diff --git a/NotificationContent/NotificationContent-Bridging-Header.h b/NotificationContent/NotificationContent-Bridging-Header.h index f207b3b666..aa1e3a7d15 100644 --- a/NotificationContent/NotificationContent-Bridging-Header.h +++ b/NotificationContent/NotificationContent-Bridging-Header.h @@ -1,6 +1,4 @@ #ifndef Share_Bridging_Header_h #define Share_Bridging_Header_h -#import "../Telegram-iOS/BuildConfig.h" - #endif diff --git a/NotificationContent/NotificationViewController.swift b/NotificationContent/NotificationViewController.swift index b1c0f8ec08..36d3cc67d4 100644 --- a/NotificationContent/NotificationViewController.swift +++ b/NotificationContent/NotificationViewController.swift @@ -1,297 +1,58 @@ import UIKit import UserNotifications import UserNotificationsUI -import Display -import TelegramCore import TelegramUI -import SwiftSignalKit -import Postbox - -private enum NotificationContentAuthorizationError { - case unauthorized -} - -private var sharedAccountContext: SharedAccountContext? - -private var installedSharedLogger = false - -private func setupSharedLogger(_ path: String) { - if !installedSharedLogger { - installedSharedLogger = true - Logger.setSharedLogger(Logger(basePath: path)) - } -} - -private func parseFileLocationResource(_ dict: [AnyHashable: Any]) -> TelegramMediaResource? { - guard let datacenterId = dict["datacenterId"] as? Int32 else { - return nil - } - guard let volumeId = dict["volumeId"] as? Int64 else { - return nil - } - guard let localId = dict["localId"] as? Int32 else { - return nil - } - guard let secret = dict["secret"] as? Int64 else { - return nil - } - var fileReference: Data? - if let fileReferenceString = dict["fileReference"] as? String { - fileReference = dataWithHexString(fileReferenceString) - } - return CloudFileMediaResource(datacenterId: Int(datacenterId), volumeId: volumeId, localId: localId, secret: secret, size: nil, fileReference: fileReference) -} +import BuildConfig @objc(NotificationViewController) class NotificationViewController: UIViewController, UNNotificationContentExtension { - private let imageNode = TransformImageNode() - private var imageInfo: (isSticker: Bool, dimensions: CGSize)? - - private let applyDisposable = MetaDisposable() - private let fetchedDisposable = MetaDisposable() - - private var accountsPath: String? - - deinit { - self.applyDisposable.dispose() - self.fetchedDisposable.dispose() - } + private var impl: NotificationViewControllerImpl? override func viewDidLoad() { super.viewDidLoad() - self.view.addSubnode(self.imageNode) - - let appBundleIdentifier = Bundle.main.bundleIdentifier! - guard let lastDotRange = appBundleIdentifier.range(of: ".", options: [.backwards]) else { - return - } - - let baseAppBundleId = String(appBundleIdentifier[.. 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((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, self.view.bounds.width), height: 256.0)) - self.view.frame = CGRect(origin: self.view.frame.origin, size: fittedSize) - self.preferredContentSize = fittedSize - - self.imageInfo = (true, dimensions) - self.updateImageLayout(boundingSize: self.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] accountAndImage in - guard let strongSelf = self else { - return - } - if let fileReference = accountAndImage.1 { - if file.isSticker { - 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()) - } - } - })) - } - } + self.impl?.didReceive(notification, view: self.view) } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) - self.updateImageLayout(boundingSize: size) - } - - private func updateImageLayout(boundingSize: CGSize) { - if let (isSticker, dimensions) = self.imageInfo { - let makeLayout = self.imageNode.asyncLayout() - let fittedSize: CGSize - if isSticker { - fittedSize = dimensions.fitted(CGSize(width: min(256.0, boundingSize.width), height: 256.0)) - } else { - fittedSize = dimensions.fitted(CGSize(width: boundingSize.width, height: 1000.0)) - } - let apply = makeLayout(TransformImageArguments(corners: ImageCorners(radius: 0.0), imageSize: fittedSize, boundingSize: fittedSize, intrinsicInsets: UIEdgeInsets())) - apply() - let displaySize = isSticker ? fittedSize : boundingSize - self.imageNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - displaySize.width) / 2.0), y: 0.0), size: displaySize) - } + self.impl?.viewWillTransition(to: size) } } diff --git a/NotificationService/AccountData.swift b/NotificationService/AccountData.swift index 83d5097306..4ad9583d1b 100644 --- a/NotificationService/AccountData.swift +++ b/NotificationService/AccountData.swift @@ -1,5 +1,6 @@ import Foundation import CommonCrypto +import LightweightAccountData private func sha256Digest(_ data: Data) -> Data { let length = data.count diff --git a/NotificationService/ImageData.swift b/NotificationService/ImageData.swift index e0be7d7b2b..fd97b1affe 100644 --- a/NotificationService/ImageData.swift +++ b/NotificationService/ImageData.swift @@ -5,6 +5,9 @@ import MtProtoKit import MtProtoKitDynamic #endif +import BuildConfig +import LightweightAccountData + struct ImageResource { let datacenterId: Int let volumeId: Int64 diff --git a/NotificationService/NotificationService-Bridging-Header.h b/NotificationService/NotificationService-Bridging-Header.h index 0d49aeee92..2f78194d54 100644 --- a/NotificationService/NotificationService-Bridging-Header.h +++ b/NotificationService/NotificationService-Bridging-Header.h @@ -1,7 +1,6 @@ #ifndef NotificationService_BridgingHeader_h #define NotificationService_BridgingHeader_h -#import "../Telegram-iOS/BuildConfig.h" #import "Crypto.h" #endif diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift index 55904efda0..23e0f5bd83 100644 --- a/NotificationService/NotificationService.swift +++ b/NotificationService/NotificationService.swift @@ -6,6 +6,8 @@ import MtProtoKit import MtProtoKitDynamic #endif import WebP +import BuildConfig +import LightweightAccountData private var sharedLogger: Logger? diff --git a/Share/Share-Bridging-Header.h b/Share/Share-Bridging-Header.h index 620e1b0868..aa1e3a7d15 100644 --- a/Share/Share-Bridging-Header.h +++ b/Share/Share-Bridging-Header.h @@ -1,10 +1,4 @@ #ifndef Share_Bridging_Header_h #define Share_Bridging_Header_h -#import "TGContactModel.h" -#import "TGItemProviderSignals.h" -#import "TGShareLocationSignals.h" - -#import "../Telegram-iOS/BuildConfig.h" - #endif diff --git a/Share/ShareRootController.swift b/Share/ShareRootController.swift index b070e2b5e3..76644e2efe 100644 --- a/Share/ShareRootController.swift +++ b/Share/ShareRootController.swift @@ -1,104 +1,15 @@ import UIKit -import Display -import TelegramCore import TelegramUI -import SwiftSignalKit -import Postbox - -private let inForeground = ValuePromise(false, ignoreRepeated: true) - -private final class SharedExtensionContext { - let sharedContext: SharedAccountContext - let wakeupManager: SharedWakeupManager - - init(sharedContext: SharedAccountContext) { - self.sharedContext = sharedContext - self.wakeupManager = SharedWakeupManager(beginBackgroundTask: { _, _ in nil }, endBackgroundTask: { _ in }, backgroundTimeRemaining: { 0.0 }, activeAccounts: sharedContext.activeAccounts |> map { ($0.0, $0.1.map { ($0.0, $0.1) }) }, liveLocationPolling: .single(nil), watchTasks: .single(nil), inForeground: inForeground.get(), hasActiveAudioSession: .single(false), notificationManager: nil, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager, accountUserInterfaceInUse: { id in - return sharedContext.accountUserInterfaceInUse(id) - }) - } -} - -private var globalSharedExtensionContext: SharedExtensionContext? - -private var installedSharedLogger = false - -private func setupSharedLogger(_ path: String) { - if !installedSharedLogger { - installedSharedLogger = true - Logger.setSharedLogger(Logger(basePath: path)) - } -} - -private enum ShareAuthorizationError { - case unauthorized -} +import BuildConfig @objc(ShareRootController) class ShareRootController: UIViewController { - private var mainWindow: Window1? - private var currentShareController: ShareController? - private var currentPasscodeController: ViewController? - - private var shouldBeMaster = Promise() - private let disposable = MetaDisposable() - private var observer1: AnyObject? - private var observer2: AnyObject? - - deinit { - self.disposable.dispose() - self.shouldBeMaster.set(.single(false)) - if let observer = self.observer1 { - NotificationCenter.default.removeObserver(observer) - } - if let observer = self.observer2 { - NotificationCenter.default.removeObserver(observer) - } - } + private var impl: ShareRootControllerImpl? override func loadView() { - telegramUIDeclareEncodables() - super.loadView() - self.view.backgroundColor = nil - self.view.isOpaque = false - - if #available(iOSApplicationExtension 8.2, *) { - self.observer1 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSExtensionHostDidBecomeActive, object: nil, queue: nil, using: { _ in - inForeground.set(true) - }) - - self.observer2 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSExtensionHostWillResignActive, object: nil, queue: nil, using: { _ in - inForeground.set(false) - }) - } - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - inForeground.set(true) - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - - self.disposable.dispose() - inForeground.set(false) - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - if self.mainWindow == nil { - let mainWindow = Window1(hostView: childWindowHostView(parent: self.view), statusBarHost: nil) - mainWindow.hostView.eventView.backgroundColor = UIColor.clear - mainWindow.hostView.eventView.isHidden = false - self.mainWindow = mainWindow - - self.view.addSubview(mainWindow.hostView.containerView) - mainWindow.hostView.containerView.frame = self.view.bounds - + if self.impl == nil { let appBundleIdentifier = Bundle.main.bundleIdentifier! guard let lastDotRange = appBundleIdentifier.range(of: ".", options: [.backwards]) else { return @@ -118,234 +29,33 @@ class ShareRootController: UIViewController { return } - let rootPath = rootPathForBasePath(appGroupUrl.path) - performAppGroupUpgrades(appGroupPath: appGroupUrl.path, rootPath: rootPath) + let rootPath = appGroupUrl.path + "/telegram-data" - TempBox.initializeShared(basePath: rootPath, processType: "share", launchSpecificId: arc4random64()) + let deviceSpecificEncryptionParameters = BuildConfig.deviceSpecificEncryptionParameters(rootPath, baseAppBundleId: baseAppBundleId) + let encryptionParameters: (Data, Data) = (deviceSpecificEncryptionParameters.key, deviceSpecificEncryptionParameters.salt) - let logsPath = rootPath + "/share-logs" - let _ = try? FileManager.default.createDirectory(atPath: logsPath, withIntermediateDirectories: true, attributes: nil) + let appVersion = (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String) ?? "unknown" - setupSharedLogger(logsPath) - - let applicationBindings = TelegramApplicationBindings(isMainApp: false, containerPath: appGroupUrl.path, appSpecificScheme: buildConfig.appSpecificUrlScheme, openUrl: { _ in - }, openUniversalUrl: { _, completion in - completion.completion(false) - return - }, canOpenUrl: { _ in - return false - }, getTopWindow: { - return nil - }, displayNotification: { _ in - - }, applicationInForeground: .single(false), applicationIsActive: .single(false), clearMessageNotifications: { _ in - }, pushIdleTimerExtension: { - return EmptyDisposable - }, openSettings: {}, openAppStorePage: {}, registerForNotifications: { _ in }, requestSiriAuthorization: { _ in }, siriAuthorization: { return .notDetermined }, getWindowHost: { - return nil - }, presentNativeController: { _ in - }, dismissNativeController: { - }, getAvailableAlternateIcons: { - return [] - }, getAlternateIconName: { - return nil - }, requestSetAlternateIconName: { _, f in - f(false) + self.impl = ShareRootControllerImpl(initializationData: ShareRootControllerInitializationData(appGroupPath: appGroupUrl.path, apiId: buildConfig.apiId, languagesCategory: languagesCategory, encryptionParameters: encryptionParameters, appVersion: appVersion, bundleData: buildConfig.bundleData), getExtensionContext: { [weak self] in + return self?.extensionContext }) - - let sharedExtensionContext: SharedExtensionContext - - if let globalSharedExtensionContext = globalSharedExtensionContext { - sharedExtensionContext = globalSharedExtensionContext - } else { - let appVersion = (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String) ?? "unknown" - - initializeAccountManagement() - let accountManager = AccountManager(basePath: rootPath + "/accounts-metadata") - var initialPresentationDataAndSettings: InitialPresentationDataAndSettings? - let semaphore = DispatchSemaphore(value: 0) - let _ = currentPresentationDataAndSettings(accountManager: accountManager).start(next: { value in - initialPresentationDataAndSettings = value - semaphore.signal() - }) - semaphore.wait() - - let deviceSpecificEncryptionParameters = BuildConfig.deviceSpecificEncryptionParameters(rootPath, baseAppBundleId: baseAppBundleId) - let encryptionParameters = ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: deviceSpecificEncryptionParameters.key)!, salt: ValueBoxEncryptionParameters.Salt(data: deviceSpecificEncryptionParameters.salt)!) - - let sharedContext = SharedAccountContext(mainWindow: nil, basePath: rootPath, encryptionParameters: encryptionParameters, accountManager: accountManager, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: apiId, languagesCategory: languagesCategory, appVersion: appVersion, voipMaxLayer: 0, appData: buildConfig.bundleData), rootPath: rootPath, legacyBasePath: nil, legacyCache: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) - sharedExtensionContext = SharedExtensionContext(sharedContext: sharedContext) - globalSharedExtensionContext = sharedExtensionContext - } - - let account: Signal<(SharedAccountContext, Account, [AccountWithInfo]), ShareAuthorizationError> = sharedExtensionContext.sharedContext.accountManager.transaction { transaction -> (SharedAccountContext, LoggingSettings) in - return (sharedExtensionContext.sharedContext, transaction.getSharedData(SharedDataKeys.loggingSettings) as? LoggingSettings ?? LoggingSettings.defaultSettings) - } - |> introduceError(ShareAuthorizationError.self) - |> mapToSignal { sharedContext, loggingSettings -> Signal<(SharedAccountContext, Account, [AccountWithInfo]), ShareAuthorizationError> in - Logger.shared.logToFile = loggingSettings.logToFile - Logger.shared.logToConsole = loggingSettings.logToConsole - - Logger.shared.redactSensitiveData = loggingSettings.redactSensitiveData - - return sharedContext.activeAccountsWithInfo - |> introduceError(ShareAuthorizationError.self) - |> take(1) - |> mapToSignal { primary, accounts -> Signal<(SharedAccountContext, Account, [AccountWithInfo]), ShareAuthorizationError> in - guard let primary = primary else { - return .fail(.unauthorized) - } - guard let info = accounts.first(where: { $0.account.id == primary }) else { - return .fail(.unauthorized) - } - return .single((sharedContext, info.account, Array(accounts))) - } - } - |> take(1) - - let applicationInterface = account - |> mapToSignal { sharedContext, account, otherAccounts -> Signal<(AccountContext, PostboxAccessChallengeData, [AccountWithInfo]), ShareAuthorizationError> in - let limitsConfiguration = account.postbox.transaction { transaction -> LimitsConfiguration in - return transaction.getPreferencesEntry(key: PreferencesKeys.limitsConfiguration) as? LimitsConfiguration ?? LimitsConfiguration.defaultValue - } - return combineLatest(sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationPasscodeSettings]), limitsConfiguration, sharedContext.accountManager.accessChallengeData()) - |> take(1) - |> deliverOnMainQueue - |> introduceError(ShareAuthorizationError.self) - |> map { sharedData, limitsConfiguration, data -> (AccountContext, PostboxAccessChallengeData, [AccountWithInfo]) in - updateLegacyLocalization(strings: sharedContext.currentPresentationData.with({ $0 }).strings) - let context = AccountContext(sharedContext: sharedContext, account: account, limitsConfiguration: limitsConfiguration) - return (context, data.data, otherAccounts) - } - } - |> deliverOnMainQueue - |> afterNext { [weak self] context, accessChallengeData, otherAccounts in - setupLegacyComponents(context: context) - initializeLegacyComponents(application: nil, currentSizeClassGetter: { return .compact }, currentHorizontalClassGetter: { return .compact }, documentsPath: "", currentApplicationBounds: { return CGRect() }, canOpenUrl: { _ in return false}, openUrl: { _ in }) - - let displayShare: () -> Void = { - var cancelImpl: (() -> Void)? - - let requestUserInteraction: ([UnpreparedShareItemContent]) -> Signal<[PreparedShareItemContent], NoError> = { content in - return Signal { [weak self] subscriber in - switch content[0] { - case let .contact(data): - let controller = deviceContactInfoController(context: context, subject: .filter(peer: nil, contactId: nil, contactData: data, completion: { peer, contactData in - let phone = contactData.basicData.phoneNumbers[0].value - if let vCardData = contactData.serializedVCard() { - subscriber.putNext([.media(.media(.standalone(media: TelegramMediaContact(firstName: contactData.basicData.firstName, lastName: contactData.basicData.lastName, phoneNumber: phone, peerId: nil, vCardData: vCardData))))]) - } - subscriber.putCompletion() - }), cancelled: { - cancelImpl?() - }) - - if let strongSelf = self, let window = strongSelf.mainWindow { - controller.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) - window.present(controller, on: .root) - } - break - } - - return ActionDisposable { - } - } |> runOn(Queue.mainQueue()) - } - - let sentItems: ([PeerId], [PreparedShareItemContent], Account) -> Signal = { peerIds, contents, account in - let sentItems = sentShareItems(account: account, to: peerIds, items: contents) - |> `catch` { _ -> Signal< - Float, NoError> in - return .complete() - } - return sentItems - |> map { value -> ShareControllerExternalStatus in - return .progress(value) - } - |> then(.single(.done)) - } - - let shareController = ShareController(context: context, subject: .fromExternal({ peerIds, additionalText, account in - if let strongSelf = self, let inputItems = strongSelf.extensionContext?.inputItems, !inputItems.isEmpty, !peerIds.isEmpty { - let rawSignals = TGItemProviderSignals.itemSignals(forInputItems: inputItems)! - return preparedShareItems(account: account, to: peerIds[0], dataItems: rawSignals, additionalText: additionalText) - |> map(Optional.init) - |> `catch` { _ -> Signal in - return .single(nil) - } - |> mapToSignal { state -> Signal in - guard let state = state else { - return .single(.done) - } - switch state { - case .preparing: - return .single(.preparing) - case let .progress(value): - return .single(.progress(value)) - case let .userInteractionRequired(value): - return requestUserInteraction(value) - |> mapToSignal { contents -> Signal in - return sentItems(peerIds, contents, account) - } - case let .done(contents): - return sentItems(peerIds, contents, account) - } - } - } else { - return .single(.done) - } - }), externalShare: false, switchableAccounts: otherAccounts) - shareController.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) - shareController.dismissed = { _ in - self?.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - } - - cancelImpl = { [weak shareController] in - shareController?.dismiss() - } - - if let strongSelf = self { - if let currentShareController = strongSelf.currentShareController { - currentShareController.dismiss() - } - strongSelf.currentShareController = shareController - strongSelf.mainWindow?.present(shareController, on: .root) - } - - context.account.resetStateManagement() - } - - let _ = passcodeEntryController(context: context, animateIn: true, completion: { value in - if value { - displayShare() - } else { - Queue.mainQueue().after(0.5, { - self?.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - }) - } - }).start(next: { controller in - guard let strongSelf = self, let controller = controller else { - return - } - - if let currentPasscodeController = strongSelf.currentPasscodeController { - currentPasscodeController.dismiss() - } - strongSelf.currentPasscodeController = controller - strongSelf.mainWindow?.present(controller, on: .root) - }) - } - - self.disposable.set(applicationInterface.start(next: { _, _, _ in }, error: { [weak self] error in - guard let strongSelf = self else { - return - } - let presentationData = sharedExtensionContext.sharedContext.currentPresentationData.with { $0 } - let controller = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: presentationData.strings.Share_AuthTitle, text: presentationData.strings.Share_AuthDescription, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { - self?.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) - })]) - strongSelf.mainWindow?.present(controller, on: .root) - }, completed: {})) } + + self.impl?.loadView() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.impl?.viewWillAppear() + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + self.impl?.viewWillDisappear() + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + self.impl?.viewDidLayoutSubviews(view: self.view) } } diff --git a/Share/TGMimeTypeMap.h b/Share/TGMimeTypeMap.h deleted file mode 100644 index af8f26570e..0000000000 --- a/Share/TGMimeTypeMap.h +++ /dev/null @@ -1,8 +0,0 @@ -#import - -@interface TGMimeTypeMap : NSObject - -+ (NSString *)mimeTypeForExtension:(NSString *)extension; -+ (NSString *)extensionForMimeType:(NSString *)mimeType; - -@end diff --git a/Share/TGMimeTypeMap.m b/Share/TGMimeTypeMap.m deleted file mode 100644 index 123d880dd3..0000000000 --- a/Share/TGMimeTypeMap.m +++ /dev/null @@ -1,347 +0,0 @@ -#import "TGMimeTypeMap.h" - -static NSDictionary *mimeToExtensionMap = nil; -static NSDictionary *extensionToMimeMap = nil; - -static void initializeMapping() -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^ - { - NSMutableDictionary *mimeToExtension = [[NSMutableDictionary alloc] init]; - NSMutableDictionary *extensionToMime = [[NSMutableDictionary alloc] init]; - - mimeToExtension[@"application/andrew-inset"] = @"ez"; extensionToMime[@"ez"] = @"application/andrew-inset"; - mimeToExtension[@"application/dsptype"] = @"tsp"; extensionToMime[@"tsp"] = @"application/dsptype"; - mimeToExtension[@"application/futuresplash"] = @"spl"; extensionToMime[@"spl"] = @"application/futuresplash"; - mimeToExtension[@"application/hta"] = @"hta"; extensionToMime[@"hta"] = @"application/hta"; - mimeToExtension[@"application/mac-binhex40"] = @"hqx"; extensionToMime[@"hqx"] = @"application/mac-binhex40"; - mimeToExtension[@"application/mac-compactpro"] = @"cpt"; extensionToMime[@"cpt"] = @"application/mac-compactpro"; - mimeToExtension[@"application/mathematica"] = @"nb"; extensionToMime[@"nb"] = @"application/mathematica"; - mimeToExtension[@"application/msaccess"] = @"mdb"; extensionToMime[@"mdb"] = @"application/msaccess"; - mimeToExtension[@"application/oda"] = @"oda"; extensionToMime[@"oda"] = @"application/oda"; - mimeToExtension[@"application/ogg"] = @"ogg"; extensionToMime[@"ogg"] = @"application/ogg"; - mimeToExtension[@"application/pdf"] = @"pdf"; extensionToMime[@"pdf"] = @"application/pdf"; - mimeToExtension[@"application/com.adobe.pdf"] = @"pdf"; - mimeToExtension[@"application/pgp-keys"] = @"key"; extensionToMime[@"key"] = @"application/pgp-keys"; - mimeToExtension[@"application/pgp-signature"] = @"pgp"; extensionToMime[@"pgp"] = @"application/pgp-signature"; - mimeToExtension[@"application/pics-rules"] = @"prf"; extensionToMime[@"prf"] = @"application/pics-rules"; - mimeToExtension[@"application/rar"] = @"rar"; extensionToMime[@"rar"] = @"application/rar"; - mimeToExtension[@"application/rdf+xml"] = @"rdf"; extensionToMime[@"rdf"] = @"application/rdf+xml"; - mimeToExtension[@"application/rss+xml"] = @"rss"; extensionToMime[@"rss"] = @"application/rss+xml"; - mimeToExtension[@"application/zip"] = @"zip"; extensionToMime[@"zip"] = @"application/zip"; - mimeToExtension[@"application/vnd.android.package-archive"] = @"apk"; extensionToMime[@"apk"] = @"application/vnd.android.package-archive"; - mimeToExtension[@"application/vnd.cinderella"] = @"cdy"; extensionToMime[@"cdy"] = @"application/vnd.cinderella"; - mimeToExtension[@"application/vnd.ms-pki.stl"] = @"stl"; extensionToMime[@"stl"] = @"application/vnd.ms-pki.stl"; - mimeToExtension[@"application/vnd.oasis.opendocument.database"] = @"odb"; extensionToMime[@"odb"] = @"application/vnd.oasis.opendocument.database"; - mimeToExtension[@"application/vnd.oasis.opendocument.formula"] = @"odf"; extensionToMime[@"odf"] = @"application/vnd.oasis.opendocument.formula"; - mimeToExtension[@"application/vnd.oasis.opendocument.graphics"] = @"odg"; extensionToMime[@"odg"] = @"application/vnd.oasis.opendocument.graphics"; - mimeToExtension[@"application/vnd.oasis.opendocument.graphics-template"] = @"otg"; extensionToMime[@"otg"] = @"application/vnd.oasis.opendocument.graphics-template"; - mimeToExtension[@"application/vnd.oasis.opendocument.image"] = @"odi"; extensionToMime[@"odi"] = @"application/vnd.oasis.opendocument.image"; - mimeToExtension[@"application/vnd.oasis.opendocument.spreadsheet"] = @"ods"; extensionToMime[@"ods"] = @"application/vnd.oasis.opendocument.spreadsheet"; - mimeToExtension[@"application/vnd.oasis.opendocument.spreadsheet-template"] = @"ots"; extensionToMime[@"ots"] = @"application/vnd.oasis.opendocument.spreadsheet-template"; - mimeToExtension[@"application/vnd.oasis.opendocument.text"] = @"odt"; extensionToMime[@"odt"] = @"application/vnd.oasis.opendocument.text"; - mimeToExtension[@"application/vnd.oasis.opendocument.text-master"] = @"odm"; extensionToMime[@"odm"] = @"application/vnd.oasis.opendocument.text-master"; - mimeToExtension[@"application/vnd.oasis.opendocument.text-template"] = @"ott"; extensionToMime[@"ott"] = @"application/vnd.oasis.opendocument.text-template"; - mimeToExtension[@"application/vnd.oasis.opendocument.text-web"] = @"oth"; extensionToMime[@"oth"] = @"application/vnd.oasis.opendocument.text-web"; - mimeToExtension[@"application/msword"] = @"doc"; extensionToMime[@"doc"] = @"application/msword"; - mimeToExtension[@"application/msword"] = @"dot"; extensionToMime[@"dot"] = @"application/msword"; - mimeToExtension[@"application/vnd.openxmlformats-officedocument.wordprocessingml.document"] = @"docx"; extensionToMime[@"docx"] = @"application/vnd.openxmlformats-officedocument.wordprocessingml.document"; - mimeToExtension[@"application/vnd.openxmlformats-officedocument.wordprocessingml.template"] = @"dotx"; extensionToMime[@"dotx"] = @"application/vnd.openxmlformats-officedocument.wordprocessingml.template"; - mimeToExtension[@"application/vnd.ms-excel"] = @"xls"; extensionToMime[@"xls"] = @"application/vnd.ms-excel"; - mimeToExtension[@"application/vnd.ms-excel"] = @"xlt"; extensionToMime[@"xlt"] = @"application/vnd.ms-excel"; - mimeToExtension[@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"] = @"xlsx"; extensionToMime[@"xlsx"] = @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; - mimeToExtension[@"application/vnd.openxmlformats-officedocument.spreadsheetml.template"] = @"xltx"; extensionToMime[@"xltx"] = @"application/vnd.openxmlformats-officedocument.spreadsheetml.template"; - mimeToExtension[@"application/vnd.ms-powerpoint"] = @"ppt"; extensionToMime[@"ppt"] = @"application/vnd.ms-powerpoint"; - mimeToExtension[@"application/vnd.ms-powerpoint"] = @"pot"; extensionToMime[@"pot"] = @"application/vnd.ms-powerpoint"; - mimeToExtension[@"application/vnd.ms-powerpoint"] = @"pps"; extensionToMime[@"pps"] = @"application/vnd.ms-powerpoint"; - mimeToExtension[@"application/vnd.openxmlformats-officedocument.presentationml.presentation"] = @"pptx"; extensionToMime[@"pptx"] = @"application/vnd.openxmlformats-officedocument.presentationml.presentation"; - mimeToExtension[@"application/vnd.openxmlformats-officedocument.presentationml.template"] = @"potx"; extensionToMime[@"potx"] = @"application/vnd.openxmlformats-officedocument.presentationml.template"; - mimeToExtension[@"application/vnd.openxmlformats-officedocument.presentationml.slideshow"] = @"ppsx"; extensionToMime[@"ppsx"] = @"application/vnd.openxmlformats-officedocument.presentationml.slideshow"; - mimeToExtension[@"application/vnd.rim.cod"] = @"cod"; extensionToMime[@"cod"] = @"application/vnd.rim.cod"; - mimeToExtension[@"application/vnd.smaf"] = @"mmf"; extensionToMime[@"mmf"] = @"application/vnd.smaf"; - mimeToExtension[@"application/vnd.stardivision.calc"] = @"sdc"; extensionToMime[@"sdc"] = @"application/vnd.stardivision.calc"; - mimeToExtension[@"application/vnd.stardivision.draw"] = @"sda"; extensionToMime[@"sda"] = @"application/vnd.stardivision.draw"; - mimeToExtension[@"application/vnd.stardivision.impress"] = @"sdd"; extensionToMime[@"sdd"] = @"application/vnd.stardivision.impress"; - mimeToExtension[@"application/vnd.stardivision.impress"] = @"sdp"; extensionToMime[@"sdp"] = @"application/vnd.stardivision.impress"; - mimeToExtension[@"application/vnd.stardivision.math"] = @"smf"; extensionToMime[@"smf"] = @"application/vnd.stardivision.math"; - mimeToExtension[@"application/vnd.stardivision.writer"] = @"sdw"; extensionToMime[@"sdw"] = @"application/vnd.stardivision.writer"; - mimeToExtension[@"application/vnd.stardivision.writer"] = @"vor"; extensionToMime[@"vor"] = @"application/vnd.stardivision.writer"; - mimeToExtension[@"application/vnd.stardivision.writer-global"] = @"sgl"; extensionToMime[@"sgl"] = @"application/vnd.stardivision.writer-global"; - mimeToExtension[@"application/vnd.sun.xml.calc"] = @"sxc"; extensionToMime[@"sxc"] = @"application/vnd.sun.xml.calc"; - mimeToExtension[@"application/vnd.sun.xml.calc.template"] = @"stc"; extensionToMime[@"stc"] = @"application/vnd.sun.xml.calc.template"; - mimeToExtension[@"application/vnd.sun.xml.draw"] = @"sxd"; extensionToMime[@"sxd"] = @"application/vnd.sun.xml.draw"; - mimeToExtension[@"application/vnd.sun.xml.draw.template"] = @"std"; extensionToMime[@"std"] = @"application/vnd.sun.xml.draw.template"; - mimeToExtension[@"application/vnd.sun.xml.impress"] = @"sxi"; extensionToMime[@"sxi"] = @"application/vnd.sun.xml.impress"; - mimeToExtension[@"application/vnd.sun.xml.impress.template"] = @"sti"; extensionToMime[@"sti"] = @"application/vnd.sun.xml.impress.template"; - mimeToExtension[@"application/vnd.sun.xml.math"] = @"sxm"; extensionToMime[@"sxm"] = @"application/vnd.sun.xml.math"; - mimeToExtension[@"application/vnd.sun.xml.writer"] = @"sxw"; extensionToMime[@"sxw"] = @"application/vnd.sun.xml.writer"; - mimeToExtension[@"application/vnd.sun.xml.writer.global"] = @"sxg"; extensionToMime[@"sxg"] = @"application/vnd.sun.xml.writer.global"; - mimeToExtension[@"application/vnd.sun.xml.writer.template"] = @"stw"; extensionToMime[@"stw"] = @"application/vnd.sun.xml.writer.template"; - mimeToExtension[@"application/vnd.visio"] = @"vsd"; extensionToMime[@"vsd"] = @"application/vnd.visio"; - mimeToExtension[@"application/x-abiword"] = @"abw"; extensionToMime[@"abw"] = @"application/x-abiword"; - mimeToExtension[@"application/x-apple-diskimage"] = @"dmg"; extensionToMime[@"dmg"] = @"application/x-apple-diskimage"; - mimeToExtension[@"application/x-bcpio"] = @"bcpio"; extensionToMime[@"bcpio"] = @"application/x-bcpio"; - mimeToExtension[@"application/x-bittorrent"] = @"torrent"; extensionToMime[@"torrent"] = @"application/x-bittorrent"; - mimeToExtension[@"application/x-cdf"] = @"cdf"; extensionToMime[@"cdf"] = @"application/x-cdf"; - mimeToExtension[@"application/x-cdlink"] = @"vcd"; extensionToMime[@"vcd"] = @"application/x-cdlink"; - mimeToExtension[@"application/x-chess-pgn"] = @"pgn"; extensionToMime[@"pgn"] = @"application/x-chess-pgn"; - mimeToExtension[@"application/x-cpio"] = @"cpio"; extensionToMime[@"cpio"] = @"application/x-cpio"; - mimeToExtension[@"application/x-debian-package"] = @"deb"; extensionToMime[@"deb"] = @"application/x-debian-package"; - mimeToExtension[@"application/x-debian-package"] = @"udeb"; extensionToMime[@"udeb"] = @"application/x-debian-package"; - mimeToExtension[@"application/x-director"] = @"dcr"; extensionToMime[@"dcr"] = @"application/x-director"; - mimeToExtension[@"application/x-director"] = @"dir"; extensionToMime[@"dir"] = @"application/x-director"; - mimeToExtension[@"application/x-director"] = @"dxr"; extensionToMime[@"dxr"] = @"application/x-director"; - mimeToExtension[@"application/x-dms"] = @"dms"; extensionToMime[@"dms"] = @"application/x-dms"; - mimeToExtension[@"application/x-doom"] = @"wad"; extensionToMime[@"wad"] = @"application/x-doom"; - mimeToExtension[@"application/x-dvi"] = @"dvi"; extensionToMime[@"dvi"] = @"application/x-dvi"; - mimeToExtension[@"application/x-flac"] = @"flac"; extensionToMime[@"flac"] = @"application/x-flac"; - mimeToExtension[@"application/x-font"] = @"pfa"; extensionToMime[@"pfa"] = @"application/x-font"; - mimeToExtension[@"application/x-font"] = @"pfb"; extensionToMime[@"pfb"] = @"application/x-font"; - mimeToExtension[@"application/x-font"] = @"gsf"; extensionToMime[@"gsf"] = @"application/x-font"; - mimeToExtension[@"application/x-font"] = @"pcf"; extensionToMime[@"pcf"] = @"application/x-font"; - mimeToExtension[@"application/x-font"] = @"pcf.Z"; extensionToMime[@"pcf.Z"] = @"application/x-font"; - mimeToExtension[@"application/x-freemind"] = @"mm"; extensionToMime[@"mm"] = @"application/x-freemind"; - mimeToExtension[@"application/x-futuresplash"] = @"spl"; extensionToMime[@"spl"] = @"application/x-futuresplash"; - mimeToExtension[@"application/x-gnumeric"] = @"gnumeric"; extensionToMime[@"gnumeric"] = @"application/x-gnumeric"; - mimeToExtension[@"application/x-go-sgf"] = @"sgf"; extensionToMime[@"sgf"] = @"application/x-go-sgf"; - mimeToExtension[@"application/x-graphing-calculator"] = @"gcf"; extensionToMime[@"gcf"] = @"application/x-graphing-calculator"; - mimeToExtension[@"application/x-gtar"] = @"gtar"; extensionToMime[@"gtar"] = @"application/x-gtar"; - mimeToExtension[@"application/x-gtar"] = @"tgz"; extensionToMime[@"tgz"] = @"application/x-gtar"; - mimeToExtension[@"application/x-gtar"] = @"taz"; extensionToMime[@"taz"] = @"application/x-gtar"; - mimeToExtension[@"application/x-hdf"] = @"hdf"; extensionToMime[@"hdf"] = @"application/x-hdf"; - mimeToExtension[@"application/x-ica"] = @"ica"; extensionToMime[@"ica"] = @"application/x-ica"; - mimeToExtension[@"application/x-internet-signup"] = @"ins"; extensionToMime[@"ins"] = @"application/x-internet-signup"; - mimeToExtension[@"application/x-internet-signup"] = @"isp"; extensionToMime[@"isp"] = @"application/x-internet-signup"; - mimeToExtension[@"application/x-iphone"] = @"iii"; extensionToMime[@"iii"] = @"application/x-iphone"; - mimeToExtension[@"application/x-iso9660-image"] = @"iso"; extensionToMime[@"iso"] = @"application/x-iso9660-image"; - mimeToExtension[@"application/x-jmol"] = @"jmz"; extensionToMime[@"jmz"] = @"application/x-jmol"; - mimeToExtension[@"application/x-kchart"] = @"chrt"; extensionToMime[@"chrt"] = @"application/x-kchart"; - mimeToExtension[@"application/x-killustrator"] = @"kil"; extensionToMime[@"kil"] = @"application/x-killustrator"; - mimeToExtension[@"application/x-koan"] = @"skp"; extensionToMime[@"skp"] = @"application/x-koan"; - mimeToExtension[@"application/x-koan"] = @"skd"; extensionToMime[@"skd"] = @"application/x-koan"; - mimeToExtension[@"application/x-koan"] = @"skt"; extensionToMime[@"skt"] = @"application/x-koan"; - mimeToExtension[@"application/x-koan"] = @"skm"; extensionToMime[@"skm"] = @"application/x-koan"; - mimeToExtension[@"application/x-kpresenter"] = @"kpr"; extensionToMime[@"kpr"] = @"application/x-kpresenter"; - mimeToExtension[@"application/x-kpresenter"] = @"kpt"; extensionToMime[@"kpt"] = @"application/x-kpresenter"; - mimeToExtension[@"application/x-kspread"] = @"ksp"; extensionToMime[@"ksp"] = @"application/x-kspread"; - mimeToExtension[@"application/x-kword"] = @"kwd"; extensionToMime[@"kwd"] = @"application/x-kword"; - mimeToExtension[@"application/x-kword"] = @"kwt"; extensionToMime[@"kwt"] = @"application/x-kword"; - mimeToExtension[@"application/x-latex"] = @"latex"; extensionToMime[@"latex"] = @"application/x-latex"; - mimeToExtension[@"application/x-lha"] = @"lha"; extensionToMime[@"lha"] = @"application/x-lha"; - mimeToExtension[@"application/x-lzh"] = @"lzh"; extensionToMime[@"lzh"] = @"application/x-lzh"; - mimeToExtension[@"application/x-lzx"] = @"lzx"; extensionToMime[@"lzx"] = @"application/x-lzx"; - mimeToExtension[@"application/x-maker"] = @"frm"; extensionToMime[@"frm"] = @"application/x-maker"; - mimeToExtension[@"application/x-maker"] = @"maker"; extensionToMime[@"maker"] = @"application/x-maker"; - mimeToExtension[@"application/x-maker"] = @"frame"; extensionToMime[@"frame"] = @"application/x-maker"; - mimeToExtension[@"application/x-maker"] = @"fb"; extensionToMime[@"fb"] = @"application/x-maker"; - mimeToExtension[@"application/x-maker"] = @"book"; extensionToMime[@"book"] = @"application/x-maker"; - mimeToExtension[@"application/x-maker"] = @"fbdoc"; extensionToMime[@"fbdoc"] = @"application/x-maker"; - mimeToExtension[@"application/x-mif"] = @"mif"; extensionToMime[@"mif"] = @"application/x-mif"; - mimeToExtension[@"application/x-ms-wmd"] = @"wmd"; extensionToMime[@"wmd"] = @"application/x-ms-wmd"; - mimeToExtension[@"application/x-ms-wmz"] = @"wmz"; extensionToMime[@"wmz"] = @"application/x-ms-wmz"; - mimeToExtension[@"application/x-msi"] = @"msi"; extensionToMime[@"msi"] = @"application/x-msi"; - mimeToExtension[@"application/x-ns-proxy-autoconfig"] = @"pac"; extensionToMime[@"pac"] = @"application/x-ns-proxy-autoconfig"; - mimeToExtension[@"application/x-nwc"] = @"nwc"; extensionToMime[@"nwc"] = @"application/x-nwc"; - mimeToExtension[@"application/x-object"] = @"o"; extensionToMime[@"o"] = @"application/x-object"; - mimeToExtension[@"application/x-oz-application"] = @"oza"; extensionToMime[@"oza"] = @"application/x-oz-application"; - mimeToExtension[@"application/x-pkcs12"] = @"p12"; extensionToMime[@"p12"] = @"application/x-pkcs12"; - mimeToExtension[@"application/x-pkcs7-certreqresp"] = @"p7r"; extensionToMime[@"p7r"] = @"application/x-pkcs7-certreqresp"; - mimeToExtension[@"application/x-pkcs7-crl"] = @"crl"; extensionToMime[@"crl"] = @"application/x-pkcs7-crl"; - mimeToExtension[@"application/x-quicktimeplayer"] = @"qtl"; extensionToMime[@"qtl"] = @"application/x-quicktimeplayer"; - mimeToExtension[@"application/x-shar"] = @"shar"; extensionToMime[@"shar"] = @"application/x-shar"; - mimeToExtension[@"application/x-shockwave-flash"] = @"swf"; extensionToMime[@"swf"] = @"application/x-shockwave-flash"; - mimeToExtension[@"application/x-stuffit"] = @"sit"; extensionToMime[@"sit"] = @"application/x-stuffit"; - mimeToExtension[@"application/x-sv4cpio"] = @"sv4cpio"; extensionToMime[@"sv4cpio"] = @"application/x-sv4cpio"; - mimeToExtension[@"application/x-sv4crc"] = @"sv4crc"; extensionToMime[@"sv4crc"] = @"application/x-sv4crc"; - mimeToExtension[@"application/x-tar"] = @"tar"; extensionToMime[@"tar"] = @"application/x-tar"; - mimeToExtension[@"application/x-texinfo"] = @"texinfo"; extensionToMime[@"texinfo"] = @"application/x-texinfo"; - mimeToExtension[@"application/x-texinfo"] = @"texi"; extensionToMime[@"texi"] = @"application/x-texinfo"; - mimeToExtension[@"application/x-troff"] = @"t"; extensionToMime[@"t"] = @"application/x-troff"; - mimeToExtension[@"application/x-troff"] = @"roff"; extensionToMime[@"roff"] = @"application/x-troff"; - mimeToExtension[@"application/x-troff-man"] = @"man"; extensionToMime[@"man"] = @"application/x-troff-man"; - mimeToExtension[@"application/x-ustar"] = @"ustar"; extensionToMime[@"ustar"] = @"application/x-ustar"; - mimeToExtension[@"application/x-wais-source"] = @"src"; extensionToMime[@"src"] = @"application/x-wais-source"; - mimeToExtension[@"application/x-wingz"] = @"wz"; extensionToMime[@"wz"] = @"application/x-wingz"; - mimeToExtension[@"application/x-webarchive"] = @"webarchive"; extensionToMime[@"webarchive"] = @"application/x-webarchive"; - mimeToExtension[@"application/x-x509-ca-cert"] = @"crt"; extensionToMime[@"crt"] = @"application/x-x509-ca-cert"; - mimeToExtension[@"application/x-x509-user-cert"] = @"crt"; extensionToMime[@"crt"] = @"application/x-x509-user-cert"; - mimeToExtension[@"application/x-xcf"] = @"xcf"; extensionToMime[@"xcf"] = @"application/x-xcf"; - mimeToExtension[@"application/x-xfig"] = @"fig"; extensionToMime[@"fig"] = @"application/x-xfig"; - mimeToExtension[@"application/xhtml+xml"] = @"xhtml"; extensionToMime[@"xhtml"] = @"application/xhtml+xml"; - mimeToExtension[@"audio/3gpp"] = @"3gpp"; extensionToMime[@"3gpp"] = @"audio/3gpp"; - mimeToExtension[@"audio/basic"] = @"snd"; extensionToMime[@"snd"] = @"audio/basic"; - mimeToExtension[@"audio/midi"] = @"mid"; extensionToMime[@"mid"] = @"audio/midi"; - mimeToExtension[@"audio/midi"] = @"midi"; extensionToMime[@"midi"] = @"audio/midi"; - mimeToExtension[@"audio/midi"] = @"kar"; extensionToMime[@"kar"] = @"audio/midi"; - mimeToExtension[@"audio/mpeg"] = @"mpga"; extensionToMime[@"mpga"] = @"audio/mpeg"; - mimeToExtension[@"audio/mpeg"] = @"mpega"; extensionToMime[@"mpega"] = @"audio/mpeg"; - mimeToExtension[@"audio/mpeg"] = @"mp2"; extensionToMime[@"mp2"] = @"audio/mpeg"; - mimeToExtension[@"audio/mpeg"] = @"mp3"; extensionToMime[@"mp3"] = @"audio/mpeg"; - mimeToExtension[@"audio/mpeg"] = @"m4a"; extensionToMime[@"m4a"] = @"audio/mpeg"; - mimeToExtension[@"audio/mpegurl"] = @"m3u"; extensionToMime[@"m3u"] = @"audio/mpegurl"; - mimeToExtension[@"audio/prs.sid"] = @"sid"; extensionToMime[@"sid"] = @"audio/prs.sid"; - mimeToExtension[@"audio/x-aiff"] = @"aif"; extensionToMime[@"aif"] = @"audio/x-aiff"; - mimeToExtension[@"audio/x-aiff"] = @"aiff"; extensionToMime[@"aiff"] = @"audio/x-aiff"; - mimeToExtension[@"audio/x-aiff"] = @"aifc"; extensionToMime[@"aifc"] = @"audio/x-aiff"; - mimeToExtension[@"audio/x-gsm"] = @"gsm"; extensionToMime[@"gsm"] = @"audio/x-gsm"; - mimeToExtension[@"audio/x-mpegurl"] = @"m3u"; extensionToMime[@"m3u"] = @"audio/x-mpegurl"; - mimeToExtension[@"audio/x-ms-wma"] = @"wma"; extensionToMime[@"wma"] = @"audio/x-ms-wma"; - mimeToExtension[@"audio/x-ms-wax"] = @"wax"; extensionToMime[@"wax"] = @"audio/x-ms-wax"; - mimeToExtension[@"audio/x-pn-realaudio"] = @"ra"; extensionToMime[@"ra"] = @"audio/x-pn-realaudio"; - mimeToExtension[@"audio/x-pn-realaudio"] = @"rm"; extensionToMime[@"rm"] = @"audio/x-pn-realaudio"; - mimeToExtension[@"audio/x-pn-realaudio"] = @"ram"; extensionToMime[@"ram"] = @"audio/x-pn-realaudio"; - mimeToExtension[@"audio/x-realaudio"] = @"ra"; extensionToMime[@"ra"] = @"audio/x-realaudio"; - mimeToExtension[@"audio/x-scpls"] = @"pls"; extensionToMime[@"pls"] = @"audio/x-scpls"; - mimeToExtension[@"audio/x-sd2"] = @"sd2"; extensionToMime[@"sd2"] = @"audio/x-sd2"; - mimeToExtension[@"audio/x-wav"] = @"wav"; extensionToMime[@"wav"] = @"audio/x-wav"; - mimeToExtension[@"image/bmp"] = @"bmp"; extensionToMime[@"bmp"] = @"image/bmp"; - mimeToExtension[@"image/gif"] = @"gif"; extensionToMime[@"gif"] = @"image/gif"; - mimeToExtension[@"image/ico"] = @"cur"; extensionToMime[@"cur"] = @"image/ico"; - mimeToExtension[@"image/ico"] = @"ico"; extensionToMime[@"ico"] = @"image/ico"; - mimeToExtension[@"image/ief"] = @"ief"; extensionToMime[@"ief"] = @"image/ief"; - mimeToExtension[@"image/jpeg"] = @"jpeg"; extensionToMime[@"jpeg"] = @"image/jpeg"; - mimeToExtension[@"image/jpeg"] = @"jpg"; extensionToMime[@"jpg"] = @"image/jpeg"; - mimeToExtension[@"image/jpeg"] = @"jpe"; extensionToMime[@"jpe"] = @"image/jpeg"; - mimeToExtension[@"image/pcx"] = @"pcx"; extensionToMime[@"pcx"] = @"image/pcx"; - mimeToExtension[@"image/png"] = @"png"; extensionToMime[@"png"] = @"image/png"; - mimeToExtension[@"image/svg+xml"] = @"svg"; extensionToMime[@"svg"] = @"image/svg+xml"; - mimeToExtension[@"image/svg+xml"] = @"svgz"; extensionToMime[@"svgz"] = @"image/svg+xml"; - mimeToExtension[@"image/tiff"] = @"tiff"; extensionToMime[@"tiff"] = @"image/tiff"; - mimeToExtension[@"image/tiff"] = @"tif"; extensionToMime[@"tif"] = @"image/tiff"; - mimeToExtension[@"image/vnd.djvu"] = @"djvu"; extensionToMime[@"djvu"] = @"image/vnd.djvu"; - mimeToExtension[@"image/vnd.djvu"] = @"djv"; extensionToMime[@"djv"] = @"image/vnd.djvu"; - mimeToExtension[@"image/vnd.wap.wbmp"] = @"wbmp"; extensionToMime[@"wbmp"] = @"image/vnd.wap.wbmp"; - mimeToExtension[@"image/x-cmu-raster"] = @"ras"; extensionToMime[@"ras"] = @"image/x-cmu-raster"; - mimeToExtension[@"image/x-coreldraw"] = @"cdr"; extensionToMime[@"cdr"] = @"image/x-coreldraw"; - mimeToExtension[@"image/x-coreldrawpattern"] = @"pat"; extensionToMime[@"pat"] = @"image/x-coreldrawpattern"; - mimeToExtension[@"image/x-coreldrawtemplate"] = @"cdt"; extensionToMime[@"cdt"] = @"image/x-coreldrawtemplate"; - mimeToExtension[@"image/x-corelphotopaint"] = @"cpt"; extensionToMime[@"cpt"] = @"image/x-corelphotopaint"; - mimeToExtension[@"image/x-icon"] = @"ico"; extensionToMime[@"ico"] = @"image/x-icon"; - mimeToExtension[@"image/x-jg"] = @"art"; extensionToMime[@"art"] = @"image/x-jg"; - mimeToExtension[@"image/x-jng"] = @"jng"; extensionToMime[@"jng"] = @"image/x-jng"; - mimeToExtension[@"image/x-ms-bmp"] = @"bmp"; extensionToMime[@"bmp"] = @"image/x-ms-bmp"; - mimeToExtension[@"image/x-photoshop"] = @"psd"; extensionToMime[@"psd"] = @"image/x-photoshop"; - mimeToExtension[@"image/x-portable-anymap"] = @"pnm"; extensionToMime[@"pnm"] = @"image/x-portable-anymap"; - mimeToExtension[@"image/x-portable-bitmap"] = @"pbm"; extensionToMime[@"pbm"] = @"image/x-portable-bitmap"; - mimeToExtension[@"image/x-portable-graymap"] = @"pgm"; extensionToMime[@"pgm"] = @"image/x-portable-graymap"; - mimeToExtension[@"image/x-portable-pixmap"] = @"ppm"; extensionToMime[@"ppm"] = @"image/x-portable-pixmap"; - mimeToExtension[@"image/x-rgb"] = @"rgb"; extensionToMime[@"rgb"] = @"image/x-rgb"; - mimeToExtension[@"image/x-xbitmap"] = @"xbm"; extensionToMime[@"xbm"] = @"image/x-xbitmap"; - mimeToExtension[@"image/x-xpixmap"] = @"xpm"; extensionToMime[@"xpm"] = @"image/x-xpixmap"; - mimeToExtension[@"image/x-xwindowdump"] = @"xwd"; extensionToMime[@"xwd"] = @"image/x-xwindowdump"; - mimeToExtension[@"model/iges"] = @"igs"; extensionToMime[@"igs"] = @"model/iges"; - mimeToExtension[@"model/iges"] = @"iges"; extensionToMime[@"iges"] = @"model/iges"; - mimeToExtension[@"model/mesh"] = @"msh"; extensionToMime[@"msh"] = @"model/mesh"; - mimeToExtension[@"model/mesh"] = @"mesh"; extensionToMime[@"mesh"] = @"model/mesh"; - mimeToExtension[@"model/mesh"] = @"silo"; extensionToMime[@"silo"] = @"model/mesh"; - mimeToExtension[@"text/calendar"] = @"ics"; extensionToMime[@"ics"] = @"text/calendar"; - mimeToExtension[@"text/calendar"] = @"icz"; extensionToMime[@"icz"] = @"text/calendar"; - mimeToExtension[@"text/comma-separated-values"] = @"csv"; extensionToMime[@"csv"] = @"text/comma-separated-values"; - mimeToExtension[@"text/css"] = @"css"; extensionToMime[@"css"] = @"text/css"; - mimeToExtension[@"text/html"] = @"htm"; extensionToMime[@"htm"] = @"text/html"; - mimeToExtension[@"text/html"] = @"html"; extensionToMime[@"html"] = @"text/html"; - mimeToExtension[@"text/h323"] = @"323"; extensionToMime[@"323"] = @"text/h323"; - mimeToExtension[@"text/iuls"] = @"uls"; extensionToMime[@"uls"] = @"text/iuls"; - mimeToExtension[@"text/mathml"] = @"mml"; extensionToMime[@"mml"] = @"text/mathml"; - // add it first so it will be the default for ExtensionFromMimeType - mimeToExtension[@"text/plain"] = @"txt"; extensionToMime[@"txt"] = @"text/plain"; - mimeToExtension[@"text/plain"] = @"asc"; extensionToMime[@"asc"] = @"text/plain"; - mimeToExtension[@"text/plain"] = @"text"; extensionToMime[@"text"] = @"text/plain"; - mimeToExtension[@"text/plain"] = @"diff"; extensionToMime[@"diff"] = @"text/plain"; - mimeToExtension[@"text/plain"] = @"po"; extensionToMime[@"po"] = @"text/plain"; // reserve "pot" for vnd.ms-powerpoint - mimeToExtension[@"text/richtext"] = @"rtx"; extensionToMime[@"rtx"] = @"text/richtext"; - mimeToExtension[@"text/rtf"] = @"rtf"; extensionToMime[@"rtf"] = @"text/rtf"; - mimeToExtension[@"text/texmacs"] = @"ts"; extensionToMime[@"ts"] = @"text/texmacs"; - mimeToExtension[@"text/text"] = @"phps"; extensionToMime[@"phps"] = @"text/text"; - mimeToExtension[@"text/tab-separated-values"] = @"tsv"; extensionToMime[@"tsv"] = @"text/tab-separated-values"; - mimeToExtension[@"text/xml"] = @"xml"; extensionToMime[@"xml"] = @"text/xml"; - mimeToExtension[@"text/x-bibtex"] = @"bib"; extensionToMime[@"bib"] = @"text/x-bibtex"; - mimeToExtension[@"text/x-boo"] = @"boo"; extensionToMime[@"boo"] = @"text/x-boo"; - mimeToExtension[@"text/x-c++hdr"] = @"h++"; extensionToMime[@"h++"] = @"text/x-c++hdr"; - mimeToExtension[@"text/x-c++hdr"] = @"hpp"; extensionToMime[@"hpp"] = @"text/x-c++hdr"; - mimeToExtension[@"text/x-c++hdr"] = @"hxx"; extensionToMime[@"hxx"] = @"text/x-c++hdr"; - mimeToExtension[@"text/x-c++hdr"] = @"hh"; extensionToMime[@"hh"] = @"text/x-c++hdr"; - mimeToExtension[@"text/x-c++src"] = @"c++"; extensionToMime[@"c++"] = @"text/x-c++src"; - mimeToExtension[@"text/x-c++src"] = @"cpp"; extensionToMime[@"cpp"] = @"text/x-c++src"; - mimeToExtension[@"text/x-c++src"] = @"cxx"; extensionToMime[@"cxx"] = @"text/x-c++src"; - mimeToExtension[@"text/x-chdr"] = @"h"; extensionToMime[@"h"] = @"text/x-chdr"; - mimeToExtension[@"text/x-component"] = @"htc"; extensionToMime[@"htc"] = @"text/x-component"; - mimeToExtension[@"text/x-csh"] = @"csh"; extensionToMime[@"csh"] = @"text/x-csh"; - mimeToExtension[@"text/x-csrc"] = @"c"; extensionToMime[@"c"] = @"text/x-csrc"; - mimeToExtension[@"text/x-dsrc"] = @"d"; extensionToMime[@"d"] = @"text/x-dsrc"; - mimeToExtension[@"text/x-haskell"] = @"hs"; extensionToMime[@"hs"] = @"text/x-haskell"; - mimeToExtension[@"text/x-java"] = @"java"; extensionToMime[@"java"] = @"text/x-java"; - mimeToExtension[@"text/x-literate-haskell"] = @"lhs"; extensionToMime[@"lhs"] = @"text/x-literate-haskell"; - mimeToExtension[@"text/x-moc"] = @"moc"; extensionToMime[@"moc"] = @"text/x-moc"; - mimeToExtension[@"text/x-pascal"] = @"p"; extensionToMime[@"p"] = @"text/x-pascal"; - mimeToExtension[@"text/x-pascal"] = @"pas"; extensionToMime[@"pas"] = @"text/x-pascal"; - mimeToExtension[@"text/x-pcs-gcd"] = @"gcd"; extensionToMime[@"gcd"] = @"text/x-pcs-gcd"; - mimeToExtension[@"text/x-setext"] = @"etx"; extensionToMime[@"etx"] = @"text/x-setext"; - mimeToExtension[@"text/x-tcl"] = @"tcl"; extensionToMime[@"tcl"] = @"text/x-tcl"; - mimeToExtension[@"text/x-tex"] = @"tex"; extensionToMime[@"tex"] = @"text/x-tex"; - mimeToExtension[@"text/x-tex"] = @"ltx"; extensionToMime[@"ltx"] = @"text/x-tex"; - mimeToExtension[@"text/x-tex"] = @"sty"; extensionToMime[@"sty"] = @"text/x-tex"; - mimeToExtension[@"text/x-tex"] = @"cls"; extensionToMime[@"cls"] = @"text/x-tex"; - mimeToExtension[@"text/x-vcalendar"] = @"vcs"; extensionToMime[@"vcs"] = @"text/x-vcalendar"; - mimeToExtension[@"text/x-vcard"] = @"vcf"; extensionToMime[@"vcf"] = @"text/x-vcard"; - mimeToExtension[@"video/3gpp"] = @"3gpp"; extensionToMime[@"3gpp"] = @"video/3gpp"; - mimeToExtension[@"video/3gpp"] = @"3gp"; extensionToMime[@"3gp"] = @"video/3gpp"; - mimeToExtension[@"video/3gpp"] = @"3g2"; extensionToMime[@"3g2"] = @"video/3gpp"; - mimeToExtension[@"video/dl"] = @"dl"; extensionToMime[@"dl"] = @"video/dl"; - mimeToExtension[@"video/dv"] = @"dif"; extensionToMime[@"dif"] = @"video/dv"; - mimeToExtension[@"video/dv"] = @"dv"; extensionToMime[@"dv"] = @"video/dv"; - mimeToExtension[@"video/fli"] = @"fli"; extensionToMime[@"fli"] = @"video/fli"; - mimeToExtension[@"video/m4v"] = @"m4v"; extensionToMime[@"m4v"] = @"video/m4v"; - mimeToExtension[@"video/mpeg"] = @"mpeg"; extensionToMime[@"mpeg"] = @"video/mpeg"; - mimeToExtension[@"video/mpeg"] = @"mpg"; extensionToMime[@"mpg"] = @"video/mpeg"; - mimeToExtension[@"video/mpeg"] = @"mpe"; extensionToMime[@"mpe"] = @"video/mpeg"; - mimeToExtension[@"video/mp4"] = @"mp4"; extensionToMime[@"mp4"] = @"video/mp4"; - mimeToExtension[@"video/mpeg"] = @"VOB"; extensionToMime[@"VOB"] = @"video/mpeg"; - mimeToExtension[@"video/quicktime"] = @"qt"; extensionToMime[@"qt"] = @"video/quicktime"; - mimeToExtension[@"video/quicktime"] = @"mov"; extensionToMime[@"mov"] = @"video/quicktime"; - mimeToExtension[@"video/vnd.mpegurl"] = @"mxu"; extensionToMime[@"mxu"] = @"video/vnd.mpegurl"; - mimeToExtension[@"video/x-la-asf"] = @"lsf"; extensionToMime[@"lsf"] = @"video/x-la-asf"; - mimeToExtension[@"video/x-la-asf"] = @"lsx"; extensionToMime[@"lsx"] = @"video/x-la-asf"; - mimeToExtension[@"video/x-mng"] = @"mng"; extensionToMime[@"mng"] = @"video/x-mng"; - mimeToExtension[@"video/x-ms-asf"] = @"asf"; extensionToMime[@"asf"] = @"video/x-ms-asf"; - mimeToExtension[@"video/x-ms-asf"] = @"asx"; extensionToMime[@"asx"] = @"video/x-ms-asf"; - mimeToExtension[@"video/x-ms-wm"] = @"wm"; extensionToMime[@"wm"] = @"video/x-ms-wm"; - mimeToExtension[@"video/x-ms-wmv"] = @"wmv"; extensionToMime[@"wmv"] = @"video/x-ms-wmv"; - mimeToExtension[@"video/x-ms-wmx"] = @"wmx"; extensionToMime[@"wmx"] = @"video/x-ms-wmx"; - mimeToExtension[@"video/x-ms-wvx"] = @"wvx"; extensionToMime[@"wvx"] = @"video/x-ms-wvx"; - mimeToExtension[@"video/x-msvideo"] = @"avi"; extensionToMime[@"avi"] = @"video/x-msvideo"; - mimeToExtension[@"video/x-sgi-movie"] = @"movie"; extensionToMime[@"movie"] = @"video/x-sgi-movie"; - mimeToExtension[@"x-conference/x-cooltalk"] = @"ice"; extensionToMime[@"ice"] = @"x-conference/x-cooltalk"; - mimeToExtension[@"x-epoc/x-sisx-app"] = @"sisx"; extensionToMime[@"sisx"] = @"x-epoc/x-sisx-app"; - mimeToExtension[@"application/epub+zip"] = @"epub"; extensionToMime[@"epub"] = @"application/epub+zip"; - mimeToExtension[@"text/swift"] = @"swift"; extensionToMime[@"swift"] = @"text/swift"; - - mimeToExtensionMap = mimeToExtension; - extensionToMimeMap = extensionToMime; - }); -} - -@implementation TGMimeTypeMap - -+ (NSString *)mimeTypeForExtension:(NSString *)extension -{ - if (extension == nil) - return nil; - - initializeMapping(); - - return extensionToMimeMap[extension]; -} - -+ (NSString *)extensionForMimeType:(NSString *)mimeType -{ - if (mimeType == nil) - return nil; - - initializeMapping(); - - return mimeToExtensionMap[mimeType]; -} - -@end diff --git a/SiriIntents/IntentHandler.swift b/SiriIntents/IntentHandler.swift index 6949f6e261..8300741925 100644 --- a/SiriIntents/IntentHandler.swift +++ b/SiriIntents/IntentHandler.swift @@ -3,6 +3,7 @@ import Intents import TelegramCore import Postbox import SwiftSignalKit +import BuildConfig private var accountCache: Account? diff --git a/SiriIntents/SiriIntents-Bridging-Header.h b/SiriIntents/SiriIntents-Bridging-Header.h index 303f8d1230..fa08975f7d 100644 --- a/SiriIntents/SiriIntents-Bridging-Header.h +++ b/SiriIntents/SiriIntents-Bridging-Header.h @@ -1,6 +1,4 @@ #ifndef SiriIntents_Bridging_Header_h #define SiriIntents_Bridging_Header_h -#import "../Telegram-iOS/BuildConfig.h" - #endif diff --git a/Telegram-iOS.xcodeproj/project.pbxproj b/Telegram-iOS.xcodeproj/project.pbxproj index 3f919860fb..95a16174b8 100644 --- a/Telegram-iOS.xcodeproj/project.pbxproj +++ b/Telegram-iOS.xcodeproj/project.pbxproj @@ -12,7 +12,6 @@ 090E777622A6945900CD99F5 /* BlackClassicIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 090E777222A6945800CD99F5 /* BlackClassicIcon@3x.png */; }; 090E777722A6945900CD99F5 /* BlueClassicIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 090E777322A6945800CD99F5 /* BlueClassicIcon@2x.png */; }; 092F368521542D6C001A9F49 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 092F368321542D6C001A9F49 /* Localizable.strings */; }; - 0956AF2C217B4642008106D0 /* WatchCommunicationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0956AF2B217B4642008106D0 /* WatchCommunicationManager.swift */; }; 0956AF2F217B8109008106D0 /* TGNeoUnsupportedMessageViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0956AF2E217B8109008106D0 /* TGNeoUnsupportedMessageViewModel.m */; }; 0972C6E021791D950069E98A /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0972C6DF21791D950069E98A /* UserNotifications.framework */; }; 0972C6E421792D130069E98A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0972C6E221792D120069E98A /* InfoPlist.strings */; }; @@ -22,6 +21,12 @@ 09A218F122A1570A00DE6898 /* BlackFilledIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A218EB22A1570900DE6898 /* BlackFilledIcon@3x.png */; }; 09A218F222A1570A00DE6898 /* BlueFilledIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A218EC22A1570900DE6898 /* BlueFilledIcon@2x.png */; }; 09A218F322A1570A00DE6898 /* BlueIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A218ED22A1570900DE6898 /* BlueIcon@3x.png */; }; + 09A4193022B7A4D500637EB4 /* BlueClassicIconIpad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A4192A22B7A4D300637EB4 /* BlueClassicIconIpad@2x.png */; }; + 09A4193122B7A4D500637EB4 /* BlackClassicIconLargeIpad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A4192B22B7A4D400637EB4 /* BlackClassicIconLargeIpad@2x.png */; }; + 09A4193222B7A4D500637EB4 /* BlueClassicIconIpad.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A4192C22B7A4D400637EB4 /* BlueClassicIconIpad.png */; }; + 09A4193322B7A4D500637EB4 /* BlueClassicIconLargeIpad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A4192D22B7A4D400637EB4 /* BlueClassicIconLargeIpad@2x.png */; }; + 09A4193422B7A4D500637EB4 /* BlackClassicIconIpad.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A4192E22B7A4D400637EB4 /* BlackClassicIconIpad.png */; }; + 09A4193522B7A4D500637EB4 /* BlackClassicIconIpad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09A4192F22B7A4D400637EB4 /* BlackClassicIconIpad@2x.png */; }; 09C50DE721729D7C009E676F /* TGBridgeAudioSignals.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572C1217292BA00BDF00F /* TGBridgeAudioSignals.m */; }; 09C50DE821729D7C009E676F /* TGBridgeBotSignals.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572BB217292B900BDF00F /* TGBridgeBotSignals.m */; }; 09C50DE921729D7C009E676F /* TGBridgeChatListSignals.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572AF217292B900BDF00F /* TGBridgeChatListSignals.m */; }; @@ -40,13 +45,7 @@ 09C50E0321729DB5009E676F /* TGBotCommandController.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C571F6217287EF00BDF00F /* TGBotCommandController.m */; }; 09C50E0421729DB5009E676F /* TGBotKeyboardController.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C571F8217287F000BDF00F /* TGBotKeyboardController.m */; }; 09C50E0521729DE6009E676F /* TGBotKeyboardButtonController.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C571F4217287E500BDF00F /* TGBotKeyboardButtonController.m */; }; - 09C50E7B21738178009E676F /* TGBridgeServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C50E7A21738178009E676F /* TGBridgeServer.m */; }; - 09C50E8321738514009E676F /* TGBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573072172953700BDF00F /* TGBridgeContext.m */; }; - 09C50E842173853E009E676F /* TGBridgeCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572CE2172939F00BDF00F /* TGBridgeCommon.m */; }; 09C50E88217385CF009E676F /* WatchConnectivity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09C50E87217385CF009E676F /* WatchConnectivity.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 09C50E8A2173AEDB009E676F /* WatchRequestHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C50E892173AEDB009E676F /* WatchRequestHandlers.swift */; }; - 09C50E912173B247009E676F /* TGBridgeSubscriptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C50E8F2173B247009E676F /* TGBridgeSubscriptions.m */; }; - 09C50E922173B247009E676F /* TGBridgeSubscriptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C50E8F2173B247009E676F /* TGBridgeSubscriptions.m */; }; 09C56F8F2172797200BDF00F /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 09C56F8D2172797200BDF00F /* Interface.storyboard */; }; 09C56F912172797400BDF00F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 09C56F902172797400BDF00F /* Assets.xcassets */; }; 09C56F982172797500BDF00F /* Watch Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 09C56F972172797400BDF00F /* Watch Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -166,62 +165,14 @@ 09C5728C21728D3700BDF00F /* STimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5726221728CFF00BDF00F /* STimer.m */; }; 09C5728D21728D3700BDF00F /* SVariable.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5725B21728CFE00BDF00F /* SVariable.m */; }; 09C572D2217293D400BDF00F /* TGBridgeClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572D02172939F00BDF00F /* TGBridgeClient.m */; }; - 09C572D3217293D400BDF00F /* TGBridgeCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572CE2172939F00BDF00F /* TGBridgeCommon.m */; }; 09C573162172953800BDF00F /* TGBridgeMessage+TGTableItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572D72172953300BDF00F /* TGBridgeMessage+TGTableItem.m */; }; 09C573182172953800BDF00F /* TGBridgeBotReplyMarkup.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572D92172953300BDF00F /* TGBridgeBotReplyMarkup.m */; }; - 09C573192172953800BDF00F /* TGBridgeContactMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572DE2172953300BDF00F /* TGBridgeContactMediaAttachment.m */; }; - 09C5731A2172953800BDF00F /* TGBridgeMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572DF2172953300BDF00F /* TGBridgeMessage.m */; }; - 09C5731B2172953800BDF00F /* TGBridgeAudioMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E02172953300BDF00F /* TGBridgeAudioMediaAttachment.m */; }; - 09C5731C2172953800BDF00F /* TGBridgeActionMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E22172953300BDF00F /* TGBridgeActionMediaAttachment.m */; }; 09C5731D2172953800BDF00F /* TGBridgeStickerPack.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E32172953400BDF00F /* TGBridgeStickerPack.m */; }; - 09C5731E2172953800BDF00F /* TGBridgeVideoMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E42172953400BDF00F /* TGBridgeVideoMediaAttachment.m */; }; - 09C573202172953800BDF00F /* TGBridgeForwardedMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E62172953400BDF00F /* TGBridgeForwardedMessageMediaAttachment.m */; }; 09C573212172953800BDF00F /* TGBridgeUser+TGTableItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E92172953400BDF00F /* TGBridgeUser+TGTableItem.m */; }; - 09C573222172953800BDF00F /* TGBridgeUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572ED2172953400BDF00F /* TGBridgeUser.m */; }; - 09C573232172953800BDF00F /* TGBridgeBotCommandInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572EF2172953500BDF00F /* TGBridgeBotCommandInfo.m */; }; - 09C573242172953800BDF00F /* TGBridgeImageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F22172953500BDF00F /* TGBridgeImageMediaAttachment.m */; }; - 09C573252172953800BDF00F /* TGBridgeLocationVenue.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F32172953500BDF00F /* TGBridgeLocationVenue.m */; }; - 09C573262172953800BDF00F /* TGBridgeMessageEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F42172953500BDF00F /* TGBridgeMessageEntities.m */; }; - 09C573272172953800BDF00F /* TGBridgeWebPageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F52172953500BDF00F /* TGBridgeWebPageMediaAttachment.m */; }; 09C573282172953800BDF00F /* TGBridgeChat+TGTableItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F62172953500BDF00F /* TGBridgeChat+TGTableItem.m */; }; - 09C573292172953900BDF00F /* TGBridgeMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F92172953600BDF00F /* TGBridgeMediaAttachment.m */; }; - 09C5732A2172953900BDF00F /* TGBridgeDocumentMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572FB2172953600BDF00F /* TGBridgeDocumentMediaAttachment.m */; }; - 09C5732B2172953900BDF00F /* TGBridgePeerNotificationSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572FC2172953600BDF00F /* TGBridgePeerNotificationSettings.m */; }; - 09C5732C2172953900BDF00F /* TGBridgeReplyMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572FD2172953600BDF00F /* TGBridgeReplyMessageMediaAttachment.m */; }; 09C5732D2172953900BDF00F /* TGBridgeLocationVenue+TGTableItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572FF2172953600BDF00F /* TGBridgeLocationVenue+TGTableItem.m */; }; - 09C5732E2172953900BDF00F /* TGBridgeLocationMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573002172953600BDF00F /* TGBridgeLocationMediaAttachment.m */; }; - 09C5732F2172953900BDF00F /* TGBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573072172953700BDF00F /* TGBridgeContext.m */; }; - 09C573302172953900BDF00F /* TGBridgeChat.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573092172953700BDF00F /* TGBridgeChat.m */; }; - 09C573312172953900BDF00F /* TGBridgeMessageEntitiesAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730A2172953700BDF00F /* TGBridgeMessageEntitiesAttachment.m */; }; - 09C573322172953900BDF00F /* TGBridgeChatMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730C2172953700BDF00F /* TGBridgeChatMessages.m */; }; - 09C573332172953900BDF00F /* TGBridgeReplyMarkupMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730D2172953800BDF00F /* TGBridgeReplyMarkupMediaAttachment.m */; }; - 09C573342172953900BDF00F /* TGBridgeUnsupportedMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730F2172953800BDF00F /* TGBridgeUnsupportedMediaAttachment.m */; }; - 09C573352172953900BDF00F /* TGBridgeBotInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573102172953800BDF00F /* TGBridgeBotInfo.m */; }; 09CFB212217299E80083F7A3 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09CFB211217299E80083F7A3 /* CoreLocation.framework */; }; 09D30420217418EC00C00567 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D09DCBB51D0C856B00F51FFE /* Localizable.strings */; }; - 09D304222174335F00C00567 /* WatchBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D304212174335F00C00567 /* WatchBridge.swift */; }; - 09D304232174340900C00567 /* TGBridgeUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572ED2172953400BDF00F /* TGBridgeUser.m */; }; - 09D304242174340E00C00567 /* TGBridgeMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572DF2172953300BDF00F /* TGBridgeMessage.m */; }; - 09D304252174341200C00567 /* TGBridgeMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F92172953600BDF00F /* TGBridgeMediaAttachment.m */; }; - 09D304262174341A00C00567 /* TGBridgeLocationVenue.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F32172953500BDF00F /* TGBridgeLocationVenue.m */; }; - 09D304272174341E00C00567 /* TGBridgeChatMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730C2172953700BDF00F /* TGBridgeChatMessages.m */; }; - 09D304282174342E00C00567 /* TGBridgeChat.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573092172953700BDF00F /* TGBridgeChat.m */; }; - 09D304292174343300C00567 /* TGBridgeBotInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573102172953800BDF00F /* TGBridgeBotInfo.m */; }; - 09D3042A2174343B00C00567 /* TGBridgeBotCommandInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572EF2172953500BDF00F /* TGBridgeBotCommandInfo.m */; }; - 09D3042C2174344900C00567 /* TGBridgeActionMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E22172953300BDF00F /* TGBridgeActionMediaAttachment.m */; }; - 09D3042D2174344900C00567 /* TGBridgeAudioMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E02172953300BDF00F /* TGBridgeAudioMediaAttachment.m */; }; - 09D3042E2174344900C00567 /* TGBridgeContactMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572DE2172953300BDF00F /* TGBridgeContactMediaAttachment.m */; }; - 09D3042F2174344900C00567 /* TGBridgeDocumentMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572FB2172953600BDF00F /* TGBridgeDocumentMediaAttachment.m */; }; - 09D304302174344900C00567 /* TGBridgeForwardedMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E62172953400BDF00F /* TGBridgeForwardedMessageMediaAttachment.m */; }; - 09D304312174344900C00567 /* TGBridgeImageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F22172953500BDF00F /* TGBridgeImageMediaAttachment.m */; }; - 09D304322174344900C00567 /* TGBridgeLocationMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C573002172953600BDF00F /* TGBridgeLocationMediaAttachment.m */; }; - 09D304332174344900C00567 /* TGBridgeMessageEntitiesAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730A2172953700BDF00F /* TGBridgeMessageEntitiesAttachment.m */; }; - 09D304342174344900C00567 /* TGBridgeReplyMarkupMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730D2172953800BDF00F /* TGBridgeReplyMarkupMediaAttachment.m */; }; - 09D304352174344900C00567 /* TGBridgeReplyMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572FD2172953600BDF00F /* TGBridgeReplyMessageMediaAttachment.m */; }; - 09D304362174344900C00567 /* TGBridgeUnsupportedMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C5730F2172953800BDF00F /* TGBridgeUnsupportedMediaAttachment.m */; }; - 09D304372174344900C00567 /* TGBridgeVideoMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572E42172953400BDF00F /* TGBridgeVideoMediaAttachment.m */; }; - 09D304382174344900C00567 /* TGBridgeWebPageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F52172953500BDF00F /* TGBridgeWebPageMediaAttachment.m */; }; - 09D304392174344900C00567 /* TGBridgeMessageEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C572F42172953500BDF00F /* TGBridgeMessageEntities.m */; }; 09EBE2A522B004EA00F670AB /* BlueFilledIconIpad.png in Resources */ = {isa = PBXBuildFile; fileRef = 09EBE29922B004E800F670AB /* BlueFilledIconIpad.png */; }; 09EBE2A622B004EA00F670AB /* BlueIconIpad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 09EBE29A22B004E800F670AB /* BlueIconIpad@2x.png */; }; 09EBE2A722B004EA00F670AB /* BlueIconIpad.png in Resources */ = {isa = PBXBuildFile; fileRef = 09EBE29B22B004E900F670AB /* BlueIconIpad.png */; }; @@ -237,7 +188,13 @@ 09FDAEE62140477F00BF856F /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09FDAEE52140477F00BF856F /* MtProtoKitDynamic.framework */; }; D000CACF21FB6E380011B15D /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = D000CAC821FB6E370011B15D /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; D001D5AA1F878DA300DF975A /* PhoneCountries.txt in Resources */ = {isa = PBXBuildFile; fileRef = D001D5A91F878DA300DF975A /* PhoneCountries.txt */; }; - D00859A21B28189D00EAF753 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00859A11B28189D00EAF753 /* AppDelegate.swift */; }; + D008185022B5797A008A895F /* BuildConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008184F22B5797A008A895F /* BuildConfig.framework */; }; + D008185222B57986008A895F /* BuildConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008185122B57986008A895F /* BuildConfig.framework */; }; + D008185422B57994008A895F /* BuildConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008185322B57994008A895F /* BuildConfig.framework */; }; + 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 */; }; @@ -247,7 +204,6 @@ 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, ); }; }; - D01A47551F4DBED700383CC1 /* HockeySDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D01A47541F4DBED700383CC1 /* HockeySDK.framework */; }; D021D4D9219CAEDD0064BEBA /* Config-Fork.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D021D4D8219CAEDD0064BEBA /* Config-Fork.xcconfig */; }; D02CF5FD215D9ABF00E0F56A /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AA1A671D568BA400152314 /* UserNotifications.framework */; }; D02CF5FE215D9ABF00E0F56A /* UserNotificationsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AA1A691D568BA400152314 /* UserNotificationsUI.framework */; }; @@ -257,9 +213,7 @@ D02CF617215DA24900E0F56A /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02CF616215DA24900E0F56A /* Postbox.framework */; }; D02CF619215DA24900E0F56A /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02CF618215DA24900E0F56A /* SwiftSignalKit.framework */; }; D02CF61B215DA24900E0F56A /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02CF61A215DA24900E0F56A /* TelegramCore.framework */; }; - D02CF61C215E51D500E0F56A /* BuildConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D09250011FE52D2A003F693F /* BuildConfig.m */; }; D02E31231BD803E800CD3F01 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D02E31221BD803E800CD3F01 /* main.m */; }; - D0338736223A9A9A007A2CE4 /* Config-Hockeyapp-Internal.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D0338735223A9A99007A2CE4 /* Config-Hockeyapp-Internal.xcconfig */; }; D03B0E7B1D63484500955575 /* ShareRootController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0E7A1D63484500955575 /* ShareRootController.swift */; }; D03B0E821D63484500955575 /* Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = D03B0E781D63484500955575 /* Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; D03B0E8A1D634B1100955575 /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03B0E871D634B1100955575 /* Display.framework */; }; @@ -297,16 +251,9 @@ D04FA1CF2145E3810006EF45 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D04FA1C32145E3810006EF45 /* InfoPlist.strings */; }; D04FA1D02145E3810006EF45 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D04FA1C62145E3810006EF45 /* InfoPlist.strings */; }; D051DB0B215E5D1C00F30F92 /* TelegramUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0400ED81D5B8F97007931CE /* TelegramUI.framework */; }; - D051DB5D21602D6E00F30F92 /* LegacyDataImportSplash.swift in Sources */ = {isa = PBXBuildFile; fileRef = D051DB5C21602D6E00F30F92 /* LegacyDataImportSplash.swift */; }; D052974622B0073F004ABAF6 /* WhiteFilledIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D052974422B0073E004ABAF6 /* WhiteFilledIcon@3x.png */; }; D052974722B0073F004ABAF6 /* WhiteFilledIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D052974522B0073F004ABAF6 /* WhiteFilledIcon@2x.png */; }; - D053DAD32018ED2B00993D32 /* LockedWindowCoveringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D053DAD22018ED2B00993D32 /* LockedWindowCoveringView.swift */; }; D055BD441B7E216400F06C0A /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D055BD431B7E216400F06C0A /* MapKit.framework */; }; - D05B37F51FEA5F6E0041D2A5 /* SnapshotEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B37F41FEA5F6E0041D2A5 /* SnapshotEnvironment.swift */; }; - D05B37F71FEA8C640041D2A5 /* SnapshotSecretChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B37F61FEA8C640041D2A5 /* SnapshotSecretChat.swift */; }; - D05B37F91FEA8CF00041D2A5 /* SnapshotSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B37F81FEA8CF00041D2A5 /* SnapshotSettings.swift */; }; - D05B37FB1FEA8D020041D2A5 /* SnapshotAppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B37FA1FEA8D020041D2A5 /* SnapshotAppearanceSettings.swift */; }; - D05B37FD1FEA8D870041D2A5 /* SnapshotResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B37FC1FEA8D870041D2A5 /* SnapshotResources.swift */; }; D05B380A1FEA8E3D0041D2A5 /* Bitmap2.png in Resources */ = {isa = PBXBuildFile; fileRef = D05B37FF1FEA8E3D0041D2A5 /* Bitmap2.png */; }; D05B380B1FEA8E3D0041D2A5 /* Bitmap3.png in Resources */ = {isa = PBXBuildFile; fileRef = D05B38001FEA8E3D0041D2A5 /* Bitmap3.png */; }; D05B380C1FEA8E3D0041D2A5 /* Bitmap1.png in Resources */ = {isa = PBXBuildFile; fileRef = D05B38011FEA8E3D0041D2A5 /* Bitmap1.png */; }; @@ -322,15 +269,9 @@ D0612E491D58B478000C8F02 /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0612E481D58B478000C8F02 /* Application.swift */; }; 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 */; }; - D06E4C2F21347D9200088087 /* UIImage+ImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = D06E4C2E21347D9200088087 /* UIImage+ImageEffects.m */; }; D073E52021FF7CE900742DDD /* Crypto.m in Sources */ = {isa = PBXBuildFile; fileRef = D073E51F21FF7CE900742DDD /* Crypto.m */; }; D073E52222003E1E00742DDD /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = D073E52122003E1E00742DDD /* Data.swift */; }; - D084023220E1883500065674 /* ApplicationShortcutItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D084023120E1883500065674 /* ApplicationShortcutItem.swift */; }; - D08410451FABDC5D008FFE92 /* TGItemProviderSignals.m in Sources */ = {isa = PBXBuildFile; fileRef = D08410441FABDC5C008FFE92 /* TGItemProviderSignals.m */; }; - D084104E1FABDCFD008FFE92 /* TGContactModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D084104C1FABDCFD008FFE92 /* TGContactModel.m */; }; - D084104F1FABDCFD008FFE92 /* TGMimeTypeMap.m in Sources */ = {isa = PBXBuildFile; fileRef = D084104D1FABDCFD008FFE92 /* TGMimeTypeMap.m */; }; D08410501FABDD54008FFE92 /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08410511FABDD54008FFE92 /* MtProtoKitDynamic.framework */; }; - D08410541FABE428008FFE92 /* ShareItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08410531FABE428008FFE92 /* ShareItems.swift */; }; 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 */; }; D08985002118B3F100918162 /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08984FF2118B3F100918162 /* Postbox.framework */; }; @@ -364,41 +305,24 @@ D08DB0BE213F4D1D00F2ADBF /* start_arrow_ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D050F2331E49DEDE00988324 /* start_arrow_ipad@2x.png */; }; D08DB0BF213F4D1D00F2ADBF /* telegram_plane1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D050F2341E49DEDE00988324 /* telegram_plane1@2x.png */; }; D08DB0C0213F4D1D00F2ADBF /* telegram_sphere@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D050F2351E49DEDE00988324 /* telegram_sphere@2x.png */; }; - D09250021FE52D2A003F693F /* BuildConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D09250011FE52D2A003F693F /* BuildConfig.m */; }; D096C2BE1CC3C021006D814E /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D096C2BD1CC3C021006D814E /* Display.framework */; }; D096C2BF1CC3C021006D814E /* Display.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D096C2BD1CC3C021006D814E /* Display.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; D096C2C21CC3C104006D814E /* Postbox.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D096C2C01CC3C104006D814E /* Postbox.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; D096C2C51CC3C11A006D814E /* SwiftSignalKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D096C2C31CC3C11A006D814E /* SwiftSignalKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; D09A59601B5858DB00FC3724 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09A595F1B5858DB00FC3724 /* SystemConfiguration.framework */; }; - D09B79C52219C784003B1F9D /* SharedAccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09B79C42219C784003B1F9D /* SharedAccountInfo.swift */; }; - D09B79C62219C784003B1F9D /* SharedAccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09B79C42219C784003B1F9D /* SharedAccountInfo.swift */; }; - D09B79C82219C7AE003B1F9D /* ManageSharedAccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09B79C72219C7AE003B1F9D /* ManageSharedAccountInfo.swift */; }; D09DCBB71D0C856B00F51FFE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D09DCBB51D0C856B00F51FFE /* Localizable.strings */; }; D0A18D631E149043004C6734 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0A18D621E149043004C6734 /* PushKit.framework */; }; - D0A18D651E15C020004C6734 /* WakeupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A18D641E15C020004C6734 /* WakeupManager.swift */; }; - D0ADF958212B56DC00310BBC /* LegacyUserDataImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ADF957212B56DC00310BBC /* LegacyUserDataImport.swift */; }; - D0ADF95A212B5AC600310BBC /* LegacyResourceImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ADF959212B5AC600310BBC /* LegacyResourceImport.swift */; }; - D0ADF95C212B636D00310BBC /* LegacyChatImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ADF95B212B636D00310BBC /* LegacyChatImport.swift */; }; - D0ADF95E212C818F00310BBC /* LegacyPreferencesImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ADF95D212C818F00310BBC /* LegacyPreferencesImport.swift */; }; - D0ADF961212C8DF600310BBC /* TGAutoDownloadPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = D0ADF95F212C8DF600310BBC /* TGAutoDownloadPreferences.m */; }; - D0ADF964212C9AA900310BBC /* TGProxyItem.m in Sources */ = {isa = PBXBuildFile; fileRef = D0ADF963212C9AA900310BBC /* TGProxyItem.m */; }; D0AF32291FACA1920097362B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D17E891CAAD66600C4750B /* Accelerate.framework */; }; D0AF322C1FACA1B00097362B /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B8445F1DACF561005F29E1 /* libc++.tbd */; }; - D0AF322F1FACBA280097362B /* TGShareLocationSignals.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AF322D1FACBA270097362B /* TGShareLocationSignals.m */; }; - D0B21B0D2203A9A1003F741D /* SharedWakeupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B0C2203A9A1003F741D /* SharedWakeupManager.swift */; }; - D0B21B0F220438E9003F741D /* SharedNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B0E220438E9003F741D /* SharedNotificationManager.swift */; }; D0B2F738204F4C9900D3BFB9 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0E41A381D65A69C00FBFC00 /* NotificationCenter.framework */; }; D0B2F742204F4C9900D3BFB9 /* Widget.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = D0B2F737204F4C9900D3BFB9 /* Widget.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; D0B2F74A204F4D6100D3BFB9 /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B2F74F204F4D6100D3BFB9 /* Postbox.framework */; }; D0B2F74B204F4D6100D3BFB9 /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B2F750204F4D6100D3BFB9 /* SwiftSignalKit.framework */; }; D0B2F74C204F4D6100D3BFB9 /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B2F751204F4D6100D3BFB9 /* TelegramCore.framework */; }; - D0B2F755204F4EAF00D3BFB9 /* BuildConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D09250011FE52D2A003F693F /* BuildConfig.m */; }; D0B2F7602050102600D3BFB9 /* PeerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B2F75F2050102600D3BFB9 /* PeerNode.swift */; }; - D0B3B53B21666C0000FC60A0 /* LegacyFileImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B3B53A21666C0000FC60A0 /* LegacyFileImport.swift */; }; 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 */; }; - D0BEAF731E54C9A900BD963D /* ApplicationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BEAF721E54C9A900BD963D /* ApplicationContext.swift */; }; 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, ); }; }; @@ -406,7 +330,6 @@ D0CCD61D222EFFB000EE1E08 /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CCD61C222EFFB000EE1E08 /* MtProtoKitDynamic.framework */; }; D0CD17B51CC3AE14007C5650 /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CD17B41CC3AE14007C5650 /* AsyncDisplayKit.framework */; }; D0CD17B61CC3AE14007C5650 /* AsyncDisplayKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0CD17B41CC3AE14007C5650 /* AsyncDisplayKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - D0CE6F1C213ED11100BCD44B /* TGPresentationAutoNightPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = D0CE6F1B213ED11100BCD44B /* TGPresentationAutoNightPreferences.m */; }; D0CE6F55213EDA4400BCD44B /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0CE6F1E213EDA4200BCD44B /* Localizable.strings */; }; D0CE6F56213EDA4400BCD44B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0CE6F20213EDA4200BCD44B /* InfoPlist.strings */; }; D0CE6F57213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = D0CE6F22213EDA4200BCD44B /* AppIntentVocabulary.plist */; }; @@ -432,11 +355,7 @@ D0CE6F6B213EDA4400BCD44B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0CE6F51213EDA4400BCD44B /* InfoPlist.strings */; }; D0CE6F6C213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = D0CE6F53213EDA4400BCD44B /* AppIntentVocabulary.plist */; }; D0CFBB931FD88C2900B65C0D /* begin_record.caf in Resources */ = {isa = PBXBuildFile; fileRef = D0CFBB921FD88C2900B65C0D /* begin_record.caf */; }; - D0D102682212E9E6003ADA5E /* SharedWakeupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B0C2203A9A1003F741D /* SharedWakeupManager.swift */; }; - D0D102692212F719003ADA5E /* SharedNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B0E220438E9003F741D /* SharedNotificationManager.swift */; }; - D0D1026A2212F804003ADA5E /* ClearNotificationsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EB243A201B77C400F6CC13 /* ClearNotificationsManager.swift */; }; D0D17E8A1CAAD66600C4750B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D17E891CAAD66600C4750B /* Accelerate.framework */; }; - D0D2276F212739120028F943 /* LegacyDataImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D2276E212739120028F943 /* LegacyDataImport.swift */; }; 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 */; }; @@ -447,14 +366,9 @@ D0E8B8B12044496C00605593 /* voip_busy.caf in Resources */ = {isa = PBXBuildFile; fileRef = D0E8B8AC2044496C00605593 /* voip_busy.caf */; }; D0E8C2DE2285EA55009F26E8 /* BlackIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0E8C2DD2285EA55009F26E8 /* BlackIcon@2x.png */; }; D0E8C2E02285EA6A009F26E8 /* BlackIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0E8C2DF2285EA6A009F26E8 /* BlackIcon@3x.png */; }; - D0EA97941FE84F2D00792DD6 /* BuildConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D09250011FE52D2A003F693F /* BuildConfig.m */; }; - D0EA97951FE84F2E00792DD6 /* BuildConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D09250011FE52D2A003F693F /* BuildConfig.m */; }; - D0EB243B201B77C400F6CC13 /* ClearNotificationsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EB243A201B77C400F6CC13 /* ClearNotificationsManager.swift */; }; 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 */; }; - D0ECCB8D1FE9CE3F00609802 /* SnapshotChatList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ECCB8C1FE9CE3F00609802 /* SnapshotChatList.swift */; }; D0ED633A21FF3EDF001D4648 /* AccountData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED633921FF3EDF001D4648 /* AccountData.swift */; }; - D0ED633B21FF3EFD001D4648 /* BuildConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D09250011FE52D2A003F693F /* BuildConfig.m */; }; 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 */; }; @@ -599,13 +513,17 @@ 09A218EB22A1570900DE6898 /* BlackFilledIcon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlackFilledIcon@3x.png"; sourceTree = ""; }; 09A218EC22A1570900DE6898 /* BlueFilledIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlueFilledIcon@2x.png"; sourceTree = ""; }; 09A218ED22A1570900DE6898 /* BlueIcon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlueIcon@3x.png"; sourceTree = ""; }; + 09A4192A22B7A4D300637EB4 /* BlueClassicIconIpad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlueClassicIconIpad@2x.png"; sourceTree = ""; }; + 09A4192B22B7A4D400637EB4 /* BlackClassicIconLargeIpad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlackClassicIconLargeIpad@2x.png"; sourceTree = ""; }; + 09A4192C22B7A4D400637EB4 /* BlueClassicIconIpad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BlueClassicIconIpad.png; sourceTree = ""; }; + 09A4192D22B7A4D400637EB4 /* BlueClassicIconLargeIpad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlueClassicIconLargeIpad@2x.png"; sourceTree = ""; }; + 09A4192E22B7A4D400637EB4 /* BlackClassicIconIpad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BlackClassicIconIpad.png; sourceTree = ""; }; + 09A4192F22B7A4D400637EB4 /* BlackClassicIconIpad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlackClassicIconIpad@2x.png"; sourceTree = ""; }; 09C50E7921738178009E676F /* TGBridgeServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeServer.h; sourceTree = ""; }; 09C50E7A21738178009E676F /* TGBridgeServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeServer.m; sourceTree = ""; }; 09C50E852173854D009E676F /* WatchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchKit.framework; path = System/Library/Frameworks/WatchKit.framework; sourceTree = SDKROOT; }; 09C50E87217385CF009E676F /* WatchConnectivity.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchConnectivity.framework; path = System/Library/Frameworks/WatchConnectivity.framework; sourceTree = SDKROOT; }; 09C50E892173AEDB009E676F /* WatchRequestHandlers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchRequestHandlers.swift; sourceTree = ""; }; - 09C50E8F2173B247009E676F /* TGBridgeSubscriptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeSubscriptions.m; path = Bridge/TGBridgeSubscriptions.m; sourceTree = ""; }; - 09C50E902173B247009E676F /* TGBridgeSubscriptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeSubscriptions.h; path = Bridge/TGBridgeSubscriptions.h; sourceTree = ""; }; 09C56F8B2172797200BDF00F /* Watch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Watch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 09C56F8E2172797200BDF00F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; 09C56F902172797400BDF00F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -870,70 +788,19 @@ 09C572C9217292BB00BDF00F /* TGBridgeStateSignal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeStateSignal.m; path = Bridge/TGBridgeStateSignal.m; sourceTree = ""; }; 09C572CA217292BB00BDF00F /* TGBridgeUserInfoSignals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeUserInfoSignals.m; path = Bridge/TGBridgeUserInfoSignals.m; sourceTree = ""; }; 09C572CC2172939F00BDF00F /* TGBridgeClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeClient.h; path = Bridge/TGBridgeClient.h; sourceTree = ""; }; - 09C572CE2172939F00BDF00F /* TGBridgeCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeCommon.m; path = Bridge/TGBridgeCommon.m; sourceTree = ""; }; - 09C572CF2172939F00BDF00F /* TGBridgeCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeCommon.h; path = Bridge/TGBridgeCommon.h; sourceTree = ""; }; 09C572D02172939F00BDF00F /* TGBridgeClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeClient.m; path = Bridge/TGBridgeClient.m; sourceTree = ""; }; - 09C572D62172953200BDF00F /* TGBridgeMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeMediaAttachment.h; path = Bridge/TGBridgeMediaAttachment.h; sourceTree = ""; }; 09C572D72172953300BDF00F /* TGBridgeMessage+TGTableItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "TGBridgeMessage+TGTableItem.m"; path = "Bridge/TGBridgeMessage+TGTableItem.m"; sourceTree = ""; }; 09C572D92172953300BDF00F /* TGBridgeBotReplyMarkup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeBotReplyMarkup.m; path = Bridge/TGBridgeBotReplyMarkup.m; sourceTree = ""; }; - 09C572DA2172953300BDF00F /* TGBridgeContactMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeContactMediaAttachment.h; path = Bridge/TGBridgeContactMediaAttachment.h; sourceTree = ""; }; 09C572DB2172953300BDF00F /* TGBridgeChat+TGTableItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "TGBridgeChat+TGTableItem.h"; path = "Bridge/TGBridgeChat+TGTableItem.h"; sourceTree = ""; }; - 09C572DC2172953300BDF00F /* TGBridgeActionMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeActionMediaAttachment.h; path = Bridge/TGBridgeActionMediaAttachment.h; sourceTree = ""; }; 09C572DD2172953300BDF00F /* TGBridgeBotReplyMarkup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeBotReplyMarkup.h; path = Bridge/TGBridgeBotReplyMarkup.h; sourceTree = ""; }; - 09C572DE2172953300BDF00F /* TGBridgeContactMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeContactMediaAttachment.m; path = Bridge/TGBridgeContactMediaAttachment.m; sourceTree = ""; }; - 09C572DF2172953300BDF00F /* TGBridgeMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeMessage.m; path = Bridge/TGBridgeMessage.m; sourceTree = ""; }; - 09C572E02172953300BDF00F /* TGBridgeAudioMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeAudioMediaAttachment.m; path = Bridge/TGBridgeAudioMediaAttachment.m; sourceTree = ""; }; - 09C572E12172953300BDF00F /* TGBridgeReplyMarkupMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeReplyMarkupMediaAttachment.h; path = Bridge/TGBridgeReplyMarkupMediaAttachment.h; sourceTree = ""; }; - 09C572E22172953300BDF00F /* TGBridgeActionMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeActionMediaAttachment.m; path = Bridge/TGBridgeActionMediaAttachment.m; sourceTree = ""; }; 09C572E32172953400BDF00F /* TGBridgeStickerPack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeStickerPack.m; path = Bridge/TGBridgeStickerPack.m; sourceTree = ""; }; - 09C572E42172953400BDF00F /* TGBridgeVideoMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeVideoMediaAttachment.m; path = Bridge/TGBridgeVideoMediaAttachment.m; sourceTree = ""; }; - 09C572E62172953400BDF00F /* TGBridgeForwardedMessageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeForwardedMessageMediaAttachment.m; path = Bridge/TGBridgeForwardedMessageMediaAttachment.m; sourceTree = ""; }; - 09C572E72172953400BDF00F /* TGBridgeLocationMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeLocationMediaAttachment.h; path = Bridge/TGBridgeLocationMediaAttachment.h; sourceTree = ""; }; - 09C572E82172953400BDF00F /* TGBridgeBotInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeBotInfo.h; path = Bridge/TGBridgeBotInfo.h; sourceTree = ""; }; 09C572E92172953400BDF00F /* TGBridgeUser+TGTableItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "TGBridgeUser+TGTableItem.m"; path = "Bridge/TGBridgeUser+TGTableItem.m"; sourceTree = ""; }; - 09C572EA2172953400BDF00F /* TGBridgeBotCommandInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeBotCommandInfo.h; path = Bridge/TGBridgeBotCommandInfo.h; sourceTree = ""; }; - 09C572EB2172953400BDF00F /* TGBridgeUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeUser.h; path = Bridge/TGBridgeUser.h; sourceTree = ""; }; - 09C572EC2172953400BDF00F /* TGBridgeReplyMessageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeReplyMessageMediaAttachment.h; path = Bridge/TGBridgeReplyMessageMediaAttachment.h; sourceTree = ""; }; - 09C572ED2172953400BDF00F /* TGBridgeUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeUser.m; path = Bridge/TGBridgeUser.m; sourceTree = ""; }; - 09C572EE2172953400BDF00F /* TGBridgeImageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeImageMediaAttachment.h; path = Bridge/TGBridgeImageMediaAttachment.h; sourceTree = ""; }; - 09C572EF2172953500BDF00F /* TGBridgeBotCommandInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeBotCommandInfo.m; path = Bridge/TGBridgeBotCommandInfo.m; sourceTree = ""; }; - 09C572F02172953500BDF00F /* TGBridgeDocumentMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeDocumentMediaAttachment.h; path = Bridge/TGBridgeDocumentMediaAttachment.h; sourceTree = ""; }; - 09C572F12172953500BDF00F /* TGBridgeChat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeChat.h; path = Bridge/TGBridgeChat.h; sourceTree = ""; }; - 09C572F22172953500BDF00F /* TGBridgeImageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeImageMediaAttachment.m; path = Bridge/TGBridgeImageMediaAttachment.m; sourceTree = ""; }; - 09C572F32172953500BDF00F /* TGBridgeLocationVenue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeLocationVenue.m; path = Bridge/TGBridgeLocationVenue.m; sourceTree = ""; }; - 09C572F42172953500BDF00F /* TGBridgeMessageEntities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeMessageEntities.m; path = Bridge/TGBridgeMessageEntities.m; sourceTree = ""; }; - 09C572F52172953500BDF00F /* TGBridgeWebPageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeWebPageMediaAttachment.m; path = Bridge/TGBridgeWebPageMediaAttachment.m; sourceTree = ""; }; 09C572F62172953500BDF00F /* TGBridgeChat+TGTableItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "TGBridgeChat+TGTableItem.m"; path = "Bridge/TGBridgeChat+TGTableItem.m"; sourceTree = ""; }; 09C572F72172953500BDF00F /* TGBridgeMessage+TGTableItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "TGBridgeMessage+TGTableItem.h"; path = "Bridge/TGBridgeMessage+TGTableItem.h"; sourceTree = ""; }; - 09C572F82172953500BDF00F /* TGBridgeMessageEntitiesAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeMessageEntitiesAttachment.h; path = Bridge/TGBridgeMessageEntitiesAttachment.h; sourceTree = ""; }; - 09C572F92172953600BDF00F /* TGBridgeMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeMediaAttachment.m; path = Bridge/TGBridgeMediaAttachment.m; sourceTree = ""; }; - 09C572FA2172953600BDF00F /* TGBridgeMessageEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeMessageEntities.h; path = Bridge/TGBridgeMessageEntities.h; sourceTree = ""; }; - 09C572FB2172953600BDF00F /* TGBridgeDocumentMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeDocumentMediaAttachment.m; path = Bridge/TGBridgeDocumentMediaAttachment.m; sourceTree = ""; }; - 09C572FC2172953600BDF00F /* TGBridgePeerNotificationSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgePeerNotificationSettings.m; path = Bridge/TGBridgePeerNotificationSettings.m; sourceTree = ""; }; - 09C572FD2172953600BDF00F /* TGBridgeReplyMessageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeReplyMessageMediaAttachment.m; path = Bridge/TGBridgeReplyMessageMediaAttachment.m; sourceTree = ""; }; - 09C572FE2172953600BDF00F /* TGBridgeForwardedMessageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeForwardedMessageMediaAttachment.h; path = Bridge/TGBridgeForwardedMessageMediaAttachment.h; sourceTree = ""; }; 09C572FF2172953600BDF00F /* TGBridgeLocationVenue+TGTableItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "TGBridgeLocationVenue+TGTableItem.m"; path = "Bridge/TGBridgeLocationVenue+TGTableItem.m"; sourceTree = ""; }; - 09C573002172953600BDF00F /* TGBridgeLocationMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeLocationMediaAttachment.m; path = Bridge/TGBridgeLocationMediaAttachment.m; sourceTree = ""; }; - 09C573022172953600BDF00F /* TGBridgePeerNotificationSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgePeerNotificationSettings.h; path = Bridge/TGBridgePeerNotificationSettings.h; sourceTree = ""; }; - 09C573032172953600BDF00F /* TGBridgeContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeContext.h; path = Bridge/TGBridgeContext.h; sourceTree = ""; }; - 09C573042172953700BDF00F /* TGBridgeMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeMessage.h; path = Bridge/TGBridgeMessage.h; sourceTree = ""; }; 09C573052172953700BDF00F /* TGBridgeUser+TGTableItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "TGBridgeUser+TGTableItem.h"; path = "Bridge/TGBridgeUser+TGTableItem.h"; sourceTree = ""; }; - 09C573062172953700BDF00F /* TGBridgeVideoMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeVideoMediaAttachment.h; path = Bridge/TGBridgeVideoMediaAttachment.h; sourceTree = ""; }; - 09C573072172953700BDF00F /* TGBridgeContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeContext.m; path = Bridge/TGBridgeContext.m; sourceTree = ""; }; - 09C573082172953700BDF00F /* TGBridgeAudioMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeAudioMediaAttachment.h; path = Bridge/TGBridgeAudioMediaAttachment.h; sourceTree = ""; }; - 09C573092172953700BDF00F /* TGBridgeChat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeChat.m; path = Bridge/TGBridgeChat.m; sourceTree = ""; }; - 09C5730A2172953700BDF00F /* TGBridgeMessageEntitiesAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeMessageEntitiesAttachment.m; path = Bridge/TGBridgeMessageEntitiesAttachment.m; sourceTree = ""; }; - 09C5730B2172953700BDF00F /* TGBridgeLocationVenue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeLocationVenue.h; path = Bridge/TGBridgeLocationVenue.h; sourceTree = ""; }; - 09C5730C2172953700BDF00F /* TGBridgeChatMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeChatMessages.m; path = Bridge/TGBridgeChatMessages.m; sourceTree = ""; }; - 09C5730D2172953800BDF00F /* TGBridgeReplyMarkupMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeReplyMarkupMediaAttachment.m; path = Bridge/TGBridgeReplyMarkupMediaAttachment.m; sourceTree = ""; }; - 09C5730F2172953800BDF00F /* TGBridgeUnsupportedMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeUnsupportedMediaAttachment.m; path = Bridge/TGBridgeUnsupportedMediaAttachment.m; sourceTree = ""; }; - 09C573102172953800BDF00F /* TGBridgeBotInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGBridgeBotInfo.m; path = Bridge/TGBridgeBotInfo.m; sourceTree = ""; }; - 09C573112172953800BDF00F /* TGBridgeUnsupportedMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeUnsupportedMediaAttachment.h; path = Bridge/TGBridgeUnsupportedMediaAttachment.h; sourceTree = ""; }; - 09C573122172953800BDF00F /* TGBridgeWebPageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeWebPageMediaAttachment.h; path = Bridge/TGBridgeWebPageMediaAttachment.h; sourceTree = ""; }; 09C573132172953800BDF00F /* TGBridgeStickerPack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeStickerPack.h; path = Bridge/TGBridgeStickerPack.h; sourceTree = ""; }; - 09C573142172953800BDF00F /* TGBridgeChatMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgeChatMessages.h; path = Bridge/TGBridgeChatMessages.h; sourceTree = ""; }; 09C573152172953800BDF00F /* TGBridgeLocationVenue+TGTableItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "TGBridgeLocationVenue+TGTableItem.h"; path = "Bridge/TGBridgeLocationVenue+TGTableItem.h"; sourceTree = ""; }; - 09C573362172974E00BDF00F /* TGBridgePeerIdAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGBridgePeerIdAdapter.h; path = Bridge/TGBridgePeerIdAdapter.h; sourceTree = ""; }; 09CFB211217299E80083F7A3 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.0.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; 09D304212174335F00C00567 /* WatchBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchBridge.swift; sourceTree = ""; }; 09EBE29922B004E800F670AB /* BlueFilledIconIpad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BlueFilledIconIpad.png; sourceTree = ""; }; @@ -956,9 +823,18 @@ D000CAC821FB6E370011B15D /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; D001D5A91F878DA300DF975A /* PhoneCountries.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = PhoneCountries.txt; path = "Telegram-iOS/Resources/PhoneCountries.txt"; sourceTree = ""; }; D006CFA121A8D12600FDCD32 /* ModernProto.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ModernProto.framework; path = "../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-ffbqcdyqpehxdvcwhyaorlehrrdc/Build/Products/Debug Hockeyapp-iphoneos/ModernProto.framework"; sourceTree = ""; }; + D008184B22B578EC008A895F /* WatchCommon.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WatchCommon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008184D22B5796E008A895F /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008184F22B5797A008A895F /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008185122B57986008A895F /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008185322B57994008A895F /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008185522B579A1008A895F /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008185722B579AD008A895F /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008185922B57EF5008A895F /* WatchCommon.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WatchCommon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D00818A422B58CCB008A895F /* WatchCommonWatch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WatchCommonWatch.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D00818CE22B595DB008A895F /* LightweightAccountData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LightweightAccountData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D008599C1B28189D00EAF753 /* Telegram.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Telegram.app; sourceTree = BUILT_PRODUCTS_DIR; }; D00859A01B28189D00EAF753 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D00859A11B28189D00EAF753 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; D00859A81B28189D00EAF753 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; D00859AB1B28189D00EAF753 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; D00859B61B28189D00EAF753 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -1061,16 +937,9 @@ D050F2341E49DEDE00988324 /* telegram_plane1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_plane1@2x.png"; sourceTree = ""; }; D050F2351E49DEDE00988324 /* telegram_sphere@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_sphere@2x.png"; sourceTree = ""; }; D051DB0C215E5E2300F30F92 /* NotificationContent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NotificationContent.entitlements; sourceTree = ""; }; - D051DB5C21602D6E00F30F92 /* LegacyDataImportSplash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyDataImportSplash.swift; sourceTree = ""; }; D052974422B0073E004ABAF6 /* WhiteFilledIcon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "WhiteFilledIcon@3x.png"; sourceTree = ""; }; D052974522B0073F004ABAF6 /* WhiteFilledIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "WhiteFilledIcon@2x.png"; sourceTree = ""; }; - D053DAD22018ED2B00993D32 /* LockedWindowCoveringView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockedWindowCoveringView.swift; sourceTree = ""; }; D055BD431B7E216400F06C0A /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; - D05B37F41FEA5F6E0041D2A5 /* SnapshotEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotEnvironment.swift; sourceTree = ""; }; - D05B37F61FEA8C640041D2A5 /* SnapshotSecretChat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotSecretChat.swift; sourceTree = ""; }; - D05B37F81FEA8CF00041D2A5 /* SnapshotSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotSettings.swift; sourceTree = ""; }; - D05B37FA1FEA8D020041D2A5 /* SnapshotAppearanceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotAppearanceSettings.swift; sourceTree = ""; }; - D05B37FC1FEA8D870041D2A5 /* SnapshotResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotResources.swift; sourceTree = ""; }; D05B37FF1FEA8E3D0041D2A5 /* Bitmap2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Bitmap2.png; sourceTree = ""; }; D05B38001FEA8E3D0041D2A5 /* Bitmap3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Bitmap3.png; sourceTree = ""; }; D05B38011FEA8E3D0041D2A5 /* Bitmap1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Bitmap1.png; sourceTree = ""; }; @@ -1084,44 +953,27 @@ D05B38091FEA8E3D0041D2A5 /* Bitmap11.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Bitmap11.png; sourceTree = ""; }; D0612E481D58B478000C8F02 /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = ""; }; D06706601D51185400DED3E3 /* TelegramCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D06E4C2D21347D9200088087 /* UIImage+ImageEffects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+ImageEffects.h"; sourceTree = ""; }; - D06E4C2E21347D9200088087 /* UIImage+ImageEffects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+ImageEffects.m"; sourceTree = ""; }; 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 = ""; }; - D07477B522A72B1F002737C4 /* TempRoot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TempRoot.swift; sourceTree = ""; }; - D07477B722A732F1002737C4 /* TempMain.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TempMain.m; sourceTree = ""; }; D079FD001F06BBD10038FADE /* Telegram-iOS-AppStore.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Telegram-iOS-AppStore.entitlements"; sourceTree = ""; }; - D084023120E1883500065674 /* ApplicationShortcutItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationShortcutItem.swift; sourceTree = ""; }; - D08410431FABDC5B008FFE92 /* TGItemProviderSignals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGItemProviderSignals.h; sourceTree = ""; }; - D08410441FABDC5C008FFE92 /* TGItemProviderSignals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGItemProviderSignals.m; 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; }; - D084104A1FABDCFD008FFE92 /* TGContactModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGContactModel.h; sourceTree = ""; }; - D084104B1FABDCFD008FFE92 /* TGMimeTypeMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMimeTypeMap.h; sourceTree = ""; }; - D084104C1FABDCFD008FFE92 /* TGContactModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGContactModel.m; sourceTree = ""; }; - D084104D1FABDCFD008FFE92 /* TGMimeTypeMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMimeTypeMap.m; sourceTree = ""; }; D08410511FABDD54008FFE92 /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MtProtoKitDynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D08410521FABDEC8008FFE92 /* Share-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Share-Bridging-Header.h"; sourceTree = ""; }; - D08410531FABE428008FFE92 /* ShareItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareItems.swift; sourceTree = ""; }; D08984FD2118B3F100918162 /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MtProtoKitDynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D08984FF2118B3F100918162 /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D08985012118B3F100918162 /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D08985032118B46F00918162 /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D08985052118B62400918162 /* SiriIntents-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SiriIntents-Bridging-Header.h"; sourceTree = ""; }; D08985062119B7FE00918162 /* IntentContacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntentContacts.swift; sourceTree = ""; }; - D09250001FE52D2A003F693F /* BuildConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BuildConfig.h; sourceTree = ""; }; - D09250011FE52D2A003F693F /* BuildConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BuildConfig.m; sourceTree = ""; }; D096C2BD1CC3C021006D814E /* Display.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D096C2C01CC3C104006D814E /* Postbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D096C2C31CC3C11A006D814E /* SwiftSignalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D09A595F1B5858DB00FC3724 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; D09A59B71B5876B600FC3724 /* Telegram-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Telegram-Bridging-Header.h"; sourceTree = ""; }; - D09B79C42219C784003B1F9D /* SharedAccountInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedAccountInfo.swift; sourceTree = ""; }; - D09B79C72219C7AE003B1F9D /* ManageSharedAccountInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManageSharedAccountInfo.swift; sourceTree = ""; }; D09DCBB61D0C856B00F51FFE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; D0A18D621E149043004C6734 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; - D0A18D641E15C020004C6734 /* WakeupManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WakeupManager.swift; sourceTree = ""; }; D0AA1A671D568BA400152314 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; D0AA1A691D568BA400152314 /* UserNotificationsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotificationsUI.framework; path = System/Library/Frameworks/UserNotificationsUI.framework; sourceTree = SDKROOT; }; D0AB0B9F1D6708B9002C78E7 /* Postbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Postbox.framework; path = "submodules/Postbox/build/Debug-iphoneos/Postbox.framework"; sourceTree = ""; }; @@ -1131,19 +983,7 @@ D0ADF953212B3B4700310BBC /* Share-AppStoreLLC.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Share-AppStoreLLC.entitlements"; sourceTree = ""; }; D0ADF954212B3B5200310BBC /* SiriIntents-AppStoreLLC.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "SiriIntents-AppStoreLLC.entitlements"; sourceTree = ""; }; D0ADF955212B3B6400310BBC /* Widget-AppStoreLLC.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Widget-AppStoreLLC.entitlements"; sourceTree = ""; }; - D0ADF957212B56DC00310BBC /* LegacyUserDataImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyUserDataImport.swift; sourceTree = ""; }; - D0ADF959212B5AC600310BBC /* LegacyResourceImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyResourceImport.swift; sourceTree = ""; }; - D0ADF95B212B636D00310BBC /* LegacyChatImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyChatImport.swift; sourceTree = ""; }; - D0ADF95D212C818F00310BBC /* LegacyPreferencesImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyPreferencesImport.swift; sourceTree = ""; }; - D0ADF95F212C8DF600310BBC /* TGAutoDownloadPreferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGAutoDownloadPreferences.m; sourceTree = ""; }; - D0ADF960212C8DF600310BBC /* TGAutoDownloadPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGAutoDownloadPreferences.h; sourceTree = ""; }; - D0ADF962212C9AA900310BBC /* TGProxyItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGProxyItem.h; sourceTree = ""; }; - D0ADF963212C9AA900310BBC /* TGProxyItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGProxyItem.m; sourceTree = ""; }; D0AF322A1FACA1A80097362B /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; }; - D0AF322D1FACBA270097362B /* TGShareLocationSignals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGShareLocationSignals.m; sourceTree = ""; }; - D0AF322E1FACBA270097362B /* TGShareLocationSignals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGShareLocationSignals.h; sourceTree = ""; }; - D0B21B0C2203A9A1003F741D /* SharedWakeupManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedWakeupManager.swift; sourceTree = ""; }; - D0B21B0E220438E9003F741D /* SharedNotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedNotificationManager.swift; sourceTree = ""; }; D0B2F737204F4C9900D3BFB9 /* Widget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Widget.appex; sourceTree = BUILT_PRODUCTS_DIR; }; D0B2F74E204F4D6100D3BFB9 /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0B2F74F204F4D6100D3BFB9 /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1155,11 +995,9 @@ D0B2F75A204F51E400D3BFB9 /* Widget-AppStore.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Widget-AppStore.entitlements"; sourceTree = ""; }; D0B2F75B204F51E500D3BFB9 /* Widget-HockeyApp.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Widget-HockeyApp.entitlements"; sourceTree = ""; }; D0B2F75F2050102600D3BFB9 /* PeerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerNode.swift; sourceTree = ""; }; - D0B3B53A21666C0000FC60A0 /* LegacyFileImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyFileImport.swift; sourceTree = ""; }; 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; }; - D0BEAF721E54C9A900BD963D /* ApplicationContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationContext.swift; 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; }; @@ -1170,8 +1008,6 @@ D0CAF3171D76394C0011F558 /* TelegramCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TelegramCore.framework; path = "submodules/TelegramCore/build/Debug-iphoneos/TelegramCore.framework"; sourceTree = ""; }; D0CCD61C222EFFB000EE1E08 /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MtProtoKitDynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0CD17B41CC3AE14007C5650 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D0CE6F1A213ED11100BCD44B /* TGPresentationAutoNightPreferences.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TGPresentationAutoNightPreferences.h; sourceTree = ""; }; - D0CE6F1B213ED11100BCD44B /* TGPresentationAutoNightPreferences.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TGPresentationAutoNightPreferences.m; sourceTree = ""; }; D0CE6F1F213EDA4200BCD44B /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = Localizable.strings; sourceTree = ""; }; D0CE6F21213EDA4200BCD44B /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = InfoPlist.strings; sourceTree = ""; }; D0CE6F23213EDA4200BCD44B /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = pt; path = AppIntentVocabulary.plist; sourceTree = ""; }; @@ -1198,7 +1034,6 @@ D0CE6F54213EDA4400BCD44B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = de; path = AppIntentVocabulary.plist; sourceTree = ""; }; D0CFBB921FD88C2900B65C0D /* begin_record.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = begin_record.caf; path = "Telegram-iOS/Resources/begin_record.caf"; sourceTree = ""; }; D0D17E891CAAD66600C4750B /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - D0D2276E212739120028F943 /* LegacyDataImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyDataImport.swift; sourceTree = ""; }; D0D268761D79A70A00C422DA /* SiriIntents.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SiriIntents.appex; sourceTree = BUILT_PRODUCTS_DIR; }; D0D268781D79A70A00C422DA /* IntentHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntentHandler.swift; sourceTree = ""; }; D0D2687A1D79A70A00C422DA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -1223,12 +1058,10 @@ D0EA97961FE8536900792DD6 /* SiriIntents-Hockeyapp.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "SiriIntents-Hockeyapp.entitlements"; sourceTree = ""; }; D0EA97971FE8537000792DD6 /* Share-HockeyApp.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Share-HockeyApp.entitlements"; sourceTree = ""; }; D0EA97981FE8537000792DD6 /* Share-AppStore.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Share-AppStore.entitlements"; sourceTree = ""; }; - D0EB243A201B77C400F6CC13 /* ClearNotificationsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearNotificationsManager.swift; sourceTree = ""; }; D0ECCB7C1FE9C38500609802 /* Telegram-iOS UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Telegram-iOS UITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; - D0ECCB8C1FE9CE3F00609802 /* SnapshotChatList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotChatList.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 = ""; }; @@ -1242,6 +1075,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D00818A522B58CCB008A895F /* WatchCommonWatch.framework in Frameworks */, 0972C6E021791D950069E98A /* UserNotifications.framework in Frameworks */, 09CFB212217299E80083F7A3 /* CoreLocation.framework in Frameworks */, 09C5723D21728C0E00BDF00F /* CoreGraphics.framework in Frameworks */, @@ -1252,6 +1086,8 @@ 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 */, ); @@ -1264,7 +1100,6 @@ D0CAD6A421C03BEB001E3055 /* FFMpeg.framework in Frameworks */, 09C50E88217385CF009E676F /* WatchConnectivity.framework in Frameworks */, 09FDAEE62140477F00BF856F /* MtProtoKitDynamic.framework in Frameworks */, - D01A47551F4DBED700383CC1 /* HockeySDK.framework in Frameworks */, D0A18D631E149043004C6734 /* PushKit.framework in Frameworks */, D0B844601DACF561005F29E1 /* libc++.tbd in Frameworks */, D06706621D5118F500DED3E3 /* TelegramCore.framework in Frameworks */, @@ -1284,6 +1119,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D008185622B579A1008A895F /* BuildConfig.framework in Frameworks */, D051DB0B215E5D1C00F30F92 /* TelegramUI.framework in Frameworks */, D02CF615215DA24900E0F56A /* Display.framework in Frameworks */, D02CF617215DA24900E0F56A /* Postbox.framework in Frameworks */, @@ -1298,6 +1134,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D008185022B5797A008A895F /* BuildConfig.framework in Frameworks */, D0AF322C1FACA1B00097362B /* libc++.tbd in Frameworks */, D0AF32291FACA1920097362B /* Accelerate.framework in Frameworks */, D08410501FABDD54008FFE92 /* MtProtoKitDynamic.framework in Frameworks */, @@ -1312,6 +1149,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D008185422B57994008A895F /* BuildConfig.framework in Frameworks */, D0B2F74A204F4D6100D3BFB9 /* Postbox.framework in Frameworks */, D0B2F74B204F4D6100D3BFB9 /* SwiftSignalKit.framework in Frameworks */, D0B2F74C204F4D6100D3BFB9 /* TelegramCore.framework in Frameworks */, @@ -1323,6 +1161,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D008185222B57986008A895F /* BuildConfig.framework in Frameworks */, D08985042118B46F00918162 /* SwiftSignalKit.framework in Frameworks */, D08984FE2118B3F100918162 /* MtProtoKitDynamic.framework in Frameworks */, D08985002118B3F100918162 /* Postbox.framework in Frameworks */, @@ -1340,14 +1179,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 092F368121542CE4001A9F49 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 092F368221542CF2001A9F49 /* en.lproj */, - ); - path = "Supporting Files"; - sourceTree = ""; - }; 092F368221542CF2001A9F49 /* en.lproj */ = { isa = PBXGroup; children = ( @@ -1367,6 +1198,12 @@ 09A218E122A14E5600DE6898 /* App Icons */ = { isa = PBXGroup; children = ( + 09A4192E22B7A4D400637EB4 /* BlackClassicIconIpad.png */, + 09A4192F22B7A4D400637EB4 /* BlackClassicIconIpad@2x.png */, + 09A4192B22B7A4D400637EB4 /* BlackClassicIconLargeIpad@2x.png */, + 09A4192C22B7A4D400637EB4 /* BlueClassicIconIpad.png */, + 09A4192A22B7A4D300637EB4 /* BlueClassicIconIpad@2x.png */, + 09A4192D22B7A4D400637EB4 /* BlueClassicIconLargeIpad@2x.png */, D052974522B0073F004ABAF6 /* WhiteFilledIcon@2x.png */, D052974422B0073E004ABAF6 /* WhiteFilledIcon@3x.png */, 09EBE2A122B004E900F670AB /* BlackFilledIconIpad.png */, @@ -1511,13 +1348,8 @@ children = ( 09C57290217291BC00BDF00F /* Model */, 09C5728E217291AC00BDF00F /* Signals */, - 09C573362172974E00BDF00F /* TGBridgePeerIdAdapter.h */, 09C572CC2172939F00BDF00F /* TGBridgeClient.h */, 09C572D02172939F00BDF00F /* TGBridgeClient.m */, - 09C572CF2172939F00BDF00F /* TGBridgeCommon.h */, - 09C572CE2172939F00BDF00F /* TGBridgeCommon.m */, - 09C50E902173B247009E676F /* TGBridgeSubscriptions.h */, - 09C50E8F2173B247009E676F /* TGBridgeSubscriptions.m */, ); name = Bridge; sourceTree = ""; @@ -1922,78 +1754,22 @@ 09C57290217291BC00BDF00F /* Model */ = { isa = PBXGroup; children = ( - 09C572CB2172938100BDF00F /* Media */, - 09C572EA2172953400BDF00F /* TGBridgeBotCommandInfo.h */, - 09C572EF2172953500BDF00F /* TGBridgeBotCommandInfo.m */, - 09C572E82172953400BDF00F /* TGBridgeBotInfo.h */, - 09C573102172953800BDF00F /* TGBridgeBotInfo.m */, 09C572DD2172953300BDF00F /* TGBridgeBotReplyMarkup.h */, 09C572D92172953300BDF00F /* TGBridgeBotReplyMarkup.m */, - 09C572F12172953500BDF00F /* TGBridgeChat.h */, - 09C573092172953700BDF00F /* TGBridgeChat.m */, 09C572DB2172953300BDF00F /* TGBridgeChat+TGTableItem.h */, 09C572F62172953500BDF00F /* TGBridgeChat+TGTableItem.m */, - 09C573142172953800BDF00F /* TGBridgeChatMessages.h */, - 09C5730C2172953700BDF00F /* TGBridgeChatMessages.m */, - 09C573032172953600BDF00F /* TGBridgeContext.h */, - 09C573072172953700BDF00F /* TGBridgeContext.m */, - 09C5730B2172953700BDF00F /* TGBridgeLocationVenue.h */, - 09C572F32172953500BDF00F /* TGBridgeLocationVenue.m */, 09C573152172953800BDF00F /* TGBridgeLocationVenue+TGTableItem.h */, 09C572FF2172953600BDF00F /* TGBridgeLocationVenue+TGTableItem.m */, - 09C572D62172953200BDF00F /* TGBridgeMediaAttachment.h */, - 09C572F92172953600BDF00F /* TGBridgeMediaAttachment.m */, - 09C573042172953700BDF00F /* TGBridgeMessage.h */, - 09C572DF2172953300BDF00F /* TGBridgeMessage.m */, 09C572F72172953500BDF00F /* TGBridgeMessage+TGTableItem.h */, 09C572D72172953300BDF00F /* TGBridgeMessage+TGTableItem.m */, - 09C573022172953600BDF00F /* TGBridgePeerNotificationSettings.h */, - 09C572FC2172953600BDF00F /* TGBridgePeerNotificationSettings.m */, 09C573132172953800BDF00F /* TGBridgeStickerPack.h */, 09C572E32172953400BDF00F /* TGBridgeStickerPack.m */, - 09C572EB2172953400BDF00F /* TGBridgeUser.h */, - 09C572ED2172953400BDF00F /* TGBridgeUser.m */, 09C573052172953700BDF00F /* TGBridgeUser+TGTableItem.h */, 09C572E92172953400BDF00F /* TGBridgeUser+TGTableItem.m */, ); name = Model; sourceTree = ""; }; - 09C572CB2172938100BDF00F /* Media */ = { - isa = PBXGroup; - children = ( - 09C572DC2172953300BDF00F /* TGBridgeActionMediaAttachment.h */, - 09C572E22172953300BDF00F /* TGBridgeActionMediaAttachment.m */, - 09C573082172953700BDF00F /* TGBridgeAudioMediaAttachment.h */, - 09C572E02172953300BDF00F /* TGBridgeAudioMediaAttachment.m */, - 09C572DA2172953300BDF00F /* TGBridgeContactMediaAttachment.h */, - 09C572DE2172953300BDF00F /* TGBridgeContactMediaAttachment.m */, - 09C572F02172953500BDF00F /* TGBridgeDocumentMediaAttachment.h */, - 09C572FB2172953600BDF00F /* TGBridgeDocumentMediaAttachment.m */, - 09C572FE2172953600BDF00F /* TGBridgeForwardedMessageMediaAttachment.h */, - 09C572E62172953400BDF00F /* TGBridgeForwardedMessageMediaAttachment.m */, - 09C572EE2172953400BDF00F /* TGBridgeImageMediaAttachment.h */, - 09C572F22172953500BDF00F /* TGBridgeImageMediaAttachment.m */, - 09C572E72172953400BDF00F /* TGBridgeLocationMediaAttachment.h */, - 09C573002172953600BDF00F /* TGBridgeLocationMediaAttachment.m */, - 09C572F82172953500BDF00F /* TGBridgeMessageEntitiesAttachment.h */, - 09C5730A2172953700BDF00F /* TGBridgeMessageEntitiesAttachment.m */, - 09C572E12172953300BDF00F /* TGBridgeReplyMarkupMediaAttachment.h */, - 09C5730D2172953800BDF00F /* TGBridgeReplyMarkupMediaAttachment.m */, - 09C572EC2172953400BDF00F /* TGBridgeReplyMessageMediaAttachment.h */, - 09C572FD2172953600BDF00F /* TGBridgeReplyMessageMediaAttachment.m */, - 09C573112172953800BDF00F /* TGBridgeUnsupportedMediaAttachment.h */, - 09C5730F2172953800BDF00F /* TGBridgeUnsupportedMediaAttachment.m */, - 09C573062172953700BDF00F /* TGBridgeVideoMediaAttachment.h */, - 09C572E42172953400BDF00F /* TGBridgeVideoMediaAttachment.m */, - 09C573122172953800BDF00F /* TGBridgeWebPageMediaAttachment.h */, - 09C572F52172953500BDF00F /* TGBridgeWebPageMediaAttachment.m */, - 09C572FA2172953600BDF00F /* TGBridgeMessageEntities.h */, - 09C572F42172953500BDF00F /* TGBridgeMessageEntities.m */, - ); - name = Media; - sourceTree = ""; - }; D00859931B28189D00EAF753 = { isa = PBXGroup; children = ( @@ -2041,23 +1817,9 @@ D079FD001F06BBD10038FADE /* Telegram-iOS-AppStore.entitlements */, D0E3A7071B285B5000A402D9 /* Telegram-iOS-Hockeyapp.entitlements */, D021D4D7219CAEDD0064BEBA /* Telegram-iOS-Fork.entitlements */, - D00859A11B28189D00EAF753 /* AppDelegate.swift */, - D0BEAF721E54C9A900BD963D /* ApplicationContext.swift */, - D053DAD22018ED2B00993D32 /* LockedWindowCoveringView.swift */, - D084023120E1883500065674 /* ApplicationShortcutItem.swift */, - D0A18D641E15C020004C6734 /* WakeupManager.swift */, - D0EB243A201B77C400F6CC13 /* ClearNotificationsManager.swift */, D00859A81B28189D00EAF753 /* Images.xcassets */, D00859AA1B28189D00EAF753 /* LaunchScreen.xib */, - D0ADF956212B56C200310BBC /* Legacy Data Import */, - D0ECCB8B1FE9CE2B00609802 /* Snapshots */, D008599F1B28189D00EAF753 /* Supporting Files */, - D0B21B0C2203A9A1003F741D /* SharedWakeupManager.swift */, - D0B21B0E220438E9003F741D /* SharedNotificationManager.swift */, - D09B79C42219C784003B1F9D /* SharedAccountInfo.swift */, - D09B79C72219C7AE003B1F9D /* ManageSharedAccountInfo.swift */, - D07477B522A72B1F002737C4 /* TempRoot.swift */, - D07477B722A732F1002737C4 /* TempMain.m */, ); path = "Telegram-iOS"; sourceTree = ""; @@ -2065,11 +1827,7 @@ D008599F1B28189D00EAF753 /* Supporting Files */ = { isa = PBXGroup; children = ( - D06E4C2D21347D9200088087 /* UIImage+ImageEffects.h */, - D06E4C2E21347D9200088087 /* UIImage+ImageEffects.m */, D0612E481D58B478000C8F02 /* Application.swift */, - D09250001FE52D2A003F693F /* BuildConfig.h */, - D09250011FE52D2A003F693F /* BuildConfig.m */, D09DCBB41D0C854D00F51FFE /* en.lproj */, D0CE6F47213EDA4400BCD44B /* ar.lproj */, D0CE6F4E213EDA4400BCD44B /* de.lproj */, @@ -2107,6 +1865,16 @@ D00859C21B281E0000EAF753 /* Frameworks */ = { isa = PBXGroup; children = ( + D00818CE22B595DB008A895F /* LightweightAccountData.framework */, + D00818A422B58CCB008A895F /* WatchCommonWatch.framework */, + D008185922B57EF5008A895F /* WatchCommon.framework */, + D008185722B579AD008A895F /* BuildConfig.framework */, + D008185522B579A1008A895F /* BuildConfig.framework */, + D008185322B57994008A895F /* BuildConfig.framework */, + D008185122B57986008A895F /* BuildConfig.framework */, + D008184F22B5797A008A895F /* BuildConfig.framework */, + D008184D22B5796E008A895F /* BuildConfig.framework */, + D008184B22B578EC008A895F /* WatchCommon.framework */, D015E04C225D2D8F00CB9E8A /* WebP.framework */, D0CCD61C222EFFB000EE1E08 /* MtProtoKitDynamic.framework */, D0CAD6A121C03BE2001E3055 /* FFMpeg.framework */, @@ -2234,23 +2002,14 @@ D03B0E791D63484500955575 /* Share */ = { isa = PBXGroup; children = ( - 092F368121542CE4001A9F49 /* Supporting Files */, + 092F368221542CF2001A9F49 /* en.lproj */, D0ADF953212B3B4700310BBC /* Share-AppStoreLLC.entitlements */, D0EA97981FE8537000792DD6 /* Share-AppStore.entitlements */, D0EA97971FE8537000792DD6 /* Share-HockeyApp.entitlements */, D021D4DA219CB0EF0064BEBA /* Share-Fork.entitlements */, - D084104A1FABDCFD008FFE92 /* TGContactModel.h */, - D084104C1FABDCFD008FFE92 /* TGContactModel.m */, - D084104B1FABDCFD008FFE92 /* TGMimeTypeMap.h */, - D084104D1FABDCFD008FFE92 /* TGMimeTypeMap.m */, - D08410431FABDC5B008FFE92 /* TGItemProviderSignals.h */, - D08410441FABDC5C008FFE92 /* TGItemProviderSignals.m */, - D0AF322E1FACBA270097362B /* TGShareLocationSignals.h */, - D0AF322D1FACBA270097362B /* TGShareLocationSignals.m */, D03B0E7A1D63484500955575 /* ShareRootController.swift */, D08410521FABDEC8008FFE92 /* Share-Bridging-Header.h */, D03B0E7F1D63484500955575 /* Info.plist */, - D08410531FABE428008FFE92 /* ShareItems.swift */, ); path = Share; sourceTree = ""; @@ -2435,26 +2194,6 @@ name = en.lproj; sourceTree = ""; }; - D0ADF956212B56C200310BBC /* Legacy Data Import */ = { - isa = PBXGroup; - children = ( - D0D2276E212739120028F943 /* LegacyDataImport.swift */, - D0ADF957212B56DC00310BBC /* LegacyUserDataImport.swift */, - D0ADF95B212B636D00310BBC /* LegacyChatImport.swift */, - D0B3B53A21666C0000FC60A0 /* LegacyFileImport.swift */, - D0ADF959212B5AC600310BBC /* LegacyResourceImport.swift */, - D0ADF95D212C818F00310BBC /* LegacyPreferencesImport.swift */, - D0ADF960212C8DF600310BBC /* TGAutoDownloadPreferences.h */, - D0ADF95F212C8DF600310BBC /* TGAutoDownloadPreferences.m */, - D0CE6F1A213ED11100BCD44B /* TGPresentationAutoNightPreferences.h */, - D0CE6F1B213ED11100BCD44B /* TGPresentationAutoNightPreferences.m */, - D0ADF962212C9AA900310BBC /* TGProxyItem.h */, - D0ADF963212C9AA900310BBC /* TGProxyItem.m */, - D051DB5C21602D6E00F30F92 /* LegacyDataImportSplash.swift */, - ); - name = "Legacy Data Import"; - sourceTree = ""; - }; D0CE6F1D213EDA4200BCD44B /* pt.lproj */ = { isa = PBXGroup; children = ( @@ -2596,19 +2335,6 @@ path = "Telegram-iOS UITests"; sourceTree = ""; }; - D0ECCB8B1FE9CE2B00609802 /* Snapshots */ = { - isa = PBXGroup; - children = ( - D05B37F41FEA5F6E0041D2A5 /* SnapshotEnvironment.swift */, - D05B37FC1FEA8D870041D2A5 /* SnapshotResources.swift */, - D0ECCB8C1FE9CE3F00609802 /* SnapshotChatList.swift */, - D05B37F61FEA8C640041D2A5 /* SnapshotSecretChat.swift */, - D05B37F81FEA8CF00041D2A5 /* SnapshotSettings.swift */, - D05B37FA1FEA8D020041D2A5 /* SnapshotAppearanceSettings.swift */, - ); - name = Snapshots; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -2957,7 +2683,6 @@ 09A218F222A1570A00DE6898 /* BlueFilledIcon@2x.png in Resources */, 090E777722A6945900CD99F5 /* BlueClassicIcon@2x.png in Resources */, D0CE6F69213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, - D0338736223A9A9A007A2CE4 /* Config-Hockeyapp-Internal.xcconfig in Resources */, D08DB0C0213F4D1D00F2ADBF /* telegram_sphere@2x.png in Resources */, D08DB0AB213F4D1D00F2ADBF /* ic_bubble@2x.png in Resources */, D04DCC341F71C80000B021D7 /* 7.m4a in Resources */, @@ -2965,6 +2690,7 @@ D0CE6F60213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, D0CE6F63213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, D00ED75D1FE95287001F38BD /* InfoPlist.strings in Resources */, + 09A4193022B7A4D500637EB4 /* BlueClassicIconIpad@2x.png in Resources */, D04DCC361F71C80000B021D7 /* 9.m4a in Resources */, D0CE6F5A213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, 09EBE2AE22B004EA00F670AB /* BlueFilledIconIpad@2x.png in Resources */, @@ -2973,6 +2699,7 @@ D0CE6F68213EDA4400BCD44B /* InfoPlist.strings in Resources */, 09A218EE22A1570A00DE6898 /* BlueFilledIcon@3x.png in Resources */, D0CE6F6A213EDA4400BCD44B /* Localizable.strings in Resources */, + 09A4193522B7A4D500637EB4 /* BlackClassicIconIpad@2x.png in Resources */, D0E8C2DE2285EA55009F26E8 /* BlackIcon@2x.png in Resources */, D09DCBB71D0C856B00F51FFE /* Localizable.strings in Resources */, D0CE6F66213EDA4400BCD44B /* AppIntentVocabulary.plist in Resources */, @@ -2983,6 +2710,8 @@ 09EBE2AA22B004EA00F670AB /* BlueIconLargeIpad@2x.png in Resources */, D0CE6F5B213EDA4400BCD44B /* Localizable.strings in Resources */, 09EBE2AF22B004EA00F670AB /* BlackIconIpad@2x.png in Resources */, + 09A4193422B7A4D500637EB4 /* BlackClassicIconIpad.png in Resources */, + 09A4193222B7A4D500637EB4 /* BlueClassicIconIpad.png in Resources */, D0CE6F62213EDA4400BCD44B /* InfoPlist.strings in Resources */, D08DB0A8213F4D1D00F2ADBF /* fast_arrow_shadow@2x.png in Resources */, D0CFBB931FD88C2900B65C0D /* begin_record.caf in Resources */, @@ -3005,6 +2734,7 @@ D08DB0A9213F4D1D00F2ADBF /* fast_body@2x.png in Resources */, D04DCC321F71C80000B021D7 /* 5.m4a in Resources */, D04DCC241F71C80000B021D7 /* 101.m4a in Resources */, + 09A4193122B7A4D500637EB4 /* BlackClassicIconLargeIpad@2x.png in Resources */, D04DCC351F71C80000B021D7 /* 8.m4a in Resources */, D08DB0B1213F4D1D00F2ADBF /* ic_smile@2x.png in Resources */, 09EBE2A722B004EA00F670AB /* BlueIconIpad.png in Resources */, @@ -3025,6 +2755,7 @@ D0CE6F58213EDA4400BCD44B /* Localizable.strings in Resources */, D08DB0AF213F4D1D00F2ADBF /* ic_pencil@2x.png in Resources */, D0CE6F67213EDA4400BCD44B /* Localizable.strings in Resources */, + 09A4193322B7A4D500637EB4 /* BlueClassicIconLargeIpad@2x.png in Resources */, D04DCC291F71C80000B021D7 /* 106.m4a in Resources */, D0CE6F5E213EDA4400BCD44B /* Localizable.strings in Resources */, D052974622B0073F004ABAF6 /* WhiteFilledIcon@3x.png in Resources */, @@ -3133,7 +2864,6 @@ 09C5728521728D3700BDF00F /* SSignal+Single.m in Sources */, 09C5728A21728D3700BDF00F /* SThreadPoolQueue.m in Sources */, 09C5727821728D3700BDF00F /* SMetaDisposable.m in Sources */, - 09C5732B2172953900BDF00F /* TGBridgePeerNotificationSettings.m in Sources */, 0956AF2F217B8109008106D0 /* TGNeoUnsupportedMessageViewModel.m in Sources */, 09C50DE821729D7C009E676F /* TGBridgeBotSignals.m in Sources */, 09C571952172806900BDF00F /* TGUserRowController.m in Sources */, @@ -3145,13 +2875,9 @@ 09C5731D2172953800BDF00F /* TGBridgeStickerPack.m in Sources */, 09C50DF321729D7C009E676F /* TGBridgeStateSignal.m in Sources */, 09C5727421728D3700BDF00F /* SAtomic.m in Sources */, - 09C5731C2172953800BDF00F /* TGBridgeActionMediaAttachment.m in Sources */, 09C571D52172875500BDF00F /* TGMessageViewController.m in Sources */, - 09C5732F2172953900BDF00F /* TGBridgeContext.m in Sources */, - 09C573192172953800BDF00F /* TGBridgeContactMediaAttachment.m in Sources */, 09C571EB2172878900BDF00F /* TGStickersHeaderController.m in Sources */, 09C50DED21729D7C009E676F /* TGBridgeLocationSignals.m in Sources */, - 09C573302172953900BDF00F /* TGBridgeChat.m in Sources */, 09C571D72172875A00BDF00F /* TGMessageViewMessageRowController.m in Sources */, 09C571F22172879C00BDF00F /* TGComposeController.m in Sources */, 09C5727621728D3700BDF00F /* SBlockDisposable.m in Sources */, @@ -3159,14 +2885,11 @@ 09C5723021728AA500BDF00F /* TGNeoMessageViewModel.m in Sources */, 09C5728C21728D3700BDF00F /* STimer.m in Sources */, 09C5728221728D3700BDF00F /* SSignal+Multicast.m in Sources */, - 09C573342172953900BDF00F /* TGBridgeUnsupportedMediaAttachment.m in Sources */, 09C573162172953800BDF00F /* TGBridgeMessage+TGTableItem.m in Sources */, 09C571922172806600BDF00F /* TGNeoLabelViewModel.m in Sources */, 09C5723521728AA500BDF00F /* TGNeoStickerMessageViewModel.m in Sources */, 09C50E0421729DB5009E676F /* TGBotKeyboardController.m in Sources */, - 09C5732E2172953900BDF00F /* TGBridgeLocationMediaAttachment.m in Sources */, 09C5722A21728AA500BDF00F /* TGNeoConversationSimpleRowController.m in Sources */, - 09C573262172953800BDF00F /* TGBridgeMessageEntities.m in Sources */, 09C5727E21728D3700BDF00F /* SSignal+Combine.m in Sources */, 09C571D42172875100BDF00F /* TGUserInfoController.m in Sources */, 09C571932172806600BDF00F /* TGNeoRenderableViewModel.m in Sources */, @@ -3175,11 +2898,9 @@ 09C50DF221729D7C009E676F /* TGBridgeSendMessageSignals.m in Sources */, 09C571902172806600BDF00F /* TGNeoAttachmentViewModel.m in Sources */, 09C50DE921729D7C009E676F /* TGBridgeChatListSignals.m in Sources */, - 09C50E922173B247009E676F /* TGBridgeSubscriptions.m in Sources */, 09C5716A21727F1500BDF00F /* TGInterfaceMenu.m in Sources */, 09C571D02172874B00BDF00F /* TGUserHandleRowController.m in Sources */, 09C5727F21728D3700BDF00F /* SSignal+Dispatch.m in Sources */, - 09C573232172953800BDF00F /* TGBridgeBotCommandInfo.m in Sources */, 09C5723121728AA500BDF00F /* TGNeoReplyHeaderViewModel.m in Sources */, 09C571F02172878900BDF00F /* TGStickersController.m in Sources */, 09C5714621727DAA00BDF00F /* TGWatchCommon.m in Sources */, @@ -3196,8 +2917,6 @@ 09C5713E21727D9E00BDF00F /* TGInterfaceController.m in Sources */, 09C571D22172875100BDF00F /* TGGroupInfoController.m in Sources */, 09C50DEA21729D7C009E676F /* TGBridgeChatMessageListSignals.m in Sources */, - 09C573332172953900BDF00F /* TGBridgeReplyMarkupMediaAttachment.m in Sources */, - 09C573352172953900BDF00F /* TGBridgeBotInfo.m in Sources */, 09C571DC2172876C00BDF00F /* TGLocationController.m in Sources */, 09C5727A21728D3700BDF00F /* SQueue.m in Sources */, 09C5714521727DAA00BDF00F /* TGWatchColor.m in Sources */, @@ -3206,7 +2925,6 @@ 09C5728D21728D3700BDF00F /* SVariable.m in Sources */, 09C5714321727DAA00BDF00F /* TGLocationUtils.m in Sources */, 09C5716121727EE700BDF00F /* TGFileCache.m in Sources */, - 09C573202172953800BDF00F /* TGBridgeForwardedMessageMediaAttachment.m in Sources */, 09C5723221728AA500BDF00F /* TGNeoRowController.m in Sources */, 09C5728121728D3700BDF00F /* SSignal+Meta.m in Sources */, 09C5722521728AA500BDF00F /* TGNeoAudioMessageViewModel.m in Sources */, @@ -3219,7 +2937,6 @@ 09C5714821727DAA00BDF00F /* WKInterfaceGroup+Signals.m in Sources */, 09C5714921727DAA00BDF00F /* WKInterfaceImage+Signals.m in Sources */, 09C5728321728D3700BDF00F /* SSignal+Pipe.m in Sources */, - 09C573322172953900BDF00F /* TGBridgeChatMessages.m in Sources */, 09C5728921728D3700BDF00F /* SThreadPool.m in Sources */, 09C5722921728AA500BDF00F /* TGNeoConversationMediaRowController.m in Sources */, 09C571DA2172876300BDF00F /* TGNeoChatViewModel.m in Sources */, @@ -3227,28 +2944,21 @@ 09C571982172807100BDF00F /* TGAudioMicAlertController.m in Sources */, 09C571D12172874B00BDF00F /* TGUserInfoHeaderController.m in Sources */, 09C5723421728AA500BDF00F /* TGNeoSmiliesMessageViewModel.m in Sources */, - 09C5731E2172953800BDF00F /* TGBridgeVideoMediaAttachment.m in Sources */, 09C50DF421729D7C009E676F /* TGBridgeStickersSignals.m in Sources */, - 09C573252172953800BDF00F /* TGBridgeLocationVenue.m in Sources */, 09C5727521728D3700BDF00F /* SBag.m in Sources */, 09C5713F21727DA000BDF00F /* TGExtensionDelegate.m in Sources */, - 09C573292172953900BDF00F /* TGBridgeMediaAttachment.m in Sources */, 09C50DEE21729D7C009E676F /* TGBridgeMediaSignals.m in Sources */, 09C571D82172875A00BDF00F /* TGMessageViewWebPageRowController.m in Sources */, 09C50E0521729DE6009E676F /* TGBotKeyboardButtonController.m in Sources */, 09C5719B217280E900BDF00F /* TGNeoChatsController.m in Sources */, - 09C5731B2172953800BDF00F /* TGBridgeAudioMediaAttachment.m in Sources */, - 09C5731A2172953800BDF00F /* TGBridgeMessage.m in Sources */, 09C5728821728D3700BDF00F /* SSubscriber.m in Sources */, 09C5722D21728AA500BDF00F /* TGNeoFileMessageViewModel.m in Sources */, 09C5723821728AA500BDF00F /* TGConversationFooterController.m in Sources */, 09C571DD2172876F00BDF00F /* TGLocationMapHeaderController.m in Sources */, - 09C573312172953900BDF00F /* TGBridgeMessageEntitiesAttachment.m in Sources */, 09C50DEC21729D7C009E676F /* TGBridgeConversationSignals.m in Sources */, 09C5727B21728D3700BDF00F /* SSignal.m in Sources */, 09C573282172953800BDF00F /* TGBridgeChat+TGTableItem.m in Sources */, 09C5727721728D3700BDF00F /* SDisposableSet.m in Sources */, - 09C573242172953800BDF00F /* TGBridgeImageMediaAttachment.m in Sources */, 09C5723B21728AA500BDF00F /* TGNeoConversationRowController.m in Sources */, 09C5714121727DAA00BDF00F /* TGGeometry.m in Sources */, 09C5714221727DAA00BDF00F /* TGIndexPath.m in Sources */, @@ -3268,23 +2978,18 @@ 09C50DE721729D7C009E676F /* TGBridgeAudioSignals.m in Sources */, 09C5722721728AA500BDF00F /* TGNeoBubbleMessageViewModel.m in Sources */, 09C571CF2172874B00BDF00F /* TGUserHandle.m in Sources */, - 09C572D3217293D400BDF00F /* TGBridgeCommon.m in Sources */, 09C5722821728AA500BDF00F /* TGNeoContactMessageViewModel.m in Sources */, - 09C573222172953800BDF00F /* TGBridgeUser.m in Sources */, 09C571EF2172878900BDF00F /* TGStickersSectionHeaderController.m in Sources */, 09C5714021727DAA00BDF00F /* TGDateUtils.m in Sources */, - 09C5732C2172953900BDF00F /* TGBridgeReplyMessageMediaAttachment.m in Sources */, 09C571942172806600BDF00F /* TGNeoViewModel.m in Sources */, 09C5727C21728D3700BDF00F /* SSignal+Accumulate.m in Sources */, 09C5714A21727DAA00BDF00F /* WKInterfaceTable+TGDataDrivenTable.m in Sources */, 09C571DE2172876F00BDF00F /* TGLocationVenueRowController.m in Sources */, 09C5716921727F1500BDF00F /* TGInputController.m in Sources */, 09C5723921728AA500BDF00F /* TGChatInfo.m in Sources */, - 09C5732A2172953900BDF00F /* TGBridgeDocumentMediaAttachment.m in Sources */, 09C571962172806D00BDF00F /* TGComplicationController.m in Sources */, 09C5723621728AA500BDF00F /* TGNeoTextMessageViewModel.m in Sources */, 09C5722B21728AA500BDF00F /* TGNeoConversationStaticRowController.m in Sources */, - 09C573272172953800BDF00F /* TGBridgeWebPageMediaAttachment.m in Sources */, 09C5718F2172806600BDF00F /* TGMessageViewModel.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3295,8 +3000,6 @@ files = ( D073E52222003E1E00742DDD /* Data.swift in Sources */, D0E2CE642227F0680084E3DD /* ManagedFile.swift in Sources */, - D0ED633B21FF3EFD001D4648 /* BuildConfig.m in Sources */, - D09B79C62219C784003B1F9D /* SharedAccountInfo.swift in Sources */, D0ED633D21FF4580001D4648 /* NotificationService.swift in Sources */, D015E01F225CDF5100CB9E8A /* Api0.swift in Sources */, D0ED633A21FF3EDF001D4648 /* AccountData.swift in Sources */, @@ -3311,64 +3014,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D00859A21B28189D00EAF753 /* AppDelegate.swift in Sources */, - 09C50E7B21738178009E676F /* TGBridgeServer.m in Sources */, - D0ADF95C212B636D00310BBC /* LegacyChatImport.swift in Sources */, - 09D3042E2174344900C00567 /* TGBridgeContactMediaAttachment.m in Sources */, - D05B37F71FEA8C640041D2A5 /* SnapshotSecretChat.swift in Sources */, - 09C50E842173853E009E676F /* TGBridgeCommon.m in Sources */, - 09D3042D2174344900C00567 /* TGBridgeAudioMediaAttachment.m in Sources */, - D05B37F51FEA5F6E0041D2A5 /* SnapshotEnvironment.swift in Sources */, - 0956AF2C217B4642008106D0 /* WatchCommunicationManager.swift in Sources */, - 09D304372174344900C00567 /* TGBridgeVideoMediaAttachment.m in Sources */, - 09C50E912173B247009E676F /* TGBridgeSubscriptions.m in Sources */, - 09D304262174341A00C00567 /* TGBridgeLocationVenue.m in Sources */, - 09D304312174344900C00567 /* TGBridgeImageMediaAttachment.m in Sources */, - 09D304292174343300C00567 /* TGBridgeBotInfo.m in Sources */, - 09D304272174341E00C00567 /* TGBridgeChatMessages.m in Sources */, - D0B21B0F220438E9003F741D /* SharedNotificationManager.swift in Sources */, D02E31231BD803E800CD3F01 /* main.m in Sources */, - D05B37FD1FEA8D870041D2A5 /* SnapshotResources.swift in Sources */, - D0EB243B201B77C400F6CC13 /* ClearNotificationsManager.swift in Sources */, - 09D304242174340E00C00567 /* TGBridgeMessage.m in Sources */, - 09D304362174344900C00567 /* TGBridgeUnsupportedMediaAttachment.m in Sources */, - D0ADF95A212B5AC600310BBC /* LegacyResourceImport.swift in Sources */, - D09B79C52219C784003B1F9D /* SharedAccountInfo.swift in Sources */, - D06E4C2F21347D9200088087 /* UIImage+ImageEffects.m in Sources */, - D0B3B53B21666C0000FC60A0 /* LegacyFileImport.swift in Sources */, - D0ADF95E212C818F00310BBC /* LegacyPreferencesImport.swift in Sources */, - D0B21B0D2203A9A1003F741D /* SharedWakeupManager.swift in Sources */, - 09D304282174342E00C00567 /* TGBridgeChat.m in Sources */, - 09C50E8A2173AEDB009E676F /* WatchRequestHandlers.swift in Sources */, - 09D304302174344900C00567 /* TGBridgeForwardedMessageMediaAttachment.m in Sources */, - D0D2276F212739120028F943 /* LegacyDataImport.swift in Sources */, - D0ADF961212C8DF600310BBC /* TGAutoDownloadPreferences.m in Sources */, - D05B37FB1FEA8D020041D2A5 /* SnapshotAppearanceSettings.swift in Sources */, - D0CE6F1C213ED11100BCD44B /* TGPresentationAutoNightPreferences.m in Sources */, - D053DAD32018ED2B00993D32 /* LockedWindowCoveringView.swift in Sources */, - D09250021FE52D2A003F693F /* BuildConfig.m in Sources */, - 09D304392174344900C00567 /* TGBridgeMessageEntities.m in Sources */, - 09D304352174344900C00567 /* TGBridgeReplyMessageMediaAttachment.m in Sources */, - 09D304322174344900C00567 /* TGBridgeLocationMediaAttachment.m in Sources */, - D084023220E1883500065674 /* ApplicationShortcutItem.swift in Sources */, - D0ADF958212B56DC00310BBC /* LegacyUserDataImport.swift in Sources */, - 09D304332174344900C00567 /* TGBridgeMessageEntitiesAttachment.m in Sources */, - 09D304342174344900C00567 /* TGBridgeReplyMarkupMediaAttachment.m in Sources */, - D0A18D651E15C020004C6734 /* WakeupManager.swift in Sources */, - D09B79C82219C7AE003B1F9D /* ManageSharedAccountInfo.swift in Sources */, - D051DB5D21602D6E00F30F92 /* LegacyDataImportSplash.swift in Sources */, - 09D304382174344900C00567 /* TGBridgeWebPageMediaAttachment.m in Sources */, - 09D3042F2174344900C00567 /* TGBridgeDocumentMediaAttachment.m in Sources */, - 09D3042C2174344900C00567 /* TGBridgeActionMediaAttachment.m in Sources */, - D0ECCB8D1FE9CE3F00609802 /* SnapshotChatList.swift in Sources */, - D0ADF964212C9AA900310BBC /* TGProxyItem.m in Sources */, - 09C50E8321738514009E676F /* TGBridgeContext.m in Sources */, - 09D304222174335F00C00567 /* WatchBridge.swift in Sources */, - 09D304252174341200C00567 /* TGBridgeMediaAttachment.m in Sources */, - 09D304232174340900C00567 /* TGBridgeUser.m in Sources */, - D05B37F91FEA8CF00041D2A5 /* SnapshotSettings.swift in Sources */, - 09D3042A2174343B00C00567 /* TGBridgeBotCommandInfo.m in Sources */, - D0BEAF731E54C9A900BD963D /* ApplicationContext.swift in Sources */, D0612E491D58B478000C8F02 /* Application.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3377,7 +3023,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D02CF61C215E51D500E0F56A /* BuildConfig.m in Sources */, D02CF601215D9ABF00E0F56A /* NotificationViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3386,16 +3031,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D0D1026A2212F804003ADA5E /* ClearNotificationsManager.swift in Sources */, - D08410451FABDC5D008FFE92 /* TGItemProviderSignals.m in Sources */, - D084104F1FABDCFD008FFE92 /* TGMimeTypeMap.m in Sources */, D03B0E7B1D63484500955575 /* ShareRootController.swift in Sources */, - D0D102682212E9E6003ADA5E /* SharedWakeupManager.swift in Sources */, - D0EA97941FE84F2D00792DD6 /* BuildConfig.m in Sources */, - D084104E1FABDCFD008FFE92 /* TGContactModel.m in Sources */, - D08410541FABE428008FFE92 /* ShareItems.swift in Sources */, - D0D102692212F719003ADA5E /* SharedNotificationManager.swift in Sources */, - D0AF322F1FACBA280097362B /* TGShareLocationSignals.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3404,7 +3040,6 @@ buildActionMask = 2147483647; files = ( D0B2F7602050102600D3BFB9 /* PeerNode.swift in Sources */, - D0B2F755204F4EAF00D3BFB9 /* BuildConfig.m in Sources */, D08DB0A4213F42F400F2ADBF /* TodayViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3414,7 +3049,6 @@ buildActionMask = 2147483647; files = ( D08985072119B7FE00918162 /* IntentContacts.swift in Sources */, - D0EA97951FE84F2E00792DD6 /* BuildConfig.m in Sources */, D0D268791D79A70A00C422DA /* IntentHandler.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/Telegram-iOS-AppStoreLLC.xcscheme b/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/Telegram-iOS-AppStoreLLC.xcscheme index f79e79c503..3e875406cc 100644 --- a/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/Telegram-iOS-AppStoreLLC.xcscheme +++ b/Telegram-iOS.xcodeproj/xcshareddata/xcschemes/Telegram-iOS-AppStoreLLC.xcscheme @@ -65,7 +65,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -16,6 +52,9 @@ + + diff --git a/Telegram-iOS/BlackClassicIcon@2x.png b/Telegram-iOS/BlackClassicIcon@2x.png index 12f8e1c429..093f5821a5 100755 Binary files a/Telegram-iOS/BlackClassicIcon@2x.png and b/Telegram-iOS/BlackClassicIcon@2x.png differ diff --git a/Telegram-iOS/BlackClassicIcon@3x.png b/Telegram-iOS/BlackClassicIcon@3x.png index e48f2b118d..13f8fe2694 100755 Binary files a/Telegram-iOS/BlackClassicIcon@3x.png and b/Telegram-iOS/BlackClassicIcon@3x.png differ diff --git a/Telegram-iOS/BlackClassicIconIpad.png b/Telegram-iOS/BlackClassicIconIpad.png new file mode 100755 index 0000000000..46593ec465 Binary files /dev/null and b/Telegram-iOS/BlackClassicIconIpad.png differ diff --git a/Telegram-iOS/BlackClassicIconIpad@2x.png b/Telegram-iOS/BlackClassicIconIpad@2x.png new file mode 100755 index 0000000000..ed0216f931 Binary files /dev/null and b/Telegram-iOS/BlackClassicIconIpad@2x.png differ diff --git a/Telegram-iOS/BlackClassicIconLargeIpad@2x.png b/Telegram-iOS/BlackClassicIconLargeIpad@2x.png new file mode 100755 index 0000000000..1fcc6fc9bb Binary files /dev/null and b/Telegram-iOS/BlackClassicIconLargeIpad@2x.png differ diff --git a/Telegram-iOS/BlackFilledIcon@2x.png b/Telegram-iOS/BlackFilledIcon@2x.png index 6d1aa23c8d..a327546043 100755 Binary files a/Telegram-iOS/BlackFilledIcon@2x.png and b/Telegram-iOS/BlackFilledIcon@2x.png differ diff --git a/Telegram-iOS/BlackFilledIcon@3x.png b/Telegram-iOS/BlackFilledIcon@3x.png index dc76ad7f75..a3972adeca 100755 Binary files a/Telegram-iOS/BlackFilledIcon@3x.png and b/Telegram-iOS/BlackFilledIcon@3x.png differ diff --git a/Telegram-iOS/BlackFilledIconIpad.png b/Telegram-iOS/BlackFilledIconIpad.png index 6314635155..d86fb7cb55 100644 Binary files a/Telegram-iOS/BlackFilledIconIpad.png and b/Telegram-iOS/BlackFilledIconIpad.png differ diff --git a/Telegram-iOS/BlackFilledIconIpad@2x.png b/Telegram-iOS/BlackFilledIconIpad@2x.png old mode 100644 new mode 100755 index 1529bf21a2..ed0216f931 Binary files a/Telegram-iOS/BlackFilledIconIpad@2x.png and b/Telegram-iOS/BlackFilledIconIpad@2x.png differ diff --git a/Telegram-iOS/BlackIcon@2x.png b/Telegram-iOS/BlackIcon@2x.png index 0b633d542b..5a3a76cbdd 100755 Binary files a/Telegram-iOS/BlackIcon@2x.png and b/Telegram-iOS/BlackIcon@2x.png differ diff --git a/Telegram-iOS/BlackIcon@3x.png b/Telegram-iOS/BlackIcon@3x.png index d664987bcc..a1d6016afb 100755 Binary files a/Telegram-iOS/BlackIcon@3x.png and b/Telegram-iOS/BlackIcon@3x.png differ diff --git a/Telegram-iOS/BlackIconIpad.png b/Telegram-iOS/BlackIconIpad.png old mode 100644 new mode 100755 diff --git a/Telegram-iOS/BlackIconIpad@2x.png b/Telegram-iOS/BlackIconIpad@2x.png old mode 100644 new mode 100755 diff --git a/Telegram-iOS/BlackIconLargeIpad@2x.png b/Telegram-iOS/BlackIconLargeIpad@2x.png old mode 100644 new mode 100755 diff --git a/Telegram-iOS/BlueClassicIcon@2x.png b/Telegram-iOS/BlueClassicIcon@2x.png index 59d5ef14fc..aa3ec282ce 100755 Binary files a/Telegram-iOS/BlueClassicIcon@2x.png and b/Telegram-iOS/BlueClassicIcon@2x.png differ diff --git a/Telegram-iOS/BlueClassicIcon@3x.png b/Telegram-iOS/BlueClassicIcon@3x.png index 5ebb074078..eca037efcf 100755 Binary files a/Telegram-iOS/BlueClassicIcon@3x.png and b/Telegram-iOS/BlueClassicIcon@3x.png differ diff --git a/Telegram-iOS/BlueClassicIconIpad.png b/Telegram-iOS/BlueClassicIconIpad.png new file mode 100755 index 0000000000..2e5e919205 Binary files /dev/null and b/Telegram-iOS/BlueClassicIconIpad.png differ diff --git a/Telegram-iOS/BlueClassicIconIpad@2x.png b/Telegram-iOS/BlueClassicIconIpad@2x.png new file mode 100755 index 0000000000..08da0b799a Binary files /dev/null and b/Telegram-iOS/BlueClassicIconIpad@2x.png differ diff --git a/Telegram-iOS/BlueClassicIconLargeIpad@2x.png b/Telegram-iOS/BlueClassicIconLargeIpad@2x.png new file mode 100755 index 0000000000..342e2766d9 Binary files /dev/null and b/Telegram-iOS/BlueClassicIconLargeIpad@2x.png differ diff --git a/Telegram-iOS/BlueFilledIcon@2x.png b/Telegram-iOS/BlueFilledIcon@2x.png index 0cc73bd47c..7c851299aa 100755 Binary files a/Telegram-iOS/BlueFilledIcon@2x.png and b/Telegram-iOS/BlueFilledIcon@2x.png differ diff --git a/Telegram-iOS/BlueFilledIcon@3x.png b/Telegram-iOS/BlueFilledIcon@3x.png index bd314a1bb0..49b7fd968c 100755 Binary files a/Telegram-iOS/BlueFilledIcon@3x.png and b/Telegram-iOS/BlueFilledIcon@3x.png differ diff --git a/Telegram-iOS/BlueIcon@2x.png b/Telegram-iOS/BlueIcon@2x.png index 4bc08e01e8..2e502e7dab 100755 Binary files a/Telegram-iOS/BlueIcon@2x.png and b/Telegram-iOS/BlueIcon@2x.png differ diff --git a/Telegram-iOS/BlueIcon@3x.png b/Telegram-iOS/BlueIcon@3x.png index 6647a2e34f..c47aeed4b1 100755 Binary files a/Telegram-iOS/BlueIcon@3x.png and b/Telegram-iOS/BlueIcon@3x.png differ diff --git a/Telegram-iOS/BlueIconIpad.png b/Telegram-iOS/BlueIconIpad.png old mode 100644 new mode 100755 index 07de560340..f07ad9568b Binary files a/Telegram-iOS/BlueIconIpad.png and b/Telegram-iOS/BlueIconIpad.png differ diff --git a/Telegram-iOS/BlueIconIpad@2x.png b/Telegram-iOS/BlueIconIpad@2x.png old mode 100644 new mode 100755 index d71dcd205e..1b21e8d928 Binary files a/Telegram-iOS/BlueIconIpad@2x.png and b/Telegram-iOS/BlueIconIpad@2x.png differ diff --git a/Telegram-iOS/BlueIconLargeIpad@2x.png b/Telegram-iOS/BlueIconLargeIpad@2x.png old mode 100644 new mode 100755 index f51ae17df9..9bf363744d Binary files a/Telegram-iOS/BlueIconLargeIpad@2x.png and b/Telegram-iOS/BlueIconLargeIpad@2x.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@2x-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@2x-1.png new file mode 100644 index 0000000000..dd360d8f50 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@2x-1.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@2x.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@2x.png new file mode 100644 index 0000000000..2e502e7dab Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@2x.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@3x.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@3x.png new file mode 100644 index 0000000000..c47aeed4b1 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIcon@3x.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconIpad.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconIpad.png new file mode 100644 index 0000000000..5eaf0bab23 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconIpad.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconIpad@2x.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconIpad@2x.png new file mode 100644 index 0000000000..6d9e7ab98c Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconIpad@2x.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconLargeIpad@2x.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconLargeIpad@2x.png new file mode 100644 index 0000000000..9bf363744d Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/BlueIconLargeIpad@2x.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Contents.json b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Contents.json index db3c2c3b25..ebb1de47f9 100644 --- a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Contents.json +++ b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Contents.json @@ -3,109 +3,109 @@ { "size" : "20x20", "idiom" : "iphone", - "filename" : "Icon1@40x40-1.png", + "filename" : "Simple@40x40.png", "scale" : "2x" }, { "size" : "20x20", "idiom" : "iphone", - "filename" : "Icon1@60x60.png", + "filename" : "Simple@60x60.png", "scale" : "3x" }, { "size" : "29x29", "idiom" : "iphone", - "filename" : "Icon1@58x58.png", + "filename" : "Simple@58x58.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "iphone", - "filename" : "Icon1@87x87.png", + "filename" : "Simple@87x87.png", "scale" : "3x" }, { "size" : "40x40", "idiom" : "iphone", - "filename" : "Icon1@80x80.png", + "filename" : "Simple@80x80.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "iphone", - "filename" : "Icon1@120x120.png", + "filename" : "BlueIcon@2x-1.png", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "Icon1@120x120-1.png", + "filename" : "BlueIcon@2x.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "Icon1@180x180.png", + "filename" : "BlueIcon@3x.png", "scale" : "3x" }, { "size" : "20x20", "idiom" : "ipad", - "filename" : "Icon1@20x20.png", + "filename" : "Simple@20x20.png", "scale" : "1x" }, { "size" : "20x20", "idiom" : "ipad", - "filename" : "Icon1@40x40.png", + "filename" : "Simple@40x40-2.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "ipad", - "filename" : "Icon1@29x29.png", + "filename" : "Simple@29x29.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "ipad", - "filename" : "Icon1@58x58-1.png", + "filename" : "Simple@58x58-1.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "ipad", - "filename" : "Icon1@40x40-2.png", + "filename" : "Simple@40x40-1.png", "scale" : "1x" }, { "size" : "40x40", "idiom" : "ipad", - "filename" : "Icon1@80x80-1.png", + "filename" : "Simple@80x80-1.png", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", - "filename" : "Icon1@76x76.png", + "filename" : "BlueIconIpad.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", - "filename" : "Icon1@152x152.png", + "filename" : "BlueIconIpad@2x.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", - "filename" : "Icon1@167x167.png", + "filename" : "BlueIconLargeIpad@2x.png", "scale" : "2x" }, { "size" : "1024x1024", "idiom" : "ios-marketing", - "filename" : "Icon1-iTunesArtwork.png", + "filename" : "Simple-iTunesArtwork.png", "scale" : "1x" } ], diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1-iTunesArtwork.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1-iTunesArtwork.png deleted file mode 100644 index 06e427a7fa..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1-iTunesArtwork.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@120x120-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@120x120-1.png deleted file mode 100644 index 19175e3ff5..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@120x120-1.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@120x120.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@120x120.png deleted file mode 100644 index 19175e3ff5..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@120x120.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@152x152.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@152x152.png deleted file mode 100644 index 1c5bdb4fdd..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@152x152.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@167x167.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@167x167.png deleted file mode 100644 index 45ad830d07..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@167x167.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@180x180.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@180x180.png deleted file mode 100644 index b4e8e178e7..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@180x180.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@20x20.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@20x20.png deleted file mode 100644 index 014505ae2e..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@20x20.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@29x29.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@29x29.png deleted file mode 100644 index b723982037..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@29x29.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40-1.png deleted file mode 100644 index 82babb6993..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40-1.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40-2.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40-2.png deleted file mode 100644 index 82babb6993..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40-2.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40.png deleted file mode 100644 index 82babb6993..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@40x40.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@58x58-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@58x58-1.png deleted file mode 100644 index ab71462027..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@58x58-1.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@58x58.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@58x58.png deleted file mode 100644 index ab71462027..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@58x58.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@60x60.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@60x60.png deleted file mode 100644 index 66ccefd8c5..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@60x60.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@76x76.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@76x76.png deleted file mode 100644 index 00e9ee33f0..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@76x76.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@80x80-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@80x80-1.png deleted file mode 100644 index d6cc478b55..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@80x80-1.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@80x80.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@80x80.png deleted file mode 100644 index d6cc478b55..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@80x80.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@87x87.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@87x87.png deleted file mode 100644 index 9f29dece11..0000000000 Binary files a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Icon1@87x87.png and /dev/null differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple-iTunesArtwork.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple-iTunesArtwork.png new file mode 100644 index 0000000000..f00a2857f0 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple-iTunesArtwork.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@20x20.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@20x20.png new file mode 100644 index 0000000000..18f609c3b5 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@20x20.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@29x29.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@29x29.png new file mode 100644 index 0000000000..90d7b67bc0 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@29x29.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40-1.png new file mode 100644 index 0000000000..a79cb5dcdc Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40-1.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40-2.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40-2.png new file mode 100644 index 0000000000..a79cb5dcdc Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40-2.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40.png new file mode 100644 index 0000000000..a79cb5dcdc Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@40x40.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@58x58-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@58x58-1.png new file mode 100644 index 0000000000..aa6a4a442e Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@58x58-1.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@58x58.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@58x58.png new file mode 100644 index 0000000000..aa6a4a442e Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@58x58.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@60x60.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@60x60.png new file mode 100644 index 0000000000..00ee472767 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@60x60.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@80x80-1.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@80x80-1.png new file mode 100644 index 0000000000..385bc474b2 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@80x80-1.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@80x80.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@80x80.png new file mode 100644 index 0000000000..385bc474b2 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@80x80.png differ diff --git a/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@87x87.png b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@87x87.png new file mode 100644 index 0000000000..c0a9ce9319 Binary files /dev/null and b/Telegram-iOS/Images.xcassets/AppIconLLC.appiconset/Simple@87x87.png differ diff --git a/Telegram-iOS/Info.plist b/Telegram-iOS/Info.plist index 8cfd6f1f19..4cd5288838 100644 --- a/Telegram-iOS/Info.plist +++ b/Telegram-iOS/Info.plist @@ -19,8 +19,6 @@ CFBundleIconFiles BlackIcon - BlackIconIpad - BlackIconLargeIpad UIPrerenderedIcon @@ -30,8 +28,6 @@ CFBundleIconFiles BlackClassicIcon - BlackClassicIconIpad - BlackClassicIconLargeIpad UIPrerenderedIcon @@ -41,8 +37,6 @@ CFBundleIconFiles BlackFilledIcon - BlackFilledIconIpad - BlackFilledIconLargeIpad UIPrerenderedIcon @@ -52,8 +46,6 @@ CFBundleIconFiles BlueIcon - BlueIconIpad - BlueIconLargeIpad UIPrerenderedIcon @@ -63,8 +55,6 @@ CFBundleIconFiles BlueClassicIcon - BlueClassicIconIpad - BlueClassicIconLargeIpad UIPrerenderedIcon @@ -74,8 +64,6 @@ CFBundleIconFiles BlueFilledIcon - BlueFilledIconIpad - BlueFilledIconLargeIpad UIPrerenderedIcon @@ -98,6 +86,88 @@ + CFBundleIcons~ipad + + CFBundleAlternateIcons + + Black + + CFBundleIconFiles + + BlackIconIpad + BlackIconLargeIpad + + UIPrerenderedIcon + + + BlackClassic + + CFBundleIconFiles + + BlackClassicIconIpad + BlackClassicIconLargeIpad + + UIPrerenderedIcon + + + BlackFilled + + CFBundleIconFiles + + BlackFilledIconIpad + BlackFilledIconLargeIpad + + UIPrerenderedIcon + + + Blue + + CFBundleIconFiles + + BlueIconIpad + BlueIconLargeIpad + + UIPrerenderedIcon + + + BlueClassic + + CFBundleIconFiles + + BlueClassicIconIpad + BlueClassicIconLargeIpad + + UIPrerenderedIcon + + + BlueFilled + + CFBundleIconFiles + + BlueFilledIconIpad + BlueFilledIconLargeIpad + + UIPrerenderedIcon + + + WhiteFilled + + CFBundleIconFiles + + WhiteFilledIcon + + UIPrerenderedIcon + + + + CFBundlePrimaryIcon + + CFBundleIconName + AppIconLLC + UIPrerenderedIcon + + + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion diff --git a/Telegram-iOS/SharedAccountInfo.swift b/Telegram-iOS/SharedAccountInfo.swift deleted file mode 100644 index 93a804b3f1..0000000000 --- a/Telegram-iOS/SharedAccountInfo.swift +++ /dev/null @@ -1,55 +0,0 @@ -import Foundation - -struct AccountNotificationKey: Codable { - let id: Data - let data: Data -} - -struct AccountDatacenterKey: Codable { - let id: Int64 - let data: Data -} - -struct AccountDatacenterAddress: Codable { - let host: String - let port: Int32 - let isMedia: Bool - let secret: Data? -} - -struct AccountDatacenterInfo: Codable { - let masterKey: AccountDatacenterKey - let addressList: [AccountDatacenterAddress] -} - -struct AccountProxyConnection: Codable { - let host: String - let port: Int32 - let username: String? - let password: String? - let secret: Data? -} - -struct StoredAccountInfo: Codable { - let id: Int64 - let primaryId: Int32 - let isTestingEnvironment: Bool - let peerName: String - let datacenters: [Int32: AccountDatacenterInfo] - let notificationKey: AccountNotificationKey -} - -struct StoredAccountInfos: Codable { - let proxy: AccountProxyConnection? - let accounts: [StoredAccountInfo] -} - -func loadAccountsData(rootPath: String) -> StoredAccountInfos { - guard let data = try? Data(contentsOf: URL(fileURLWithPath: rootPath + "/accounts-shared-data")) else { - return StoredAccountInfos(proxy: nil, accounts: []) - } - guard let value = try? JSONDecoder().decode(StoredAccountInfos.self, from: data) else { - return StoredAccountInfos(proxy: nil, accounts: []) - } - return value -} diff --git a/Telegram-iOS/SnapshotAppearanceSettings.swift b/Telegram-iOS/SnapshotAppearanceSettings.swift deleted file mode 100644 index 9318f4aae4..0000000000 --- a/Telegram-iOS/SnapshotAppearanceSettings.swift +++ /dev/null @@ -1,34 +0,0 @@ -#if DEBUG - -import Foundation -import TelegramCore -import Postbox -import SwiftSignalKit -import Display -import TelegramUI - -func snapshotAppearanceSettings(application: UIApplication, mainWindow: UIWindow, window: Window1, statusBarHost: StatusBarHost) { - let (context, accountManager) = snapshotEnvironment(application: application, mainWindow: mainWindow, statusBarHost: statusBarHost, theme: .day) - context.account.network.mockConnectionStatus = .online(proxyAddress: nil) - - let _ = (context.account.postbox.transaction { transaction -> Void in - if let hole = context.account.postbox.seedConfiguration.initializeChatListWithHole.topLevel { - transaction.replaceChatListHole(groupId: .root, index: hole.index, hole: nil) - } - - let accountPeer = TelegramUser(id: context.account.peerId, accessHash: nil, firstName: "Alena", lastName: "Shy", username: "alenashy", phone: "44321456789", photo: snapshotAvatar(context.account.postbox, 1), botInfo: nil, restrictionInfo: nil, flags: []) - transaction.updatePeersInternal([accountPeer], update: { _, updated in - return updated - }) - }).start() - - let rootController = TelegramRootController(context: context) - rootController.addRootControllers(showCallsTab: true) - window.viewController = rootController - rootController.rootTabController!.selectedIndex = 3 - rootController.pushViewController(themeSettingsController(context: context)) -} - -#endif - - diff --git a/Telegram-iOS/SnapshotChatList.swift b/Telegram-iOS/SnapshotChatList.swift deleted file mode 100644 index a0c24c2cb7..0000000000 --- a/Telegram-iOS/SnapshotChatList.swift +++ /dev/null @@ -1,155 +0,0 @@ -#if DEBUG - -import Foundation -import TelegramCore -import Postbox -import SwiftSignalKit -import Display -import TelegramUI - -private enum SnapshotPeerAvatar { - case none - case id(Int32) -} - -private func avatarImages(_ postbox: Postbox, _ value: SnapshotPeerAvatar) -> [TelegramMediaImageRepresentation] { - switch value { - case .none: - return [] - case let .id(id): - return snapshotAvatar(postbox, id) - } -} - -private enum SnapshotPeer { - case user(Int32, SnapshotPeerAvatar, String?, String?) - case secretChat(Int32, Int32, SnapshotPeerAvatar, String?, String?) - case channel(Int32, SnapshotPeerAvatar, String) - - func additionalPeer(_ postbox: Postbox) -> Peer? { - switch self { - case .user: - return nil - case let .secretChat(_, userId, avatar, first, last): - return TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), accessHash: nil, firstName: first, lastName: last, username: nil, phone: nil, photo: avatarImages(postbox, avatar), botInfo: nil, restrictionInfo: nil, flags: []) - case .channel: - return nil - } - } - - var peerId: PeerId { - switch self { - case let .user(id, _, _, _): - return PeerId(namespace: Namespaces.Peer.CloudUser, id: id) - case let .secretChat(id, _, _, _, _): - return PeerId(namespace: Namespaces.Peer.SecretChat, id: id) - case let .channel(id, _, _): - return PeerId(namespace: Namespaces.Peer.CloudChannel, id: id) - } - } - - func peer(_ postbox: Postbox) -> Peer { - switch self { - case let .user(id, avatar, first, last): - return TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: nil, firstName: first, lastName: last, username: nil, phone: nil, photo: avatarImages(postbox, avatar), botInfo: nil, restrictionInfo: nil, flags: []) - case let .secretChat(id, userId, _, _, _): - return TelegramSecretChat(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: id), creationDate: 123, regularPeerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), accessHash: 123, role: .creator, embeddedState: .active, messageAutoremoveTimeout: nil) - case let .channel(id, avatar, title): - return TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: id), accessHash: 123, title: title, username: nil, photo: avatarImages(postbox, avatar), creationDate: 123, version: 0, participationStatus: .member, info: .broadcast(TelegramChannelBroadcastInfo(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) - } - } -} - -private struct SnapshotMessage { - let date: Int32 - let peer: SnapshotPeer - let text: String - let outgoing: Bool - - init(_ date: Int32, _ peer: SnapshotPeer, _ text: String, _ outgoing: Bool) { - self.date = date - self.peer = peer - self.text = text - self.outgoing = outgoing - } - - func storeMessage(_ accountPeerId: PeerId, _ baseDate: Int32) -> StoreMessage { - var flags: StoreMessageFlags = [] - if !self.outgoing { - flags.insert(.Incoming) - } - return StoreMessage(id: MessageId(peerId: self.peer.peerId, namespace: Namespaces.Message.Cloud, id: self.date), globallyUniqueId: nil, groupingKey: nil, timestamp: baseDate + self.date, flags: flags, tags: [], globalTags: [], localTags: [], forwardInfo: nil, authorId: outgoing ? accountPeerId : self.peer.peerId, text: self.text, attributes: [], media: []) - } -} - -private struct SnapshotChat { - let message: SnapshotMessage - let unreadCount: Int32 - let isPinned: Bool - let isMuted: Bool - - init(_ message: SnapshotMessage, unreadCount: Int32 = 0, isPinned: Bool = false, isMuted: Bool = false) { - self.message = message - self.unreadCount = unreadCount - self.isPinned = isPinned - self.isMuted = isMuted - } -} - -private let chatList: [SnapshotChat] = [ - .init(.init(100, .user(1, .id(7), "Jane", ""), "Well I do help animals. Maybe I'll have a few cats in my new luxury apartment. 😊", false), isPinned: true), - .init(.init(90, .user(3, .none, "Tyrion", "Lannister"), "Sometimes posession is an abstract concept. They took my purse, but the gold is still mine.", false), unreadCount: 1), - .init(.init(80, .user(2, .id(1), "Alena", "Shy"), "😍 Sticker", true)), - .init(.init(70, .secretChat(4, 4, .id(8), "Heisenberg", ""), "Thanks, Telegram helps me a lot. You have my financial support if you need more servers.", false)), - .init(.init(60, .user(5, .id(9), "Bender", ""), "I looove new iPhones! In fact, they invited me to a focus group.", false)), - .init(.init(50, .channel(6, .id(10), "World News Today"), "LaserBlastSafetyGuide.pdf", false), unreadCount: 1, isMuted: true), - .init(.init(40, .user(7, .id(11), "EVE", ""), "LaserBlastSafetyGuide.pdf", true)), - .init(.init(30, .user(8, .id(12), "Nick", ""), "It's impossible", false)) -] - -func snapshotChatList(application: UIApplication, mainWindow: UIWindow, window: Window1, statusBarHost: StatusBarHost) { - let (context, _) = snapshotEnvironment(application: application, mainWindow: mainWindow, statusBarHost: statusBarHost, theme: .night) - context.account.network.mockConnectionStatus = .online(proxyAddress: nil) - - let _ = (context.account.postbox.transaction { transaction -> Void in - if let hole = context.account.postbox.seedConfiguration.initializeChatListWithHole.topLevel { - transaction.replaceChatListHole(groupId: .root, index: hole.index, hole: nil) - } - - let accountPeer = TelegramUser(id: context.account.peerId, accessHash: nil, firstName: "Alena", lastName: "Shy", username: "alenashy", phone: "44321456789", photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - transaction.updatePeersInternal([accountPeer], update: { _, updated in - return updated - }) - - let baseDate: Int32 = Int32(Date().timeIntervalSince1970) - 10000 - for item in chatList { - let peer = item.message.peer.peer(context.account.postbox) - - transaction.updatePeersInternal([peer], update: { _, updated in - return updated - }) - if let additionalPeer = item.message.peer.additionalPeer(context.account.postbox) { - transaction.updatePeersInternal([additionalPeer], update: { _, updated in - return updated - }) - } - transaction.updatePeerChatListInclusion(peer.id, inclusion: .ifHasMessagesOrOneOf(groupId: .root, pinningIndex: nil, minTimestamp: nil)) - let _ = transaction.addMessages([item.message.storeMessage(context.account.peerId, baseDate)], location: .UpperHistoryBlock) - transaction.resetIncomingReadStates([peer.id: [Namespaces.Message.Cloud: .idBased(maxIncomingReadId: Int32.max - 1, maxOutgoingReadId: Int32.max - 1, maxKnownId: Int32.max - 1, count: item.unreadCount, markedUnread: false)]]) - if item.isMuted { - transaction.updateCurrentPeerNotificationSettings([peer.id: TelegramPeerNotificationSettings.defaultSettings.withUpdatedMuteState(.muted(until: Int32.max - 1))]) - } else { - transaction.updateCurrentPeerNotificationSettings([peer.id: TelegramPeerNotificationSettings.defaultSettings]) - } - } - transaction.setPinnedItemIds(groupId: .root, itemIds: chatList.filter{ $0.isPinned }.map{ .peer($0.message.peer.peerId) }) - }).start() - - let rootController = TelegramRootController(context: context) - rootController.addRootControllers(showCallsTab: true) - window.viewController = rootController - rootController.rootTabController!.selectedIndex = 0 - rootController.rootTabController!.selectedIndex = 2 -} - -#endif diff --git a/Telegram-iOS/SnapshotEnvironment.swift b/Telegram-iOS/SnapshotEnvironment.swift deleted file mode 100644 index 3576520e17..0000000000 --- a/Telegram-iOS/SnapshotEnvironment.swift +++ /dev/null @@ -1,115 +0,0 @@ -#if DEBUG - -import Foundation -import TelegramCore -import Postbox -import SwiftSignalKit -import TelegramUI -import Display - -enum SnapshotEnvironmentTheme { - case night - case day -} - -func snapshotEnvironment(application: UIApplication, mainWindow: UIWindow, statusBarHost: StatusBarHost, theme: SnapshotEnvironmentTheme) -> (AccountContext, AccountManager) { - preconditionFailure() - /*var randomId: Int64 = 0 - arc4random_buf(&randomId, 8) - let path = NSTemporaryDirectory() + "\(randomId)" - - Logger.setSharedLogger(Logger(basePath: path + "/logs")) - Logger.shared.logToFile = false - - let semaphore = DispatchSemaphore(value: 0) - var accountManagerValue: AccountManager? - initializeAccountManagement() - let _ = accountManager(basePath: path).start(next: { value in - accountManagerValue = value - semaphore.signal() - }) - semaphore.wait() - precondition(accountManagerValue != nil) - - var result: Account? - while true { - let account = currentAccount(allocateIfNotExists: true, networkArguments: NetworkInitializationArguments(apiId: 0, languagesCategory: "ios", appVersion: "unknown", voipMaxLayer: 0), supplementary: false, manager: accountManagerValue!, rootPath: path, auxiliaryMethods: AccountAuxiliaryMethods(updatePeerChatInputState: { _, _ in return nil }, fetchResource: { _, _, _, _ in - return .never() - }, fetchResourceMediaReferenceHash: { _ in - return .never() - }, prepareSecretThumbnailData: { _ in - return nil - })) |> take(1) - let semaphore = DispatchSemaphore(value: 0) - let _ = account.start(next: { value in - switch value! { - case .upgrading: - preconditionFailure() - case let .unauthorized(account): - let _ = account.postbox.transaction({ transaction -> Void in - let encoder = PostboxEncoder() - encoder.encodeInt32(1, forKey: "masterDatacenterId") - encoder.encodeInt64(PeerId(namespace: Namespaces.Peer.CloudUser, id: 1234567).toInt64(), forKey: "peerId") - - transaction.setState(AuthorizedAccountState(decoder: PostboxDecoder(buffer: encoder.readBufferNoCopy()))) - }).start() - case let .authorized(account): - result = account - } - semaphore.signal() - }) - semaphore.wait() - if result != nil { - break - } - } - - let applicationBindings = TelegramApplicationBindings(isMainApp: true, containerPath: path, appSpecificScheme: "tg", openUrl: { _ in - }, openUniversalUrl: { _, completion in - completion.completion(false) - }, canOpenUrl: { _ in - return false - }, getTopWindow: { - for window in application.windows.reversed() { - if window === mainWindow || window === statusBarHost.keyboardWindow { - return window - } - } - return application.windows.last - }, displayNotification: { _ in - }, applicationInForeground: .single(true), applicationIsActive: .single(true), clearMessageNotifications: { _ in - }, pushIdleTimerExtension: { - return EmptyDisposable - }, openSettings: { - }, openAppStorePage: { - }, registerForNotifications: { _ in - }, requestSiriAuthorization: { _ in }, siriAuthorization: { return .notDetermined }, getWindowHost: { - return nil - }, presentNativeController: { _ in - }, dismissNativeController: { - }) - - let _ = updatePresentationThemeSettingsInteractively(postbox: result!.postbox, { _ in - switch theme { - case .day: - return PresentationThemeSettings(chatWallpaper: .color(0xffffff), theme: .builtin(.day), themeAccentColor: nil, themeSpecificChatWallpapers: [:], fontSize: .regular, automaticThemeSwitchSetting: AutomaticThemeSwitchSetting(trigger: .none, theme: .nightAccent), disableAnimations: false) - case .night: - return PresentationThemeSettings(chatWallpaper: .color(0x000000), theme: .builtin(.nightAccent), themeAccentColor: nil, themeSpecificChatWallpapers: [:], fontSize: .regular, automaticThemeSwitchSetting: AutomaticThemeSwitchSetting(trigger: .none, theme: .nightAccent), disableAnimations: false) - } - }).start() - - let semaphore1 = DispatchSemaphore(value: 0) - var dataAndSettings: InitialPresentationDataAndSettings? - let _ = currentPresentationDataAndSettings(postbox: result!.postbox).start(next: { value in - dataAndSettings = value - semaphore1.signal() - }) - semaphore1.wait() - precondition(dataAndSettings != nil) - - let context = AccountContext(sharedContext: SharedAccountContext(applicationBindings: applicationBindings, accountManager: accountManagerValue!), account: result!, initialPresentationDataAndSettings: dataAndSettings!) - - return (context, accountManagerValue!)*/ -} - -#endif diff --git a/Telegram-iOS/SnapshotResources.swift b/Telegram-iOS/SnapshotResources.swift deleted file mode 100644 index 298cb8ee7c..0000000000 --- a/Telegram-iOS/SnapshotResources.swift +++ /dev/null @@ -1,32 +0,0 @@ -#if DEBUG - -import Foundation -import Postbox -import SwiftSignalKit -import TelegramCore - -private var dataPath: String? - -func setupSnapshotData(_ path: String) { - dataPath = path -} - -func snapshotAvatar(_ postbox: Postbox, _ id: Int32) -> [TelegramMediaImageRepresentation] { - guard let path = dataPath else { - return [] - } - - guard let data = try? Data(contentsOf: URL(fileURLWithPath: path + "/Bitmap\(id).png")) else { - return [] - } - if let image = UIImage(data: data) { - let resource = LocalFileMediaResource(fileId: arc4random64(), size: data.count) - - postbox.mediaBox.storeResourceData(resource.id, data: data) - return [TelegramMediaImageRepresentation(dimensions: image.size, resource: resource)] - } else { - return [] - } -} - -#endif diff --git a/Telegram-iOS/SnapshotSecretChat.swift b/Telegram-iOS/SnapshotSecretChat.swift deleted file mode 100644 index 0f7a2ad39f..0000000000 --- a/Telegram-iOS/SnapshotSecretChat.swift +++ /dev/null @@ -1,75 +0,0 @@ -#if DEBUG - -import Foundation -import TelegramCore -import Postbox -import SwiftSignalKit -import Display -import TelegramUI - -private enum SnapshotMessage { - case text(String, Bool) - case timer(Int32, Bool) - - func storeMessage(_ postbox: Postbox, peerId: PeerId, userPeerId: PeerId, accountPeerId: PeerId, _ date: Int32) -> StoreMessage { - switch self { - case let .text(text, outgoing): - var flags: StoreMessageFlags = [] - if !outgoing { - flags.insert(.Incoming) - } - return StoreMessage(id: MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: date), globallyUniqueId: nil, groupingKey: nil, timestamp: date, flags: flags, tags: [], globalTags: [], localTags: [], forwardInfo: nil, authorId: outgoing ? accountPeerId : userPeerId, text: text, attributes: [], media: []) - case let .timer(timeout, outgoing): - var flags: StoreMessageFlags = [] - if !outgoing { - flags.insert(.Incoming) - } - return StoreMessage(id: MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: date), globallyUniqueId: nil, groupingKey: nil, timestamp: date, flags: flags, tags: [], globalTags: [], localTags: [], forwardInfo: nil, authorId: outgoing ? accountPeerId : userPeerId, text: "", attributes: [], media: [TelegramMediaAction(action: .messageAutoremoveTimeoutUpdated(timeout))]) - } - } -} - -private let messages: [SnapshotMessage] = [ - .text("Hey Eileen", true), - .text("So, why is Telegram cool?", true), - .text("Well, look. Telegram is superfast and you can use it on all your devices at the same time — phones, tablets, even desktops.", false), - .text("😴", true), - .text("And it has secret chats, like this one, with end-to-end encryption!", false), - .text("End encryption to what end??", true), - .text("Arrgh. Forget it. You can set a timer and send photos that will disappear when the time runs out. Yay!", false), - .timer(15, false) -] - -func snapshotSecretChat(application: UIApplication, mainWindow: UIWindow, window: Window1, statusBarHost: StatusBarHost) { - let (context, _) = snapshotEnvironment(application: application, mainWindow: mainWindow, statusBarHost: statusBarHost, theme: .night) - context.account.network.mockConnectionStatus = .online(proxyAddress: nil) - - let accountPeer = TelegramUser(id: context.account.peerId, accessHash: nil, firstName: "Alena", lastName: "Shy", username: "alenashy", phone: "44321456789", photo: [], botInfo: nil, restrictionInfo: nil, flags: []) - let userPeer = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: 456), accessHash: nil, firstName: "Eileen", lastName: "Lockhard", username: nil, phone: "44321456789", photo: snapshotAvatar(context.account.postbox, 6), botInfo: nil, restrictionInfo: nil, flags: []) - let secretPeer = TelegramSecretChat(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: 456), creationDate: 123, regularPeerId: userPeer.id, accessHash: 123, role: .creator, embeddedState: .active, messageAutoremoveTimeout: nil) - - let _ = (context.account.postbox.transaction { transaction -> Void in - if let hole = context.account.postbox.seedConfiguration.initializeChatListWithHole.topLevel { - transaction.replaceChatListHole(groupId: .root, index: hole.index, hole: nil) - } - - transaction.updatePeersInternal([accountPeer, userPeer, secretPeer], update: { _, updated in - return updated - }) - - transaction.updatePeerPresencesInternal(presences: [userPeer.id: TelegramUserPresence(status: .present(until: Int32.max - 1), lastActivity: 0)], merge: { _, updated in return updated }) - - var date: Int32 = Int32(Date().timeIntervalSince1970) - 1000 - for message in messages { - let _ = transaction.addMessages([message.storeMessage(context.account.postbox, peerId: secretPeer.id, userPeerId: userPeer.id, accountPeerId: context.account.peerId, date)], location: .UpperHistoryBlock) - date += 10 - } - }).start() - - let rootController = TelegramRootController(context: context) - rootController.addRootControllers(showCallsTab: true) - window.viewController = rootController - navigateToChatController(navigationController: rootController, context: context, chatLocation: .peer(secretPeer.id), animated: false) -} - -#endif diff --git a/Telegram-iOS/SnapshotSettings.swift b/Telegram-iOS/SnapshotSettings.swift deleted file mode 100644 index 30ac6c510b..0000000000 --- a/Telegram-iOS/SnapshotSettings.swift +++ /dev/null @@ -1,33 +0,0 @@ -#if DEBUG - -import Foundation -import TelegramCore -import Postbox -import SwiftSignalKit -import Display -import TelegramUI - -func snapshotSettings(application: UIApplication, mainWindow: UIWindow, window: Window1, statusBarHost: StatusBarHost) { - let (context, accountManager) = snapshotEnvironment(application: application, mainWindow: mainWindow, statusBarHost: statusBarHost, theme: .night) - context.account.network.mockConnectionStatus = .online(proxyAddress: nil) - - let _ = (context.account.postbox.transaction { transaction -> Void in - if let hole = context.account.postbox.seedConfiguration.initializeChatListWithHole.topLevel { - transaction.replaceChatListHole(groupId: .root, index: hole.index, hole: nil) - } - - let accountPeer = TelegramUser(id: context.account.peerId, accessHash: nil, firstName: "Alena", lastName: "Shy", username: "alenashy", phone: "44321456789", photo: snapshotAvatar(context.account.postbox, 1), botInfo: nil, restrictionInfo: nil, flags: []) - transaction.updatePeersInternal([accountPeer], update: { _, updated in - return updated - }) - }).start() - - let rootController = TelegramRootController(context: context) - rootController.addRootControllers(showCallsTab: true) - window.viewController = rootController - rootController.rootTabController!.selectedIndex = 3 - rootController.pushViewController(settingsController(context: context, accountManager: accountManager)) -} - -#endif - diff --git a/Telegram-iOS/Telegram-Bridging-Header.h b/Telegram-iOS/Telegram-Bridging-Header.h index 6d119f44a8..8f9882681c 100644 --- a/Telegram-iOS/Telegram-Bridging-Header.h +++ b/Telegram-iOS/Telegram-Bridging-Header.h @@ -1,17 +1,4 @@ #ifndef Telegram_iOS_Telegram_Bridging_Header_h #define Telegram_iOS_Telegram_Bridging_Header_h -#import "BuildConfig.h" -#import "TGAutoDownloadPreferences.h" -#import "TGPresentationAutoNightPreferences.h" -#import "TGProxyItem.h" -#import "UIImage+ImageEffects.h" - -#import "TGBridgeServer.h" -#import "TGBridgeCommon.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" -#import "TGBridgeLocationVenue.h" - #endif diff --git a/Telegram-iOS/TempMain.m b/Telegram-iOS/TempMain.m deleted file mode 100644 index 81d976a847..0000000000 --- a/Telegram-iOS/TempMain.m +++ /dev/null @@ -1,7 +0,0 @@ -#import - -int main(int argc, char *argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, @"Application", @"AppDelegate"); - } -} diff --git a/Telegram-iOS/TempRoot.swift b/Telegram-iOS/TempRoot.swift deleted file mode 100644 index 2678d48e09..0000000000 --- a/Telegram-iOS/TempRoot.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Foundation -import AsyncDisplayKit -import MtProtoKit -import SwiftSignalKit -import SSignalKit -import Display -import Postbox -import TelegramCore -import LegacyComponents -import HockeySDK -import Lottie -import WebP -import FFMpeg -import TelegramUIPrivateModule - -func test() { - let _ = ASDisplayNode() - let _ = MTProto() - let _ = Signal { subscriber in - return ActionDisposable { - } - } - let _ = SSignal(generator: { subscriber in - return SBlockDisposable { - } - }) - let _ = ListView() - let _ = SqliteValueBox(basePath: "", queue: .mainQueue(), encryptionParameters: nil, upgradeProgress: { _ in }, inMemory: true) - initializeAccountManagement() - BITHockeyManager.shared().crashManager.crashManagerStatus = .alwaysAsk - let _ = LOTComposition(json: [:]) -} diff --git a/Telegram-iOS/WhiteFilledIcon@2x.png b/Telegram-iOS/WhiteFilledIcon@2x.png index 23bedc0e4e..221eb7e7ee 100644 Binary files a/Telegram-iOS/WhiteFilledIcon@2x.png and b/Telegram-iOS/WhiteFilledIcon@2x.png differ diff --git a/Telegram-iOS/WhiteFilledIcon@3x.png b/Telegram-iOS/WhiteFilledIcon@3x.png index f9be7ad977..98776bf3d9 100644 Binary files a/Telegram-iOS/WhiteFilledIcon@3x.png and b/Telegram-iOS/WhiteFilledIcon@3x.png differ diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index bf8021171c..ef8337e795 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -1532,7 +1532,7 @@ "Forward.ChannelReadOnly" = "Sorry, you can't post to this channel."; "Channel.ErrorAccessDenied" = "Sorry, this channel is private."; -"Group.ErrorAccessDenied" = "Sorry, this channel is private."; +"Group.ErrorAccessDenied" = "Sorry, this group is private."; "Conversation.InputTextBroadcastPlaceholder" = "Broadcast"; "Channel.NotificationLoading" = "Loading..."; @@ -1614,7 +1614,10 @@ "ShareMenu.Send" = "Send"; "Conversation.ReportSpam" = "Report Spam"; +"Conversation.ReportSpamAndLeave" = "Report Spam and Leave"; "Conversation.ReportSpamConfirmation" = "Are you sure you want to report spam from this user?"; +"Conversation.ReportSpamGroupConfirmation" = "Are you sure you want to report spam from this group?"; +"Conversation.ReportSpamChannelConfirmation" = "Are you sure you want to report spam from this channel?"; "SharedMedia.EmptyMusicText" = "All music shared in this chat will appear here."; "ChatSettings.AutoPlayAnimations" = "Autoplay GIFs"; @@ -4348,6 +4351,7 @@ Any member of this group will be able to see messages in the channel."; "Appearance.ThemeCarouselNight" = "Monochrome"; "Notification.Exceptions.DeleteAll" = "Delete All"; +"Notification.Exceptions.DeleteAllConfirmation" = "Are you sure you want to delete all exceptions?"; "Notification.Exceptions.Add" = "Add"; "Exceptions.AddToExceptions" = "ADD TO EXCEPTIONS"; @@ -4358,11 +4362,13 @@ Any member of this group will be able to see messages in the channel."; "Conversation.Block" = "Block"; "Conversation.BlockUser" = "Block User"; "Conversation.ShareMyPhoneNumber" = "Share My Phone Number"; +"Conversation.ShareMyPhoneNumberConfirmation" = "Are you sure you want to share your phone number %1$@ with %2$@?"; "Conversation.AddToContacts" = "Add to Contacts"; "Conversation.AddNameToContacts" = "Add %@ to Contacts"; -"AddContact.ContactWillBeSharedNow" = "When you tap **Done**, your phone number will become visible to %@."; -"AddContact.ContactWillBeSharedAfterMutual" = "Phone number will be visible once %1$@ adds you as a contact. Your phone number will become visible to %1$@."; +"AddContact.ContactWillBeSharedAfterMutual" = "Phone number will be visible once %1$@ adds you as a contact."; +"AddContact.SharedContactException" = "Share My Phone Number"; +"AddContact.SharedContactExceptionInfo" = "You can make your phone visible to %@."; "AddContact.StatusSuccess" = "%@ is now in your contacts list."; "Conversation.ShareMyPhoneNumber.StatusSuccess" = "%@ can now see your phone number."; @@ -4381,6 +4387,7 @@ Any member of this group will be able to see messages in the channel."; "Channel.OwnershipTransfer.ChangeOwner" = "Change Owner"; "Channel.OwnershipTransfer.ErrorPublicChannelsTooMuch" = "Sorry, the target user has too many public groups or channels already. Please ask them to make one of their existing groups or channels private first."; +"Group.OwnershipTransfer.ErrorLocatedGroupsTooMuch" = "Sorry, the target user has too many location-based groups already. Please ask them to delete or transfer one of their existing ones first."; "Group.OwnershipTransfer.ErrorAdminsTooMuch" = "Sorry, this group has too many admins and the new owner can't be added. Please remove one of the existing admins first."; "Channel.OwnershipTransfer.ErrorAdminsTooMuch" = "Sorry, this channel has too many admins and the new owner can't be added. Please remove one of the existing admins first."; @@ -4397,15 +4404,53 @@ Any member of this group will be able to see messages in the channel."; "Contacts.AddPeopleNearby" = "Add People Nearby"; "PeopleNearby.Title" = "People Nearby"; -"PeopleNearby.Description" = "Use this section to quickly find people and groups near you."; -"PeopleNearby.Users" = "People Around You"; -"PeopleNearby.UsersEmpty" = "No one else is viewing \"People Nearby\" around you now"; -"PeopleNearby.Groups" = "Groups Around You"; -"PeopleNearby.CreateGroup" = "Start a Group Chat Here"; -"PeopleNearby.Channels" = "Channels Around You"; +"PeopleNearby.Description" = "Ask your friend nearby to open this page to exchange phone numbers."; +"PeopleNearby.Users" = "People Nearby"; +"PeopleNearby.UsersEmpty" = "Looking for users around you..."; +"PeopleNearby.Groups" = "Groups Nearby"; +"PeopleNearby.CreateGroup" = "Create a Group Here"; +"PeopleNearby.NoMembers" = "no members"; "Channel.Management.LabelOwner" = "Owner"; "Channel.Management.LabelAdministrator" = "Administrator"; "ContactInfo.PhoneNumberHidden" = "Hidden"; "Common.ActionNotAllowedError" = "Sorry, you are not allowed to do this."; + +"Group.Location.Title" = "Location"; +"Group.Location.ChangeLocation" = "Change Location"; +"Group.Location.Info" = "People can find your group using People Nearby section."; + +"Channel.AdminLog.MessageTransferedName" = "transferred ownership to %1$@"; +"Channel.AdminLog.MessageTransferedNameUsername" = "transferred ownership to %1$@ (%2$@)"; + +"Channel.AdminLog.MessageChangedGroupGeoLocation" = "changed group location to \"%@\""; + +"Map.SetThisLocation" = "Set This Location"; + +"Permissions.PeopleNearbyTitle.v0" = "People Nearby"; +"Permissions.PeopleNearbyText.v0" = "Use this section to quickly add people near you and discover nearby group chats.\n\nPlease allow location access\nto start using this feature."; +"Permissions.PeopleNearbyAllow.v0" = "Allow Access"; +"Permissions.PeopleNearbyAllowInSettings.v0" = "Allow in Settings"; + +"Conversation.ReportGroupLocation" = "Group unrelated to location?"; +"ReportGroupLocation.Title" = "Report Unrelated Group"; +"ReportGroupLocation.Text" = "Please tell us if this group is not related to this location."; +"ReportGroupLocation.Report" = "Report"; + +"LocalGroup.Title" = "Create a Local Group"; +"LocalGroup.Text" = "Anyone close to this location (neighbors, co-workers, fellow students, event attendees, visitors of a venue) will see your group in the People Nearby section."; +"LocalGroup.ButtonTitle" = "Start Group"; +"LocalGroup.IrrelevantWarning" = "If you start an unrelated group at this location, you may get restricted in creating new location-based groups."; + +"GroupInfo.Location" = "Location"; +"GroupInfo.PublicLink" = "Public Link"; +"GroupInfo.PublicLinkAdd" = "Add"; + +"Group.PublicLink.Title" = "Public Link"; +"Group.PublicLink.Placeholder" = "link"; +"Group.PublicLink.Info" = "People can share this link with others and find your group using Telegram search.\n\nYou can use **a-z**, **0-9** and underscores. Minimum length is **5** characters."; + +"CreateGroup.ErrorLocatedGroupsTooMuch" = "Sorry, you have too many location-based groups already. Please delete one of your existing ones first."; + +"GroupInfo.LabelOwner" = "owner"; diff --git a/Watch/Bridge/TGBridgeAudioSignals.m b/Watch/Bridge/TGBridgeAudioSignals.m index 36a0961e06..045bcdbb1d 100644 --- a/Watch/Bridge/TGBridgeAudioSignals.m +++ b/Watch/Bridge/TGBridgeAudioSignals.m @@ -1,11 +1,10 @@ #import "TGBridgeAudioSignals.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeAudioMediaAttachment.h" + +#import + #import "TGBridgeClient.h" #import "TGFileCache.h" -#import "TGBridgeMessage.h" - #import "TGExtensionDelegate.h" #import diff --git a/Watch/Bridge/TGBridgeBotSignals.m b/Watch/Bridge/TGBridgeBotSignals.m index 9af378c047..d1abf20b67 100644 --- a/Watch/Bridge/TGBridgeBotSignals.m +++ b/Watch/Bridge/TGBridgeBotSignals.m @@ -1,11 +1,10 @@ #import "TGBridgeBotSignals.h" + +#import + #import "TGBridgeUserCache.h" #import "TGBridgeClient.h" -#import "TGBridgeSubscriptions.h" - -#import "TGBridgeUser.h" -#import "TGBridgeBotInfo.h" @implementation TGBridgeBotSignals diff --git a/Watch/Bridge/TGBridgeChat+TGTableItem.h b/Watch/Bridge/TGBridgeChat+TGTableItem.h index 4b036bf928..b5da6b909c 100644 --- a/Watch/Bridge/TGBridgeChat+TGTableItem.h +++ b/Watch/Bridge/TGBridgeChat+TGTableItem.h @@ -1,4 +1,5 @@ -#import "TGBridgeChat.h" +#import + #import "WKInterfaceTable+TGDataDrivenTable.h" @interface TGBridgeChat (TGTableItem) diff --git a/Watch/Bridge/TGBridgeChatListSignals.m b/Watch/Bridge/TGBridgeChatListSignals.m index 61edb4ecec..b32a4ded15 100644 --- a/Watch/Bridge/TGBridgeChatListSignals.m +++ b/Watch/Bridge/TGBridgeChatListSignals.m @@ -1,7 +1,7 @@ #import "TGBridgeChatListSignals.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeChatListSignals diff --git a/Watch/Bridge/TGBridgeChatMessageListSignals.m b/Watch/Bridge/TGBridgeChatMessageListSignals.m index b06600c807..d5ee468fe2 100644 --- a/Watch/Bridge/TGBridgeChatMessageListSignals.m +++ b/Watch/Bridge/TGBridgeChatMessageListSignals.m @@ -1,7 +1,7 @@ #import "TGBridgeChatMessageListSignals.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeMessage.h" -#import "TGBridgeUser.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeChatMessageListSignals diff --git a/Watch/Bridge/TGBridgeClient.m b/Watch/Bridge/TGBridgeClient.m index 92bb803261..d2e05a8da1 100644 --- a/Watch/Bridge/TGBridgeClient.m +++ b/Watch/Bridge/TGBridgeClient.m @@ -1,11 +1,11 @@ #import "TGBridgeClient.h" -#import "TGBridgeCommon.h" -#import "TGBridgeChat.h" + +#import + #import "TGWatchCommon.h" #import -#import "TGBridgeContext.h" #import "TGFileCache.h" #import "TGBridgeStickersSignals.h" diff --git a/Watch/Bridge/TGBridgeContactsSignals.m b/Watch/Bridge/TGBridgeContactsSignals.m index 6c16d039ba..e944eb1fd1 100644 --- a/Watch/Bridge/TGBridgeContactsSignals.m +++ b/Watch/Bridge/TGBridgeContactsSignals.m @@ -1,6 +1,7 @@ #import "TGBridgeContactsSignals.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeUser.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeContactsSignals diff --git a/Watch/Bridge/TGBridgeConversationSignals.m b/Watch/Bridge/TGBridgeConversationSignals.m index 6927c25b2e..e1f68a490a 100644 --- a/Watch/Bridge/TGBridgeConversationSignals.m +++ b/Watch/Bridge/TGBridgeConversationSignals.m @@ -1,7 +1,7 @@ #import "TGBridgeConversationSignals.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeConversationSignals diff --git a/Watch/Bridge/TGBridgeLocationSignals.m b/Watch/Bridge/TGBridgeLocationSignals.m index fe850eaab7..718a21e858 100644 --- a/Watch/Bridge/TGBridgeLocationSignals.m +++ b/Watch/Bridge/TGBridgeLocationSignals.m @@ -1,7 +1,7 @@ #import "TGBridgeLocationSignals.h" -#import "TGBridgeCommon.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeLocationVenue.h" + +#import + #import "TGBridgeClient.h" #import diff --git a/Watch/Bridge/TGBridgeLocationVenue+TGTableItem.h b/Watch/Bridge/TGBridgeLocationVenue+TGTableItem.h index 06f1293d86..e9ac419be6 100644 --- a/Watch/Bridge/TGBridgeLocationVenue+TGTableItem.h +++ b/Watch/Bridge/TGBridgeLocationVenue+TGTableItem.h @@ -1,4 +1,5 @@ -#import "TGBridgeLocationVenue.h" +#import + #import "WKInterfaceTable+TGDataDrivenTable.h" @interface TGBridgeLocationVenue (TGTableItem) diff --git a/Watch/Bridge/TGBridgeMediaSignals.h b/Watch/Bridge/TGBridgeMediaSignals.h index 0157c31bc8..d7443c8ffc 100644 --- a/Watch/Bridge/TGBridgeMediaSignals.h +++ b/Watch/Bridge/TGBridgeMediaSignals.h @@ -1,5 +1,5 @@ #import -#import "TGBridgeSubscriptions.h" +#import @class TGBridgeImageMediaAttachment; @class TGBridgeVideoMediaAttachment; diff --git a/Watch/Bridge/TGBridgeMediaSignals.m b/Watch/Bridge/TGBridgeMediaSignals.m index d915ed246a..2952737d0a 100644 --- a/Watch/Bridge/TGBridgeMediaSignals.m +++ b/Watch/Bridge/TGBridgeMediaSignals.m @@ -1,7 +1,7 @@ #import "TGBridgeMediaSignals.h" -#import "TGBridgeImageMediaAttachment.h" -#import "TGBridgeVideoMediaAttachment.h" -#import "TGBridgeDocumentMediaAttachment.h" + +#import + #import "TGBridgeClient.h" #import "TGFileCache.h" diff --git a/Watch/Bridge/TGBridgeMessage+TGTableItem.h b/Watch/Bridge/TGBridgeMessage+TGTableItem.h index 253c3d9449..d7da46a6e2 100644 --- a/Watch/Bridge/TGBridgeMessage+TGTableItem.h +++ b/Watch/Bridge/TGBridgeMessage+TGTableItem.h @@ -1,4 +1,5 @@ -#import "TGBridgeMessage.h" +#import + #import "WKInterfaceTable+TGDataDrivenTable.h" @interface TGBridgeMessage (TGTableItem) diff --git a/Watch/Bridge/TGBridgeMessageEntitiesAttachment.h b/Watch/Bridge/TGBridgeMessageEntitiesAttachment.h deleted file mode 100644 index 7913d8316e..0000000000 --- a/Watch/Bridge/TGBridgeMessageEntitiesAttachment.h +++ /dev/null @@ -1,8 +0,0 @@ -#import "TGBridgeMediaAttachment.h" -#import "TGBridgeMessageEntities.h" - -@interface TGBridgeMessageEntitiesAttachment : TGBridgeMediaAttachment - -@property (nonatomic, strong) NSArray *entities; - -@end diff --git a/Watch/Bridge/TGBridgePeerSettingsSignals.h b/Watch/Bridge/TGBridgePeerSettingsSignals.h index be84781194..8078a0a938 100644 --- a/Watch/Bridge/TGBridgePeerSettingsSignals.h +++ b/Watch/Bridge/TGBridgePeerSettingsSignals.h @@ -1,5 +1,4 @@ #import -#import "TGBridgePeerNotificationSettings.h" @interface TGBridgePeerSettingsSignals : NSObject diff --git a/Watch/Bridge/TGBridgePeerSettingsSignals.m b/Watch/Bridge/TGBridgePeerSettingsSignals.m index 1a7978870c..8663181e7c 100644 --- a/Watch/Bridge/TGBridgePeerSettingsSignals.m +++ b/Watch/Bridge/TGBridgePeerSettingsSignals.m @@ -1,5 +1,7 @@ #import "TGBridgePeerSettingsSignals.h" -#import "TGBridgeSubscriptions.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgePeerSettingsSignals diff --git a/Watch/Bridge/TGBridgeRemoteSignals.m b/Watch/Bridge/TGBridgeRemoteSignals.m index 24fa1e0b99..5e8a78739f 100644 --- a/Watch/Bridge/TGBridgeRemoteSignals.m +++ b/Watch/Bridge/TGBridgeRemoteSignals.m @@ -1,5 +1,7 @@ #import "TGBridgeRemoteSignals.h" -#import "TGBridgeSubscriptions.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeRemoteSignals diff --git a/Watch/Bridge/TGBridgeSendMessageSignals.h b/Watch/Bridge/TGBridgeSendMessageSignals.h index 81eda0f5b6..c76a18808e 100644 --- a/Watch/Bridge/TGBridgeSendMessageSignals.h +++ b/Watch/Bridge/TGBridgeSendMessageSignals.h @@ -1,7 +1,6 @@ #import -#import "TGBridgeDocumentMediaAttachment.h" -#import "TGBridgeLocationMediaAttachment.h" +#import @interface TGBridgeSendMessageSignals : NSObject diff --git a/Watch/Bridge/TGBridgeSendMessageSignals.m b/Watch/Bridge/TGBridgeSendMessageSignals.m index 4a7bfa666d..0c24241f26 100644 --- a/Watch/Bridge/TGBridgeSendMessageSignals.m +++ b/Watch/Bridge/TGBridgeSendMessageSignals.m @@ -1,6 +1,7 @@ #import "TGBridgeSendMessageSignals.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeMessage.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeSendMessageSignals diff --git a/Watch/Bridge/TGBridgeStateSignal.m b/Watch/Bridge/TGBridgeStateSignal.m index 915e7d0a43..3de0d1514c 100644 --- a/Watch/Bridge/TGBridgeStateSignal.m +++ b/Watch/Bridge/TGBridgeStateSignal.m @@ -1,5 +1,7 @@ #import "TGBridgeStateSignal.h" -#import "TGBridgeSubscriptions.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeStateSignal diff --git a/Watch/Bridge/TGBridgeStickerPack.h b/Watch/Bridge/TGBridgeStickerPack.h index e37f8b26cc..e372ecc8e0 100644 --- a/Watch/Bridge/TGBridgeStickerPack.h +++ b/Watch/Bridge/TGBridgeStickerPack.h @@ -1,4 +1,4 @@ -#import "TGBridgeCommon.h" +#import @interface TGBridgeStickerPack : NSObject { diff --git a/Watch/Bridge/TGBridgeStickerPack.m b/Watch/Bridge/TGBridgeStickerPack.m index da2711aec8..e0c45bf373 100644 --- a/Watch/Bridge/TGBridgeStickerPack.m +++ b/Watch/Bridge/TGBridgeStickerPack.m @@ -1,5 +1,6 @@ #import "TGBridgeStickerPack.h" -#import "TGBridgeDocumentMediaAttachment.h" + +#import NSString *const TGBridgeStickerPackBuiltInKey = @"builtin"; NSString *const TGBridgeStickerPackTitleKey = @"title"; diff --git a/Watch/Bridge/TGBridgeStickersSignals.m b/Watch/Bridge/TGBridgeStickersSignals.m index dd2e3afde3..b5c7d9e262 100644 --- a/Watch/Bridge/TGBridgeStickersSignals.m +++ b/Watch/Bridge/TGBridgeStickersSignals.m @@ -1,7 +1,8 @@ #import "TGBridgeStickersSignals.h" -#import "TGBridgeSubscriptions.h" + +#import + #import "TGBridgeStickerPack.h" -#import "TGBridgeDocumentMediaAttachment.h" #import "TGBridgeClient.h" @implementation TGBridgeStickersSignals diff --git a/Watch/Bridge/TGBridgeUser+TGTableItem.h b/Watch/Bridge/TGBridgeUser+TGTableItem.h index 4f8c2bdff9..a52adbcc55 100644 --- a/Watch/Bridge/TGBridgeUser+TGTableItem.h +++ b/Watch/Bridge/TGBridgeUser+TGTableItem.h @@ -1,4 +1,5 @@ -#import "TGBridgeUser.h" +#import + #import "WKInterfaceTable+TGDataDrivenTable.h" @interface TGBridgeUser (TGTableItem) diff --git a/Watch/Bridge/TGBridgeUserInfoSignals.m b/Watch/Bridge/TGBridgeUserInfoSignals.m index 753ee5ecfa..bdd2978190 100644 --- a/Watch/Bridge/TGBridgeUserInfoSignals.m +++ b/Watch/Bridge/TGBridgeUserInfoSignals.m @@ -1,6 +1,7 @@ #import "TGBridgeUserInfoSignals.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeUser.h" + +#import + #import "TGBridgeClient.h" @implementation TGBridgeUserInfoSignals diff --git a/Watch/Extension/TGAvatarViewModel.m b/Watch/Extension/TGAvatarViewModel.m index 4b4f31f30a..a841af8629 100644 --- a/Watch/Extension/TGAvatarViewModel.m +++ b/Watch/Extension/TGAvatarViewModel.m @@ -1,8 +1,6 @@ #import "TGAvatarViewModel.h" -#import "TGBridgeContext.h" -#import "TGBridgeUser.h" -#import "TGBridgeChat.h" +#import #import "TGStringUtils.h" #import "TGWatchColor.h" diff --git a/Watch/Extension/TGBotCommandController.m b/Watch/Extension/TGBotCommandController.m index 7ff6606da7..9db41226a4 100644 --- a/Watch/Extension/TGBotCommandController.m +++ b/Watch/Extension/TGBotCommandController.m @@ -1,10 +1,10 @@ #import "TGBotCommandController.h" + +#import + #import "TGWatchCommon.h" #import -#import "TGBridgeUser.h" -#import "TGBridgeBotCommandInfo.h" - #import "WKInterfaceTable+TGDataDrivenTable.h" #import "TGUserRowController.h" diff --git a/Watch/Extension/TGBridgeUserCache.m b/Watch/Extension/TGBridgeUserCache.m index 5477c6bee4..9ba7651bbc 100644 --- a/Watch/Extension/TGBridgeUserCache.m +++ b/Watch/Extension/TGBridgeUserCache.m @@ -1,11 +1,11 @@ #import "TGBridgeUserCache.h" + +#import + #import "TGFileCache.h" #import -#import "TGBridgeUser.h" -#import "TGBridgeBotInfo.h" - @interface TGBridgeUserCache () { NSMutableDictionary *_userByUid; diff --git a/Watch/Extension/TGComposeController.m b/Watch/Extension/TGComposeController.m index a2ab1c9ad6..c14ac8352c 100644 --- a/Watch/Extension/TGComposeController.m +++ b/Watch/Extension/TGComposeController.m @@ -1,7 +1,9 @@ #import "TGComposeController.h" + +#import + #import "TGWatchCommon.h" #import "TGBridgeSendMessageSignals.h" -#import "TGBridgeUser.h" #import "WKInterfaceGroup+Signals.h" #import "TGBridgeMediaSignals.h" diff --git a/Watch/Extension/TGGroupInfoController.m b/Watch/Extension/TGGroupInfoController.m index 1d56836583..77117a8f45 100644 --- a/Watch/Extension/TGGroupInfoController.m +++ b/Watch/Extension/TGGroupInfoController.m @@ -1,13 +1,13 @@ #import "TGGroupInfoController.h" + +#import + #import "TGWatchCommon.h" #import "TGStringUtils.h" -#import "TGBridgeContext.h" #import "TGBridgeConversationSignals.h" #import "TGBridgePeerSettingsSignals.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" #import "WKInterfaceTable+TGDataDrivenTable.h" #import "TGTableDeltaUpdater.h" diff --git a/Watch/Extension/TGGroupInfoHeaderController.m b/Watch/Extension/TGGroupInfoHeaderController.m index 4432e7599b..b70959ae42 100644 --- a/Watch/Extension/TGGroupInfoHeaderController.m +++ b/Watch/Extension/TGGroupInfoHeaderController.m @@ -1,15 +1,13 @@ #import "TGGroupInfoHeaderController.h" + +#import + #import "TGWatchCommon.h" #import "TGStringUtils.h" #import "WKInterfaceGroup+Signals.h" #import "TGBridgeMediaSignals.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" - -#import "TGBridgeContext.h" - NSString *const TGGroupInfoHeaderIdentifier = @"TGGroupInfoHeader"; @interface TGGroupInfoHeaderController () diff --git a/Watch/Extension/TGInputController.m b/Watch/Extension/TGInputController.m index e9e3f32367..238d0ac387 100644 --- a/Watch/Extension/TGInputController.m +++ b/Watch/Extension/TGInputController.m @@ -1,6 +1,8 @@ #import "TGInputController.h" + +#import + #import "TGWatchCommon.h" -#import "TGBridgeCommon.h" #import "TGInterfaceController.h" #import "TGFileCache.h" diff --git a/Watch/Extension/TGLocationController.m b/Watch/Extension/TGLocationController.m index a92e9b1c1d..2eaee71eb5 100644 --- a/Watch/Extension/TGLocationController.m +++ b/Watch/Extension/TGLocationController.m @@ -1,10 +1,12 @@ #import "TGLocationController.h" + +#import + #import "TGWatchCommon.h" #import "TGBridgeLocationSignals.h" #import "TGBridgeLocationVenue+TGTableItem.h" -#import "TGBridgeLocationMediaAttachment.h" #import "WKInterfaceTable+TGDataDrivenTable.h" #import "TGTableDeltaUpdater.h" diff --git a/Watch/Extension/TGLocationVenueRowController.m b/Watch/Extension/TGLocationVenueRowController.m index c9607d1ab0..a00135ca9d 100644 --- a/Watch/Extension/TGLocationVenueRowController.m +++ b/Watch/Extension/TGLocationVenueRowController.m @@ -1,6 +1,6 @@ #import "TGLocationVenueRowController.h" -#import "TGBridgeLocationVenue.h" +#import NSString *const TGLocationVenueRowIdentifier = @"TGLocationVenueRow"; diff --git a/Watch/Extension/TGMessageViewController.m b/Watch/Extension/TGMessageViewController.m index eafa9cfc0d..f6929f7b37 100644 --- a/Watch/Extension/TGMessageViewController.m +++ b/Watch/Extension/TGMessageViewController.m @@ -1,14 +1,12 @@ #import "TGMessageViewController.h" + +#import + #import "TGWatchCommon.h" #import "TGBridgeSendMessageSignals.h" #import "TGBridgeRemoteSignals.h" #import "TGBridgeAudioSignals.h" -#import "TGBridgePeerIdAdapter.h" - -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" -#import "TGBridgeMessage.h" #import "TGBridgeUserCache.h" #import "WKInterfaceTable+TGDataDrivenTable.h" diff --git a/Watch/Extension/TGMessageViewFooterController.m b/Watch/Extension/TGMessageViewFooterController.m index d0aaaa7caa..190a1d5cb7 100644 --- a/Watch/Extension/TGMessageViewFooterController.m +++ b/Watch/Extension/TGMessageViewFooterController.m @@ -1,9 +1,10 @@ #import "TGMessageViewFooterController.h" + +#import + #import "TGWatchCommon.h" #import "TGDateUtils.h" -#import "TGBridgeMessage.h" - NSString *const TGMessageViewFooterIdentifier = @"TGMessageViewFooter"; @implementation TGMessageViewFooterController diff --git a/Watch/Extension/TGMessageViewMessageRowController.m b/Watch/Extension/TGMessageViewMessageRowController.m index ce10c48756..a377a119cc 100644 --- a/Watch/Extension/TGMessageViewMessageRowController.m +++ b/Watch/Extension/TGMessageViewMessageRowController.m @@ -1,4 +1,7 @@ #import "TGMessageViewMessageRowController.h" + +#import + #import "TGWatchCommon.h" #import "TGExtensionDelegate.h" @@ -11,14 +14,8 @@ #import "TGBridgeMediaSignals.h" -#import "TGBridgeUser.h" -#import "TGBridgeMessage.h" #import "TGBridgeUserCache.h" -#import "TGBridgeContext.h" - -#import "TGBridgePeerIdAdapter.h" - NSString *const TGMessageViewMessageRowIdentifier = @"TGMessageViewMessageRow"; @interface TGMessageViewMessageRowController () diff --git a/Watch/Extension/TGMessageViewModel.m b/Watch/Extension/TGMessageViewModel.m index ff4f47e1f8..052cba63ec 100644 --- a/Watch/Extension/TGMessageViewModel.m +++ b/Watch/Extension/TGMessageViewModel.m @@ -1,4 +1,7 @@ #import "TGMessageViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGStringUtils.h" #import "TGGeometry.h" @@ -6,13 +9,8 @@ #import "WKInterfaceImage+Signals.h" #import "WKInterfaceGroup+Signals.h" -#import "TGBridgeUser.h" -#import "TGBridgeChat.h" -#import "TGBridgeMessage.h" #import "TGBridgeUserCache.h" -#import "TGBridgeContext.h" - #import "TGBridgeMediaSignals.h" @implementation TGMessageViewModel diff --git a/Watch/Extension/TGMessageViewWebPageRowController.m b/Watch/Extension/TGMessageViewWebPageRowController.m index ce3db6fea6..2988c9f886 100644 --- a/Watch/Extension/TGMessageViewWebPageRowController.m +++ b/Watch/Extension/TGMessageViewWebPageRowController.m @@ -1,12 +1,11 @@ #import "TGMessageViewWebPageRowController.h" +#import + #import "WKInterfaceGroup+Signals.h" #import "TGBridgeMediaSignals.h" -#import "TGBridgeMessage.h" #import "TGMessageViewModel.h" -#import "TGBridgeImageMediaAttachment.h" -#import "TGBridgeWebPageMediaAttachment.h" NSString *const TGMessageViewWebPageRowIdentifier = @"TGMessageViewWebPageRow"; diff --git a/Watch/Extension/TGNeoAttachmentViewModel.m b/Watch/Extension/TGNeoAttachmentViewModel.m index 9af87799d1..5829e8a35f 100644 --- a/Watch/Extension/TGNeoAttachmentViewModel.m +++ b/Watch/Extension/TGNeoAttachmentViewModel.m @@ -1,13 +1,13 @@ #import "TGNeoAttachmentViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoImageViewModel.h" #import "TGNeoLabelViewModel.h" #import "TGStringUtils.h" -#import "TGBridgeMessage.h" -#import "TGBridgeUser.h" - @interface TGNeoAttachmentViewModel () { TGNeoImageViewModel *_iconModel; diff --git a/Watch/Extension/TGNeoAudioMessageViewModel.m b/Watch/Extension/TGNeoAudioMessageViewModel.m index b42693ad06..1ac4c08923 100644 --- a/Watch/Extension/TGNeoAudioMessageViewModel.m +++ b/Watch/Extension/TGNeoAudioMessageViewModel.m @@ -1,6 +1,8 @@ #import "TGNeoAudioMessageViewModel.h" + +#import + #import "TGWatchCommon.h" -#import "TGBridgeMessage.h" @interface TGNeoAudioMessageViewModel () { diff --git a/Watch/Extension/TGNeoBubbleMessageViewModel.m b/Watch/Extension/TGNeoBubbleMessageViewModel.m index 660c890fa2..fa07d55b9d 100644 --- a/Watch/Extension/TGNeoBubbleMessageViewModel.m +++ b/Watch/Extension/TGNeoBubbleMessageViewModel.m @@ -1,15 +1,12 @@ #import "TGNeoBubbleMessageViewModel.h" + +#import + #import "TGNeoBackgroundViewModel.h" #import "TGExtensionDelegate.h" #import "TGWatchColor.h" -#import "TGBridgeContext.h" -#import "TGBridgeMessage.h" -#import "TGBridgeUser.h" - -#import "TGBridgePeerIdAdapter.h" - const UIEdgeInsets TGNeoBubbleMessageViewModelInsets = { 4.5, 11, 9, 11 }; const CGFloat TGNeoBubbleMessageMetaSpacing = 5.0f; const CGFloat TGNeoBubbleHeaderSpacing = 2.0f; diff --git a/Watch/Extension/TGNeoChatRowController.m b/Watch/Extension/TGNeoChatRowController.m index 540c9d21b8..9b0dcf4e30 100644 --- a/Watch/Extension/TGNeoChatRowController.m +++ b/Watch/Extension/TGNeoChatRowController.m @@ -1,8 +1,8 @@ #import "TGNeoChatRowController.h" + +#import + #import "TGWatchCommon.h" -#import "TGBridgeContext.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" #import "TGBridgeUserCache.h" #import "TGNeoChatViewModel.h" diff --git a/Watch/Extension/TGNeoChatViewModel.m b/Watch/Extension/TGNeoChatViewModel.m index 266f7e9014..ccdc0de8af 100644 --- a/Watch/Extension/TGNeoChatViewModel.m +++ b/Watch/Extension/TGNeoChatViewModel.m @@ -1,13 +1,12 @@ #import "TGNeoChatViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoLabelViewModel.h" #import "TGNeoImageViewModel.h" #import "TGNeoAttachmentViewModel.h" -#import "TGBridgeContext.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" - #import "TGExtensionDelegate.h" #import "TGStringUtils.h" #import "TGDateUtils.h" diff --git a/Watch/Extension/TGNeoChatsController.m b/Watch/Extension/TGNeoChatsController.m index 333c97ac41..9a546a3762 100644 --- a/Watch/Extension/TGNeoChatsController.m +++ b/Watch/Extension/TGNeoChatsController.m @@ -1,12 +1,12 @@ #import "TGNeoChatsController.h" + +#import + #import "TGWatchCommon.h" #import "WKInterfaceTable+TGDataDrivenTable.h" #import "TGTableDeltaUpdater.h" #import "TGInterfaceMenu.h" -#import "TGBridgeContext.h" -#import "TGBridgeUser.h" -#import "TGBridgeChat.h" #import "TGBridgeUserCache.h" #import "TGBridgeClient.h" diff --git a/Watch/Extension/TGNeoContactMessageViewModel.m b/Watch/Extension/TGNeoContactMessageViewModel.m index 396573a1aa..a67c90e6b8 100644 --- a/Watch/Extension/TGNeoContactMessageViewModel.m +++ b/Watch/Extension/TGNeoContactMessageViewModel.m @@ -1,11 +1,10 @@ #import "TGNeoContactMessageViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoLabelViewModel.h" -#import "TGBridgeContext.h" -#import "TGBridgeMessage.h" -#import "TGBridgeUser.h" - #import "TGStringUtils.h" @interface TGNeoContactMessageViewModel () diff --git a/Watch/Extension/TGNeoConversationController.m b/Watch/Extension/TGNeoConversationController.m index e904d6160e..4c099a70c3 100644 --- a/Watch/Extension/TGNeoConversationController.m +++ b/Watch/Extension/TGNeoConversationController.m @@ -1,4 +1,7 @@ #import "TGNeoConversationController.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoChatsController.h" @@ -10,12 +13,7 @@ #import "TGInterfaceMenu.h" #import "TGBridgeClient.h" -#import "TGBridgeContext.h" -#import "TGBridgeUser.h" -#import "TGBridgeChat.h" -#import "TGBridgeChatMessages.h" #import "TGBridgeMessage+TGTableItem.h" -#import "TGBridgeBotInfo.h" #import "TGBridgeBotReplyMarkup.h" #import "TGBridgeUserCache.h" diff --git a/Watch/Extension/TGNeoConversationStaticRowController.m b/Watch/Extension/TGNeoConversationStaticRowController.m index 04803dc660..ad7dc6a847 100644 --- a/Watch/Extension/TGNeoConversationStaticRowController.m +++ b/Watch/Extension/TGNeoConversationStaticRowController.m @@ -1,5 +1,7 @@ #import "TGNeoConversationStaticRowController.h" -#import "TGBridgeMessage.h" + +#import + #import "TGBridgeUserCache.h" #import "TGChatInfo.h" diff --git a/Watch/Extension/TGNeoFileMessageViewModel.m b/Watch/Extension/TGNeoFileMessageViewModel.m index 8da4a3f15e..e68f0ce0f9 100644 --- a/Watch/Extension/TGNeoFileMessageViewModel.m +++ b/Watch/Extension/TGNeoFileMessageViewModel.m @@ -1,6 +1,8 @@ #import "TGNeoFileMessageViewModel.h" + +#import + #import "TGNeoImageViewModel.h" -#import "TGBridgeMessage.h" #import "TGStringUtils.h" diff --git a/Watch/Extension/TGNeoForwardHeaderViewModel.m b/Watch/Extension/TGNeoForwardHeaderViewModel.m index 9d0f03167e..177119eb55 100644 --- a/Watch/Extension/TGNeoForwardHeaderViewModel.m +++ b/Watch/Extension/TGNeoForwardHeaderViewModel.m @@ -1,10 +1,10 @@ #import "TGNeoForwardHeaderViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoLabelViewModel.h" -#import "TGBridgeUser.h" -#import "TGBridgeChat.h" - const CGFloat TGNeoForwardHeaderHeight = 29; @interface TGNeoForwardHeaderViewModel () diff --git a/Watch/Extension/TGNeoMediaMessageViewModel.m b/Watch/Extension/TGNeoMediaMessageViewModel.m index 17a048a7c3..078c46f35d 100644 --- a/Watch/Extension/TGNeoMediaMessageViewModel.m +++ b/Watch/Extension/TGNeoMediaMessageViewModel.m @@ -1,6 +1,8 @@ #import "TGNeoMediaMessageViewModel.h" + +#import + #import "TGWatchCommon.h" -#import "TGBridgeMessage.h" #import "TGGeometry.h" diff --git a/Watch/Extension/TGNeoMessageViewModel.m b/Watch/Extension/TGNeoMessageViewModel.m index fa4f83e79c..555211c67f 100644 --- a/Watch/Extension/TGNeoMessageViewModel.m +++ b/Watch/Extension/TGNeoMessageViewModel.m @@ -1,4 +1,7 @@ #import "TGNeoMessageViewModel.h" + +#import + #import "TGNeoTextMessageViewModel.h" #import "TGNeoSmiliesMessageViewModel.h" #import "TGNeoMediaMessageViewModel.h" @@ -16,8 +19,6 @@ #import "TGStringUtils.h" -#import "TGBridgePeerIdAdapter.h" -#import "TGBridgeMessage.h" #import "TGBridgeUserCache.h" NSString *const TGNeoContentInset = @"contentInset"; diff --git a/Watch/Extension/TGNeoReplyHeaderViewModel.m b/Watch/Extension/TGNeoReplyHeaderViewModel.m index 8eb5b98bbf..f1e6f58e95 100644 --- a/Watch/Extension/TGNeoReplyHeaderViewModel.m +++ b/Watch/Extension/TGNeoReplyHeaderViewModel.m @@ -1,14 +1,11 @@ #import "TGNeoReplyHeaderViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoLabelViewModel.h" #import "TGNeoAttachmentViewModel.h" -#import "TGBridgeMessage.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" -#import "TGBridgeReplyMessageMediaAttachment.h" -#import "TGBridgeVideoMediaAttachment.h" - const CGFloat TGNeoReplyHeaderHeight = 29.0f; const CGFloat TGNeoReplyHeaderLineWidth = 2.0f; const CGFloat TGNeoReplyHeaderSpacing = 4.0f; diff --git a/Watch/Extension/TGNeoRowController.m b/Watch/Extension/TGNeoRowController.m index 0fcc0433f9..6ac19ec741 100644 --- a/Watch/Extension/TGNeoRowController.m +++ b/Watch/Extension/TGNeoRowController.m @@ -1,4 +1,7 @@ #import "TGNeoRowController.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoConversationRowController.h" #import "TGNeoConversationSimpleRowController.h" @@ -12,8 +15,6 @@ #import "TGNeoBubbleMessageViewModel.h" #import "TGNeoStickerMessageViewModel.h" -#import "TGBridgeMessage.h" - #import "WKInterfaceGroup+Signals.h" #import "TGBridgeMediaSignals.h" diff --git a/Watch/Extension/TGNeoServiceMessageViewModel.m b/Watch/Extension/TGNeoServiceMessageViewModel.m index 71f0d88372..2fa384c081 100644 --- a/Watch/Extension/TGNeoServiceMessageViewModel.m +++ b/Watch/Extension/TGNeoServiceMessageViewModel.m @@ -1,13 +1,11 @@ #import "TGNeoServiceMessageViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoLabelViewModel.h" - -#import "TGBridgeMessage.h" -#import "TGBridgeUser.h" #import "TGChatInfo.h" -#import "TGBridgePeerIdAdapter.h" - const UIEdgeInsets TGNeoServiceMessageInsets = { 2, 0, 6, 0 }; const UIEdgeInsets TGNeoChatInfoInsets = { 12, 0, 12, 0 }; diff --git a/Watch/Extension/TGNeoSmiliesMessageViewModel.m b/Watch/Extension/TGNeoSmiliesMessageViewModel.m index fd97837015..6fec0fd0c3 100644 --- a/Watch/Extension/TGNeoSmiliesMessageViewModel.m +++ b/Watch/Extension/TGNeoSmiliesMessageViewModel.m @@ -1,14 +1,12 @@ #import "TGNeoSmiliesMessageViewModel.h" + +#import + #import "TGNeoBubbleMessageViewModel.h" #import "TGNeoLabelViewModel.h" -#import "TGBridgeContext.h" -#import "TGBridgeMessage.h" - #import "TGWatchColor.h" -#import "TGBridgePeerIdAdapter.h" - const CGFloat TGNeoSmiliesMessageHeight = 39; @interface TGNeoSmiliesMessageViewModel () diff --git a/Watch/Extension/TGNeoStickerMessageViewModel.m b/Watch/Extension/TGNeoStickerMessageViewModel.m index 56bf7ddfc6..69e878d415 100644 --- a/Watch/Extension/TGNeoStickerMessageViewModel.m +++ b/Watch/Extension/TGNeoStickerMessageViewModel.m @@ -1,4 +1,7 @@ #import "TGNeoStickerMessageViewModel.h" + +#import + #import "TGWatchCommon.h" #import "TGNeoLabelViewModel.h" @@ -6,11 +9,7 @@ #import "TGGeometry.h" -#import "TGBridgeContext.h" -#import "TGBridgeMessage.h" - #import "../Extension/TGStringUtils.h" -#import "TGBridgePeerIdAdapter.h" @interface TGNeoStickerMessageViewModel () { diff --git a/Watch/Extension/TGNeoTextMessageViewModel.m b/Watch/Extension/TGNeoTextMessageViewModel.m index 2efe822100..2fb4e2da08 100644 --- a/Watch/Extension/TGNeoTextMessageViewModel.m +++ b/Watch/Extension/TGNeoTextMessageViewModel.m @@ -1,9 +1,10 @@ #import "TGNeoTextMessageViewModel.h" + +#import + #import "TGNeoLabelViewModel.h" #import "TGMessageViewModel.h" -#import "TGBridgeMessage.h" - @interface TGNeoTextMessageViewModel () { TGNeoLabelViewModel *_textModel; diff --git a/Watch/Extension/TGNeoUnsupportedMessageViewModel.m b/Watch/Extension/TGNeoUnsupportedMessageViewModel.m index 01d19f2676..4e15abe51a 100644 --- a/Watch/Extension/TGNeoUnsupportedMessageViewModel.m +++ b/Watch/Extension/TGNeoUnsupportedMessageViewModel.m @@ -1,6 +1,6 @@ #import "TGNeoUnsupportedMessageViewModel.h" #import "TGWatchCommon.h" -#import "TGBridgeMessage.h" +#import @interface TGNeoUnsupportedMessageViewModel () { diff --git a/Watch/Extension/TGNeoVenueMessageViewModel.m b/Watch/Extension/TGNeoVenueMessageViewModel.m index 8cb4cc3bdf..c32842fcdf 100644 --- a/Watch/Extension/TGNeoVenueMessageViewModel.m +++ b/Watch/Extension/TGNeoVenueMessageViewModel.m @@ -1,6 +1,8 @@ #import "TGNeoVenueMessageViewModel.h" + +#import + #import "TGNeoImageViewModel.h" -#import "TGBridgeMessage.h" @interface TGNeoVenueMessageViewModel () { diff --git a/Watch/Extension/TGNotificationController.m b/Watch/Extension/TGNotificationController.m index 9e3a1e3f65..d5260db5f2 100644 --- a/Watch/Extension/TGNotificationController.m +++ b/Watch/Extension/TGNotificationController.m @@ -1,4 +1,7 @@ #import "TGNotificationController.h" + +#import + #import "TGWatchCommon.h" #import "TGStringUtils.h" #import "TGLocationUtils.h" @@ -10,15 +13,8 @@ #import "TGBridgeMediaSignals.h" #import "TGBridgeClient.h" -#import "TGBridgeSubscriptions.h" -#import "TGBridgeChatMessages.h" -#import "TGBridgeMessage.h" -#import "TGBridgeChat.h" -#import "TGBridgeUser.h" #import "TGBridgeUserCache.h" -#import "TGBridgePeerIdAdapter.h" - #import #import diff --git a/Watch/Extension/TGStickersRowController.m b/Watch/Extension/TGStickersRowController.m index ca206876eb..70a7b9a051 100644 --- a/Watch/Extension/TGStickersRowController.m +++ b/Watch/Extension/TGStickersRowController.m @@ -1,8 +1,9 @@ #import "TGStickersRowController.h" +#import + #import "WKInterfaceGroup+Signals.h" #import "TGBridgeMediaSignals.h" -#import "TGBridgeDocumentMediaAttachment.h" NSString *const TGStickersRowIdentifier = @"TGStickersRow"; diff --git a/Watch/Extension/TGUserInfoController.m b/Watch/Extension/TGUserInfoController.m index b1b00e300c..c3eb9d87e0 100644 --- a/Watch/Extension/TGUserInfoController.m +++ b/Watch/Extension/TGUserInfoController.m @@ -2,17 +2,13 @@ #import "TGWatchCommon.h" #import "TGStringUtils.h" -#import "TGBridgeContext.h" +#import #import "TGBridgeBotSignals.h" #import "TGBridgeUserInfoSignals.h" #import "TGBridgePeerSettingsSignals.h" -#import "TGBridgeUser.h" -#import "TGBridgeBotInfo.h" #import "TGBridgeUserCache.h" #import "TGUserHandle.h" -#import "TGBridgeChat.h" - #import "TGTableDeltaUpdater.h" #import "WKInterfaceTable+TGDataDrivenTable.h" diff --git a/Watch/Extension/TGUserInfoHeaderController.m b/Watch/Extension/TGUserInfoHeaderController.m index 05b72ae420..d4805e7250 100644 --- a/Watch/Extension/TGUserInfoHeaderController.m +++ b/Watch/Extension/TGUserInfoHeaderController.m @@ -1,4 +1,7 @@ #import "TGUserInfoHeaderController.h" + +#import + #import "TGWatchCommon.h" #import "TGDateUtils.h" #import "TGStringUtils.h" @@ -7,11 +10,6 @@ #import "TGBridgeMediaSignals.h" -#import "TGBridgeUser.h" -#import "TGBridgeChat.h" - -#import "TGBridgeContext.h" - NSString *const TGUserInfoHeaderIdentifier = @"TGUserInfoHeader"; @interface TGUserInfoHeaderController () diff --git a/Watch/Extension/TGUserRowController.m b/Watch/Extension/TGUserRowController.m index 4fdd5e6a61..8264c144e2 100644 --- a/Watch/Extension/TGUserRowController.m +++ b/Watch/Extension/TGUserRowController.m @@ -1,4 +1,7 @@ #import "TGUserRowController.h" + +#import + #import "TGWatchCommon.h" #import "TGDateUtils.h" #import "TGStringUtils.h" @@ -7,11 +10,6 @@ #import "TGBridgeMediaSignals.h" -#import "TGBridgeUser.h" -#import "TGBridgeChat.h" -#import "TGBridgeBotCommandInfo.h" -#import "TGBridgeContext.h" - NSString *const TGUserRowIdentifier = @"TGUserRow"; @interface TGUserRowController () diff --git a/Watch/Extension/TGWatchColor.m b/Watch/Extension/TGWatchColor.m index 515141dbb3..fcbf7d1776 100644 --- a/Watch/Extension/TGWatchColor.m +++ b/Watch/Extension/TGWatchColor.m @@ -1,5 +1,5 @@ #import "TGWatchColor.h" -#import "TGBridgePeerIdAdapter.h" +#import #import @implementation UIColor (TGColor) diff --git a/Widget/PeerNode.swift b/Widget/PeerNode.swift index a18dd3df1f..d107a1cefa 100644 --- a/Widget/PeerNode.swift +++ b/Widget/PeerNode.swift @@ -41,6 +41,18 @@ private func avatarRoundImage(size: CGSize, source: UIImage) -> UIImage? { return image } +private let deviceColorSpace: CGColorSpace = { + if #available(iOSApplicationExtension 9.3, *) { + if let colorSpace = CGColorSpace(name: CGColorSpace.displayP3) { + return colorSpace + } else { + return CGColorSpaceCreateDeviceRGB() + } + } else { + return CGColorSpaceCreateDeviceRGB() + } +}() + private func avatarViewLettersImage(size: CGSize, peerId: PeerId, accountPeerId: PeerId, letters: [String]) -> UIImage? { UIGraphicsBeginImageContextWithOptions(size, false, 0.0) let context = UIGraphicsGetCurrentContext() @@ -53,8 +65,7 @@ private func avatarViewLettersImage(size: CGSize, peerId: PeerId, accountPeerId: let colorsArray = gradientColors[colorIndex % gradientColors.count] var locations: [CGFloat] = [1.0, 0.0] - let colorSpace = CGColorSpaceCreateDeviceRGB() - let gradient = CGGradient(colorsSpace: colorSpace, colors: colorsArray, locations: &locations)! + let gradient = CGGradient(colorsSpace: deviceColorSpace, colors: colorsArray, locations: &locations)! context?.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions()) diff --git a/Widget/TodayViewController.swift b/Widget/TodayViewController.swift index f8c91c295f..a06923c2c7 100644 --- a/Widget/TodayViewController.swift +++ b/Widget/TodayViewController.swift @@ -3,6 +3,7 @@ import TelegramCore import SwiftSignalKit import Postbox import NotificationCenter +import BuildConfig private var installedSharedLogger = false diff --git a/Widget/Widget-Bridging-Header.h b/Widget/Widget-Bridging-Header.h index fd2b66c5aa..16747def3f 100644 --- a/Widget/Widget-Bridging-Header.h +++ b/Widget/Widget-Bridging-Header.h @@ -1,6 +1,4 @@ #ifndef Widget_Bridging_Header_h #define Widget_Bridging_Header_h -#import "../Telegram-iOS/BuildConfig.h" - #endif diff --git a/submodules/BuildConfig/BuildConfig_Xcode.xcodeproj/project.pbxproj b/submodules/BuildConfig/BuildConfig_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..0513f534a2 --- /dev/null +++ b/submodules/BuildConfig/BuildConfig_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,544 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D008179222B4786B008A895F /* BuildConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = D008179022B4786B008A895F /* BuildConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008179A22B4792C008A895F /* BuildConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D008179922B4792C008A895F /* BuildConfig.m */; }; + D00818B222B59067008A895F /* Config-Fork.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D00818AF22B59067008A895F /* Config-Fork.xcconfig */; }; + D00818B322B59067008A895F /* Config-Hockeyapp-Internal.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D00818B022B59067008A895F /* Config-Hockeyapp-Internal.xcconfig */; }; + D00818B422B59067008A895F /* Config-AppStoreLLC.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D00818B122B59067008A895F /* Config-AppStoreLLC.xcconfig */; }; + D035734E22B5CEE200F0920D /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D035734D22B5CEE200F0920D /* MtProtoKitDynamic.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D008178D22B4786B008A895F /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008179022B4786B008A895F /* BuildConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BuildConfig.h; sourceTree = ""; }; + D008179122B4786B008A895F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D008179922B4792C008A895F /* BuildConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BuildConfig.m; sourceTree = ""; }; + D00818AF22B59067008A895F /* Config-Fork.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Config-Fork.xcconfig"; sourceTree = ""; }; + D00818B022B59067008A895F /* Config-Hockeyapp-Internal.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Config-Hockeyapp-Internal.xcconfig"; sourceTree = ""; }; + D00818B122B59067008A895F /* Config-AppStoreLLC.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Config-AppStoreLLC.xcconfig"; sourceTree = ""; }; + D035734D22B5CEE200F0920D /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MtProtoKitDynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D008178A22B4786B008A895F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D035734E22B5CEE200F0920D /* MtProtoKitDynamic.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D008178322B4786B008A895F = { + isa = PBXGroup; + children = ( + D00818B122B59067008A895F /* Config-AppStoreLLC.xcconfig */, + D00818AF22B59067008A895F /* Config-Fork.xcconfig */, + D00818B022B59067008A895F /* Config-Hockeyapp-Internal.xcconfig */, + D008179122B4786B008A895F /* Info.plist */, + D008178F22B4786B008A895F /* Sources */, + D008178E22B4786B008A895F /* Products */, + D035734C22B5CEE200F0920D /* Frameworks */, + ); + sourceTree = ""; + }; + D008178E22B4786B008A895F /* Products */ = { + isa = PBXGroup; + children = ( + D008178D22B4786B008A895F /* BuildConfig.framework */, + ); + name = Products; + sourceTree = ""; + }; + D008178F22B4786B008A895F /* Sources */ = { + isa = PBXGroup; + children = ( + D008179022B4786B008A895F /* BuildConfig.h */, + D008179922B4792C008A895F /* BuildConfig.m */, + ); + path = Sources; + sourceTree = ""; + }; + D035734C22B5CEE200F0920D /* Frameworks */ = { + isa = PBXGroup; + children = ( + D035734D22B5CEE200F0920D /* MtProtoKitDynamic.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D008178822B4786B008A895F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D008179222B4786B008A895F /* BuildConfig.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D008178C22B4786B008A895F /* BuildConfig */ = { + isa = PBXNativeTarget; + buildConfigurationList = D008179522B4786B008A895F /* Build configuration list for PBXNativeTarget "BuildConfig" */; + buildPhases = ( + D008178822B4786B008A895F /* Headers */, + D008178922B4786B008A895F /* Sources */, + D008178A22B4786B008A895F /* Frameworks */, + D008178B22B4786B008A895F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BuildConfig; + productName = BuildConfig; + productReference = D008178D22B4786B008A895F /* BuildConfig.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D008178422B4786B008A895F /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D008178C22B4786B008A895F = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = D008178722B4786B008A895F /* Build configuration list for PBXProject "BuildConfig_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D008178322B4786B008A895F; + productRefGroup = D008178E22B4786B008A895F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D008178C22B4786B008A895F /* BuildConfig */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D008178B22B4786B008A895F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D00818B422B59067008A895F /* Config-AppStoreLLC.xcconfig in Resources */, + D00818B322B59067008A895F /* Config-Hockeyapp-Internal.xcconfig in Resources */, + D00818B222B59067008A895F /* Config-Fork.xcconfig in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D008178922B4786B008A895F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D008179A22B4792C008A895F /* BuildConfig.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D008179322B4786B008A895F /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B122B59067008A895F /* Config-AppStoreLLC.xcconfig */; + 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; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStoreLLC; + }; + D008179422B4786B008A895F /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B122B59067008A895F /* Config-AppStoreLLC.xcconfig */; + 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; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStoreLLC; + }; + D008179622B4786B008A895F /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B122B59067008A895F /* Config-AppStoreLLC.xcconfig */; + 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.BuildConfig; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D008179722B4786B008A895F /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B122B59067008A895F /* Config-AppStoreLLC.xcconfig */; + 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.BuildConfig; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D0A25B5A22B5BEE600AD4DE8 /* DebugHockeyapp */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B022B59067008A895F /* Config-Hockeyapp-Internal.xcconfig */; + 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; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugHockeyapp; + }; + D0A25B5B22B5BEE600AD4DE8 /* DebugHockeyapp */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B022B59067008A895F /* Config-Hockeyapp-Internal.xcconfig */; + 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.BuildConfig; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B7322B5BF3A00AD4DE8 /* ReleaseHockeyappInternal */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B022B59067008A895F /* Config-Hockeyapp-Internal.xcconfig */; + 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; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyappInternal; + }; + D0A25B7422B5BF3A00AD4DE8 /* ReleaseHockeyappInternal */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D00818B022B59067008A895F /* Config-Hockeyapp-Internal.xcconfig */; + 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.BuildConfig; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D008178722B4786B008A895F /* Build configuration list for PBXProject "BuildConfig_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D008179322B4786B008A895F /* DebugAppStoreLLC */, + D0A25B5A22B5BEE600AD4DE8 /* DebugHockeyapp */, + D008179422B4786B008A895F /* ReleaseAppStoreLLC */, + D0A25B7322B5BF3A00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D008179522B4786B008A895F /* Build configuration list for PBXNativeTarget "BuildConfig" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D008179622B4786B008A895F /* DebugAppStoreLLC */, + D0A25B5B22B5BEE600AD4DE8 /* DebugHockeyapp */, + D008179722B4786B008A895F /* ReleaseAppStoreLLC */, + D0A25B7422B5BF3A00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D008178422B4786B008A895F /* Project object */; +} diff --git a/submodules/BuildConfig/Config-AppStoreLLC.xcconfig b/submodules/BuildConfig/Config-AppStoreLLC.xcconfig new file mode 100644 index 0000000000..d6449fc612 --- /dev/null +++ b/submodules/BuildConfig/Config-AppStoreLLC.xcconfig @@ -0,0 +1 @@ +#include "../../Telegram-iOS/Config-AppStoreLLC.xcconfig" diff --git a/submodules/BuildConfig/Config-Fork.xcconfig b/submodules/BuildConfig/Config-Fork.xcconfig new file mode 100644 index 0000000000..efe0d66c5c --- /dev/null +++ b/submodules/BuildConfig/Config-Fork.xcconfig @@ -0,0 +1 @@ +#include "../../Telegram-iOS/Config-Fork.xcconfig" diff --git a/submodules/BuildConfig/Config-Hockeyapp-Internal.xcconfig b/submodules/BuildConfig/Config-Hockeyapp-Internal.xcconfig new file mode 100644 index 0000000000..8b9e14fa83 --- /dev/null +++ b/submodules/BuildConfig/Config-Hockeyapp-Internal.xcconfig @@ -0,0 +1 @@ +#include "../../../Telegram-iOS-Shared/Config/Hockeyapp-Internal/Config.xcconfig" diff --git a/submodules/BuildConfig/Info.plist b/submodules/BuildConfig/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/BuildConfig/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/Telegram-iOS/BuildConfig.h b/submodules/BuildConfig/Sources/BuildConfig.h similarity index 100% rename from Telegram-iOS/BuildConfig.h rename to submodules/BuildConfig/Sources/BuildConfig.h diff --git a/Telegram-iOS/BuildConfig.m b/submodules/BuildConfig/Sources/BuildConfig.m similarity index 100% rename from Telegram-iOS/BuildConfig.m rename to submodules/BuildConfig/Sources/BuildConfig.m diff --git a/submodules/DeviceAccess/DeviceAccess_Xcode.xcodeproj/project.pbxproj b/submodules/DeviceAccess/DeviceAccess_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..a801764776 --- /dev/null +++ b/submodules/DeviceAccess/DeviceAccess_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,559 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D0AE31FE22B281300058D3BC /* DeviceAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE31FC22B281300058D3BC /* DeviceAccess.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE320522B2818D0058D3BC /* DeviceAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE320422B2818D0058D3BC /* DeviceAccess.swift */; }; + D0AE320A22B281CA0058D3BC /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE320922B281CA0058D3BC /* Display.framework */; }; + D0AE320C22B281CE0058D3BC /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE320B22B281CE0058D3BC /* TelegramCore.framework */; }; + D0AE320E22B281D30058D3BC /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE320D22B281D30058D3BC /* SwiftSignalKit.framework */; }; + D0AE321022B281E50058D3BC /* LegacyComponents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE320F22B281E50058D3BC /* LegacyComponents.framework */; }; + D0AE321222B2821B0058D3BC /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE321122B2821B0058D3BC /* TelegramPresentationData.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D0AE31F922B281300058D3BC /* DeviceAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DeviceAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31FC22B281300058D3BC /* DeviceAccess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeviceAccess.h; sourceTree = ""; }; + D0AE31FD22B281300058D3BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE320422B2818D0058D3BC /* DeviceAccess.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceAccess.swift; sourceTree = ""; }; + D0AE320922B281CA0058D3BC /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE320B22B281CE0058D3BC /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE320D22B281D30058D3BC /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE320F22B281E50058D3BC /* LegacyComponents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyComponents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE321122B2821B0058D3BC /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE31F622B281300058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE321222B2821B0058D3BC /* TelegramPresentationData.framework in Frameworks */, + D0AE321022B281E50058D3BC /* LegacyComponents.framework in Frameworks */, + D0AE320E22B281D30058D3BC /* SwiftSignalKit.framework in Frameworks */, + D0AE320C22B281CE0058D3BC /* TelegramCore.framework in Frameworks */, + D0AE320A22B281CA0058D3BC /* Display.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0AE31EF22B281300058D3BC = { + isa = PBXGroup; + children = ( + D0AE31FD22B281300058D3BC /* Info.plist */, + D0AE31FB22B281300058D3BC /* Sources */, + D0AE31FA22B281300058D3BC /* Products */, + D0AE320822B281CA0058D3BC /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE31FA22B281300058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE31F922B281300058D3BC /* DeviceAccess.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE31FB22B281300058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE320422B2818D0058D3BC /* DeviceAccess.swift */, + D0AE31FC22B281300058D3BC /* DeviceAccess.h */, + ); + path = Sources; + sourceTree = ""; + }; + D0AE320822B281CA0058D3BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0AE321122B2821B0058D3BC /* TelegramPresentationData.framework */, + D0AE320F22B281E50058D3BC /* LegacyComponents.framework */, + D0AE320D22B281D30058D3BC /* SwiftSignalKit.framework */, + D0AE320B22B281CE0058D3BC /* TelegramCore.framework */, + D0AE320922B281CA0058D3BC /* Display.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE31F422B281300058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE31FE22B281300058D3BC /* DeviceAccess.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE31F822B281300058D3BC /* DeviceAccess */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE320122B281300058D3BC /* Build configuration list for PBXNativeTarget "DeviceAccess" */; + buildPhases = ( + D0AE31F422B281300058D3BC /* Headers */, + D0AE31F522B281300058D3BC /* Sources */, + D0AE31F622B281300058D3BC /* Frameworks */, + D0AE31F722B281300058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DeviceAccess; + productName = DeviceAccess; + productReference = D0AE31F922B281300058D3BC /* DeviceAccess.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE31F022B281300058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE31F822B281300058D3BC = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D0AE31F322B281300058D3BC /* Build configuration list for PBXProject "DeviceAccess_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE31EF22B281300058D3BC; + productRefGroup = D0AE31FA22B281300058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE31F822B281300058D3BC /* DeviceAccess */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE31F722B281300058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE31F522B281300058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE320522B2818D0058D3BC /* DeviceAccess.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B5E22B5BEF200AD4DE8 /* 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; + }; + D0A25B5F22B5BEF200AD4DE8 /* 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.DeviceAccess; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B7722B5BF4100AD4DE8 /* 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; + }; + D0A25B7822B5BF4100AD4DE8 /* 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.DeviceAccess; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE31FF22B281300058D3BC /* 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; + }; + D0AE320022B281300058D3BC /* 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; + }; + D0AE320222B281300058D3BC /* 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.DeviceAccess; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE320322B281300058D3BC /* 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.DeviceAccess; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE31F322B281300058D3BC /* Build configuration list for PBXProject "DeviceAccess_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE31FF22B281300058D3BC /* DebugAppStoreLLC */, + D0A25B5E22B5BEF200AD4DE8 /* DebugHockeyapp */, + D0AE320022B281300058D3BC /* ReleaseAppStoreLLC */, + D0A25B7722B5BF4100AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE320122B281300058D3BC /* Build configuration list for PBXNativeTarget "DeviceAccess" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE320222B281300058D3BC /* DebugAppStoreLLC */, + D0A25B5F22B5BEF200AD4DE8 /* DebugHockeyapp */, + D0AE320322B281300058D3BC /* ReleaseAppStoreLLC */, + D0A25B7822B5BF4100AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE31F022B281300058D3BC /* Project object */; +} diff --git a/submodules/DeviceAccess/Info.plist b/submodules/DeviceAccess/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/DeviceAccess/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/DeviceAccess/Sources/DeviceAccess.h b/submodules/DeviceAccess/Sources/DeviceAccess.h new file mode 100644 index 0000000000..bfb7ce3a32 --- /dev/null +++ b/submodules/DeviceAccess/Sources/DeviceAccess.h @@ -0,0 +1,19 @@ +// +// DeviceAccess.h +// DeviceAccess +// +// Created by Peter on 6/13/19. +// Copyright © 2019 Telegram LLP. All rights reserved. +// + +#import + +//! Project version number for DeviceAccess. +FOUNDATION_EXPORT double DeviceAccessVersionNumber; + +//! Project version string for DeviceAccess. +FOUNDATION_EXPORT const unsigned char DeviceAccessVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/TelegramUI/TelegramUI/CheckDeviceAccess.swift b/submodules/DeviceAccess/Sources/DeviceAccess.swift similarity index 87% rename from submodules/TelegramUI/TelegramUI/CheckDeviceAccess.swift rename to submodules/DeviceAccess/Sources/DeviceAccess.swift index 898473c2d9..b93e023d00 100644 --- a/submodules/TelegramUI/TelegramUI/CheckDeviceAccess.swift +++ b/submodules/DeviceAccess/Sources/DeviceAccess.swift @@ -10,7 +10,7 @@ import Contacts import AddressBook import UserNotifications import CoreTelephony - +import TelegramPresentationData import LegacyComponents public enum DeviceAccessMicrophoneSubject { @@ -52,7 +52,7 @@ public enum AccessType { private let cachedMediaLibraryAccessStatus = Atomic(value: nil) -func shouldDisplayNotificationsPermissionWarning(status: AccessType, suppressed: Bool) -> Bool { +public func shouldDisplayNotificationsPermissionWarning(status: AccessType, suppressed: Bool) -> Bool { switch (status, suppressed) { case (.allowed, _), (.unreachable, true), (.notDetermined, true): return false @@ -78,11 +78,16 @@ public final class DeviceAccess { return self.siriPromise.get() } - public static func isMicrophoneAccessAuthorized() -> Bool? { - return AVAudioSession.sharedInstance().recordPermission() == .granted + private static let locationPromise = Promise(nil) + static var location: Signal { + return self.locationPromise.get() } - public static func authorizationStatus(context: AccountContext? = nil, subject: DeviceAccessSubject) -> Signal { + public static func isMicrophoneAccessAuthorized() -> Bool? { + return AVAudioSession.sharedInstance().recordPermission == .granted + } + + public static func authorizationStatus(applicationInForeground: Signal? = nil, siriAuthorization: (() -> AccessType)? = nil, subject: DeviceAccessSubject) -> Signal { switch subject { case .notifications: let status = (Signal { subscriber in @@ -125,8 +130,8 @@ public final class DeviceAccess { return .complete() } }) - if let context = context { - return context.sharedContext.applicationBindings.applicationInForeground + if let applicationInForeground = applicationInForeground { + return applicationInForeground |> distinctUntilChanged |> mapToSignal { inForeground -> Signal in return status @@ -173,12 +178,12 @@ public final class DeviceAccess { if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { func statusForCellularState(_ state: CTCellularDataRestrictedState) -> AccessType? { switch state { - case .restricted: - return .denied - case .notRestricted: - return .allowed - default: - return nil + case .restricted: + return .denied + case .notRestricted: + return .allowed + default: + return nil } } let cellState = CTCellularData.init() @@ -197,9 +202,9 @@ public final class DeviceAccess { return EmptyDisposable } case .siri: - if let context = context { + if let siriAuthorization = siriAuthorization { return Signal { subscriber in - let status = context.sharedContext.applicationBindings.siriAuthorization() + let status = siriAuthorization() subscriber.putNext(status) subscriber.putCompletion() return EmptyDisposable @@ -215,12 +220,35 @@ public final class DeviceAccess { } else { return .single(.denied) } + case .location: + return Signal { subscriber in + let status = CLLocationManager.authorizationStatus() + switch status { + case .authorizedAlways, .authorizedWhenInUse: + subscriber.putNext(.allowed) + case .denied, .restricted: + subscriber.putNext(.denied) + case .notDetermined: + subscriber.putNext(.notDetermined) + } + subscriber.putCompletion() + return EmptyDisposable + } + |> then(self.location + |> mapToSignal { authorized -> Signal in + if let authorized = authorized { + return .single(authorized ? .allowed : .denied) + } else { + return .complete() + } + } + ) default: return .single(.notDetermined) } } - public static func authorizeAccess(to subject: DeviceAccessSubject, context: AccountContext? = nil, presentationData: PresentationData? = nil, present: @escaping (ViewController, Any?) -> Void = { _, _ in }, openSettings: @escaping () -> Void = { }, displayNotificationFromBackground: @escaping (String) -> Void = { _ in }, _ completion: @escaping (Bool) -> Void = { _ in }) { + public static func authorizeAccess(to subject: DeviceAccessSubject, registerForNotifications: ((@escaping (Bool) -> Void) -> Void)? = nil, requestSiriAuthorization: ((@escaping (Bool) -> Void) -> Void)? = nil, presentationData: PresentationData? = nil, present: @escaping (ViewController, Any?) -> Void = { _, _ in }, openSettings: @escaping () -> Void = { }, displayNotificationFromBackground: @escaping (String) -> Void = { _ in }, _ completion: @escaping (Bool) -> Void = { _ in }) { switch subject { case .camera: let status = PGCamera.cameraAuthorizationStatus() @@ -254,7 +282,7 @@ public final class DeviceAccess { completion(true) } case let .microphone(microphoneSubject): - if AVAudioSession.sharedInstance().recordPermission() == .granted { + if AVAudioSession.sharedInstance().recordPermission == .granted { completion(true) } else { AVAudioSession.sharedInstance().requestRecordPermission({ granted in @@ -405,15 +433,15 @@ public final class DeviceAccess { } }) case .notifications: - if let context = context { - context.sharedContext.applicationBindings.registerForNotifications { result in + if let registerForNotifications = registerForNotifications { + registerForNotifications { result in self.notificationsPromise.set(.single(result)) completion(result) } } case .siri: - if let context = context { - context.sharedContext.applicationBindings.requestSiriAuthorization { result in + if let requestSiriAuthorization = requestSiriAuthorization { + requestSiriAuthorization { result in self.siriPromise.set(.single(result)) completion(result) } diff --git a/submodules/Display/Display/AlertControllerNode.swift b/submodules/Display/Display/AlertControllerNode.swift index 30ae994d00..82d0b9e84e 100644 --- a/submodules/Display/Display/AlertControllerNode.swift +++ b/submodules/Display/Display/AlertControllerNode.swift @@ -25,7 +25,7 @@ final class AlertControllerNode: ASDisplayNode { let dimColor = UIColor(white: 0.0, alpha: 0.5) self.centerDimView = UIImageView() - self.centerDimView.image = generateStretchableFilledCircleImage(radius: 16.0, color: nil, backgroundColor: dimColor) + self.centerDimView.backgroundColor = dimColor self.topDimView = UIView() self.topDimView.backgroundColor = dimColor @@ -95,11 +95,17 @@ final class AlertControllerNode: ASDisplayNode { self.bottomDimView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) self.leftDimView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) self.rightDimView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) - self.containerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25) + self.containerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25, completion: { [weak self] _ in + self?.centerDimView.backgroundColor = nil + self?.centerDimView.image = generateStretchableFilledCircleImage(radius: 16.0, color: nil, backgroundColor: UIColor(white: 0.0, alpha: 0.5)) + }) self.containerNode.layer.animateSpring(from: 0.8 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.5, initialVelocity: 0.0, removeOnCompletion: true, additive: false, completion: nil) } func animateOut(completion: @escaping () -> Void) { + self.centerDimView.backgroundColor = UIColor(white: 0.0, alpha: 0.5) + self.centerDimView.image = nil + self.centerDimView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) self.topDimView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) self.bottomDimView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false) diff --git a/submodules/Display/Display/GenerateImage.swift b/submodules/Display/Display/GenerateImage.swift index dac84c3a37..ae6baba564 100644 --- a/submodules/Display/Display/GenerateImage.swift +++ b/submodules/Display/Display/GenerateImage.swift @@ -1,15 +1,25 @@ import Foundation import UIKit -let deviceColorSpace = CGColorSpaceCreateDeviceRGB() +private let deviceColorSpace: CGColorSpace = { + if #available(iOSApplicationExtension 9.3, *) { + if let colorSpace = CGColorSpace(name: CGColorSpace.displayP3) { + return colorSpace + } else { + return CGColorSpaceCreateDeviceRGB() + } + } else { + return CGColorSpaceCreateDeviceRGB() + } +}() + let deviceScale = UIScreen.main.scale -public func generateImagePixel(_ size: CGSize, pixelGenerator: (CGSize, UnsafeMutablePointer) -> Void) -> UIImage? { - let scale = deviceScale +public func generateImagePixel(_ size: CGSize, scale: CGFloat, pixelGenerator: (CGSize, UnsafeMutablePointer) -> Void) -> UIImage? { let scaledSize = CGSize(width: size.width * scale, height: size.height * scale) let bytesPerRow = (4 * Int(scaledSize.width) + 15) & (~15) let length = bytesPerRow * Int(scaledSize.height) - let bytes = malloc(length)!.assumingMemoryBound(to: Int8.self) + let bytes = malloc(length)!.assumingMemoryBound(to: UInt8.self) guard let provider = CGDataProvider(dataInfo: bytes, data: bytes, size: length, releaseData: { bytes, _, _ in free(bytes) }) @@ -287,7 +297,7 @@ public class DrawingContext { } } - public init(size: CGSize, scale: CGFloat = 0.0, clear: Bool = false) { + public init(size: CGSize, scale: CGFloat = 0.0, premultiplied: Bool = true, clear: Bool = false) { let actualScale: CGFloat if scale.isZero { actualScale = deviceScale @@ -301,7 +311,11 @@ public class DrawingContext { self.bytesPerRow = (4 * Int(scaledSize.width) + 15) & (~15) self.length = bytesPerRow * Int(scaledSize.height) - self.bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue) + if premultiplied { + self.bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue) + } else { + self.bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.first.rawValue) + } self.bytes = malloc(length)! if clear { diff --git a/submodules/TelegramUI/TelegramUI/ImageNode.swift b/submodules/Display/Display/ImageNode.swift similarity index 97% rename from submodules/TelegramUI/TelegramUI/ImageNode.swift rename to submodules/Display/Display/ImageNode.swift index 8ebc6e2157..99192e4895 100644 --- a/submodules/TelegramUI/TelegramUI/ImageNode.swift +++ b/submodules/Display/Display/ImageNode.swift @@ -2,7 +2,6 @@ import Foundation import UIKit import AsyncDisplayKit import SwiftSignalKit -import Display public let displayLinkDispatcher = DisplayLinkDispatcher() private let dispatcher = displayLinkDispatcher @@ -66,7 +65,7 @@ public func ==(lhs: ImageCorner, rhs: ImageCorner) -> Bool { } } -func isRoundEqualCorners(_ corners: ImageCorners) -> Bool { +public func isRoundEqualCorners(_ corners: ImageCorners) -> Bool { if case .Corner = corners.topLeft, case .Corner = corners.topRight, case .Corner = corners.bottomLeft, case .Corner = corners.bottomRight { if corners.topLeft.radius == corners.topRight.radius && corners.topRight.radius == corners.bottomLeft.radius && corners.bottomLeft.radius == corners.bottomRight.radius { return true @@ -141,7 +140,7 @@ public class ImageNode: ASDisplayNode { private var first = true private let enableEmpty: Bool - var ready: Signal { + public var ready: Signal { if let hasImage = self.hasImage { return hasImage.get() } else { @@ -149,7 +148,7 @@ public class ImageNode: ASDisplayNode { } } - init(enableHasImage: Bool = false, enableEmpty: Bool = false) { + public init(enableHasImage: Bool = false, enableEmpty: Bool = false) { if enableHasImage { self.hasImage = ValuePromise(false, ignoreRepeated: true) } else { diff --git a/submodules/Display/Display/ListView.swift b/submodules/Display/Display/ListView.swift index 024cd5d560..14212245b4 100644 --- a/submodules/Display/Display/ListView.swift +++ b/submodules/Display/Display/ListView.swift @@ -759,7 +759,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture return additionalInverseTopInset } - private func snapToBounds(snapTopItem: Bool, stackFromBottom: Bool, updateSizeAndInsets: ListViewUpdateSizeAndInsets? = nil, scrollToItem: ListViewScrollToItem? = nil) -> (snappedTopInset: CGFloat, offset: CGFloat) { + private func snapToBounds(snapTopItem: Bool, stackFromBottom: Bool, updateSizeAndInsets: ListViewUpdateSizeAndInsets? = nil, scrollToItem: ListViewScrollToItem? = nil, isExperimentalSnapToScrollToItem: Bool = false) -> (snappedTopInset: CGFloat, offset: CGFloat) { if self.itemNodes.count == 0 { return (0.0, 0.0) } @@ -819,7 +819,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture var transition: ContainedViewLayoutTransition = .immediate if let updateSizeAndInsets = updateSizeAndInsets { - if !updateSizeAndInsets.duration.isZero { + if !updateSizeAndInsets.duration.isZero && !isExperimentalSnapToScrollToItem { switch updateSizeAndInsets.curve { case let .Spring(duration): transition = .animated(duration: duration, curve: .spring) @@ -828,15 +828,17 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture } } } else if let scrollToItem = scrollToItem { - switch scrollToItem.curve { - case let .Spring(duration): - transition = .animated(duration: duration, curve: .spring) - case let .Default(duration): - if let duration = duration, duration.isZero { - transition = .immediate - } else { - transition = .animated(duration: duration ?? 0.3, curve: .easeInOut) - } + if scrollToItem.animated { + switch scrollToItem.curve { + case let .Spring(duration): + transition = .animated(duration: duration, curve: .spring) + case let .Default(duration): + if let duration = duration, duration.isZero { + transition = .immediate + } else { + transition = .animated(duration: duration ?? 0.3, curve: .easeInOut) + } + } } } @@ -2484,7 +2486,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture itemNode.position = CGPoint(x: position.x, y: position.y + offsetFix) } - let (snappedTopInset, snapToBoundsOffset) = self.snapToBounds(snapTopItem: scrollToItem != nil, stackFromBottom: self.stackFromBottom, updateSizeAndInsets: updateSizeAndInsets) + let (snappedTopInset, snapToBoundsOffset) = self.snapToBounds(snapTopItem: scrollToItem != nil, stackFromBottom: self.stackFromBottom, updateSizeAndInsets: updateSizeAndInsets, isExperimentalSnapToScrollToItem: isExperimentalSnapToScrollToItem) if !snappedTopInset.isZero && (previousVisibleSize.height.isZero || previousApparentFrames.isEmpty) { offsetFix += snappedTopInset @@ -2504,7 +2506,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture sizeAndInsetsOffset = offsetFix completeOffset += snapToBoundsOffset - if !updateSizeAndInsets.duration.isZero { + if !updateSizeAndInsets.duration.isZero && !isExperimentalSnapToScrollToItem { let animation: CABasicAnimation switch updateSizeAndInsets.curve { case let .Spring(duration): diff --git a/submodules/TelegramUI/TelegramUI/TransformImageArguments.swift b/submodules/Display/Display/TransformImageArguments.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/TransformImageArguments.swift rename to submodules/Display/Display/TransformImageArguments.swift diff --git a/submodules/TelegramUI/TelegramUI/TransformImageNode.swift b/submodules/Display/Display/TransformImageNode.swift similarity index 91% rename from submodules/TelegramUI/TelegramUI/TransformImageNode.swift rename to submodules/Display/Display/TransformImageNode.swift index 117f5fa6a7..36e72a6568 100644 --- a/submodules/TelegramUI/TelegramUI/TransformImageNode.swift +++ b/submodules/Display/Display/TransformImageNode.swift @@ -2,8 +2,6 @@ import Foundation import UIKit import AsyncDisplayKit import SwiftSignalKit -import Display -import TelegramCore public struct TransformImageNodeContentAnimations: OptionSet { public var rawValue: Int32 @@ -16,7 +14,7 @@ public struct TransformImageNodeContentAnimations: OptionSet { public static let subsequentUpdates = TransformImageNodeContentAnimations(rawValue: 1 << 1) } -public class TransformImageNode: ASDisplayNode { +open class TransformImageNode: ASDisplayNode { public var imageUpdated: ((UIImage?) -> Void)? public var contentAnimations: TransformImageNodeContentAnimations = [] private var disposable = MetaDisposable() @@ -32,7 +30,7 @@ public class TransformImageNode: ASDisplayNode { self.disposable.dispose() } - override public func didLoad() { + override open func didLoad() { super.didLoad() if #available(iOSApplicationExtension 11.0, iOS 11.0, *), !self.isLayerBacked { @@ -40,7 +38,7 @@ public class TransformImageNode: ASDisplayNode { } } - override public var frame: CGRect { + override open var frame: CGRect { didSet { if let overlayNode = self.overlayNode { overlayNode.frame = self.bounds @@ -52,16 +50,6 @@ public class TransformImageNode: ASDisplayNode { let argumentsPromise = self.argumentsPromise let data = combineLatest(signal, argumentsPromise.get()) - /*|> mapToSignal { transform, arguments -> Signal<((TransformImageArguments) -> DrawingContext?, TransformImageArguments), NoError> in - let result: Signal<((TransformImageArguments) -> DrawingContext?, TransformImageArguments), NoError> = .single((transform, arguments)) - if shouldAttemptSynchronously { - shouldAttemptSynchronously = false - return result - } else { - return result - |> deliverOn(Queue.concurrentDefaultQueue()) - } - }*/ let resultData: Signal<((TransformImageArguments) -> DrawingContext?, TransformImageArguments), NoError> if attemptSynchronously { diff --git a/submodules/Display/Display_Xcode.xcodeproj/project.pbxproj b/submodules/Display/Display_Xcode.xcodeproj/project.pbxproj index 972eda7c58..b7dae52ecb 100644 --- a/submodules/Display/Display_Xcode.xcodeproj/project.pbxproj +++ b/submodules/Display/Display_Xcode.xcodeproj/project.pbxproj @@ -105,6 +105,9 @@ D06B76DB20592A97006E9EEA /* LayoutSizes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06B76DA20592A97006E9EEA /* LayoutSizes.swift */; }; D06D37A220779C82009219B6 /* VolumeControlStatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06D37A120779C82009219B6 /* VolumeControlStatusBar.swift */; }; D06EE8451B7140FF00837186 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06EE8441B7140FF00837186 /* Font.swift */; }; + D0750C7322B2931900BE5F6E /* TransformImageNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C7122B2931900BE5F6E /* TransformImageNode.swift */; }; + D0750C7422B2931900BE5F6E /* TransformImageArguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C7222B2931900BE5F6E /* TransformImageArguments.swift */; }; + D0750C7622B2934800BE5F6E /* ImageNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C7522B2934800BE5F6E /* ImageNode.swift */; }; D077B8E91F4637040046D27A /* NavigationBarBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = D077B8E81F4637040046D27A /* NavigationBarBadge.swift */; }; D081229D1D19AA1C005F7395 /* ContainerViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D081229C1D19AA1C005F7395 /* ContainerViewLayout.swift */; }; D087BFB51F75181D003FD209 /* ChildWindowHostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D087BFB41F75181D003FD209 /* ChildWindowHostView.swift */; }; @@ -281,6 +284,9 @@ D06B76DA20592A97006E9EEA /* LayoutSizes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutSizes.swift; sourceTree = ""; }; D06D37A120779C82009219B6 /* VolumeControlStatusBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VolumeControlStatusBar.swift; sourceTree = ""; }; D06EE8441B7140FF00837186 /* Font.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Font.swift; sourceTree = ""; }; + D0750C7122B2931900BE5F6E /* TransformImageNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransformImageNode.swift; sourceTree = ""; }; + D0750C7222B2931900BE5F6E /* TransformImageArguments.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransformImageArguments.swift; sourceTree = ""; }; + D0750C7522B2934800BE5F6E /* ImageNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageNode.swift; sourceTree = ""; }; D077B8E81F4637040046D27A /* NavigationBarBadge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationBarBadge.swift; sourceTree = ""; }; D081229C1D19AA1C005F7395 /* ContainerViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerViewLayout.swift; sourceTree = ""; }; D087BFB41F75181D003FD209 /* ChildWindowHostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChildWindowHostView.swift; sourceTree = ""; }; @@ -580,6 +586,9 @@ D05CC3001B6955D500E235A3 /* Utils */ = { isa = PBXGroup; children = ( + D0750C7522B2934800BE5F6E /* ImageNode.swift */, + D0750C7222B2931900BE5F6E /* TransformImageArguments.swift */, + D0750C7122B2931900BE5F6E /* TransformImageNode.swift */, D05CC2EB1B69558A00E235A3 /* RuntimeUtils.h */, D05CC2EA1B69558A00E235A3 /* RuntimeUtils.m */, D05CC2F01B6955D000E235A3 /* UIViewController+Navigation.h */, @@ -892,6 +901,7 @@ D05174B41EAA833200A1BF36 /* CASeeThroughTracingLayer.m in Sources */, D03AA4D9202D8E5E0056C405 /* GlobalOverlayPresentationContext.swift in Sources */, D0076F2221ACA5020059500A /* Toolbar.swift in Sources */, + D0750C7422B2931900BE5F6E /* TransformImageArguments.swift in Sources */, D0F8C3932014FB7C00236FC5 /* ListView.swift in Sources */, D03E7DE61C96B96E00C07816 /* NavigationBarTransitionContainer.swift in Sources */, D0C85DD01D1C082E00124894 /* ActionSheetItemGroupsContainerNode.swift in Sources */, @@ -950,6 +960,7 @@ D0DA44521E4DCC11005FDCA7 /* TextAlertController.swift in Sources */, D081229D1D19AA1C005F7395 /* ContainerViewLayout.swift in Sources */, D0C2DFC71CC4431D0044FF83 /* ListViewItemNode.swift in Sources */, + D0750C7322B2931900BE5F6E /* TransformImageNode.swift in Sources */, D0FF9B301E7196F6000C66DB /* KeyboardManager.swift in Sources */, D01E2BE21D9049F60066BF65 /* GridItemNode.swift in Sources */, D08E903A1D24159200533158 /* ActionSheetItem.swift in Sources */, @@ -968,6 +979,7 @@ D0C2DFCD1CC4431D0044FF83 /* ListViewTransactionQueue.swift in Sources */, D0AA84101FED2887005C6E91 /* ListViewOverscrollBackgroundNode.swift in Sources */, D02383821DDF798E004018B6 /* LegacyPresentedControllerNode.swift in Sources */, + D0750C7622B2934800BE5F6E /* ImageNode.swift in Sources */, D05CC2FC1B6955D000E235A3 /* UIKitUtils.m in Sources */, D0C2DFC61CC4431D0044FF83 /* ASTransformLayerNode.swift in Sources */, D03AA4DD202DB1840056C405 /* PeekControllerGestureRecognizer.swift in Sources */, diff --git a/submodules/TelegramUI/TelegramUI/GZip.h b/submodules/GZip/GZip.h similarity index 100% rename from submodules/TelegramUI/TelegramUI/GZip.h rename to submodules/GZip/GZip.h diff --git a/submodules/GZip/GZip_Xcode.xcodeproj/project.pbxproj b/submodules/GZip/GZip_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..cbb24f45b2 --- /dev/null +++ b/submodules/GZip/GZip_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,516 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D0AE30E822B1DB2E0058D3BC /* GZip.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE30E622B1DB2E0058D3BC /* GZip.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE30E922B1DB2E0058D3BC /* GZip.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE30E722B1DB2E0058D3BC /* GZip.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D0AE30DA22B1DAE20058D3BC /* GZip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GZip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE30E622B1DB2E0058D3BC /* GZip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GZip.h; sourceTree = ""; }; + D0AE30E722B1DB2E0058D3BC /* GZip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GZip.m; sourceTree = ""; }; + D0AE310722B1DCB00058D3BC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE30D722B1DAE20058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0AE30D022B1DAE20058D3BC = { + isa = PBXGroup; + children = ( + D0AE310722B1DCB00058D3BC /* Info.plist */, + D0AE30E522B1DB2E0058D3BC /* Sources */, + D0AE30DB22B1DAE20058D3BC /* Products */, + ); + sourceTree = ""; + }; + D0AE30DB22B1DAE20058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE30DA22B1DAE20058D3BC /* GZip.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE30E522B1DB2E0058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE30E622B1DB2E0058D3BC /* GZip.h */, + D0AE30E722B1DB2E0058D3BC /* GZip.m */, + ); + path = Sources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE30D522B1DAE20058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE30E822B1DB2E0058D3BC /* GZip.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE30D922B1DAE20058D3BC /* GZip */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE30E222B1DAE20058D3BC /* Build configuration list for PBXNativeTarget "GZip" */; + buildPhases = ( + D0AE30D522B1DAE20058D3BC /* Headers */, + D0AE30D622B1DAE20058D3BC /* Sources */, + D0AE30D722B1DAE20058D3BC /* Frameworks */, + D0AE30D822B1DAE20058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GZip; + productName = GZip; + productReference = D0AE30DA22B1DAE20058D3BC /* GZip.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE30D122B1DAE20058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE30D922B1DAE20058D3BC = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = D0AE30D422B1DAE20058D3BC /* Build configuration list for PBXProject "GZip_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE30D022B1DAE20058D3BC; + productRefGroup = D0AE30DB22B1DAE20058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE30D922B1DAE20058D3BC /* GZip */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE30D822B1DAE20058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE30D622B1DAE20058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE30E922B1DB2E0058D3BC /* GZip.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B6822B5BF0900AD4DE8 /* 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; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugHockeyapp; + }; + D0A25B6922B5BF0900AD4DE8 /* 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 = 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.GZip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B8122B5BF5200AD4DE8 /* 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; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyappInternal; + }; + D0A25B8222B5BF5200AD4DE8 /* 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 = 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.GZip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE30E022B1DAE20058D3BC /* 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; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStoreLLC; + }; + D0AE30E122B1DAE20058D3BC /* 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; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStoreLLC; + }; + D0AE30E322B1DAE20058D3BC /* 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 = 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.GZip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE30E422B1DAE20058D3BC /* 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 = 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.GZip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE30D422B1DAE20058D3BC /* Build configuration list for PBXProject "GZip_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE30E022B1DAE20058D3BC /* DebugAppStoreLLC */, + D0A25B6822B5BF0900AD4DE8 /* DebugHockeyapp */, + D0AE30E122B1DAE20058D3BC /* ReleaseAppStoreLLC */, + D0A25B8122B5BF5200AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE30E222B1DAE20058D3BC /* Build configuration list for PBXNativeTarget "GZip" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE30E322B1DAE20058D3BC /* DebugAppStoreLLC */, + D0A25B6922B5BF0900AD4DE8 /* DebugHockeyapp */, + D0AE30E422B1DAE20058D3BC /* ReleaseAppStoreLLC */, + D0A25B8222B5BF5200AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE30D122B1DAE20058D3BC /* Project object */; +} diff --git a/submodules/GZip/Info.plist b/submodules/GZip/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/GZip/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/GZip/Sources/GZip.h b/submodules/GZip/Sources/GZip.h new file mode 100644 index 0000000000..1558cbbdf9 --- /dev/null +++ b/submodules/GZip/Sources/GZip.h @@ -0,0 +1,19 @@ +#import + +//! Project version number for GZip. +FOUNDATION_EXPORT double GZipVersionNumber; + +//! Project version string for GZip. +FOUNDATION_EXPORT const unsigned char GZipVersionString[]; + +#ifdef __cplusplus +extern "C" { +#endif + +NSData *TGGZipData(NSData *data, float level); +NSData *TGGUnzipData(NSData *data); + +#ifdef __cplusplus +} +#endif + diff --git a/submodules/TelegramUI/TelegramUI/GZip.m b/submodules/GZip/Sources/GZip.m similarity index 100% rename from submodules/TelegramUI/TelegramUI/GZip.m rename to submodules/GZip/Sources/GZip.m diff --git a/submodules/LegacyComponents/LegacyComponents/LegacyComponentsInternal.m b/submodules/LegacyComponents/LegacyComponents/LegacyComponentsInternal.m index 5ef77d899a..bcc18ecbb0 100644 --- a/submodules/LegacyComponents/LegacyComponents/LegacyComponentsInternal.m +++ b/submodules/LegacyComponents/LegacyComponents/LegacyComponentsInternal.m @@ -44,42 +44,8 @@ int iosMajorVersion() { static bool initialized = false; static int version = 7; - if (!initialized) - { - switch ([[[UIDevice currentDevice] systemVersion] intValue]) - { - case 4: - version = 4; - break; - case 5: - version = 5; - break; - case 6: - version = 6; - break; - case 7: - version = 7; - break; - case 8: - version = 8; - break; - case 9: - version = 9; - break; - case 10: - version = 10; - break; - case 11: - version = 11; - break; - case 12: - version = 12; - break; - default: - version = 9; - break; - } - + if (!initialized) { + version = [[[UIDevice currentDevice] systemVersion] intValue]; initialized = true; } return version; @@ -93,8 +59,9 @@ int iosMinorVersion() { NSString *versionString = [[UIDevice currentDevice] systemVersion]; NSRange range = [versionString rangeOfString:@"."]; - if (range.location != NSNotFound) + if (range.location != NSNotFound) { version = [[versionString substringFromIndex:range.location + 1] intValue]; + } initialized = true; } diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.h b/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.h index 7280b79f4f..930f9352ac 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.h +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.h @@ -12,6 +12,7 @@ - (void)configureForCurrentLocationWithAccuracy:(CLLocationAccuracy)accuracy; - (void)configureForCustomLocationWithAddress:(NSString *)address; +- (void)configureForGroupLocationWithAddress:(NSString *)address; - (void)configureForLiveLocationWithAccuracy:(CLLocationAccuracy)accuracy; - (void)configureForStopWithMessage:(TGMessage *)message remaining:(SSignal *)remaining; diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.m b/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.m index 2b1c9b5c58..39541e7d75 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.m +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationCurrentLocationCell.m @@ -341,6 +341,48 @@ const CGFloat TGLocationCurrentLocationCellHeight = 68; [self setNeedsLayout]; } +- (void)configureForGroupLocationWithAddress:(NSString *)address +{ + _messageId = 0; + + UIImage *icon = TGComponentsImageNamed(@"LocationMessagePinIcon"); + if (_pallete != nil) + icon = TGTintedImage(icon, _pallete.iconColor); + _iconView.image = icon; + _titleLabel.textColor = self.pallete != nil ? self.pallete.accentColor : TGAccentColor(); + _elapsedView.hidden = true; + + if (_isCurrentLocation) + { + [UIView transitionWithView:self duration:0.2f options:UIViewAnimationOptionTransitionCrossDissolve animations:^ + { + _titleLabel.text = TGLocalized(@"Map.SetThisLocation"); + _subtitleLabel.text = [self _subtitleForAddress:address]; + + _circleView.alpha = 1.0f; + _titleLabel.alpha = 1.0f; + _subtitleLabel.alpha = 1.0f; + } completion:nil]; + + _isCurrentLocation = false; + } + else + { + [UIView transitionWithView:self duration:0.2f options:UIViewAnimationOptionTransitionCrossDissolve animations:^ + { + _subtitleLabel.text = [self _subtitleForAddress:address]; + } completion:nil]; + } + + [self setCircleColor:_pallete != nil ? _pallete.locationColor : UIColorRGB(0x008df2)]; + + _separatorView.hidden = true; + [_wavesView stop]; + _wavesView.hidden = true; + + [self setNeedsLayout]; +} + - (NSString *)_subtitleForAddress:(NSString *)address { if (address != nil && address.length == 0) diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.h b/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.h index b85ee3bbf9..6f76489ad3 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.h +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.h @@ -14,7 +14,7 @@ typedef enum { @interface TGLocationPickerController : TGLocationMapViewController -@property (nonatomic, copy) void (^locationPicked)(CLLocationCoordinate2D coordinate, TGVenueAttachment *venue); +@property (nonatomic, copy) void (^locationPicked)(CLLocationCoordinate2D coordinate, TGVenueAttachment *venue, NSString *address); @property (nonatomic, copy) SSignal *(^nearbyPlacesSignal)(NSString *query, CLLocation *coordinate); diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.m b/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.m index 5dcb1fbb89..b117413519 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.m +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationPickerController.m @@ -340,12 +340,14 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; - (void)_sendLocation { + _tableView.userInteractionEnabled = false; + CLLocationCoordinate2D coordinate = _currentUserLocation.coordinate; if (_mapInFullScreenMode) coordinate = [self mapCenterCoordinateForPickerPin]; if (self.locationPicked != nil) - self.locationPicked(coordinate, nil); + self.locationPicked(coordinate, nil, _customAddress); } - (void)searchButtonPressed @@ -373,7 +375,7 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; _pinMovedFromUserLocation = false; [self hidePickerAnnotationAnimated:true]; - [_pickerPinView setPinRaised:true animated:true completion:nil]; + [_pickerPinView setPinRaised:true avatar:_intent == TGLocationPickerControllerCustomLocationIntent animated:true completion:nil]; MKCoordinateSpan span = _fullScreenMapSpan != nil ? _fullScreenMapSpan.MKCoordinateSpanValue : TGLocationDefaultSpan; [self setMapCenterCoordinate:_mapView.userLocation.location.coordinate span:span offset:TGLocationPickerPinOffset animated:true]; @@ -399,7 +401,7 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; [self switchToFullscreen]; } - [_pickerPinView setPinRaised:true animated:true completion:nil]; + [_pickerPinView setPinRaised:true avatar:_intent == TGLocationPickerControllerCustomLocationIntent animated:true completion:nil]; _pinMovedFromUserLocation = true; _updatePinAnnotation = false; @@ -435,7 +437,7 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; - (void)pinPinView { __weak TGLocationPickerController *weakSelf = self; - [_pickerPinView setPinRaised:false animated:true completion:^ + [_pickerPinView setPinRaised:false avatar:_intent == TGLocationPickerControllerCustomLocationIntent animated:true completion:^ { __strong TGLocationPickerController *strongSelf = weakSelf; if (strongSelf == nil) @@ -520,7 +522,7 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; NSString *address = @""; if (result != nil) - address = result.displayAddress; + address = result.fullAddress; strongSelf->_customAddress = address; [strongSelf updateCurrentLocationCell]; @@ -662,7 +664,9 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; _ownLocationView.hidden = true; _pickerPinWrapper.hidden = false; - [_pickerPinView setCustomPin:true animated:true]; + //if (_intent != TGLocationPickerControllerCustomLocationIntent) { + [_pickerPinView setCustomPin:true animated:true]; + //} _mapView.tapEnabled = false; _mapView.longPressAsTapEnabled = false; @@ -767,6 +771,9 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; - (UIBarButtonItem *)controllerRightBarButtonItem { + if (_intent == TGLocationPickerControllerCustomLocationIntent) { + return nil; + } if (iosMajorVersion() < 7) { TGModernBarButton *searchButton = [[TGModernBarButton alloc] initWithImage:TGComponentsImageNamed(@"NavigationSearchIcon.png")]; @@ -944,7 +951,9 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; if (_currentUserLocation != nil) [self fetchNearbyVenuesWithLocation:_currentUserLocation]; } - [cell configureWithTitle:TGLocalized(@"Map.ChooseAPlace")]; + if (_intent != TGLocationPickerControllerCustomLocationIntent) { + [cell configureWithTitle:TGLocalized(@"Map.ChooseAPlace")]; + } if (scrollView.contentOffset.y > -scrollView.contentInset.top + TGLocationSectionHeaderHeight) { @@ -975,7 +984,9 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; else { _activityIndicator.alpha = 0.0f; - [cell configureWithTitle:TGLocalized(@"Map.PullUpForPlaces")]; + if (_intent != TGLocationPickerControllerCustomLocationIntent) { + [cell configureWithTitle:TGLocalized(@"Map.PullUpForPlaces")]; + } if (_safeAreaCurtainView != nil) { @@ -1004,10 +1015,14 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; { TGLocationCurrentLocationCell *locationCell = (TGLocationCurrentLocationCell *)cell; - if (_mapInFullScreenMode) - [locationCell configureForCustomLocationWithAddress:_customAddress]; - else - [locationCell configureForCurrentLocationWithAccuracy:_currentUserLocation.horizontalAccuracy]; + if (_intent == TGLocationPickerControllerCustomLocationIntent) { + [locationCell configureForGroupLocationWithAddress:_customAddress]; + } else { + if (_mapInFullScreenMode) + [locationCell configureForCustomLocationWithAddress:_customAddress]; + else + [locationCell configureForCurrentLocationWithAccuracy:_currentUserLocation.horizontalAccuracy]; + } } cell = [_tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]]; @@ -1096,7 +1111,9 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; } else if ((_allowLiveLocationSharing && indexPath.row == 2) || (!_allowLiveLocationSharing && indexPath.row == 1)) { - [self _presentVenuesList]; + if (_intent != TGLocationPickerControllerCustomLocationIntent) { + [self _presentVenuesList]; + } } } else @@ -1113,7 +1130,7 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; } if (self.locationPicked != nil) - self.locationPicked(venue.coordinate, [venue venueAttachment]); + self.locationPicked(venue.coordinate, [venue venueAttachment], _customAddress); } } @@ -1151,10 +1168,14 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; locationCell.pallete = self.pallete; locationCell.edgeView = _edgeHighlightView; - if (_mapInFullScreenMode) - [locationCell configureForCustomLocationWithAddress:_customAddress]; - else - [locationCell configureForCurrentLocationWithAccuracy:_currentUserLocation.horizontalAccuracy]; + if (_intent == TGLocationPickerControllerCustomLocationIntent) { + [locationCell configureForGroupLocationWithAddress:_customAddress]; + } else { + if (_mapInFullScreenMode) + [locationCell configureForCustomLocationWithAddress:_customAddress]; + else + [locationCell configureForCurrentLocationWithAccuracy:_currentUserLocation.horizontalAccuracy]; + } cell = locationCell; } @@ -1180,10 +1201,12 @@ const CGPoint TGLocationPickerPinOffset = { 0.0f, 33.0f }; sectionCell = [[TGLocationSectionHeaderCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TGLocationSectionHeaderKind]; sectionCell.pallete = self.pallete; - if (tableView.contentOffset.y > -tableView.contentInset.top) - [sectionCell configureWithTitle:TGLocalized(@"Map.ChooseAPlace")]; - else - [sectionCell configureWithTitle:TGLocalized(@"Map.PullUpForPlaces")]; + if (_intent != TGLocationPickerControllerCustomLocationIntent) { + if (tableView.contentOffset.y > -tableView.contentInset.top) + [sectionCell configureWithTitle:TGLocalized(@"Map.ChooseAPlace")]; + else + [sectionCell configureWithTitle:TGLocalized(@"Map.PullUpForPlaces")]; + } cell = sectionCell; } diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.h b/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.h index a43aa71896..9332f8d00e 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.h +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.h @@ -7,7 +7,7 @@ - (instancetype)initWithAnnotation:(id)annotation; @property (nonatomic, assign, getter=isPinRaised) bool pinRaised; -- (void)setPinRaised:(bool)raised animated:(bool)animated completion:(void (^)(void))completion; +- (void)setPinRaised:(bool)raised avatar:(bool)avatar animated:(bool)animated completion:(void (^)(void))completion; - (void)setCustomPin:(bool)customPin animated:(bool)animated; diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.m b/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.m index 3bd7548fb6..0f93d8c45b 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.m +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationPinAnnotationView.m @@ -429,12 +429,13 @@ NSString *const TGLocationPinAnnotationKind = @"TGLocationPinAnnotation"; - (void)setPinRaised:(bool)raised { - [self setPinRaised:raised animated:false completion:nil]; + [self setPinRaised:raised avatar:false animated:false completion:nil]; } -- (void)setPinRaised:(bool)raised animated:(bool)animated completion:(void (^)(void))completion +- (void)setPinRaised:(bool)raised avatar:(bool)avatar animated:(bool)animated completion:(void (^)(void))completion { _pinRaised = raised; + avatar = false; [_shadowView.layer removeAllAnimations]; if (iosMajorVersion() < 7) @@ -447,6 +448,8 @@ NSString *const TGLocationPinAnnotationKind = @"TGLocationPinAnnotation"; [UIView animateWithDuration:0.2 delay:0.0 options:7 << 16 | UIViewAnimationOptionAllowAnimatedContent animations:^ { _shadowView.center = CGPointMake(TGScreenPixel, -66.0f); + if (avatar) + _avatarView.center = CGPointMake(TGScreenPixel, -71.0f); } completion:^(BOOL finished) { if (finished && completion != nil) completion(); @@ -457,6 +460,8 @@ NSString *const TGLocationPinAnnotationKind = @"TGLocationPinAnnotation"; [UIView animateWithDuration:0.2 delay:0.0 usingSpringWithDamping:0.6 initialSpringVelocity:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^ { _shadowView.center = CGPointMake(TGScreenPixel, -36.0f); + if (avatar) + _avatarView.center = CGPointMake(TGScreenPixel, -41.0f); } completion:^(BOOL finished) { if (finished && completion != nil) @@ -467,6 +472,8 @@ NSString *const TGLocationPinAnnotationKind = @"TGLocationPinAnnotation"; else { _shadowView.center = CGPointMake(TGScreenPixel, raised ? -66.0f : -36.0f); + if (avatar) + _avatarView.center = CGPointMake(TGScreenPixel, raised ? -71.0 : -41.0f); if (completion != nil) completion(); @@ -485,6 +492,9 @@ NSString *const TGLocationPinAnnotationKind = @"TGLocationPinAnnotation"; _iconView.image = image; [_backgroundView addSubview:_avatarView]; _avatarView.center = CGPointMake(_backgroundView.frame.size.width / 2.0f, _backgroundView.frame.size.height / 2.0f - 5.0f); + _shadowView.center = CGPointMake(TGScreenPixel, -36.0f); + _backgroundView.center = CGPointMake(_shadowView.frame.size.width / 2.0f, _shadowView.frame.size.height / 2.0f); + _iconView.center = CGPointMake(_shadowView.frame.size.width / 2.0f, _shadowView.frame.size.height / 2.0f - 5.0f); TGDispatchAfter(0.01, dispatch_get_main_queue(), ^ { @@ -498,8 +508,11 @@ NSString *const TGLocationPinAnnotationKind = @"TGLocationPinAnnotation"; if (!customPin) [self addSubview:_avatarView]; _animating = false; + [self setNeedsLayout]; }]; }); + + [self setNeedsLayout]; } else { diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.h b/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.h index b3aba81dbc..02dd86e16f 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.h +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.h @@ -14,6 +14,8 @@ @property (nonatomic, readonly) NSString *city; @property (nonatomic, readonly) NSString *district; @property (nonatomic, readonly) NSString *street; + +@property (nonatomic, readonly) NSString *fullAddress; + (TGLocationReverseGeocodeResult *)reverseGeocodeResultWithDictionary:(NSDictionary *)dictionary; + (TGLocationReverseGeocodeResult *)reverseGeocodeResultWithPlacemark:(CLPlacemark *)placemark; diff --git a/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.m b/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.m index bcb0edce7e..0274544642 100644 --- a/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.m +++ b/submodules/LegacyComponents/LegacyComponents/TGLocationReverseGeocodeResult.m @@ -69,5 +69,17 @@ return nil; } + +- (NSString *)fullAddress +{ + NSMutableArray *components = [[NSMutableArray alloc] init]; + if (self.street.length > 0) + [components addObject:self.street]; + if (self.city.length > 0) + [components addObject:self.city]; + if (self.country.length > 0) + [components addObject:self.country]; + return [components componentsJoinedByString:@", "]; +} @end diff --git a/submodules/LightweightAccountData/Info.plist b/submodules/LightweightAccountData/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/LightweightAccountData/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/LightweightAccountData/LightweightAccountData_Xcode.xcodeproj/project.pbxproj b/submodules/LightweightAccountData/LightweightAccountData_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..6f1db3fa7d --- /dev/null +++ b/submodules/LightweightAccountData/LightweightAccountData_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,531 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D00818C422B59409008A895F /* LightweightAccountData.h in Headers */ = {isa = PBXBuildFile; fileRef = D00818C222B59409008A895F /* LightweightAccountData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818CB22B594B7008A895F /* SharedAccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00818CA22B594B7008A895F /* SharedAccountInfo.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D00818BF22B59409008A895F /* LightweightAccountData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LightweightAccountData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D00818C222B59409008A895F /* LightweightAccountData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LightweightAccountData.h; sourceTree = ""; }; + D00818C322B59409008A895F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D00818CA22B594B7008A895F /* SharedAccountInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedAccountInfo.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D00818BC22B59409008A895F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D00818B522B59409008A895F = { + isa = PBXGroup; + children = ( + D00818C322B59409008A895F /* Info.plist */, + D00818C122B59409008A895F /* Sources */, + D00818C022B59409008A895F /* Products */, + ); + sourceTree = ""; + }; + D00818C022B59409008A895F /* Products */ = { + isa = PBXGroup; + children = ( + D00818BF22B59409008A895F /* LightweightAccountData.framework */, + ); + name = Products; + sourceTree = ""; + }; + D00818C122B59409008A895F /* Sources */ = { + isa = PBXGroup; + children = ( + D00818C222B59409008A895F /* LightweightAccountData.h */, + D00818CA22B594B7008A895F /* SharedAccountInfo.swift */, + ); + path = Sources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D00818BA22B59409008A895F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D00818C422B59409008A895F /* LightweightAccountData.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D00818BE22B59409008A895F /* LightweightAccountData */ = { + isa = PBXNativeTarget; + buildConfigurationList = D00818C722B59409008A895F /* Build configuration list for PBXNativeTarget "LightweightAccountData" */; + buildPhases = ( + D00818BA22B59409008A895F /* Headers */, + D00818BB22B59409008A895F /* Sources */, + D00818BC22B59409008A895F /* Frameworks */, + D00818BD22B59409008A895F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LightweightAccountData; + productName = LightweightAccountData; + productReference = D00818BF22B59409008A895F /* LightweightAccountData.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D00818B622B59409008A895F /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D00818BE22B59409008A895F = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D00818B922B59409008A895F /* Build configuration list for PBXProject "LightweightAccountData_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D00818B522B59409008A895F; + productRefGroup = D00818C022B59409008A895F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D00818BE22B59409008A895F /* LightweightAccountData */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D00818BD22B59409008A895F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D00818BB22B59409008A895F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D00818CB22B594B7008A895F /* SharedAccountInfo.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D00818C522B59409008A895F /* 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; + }; + D00818C622B59409008A895F /* 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; + }; + D00818C822B59409008A895F /* 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.LightweightAccountData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D00818C922B59409008A895F /* 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.LightweightAccountData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D0A25B5522B5BEDD00AD4DE8 /* 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; + }; + D0A25B5622B5BEDD00AD4DE8 /* 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.LightweightAccountData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B6E22B5BF3200AD4DE8 /* 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; + }; + D0A25B6F22B5BF3200AD4DE8 /* 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.LightweightAccountData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D00818B922B59409008A895F /* Build configuration list for PBXProject "LightweightAccountData_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D00818C522B59409008A895F /* DebugAppStoreLLC */, + D0A25B5522B5BEDD00AD4DE8 /* DebugHockeyapp */, + D00818C622B59409008A895F /* ReleaseAppStoreLLC */, + D0A25B6E22B5BF3200AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D00818C722B59409008A895F /* Build configuration list for PBXNativeTarget "LightweightAccountData" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D00818C822B59409008A895F /* DebugAppStoreLLC */, + D0A25B5622B5BEDD00AD4DE8 /* DebugHockeyapp */, + D00818C922B59409008A895F /* ReleaseAppStoreLLC */, + D0A25B6F22B5BF3200AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D00818B622B59409008A895F /* Project object */; +} diff --git a/submodules/LightweightAccountData/Sources/LightweightAccountData.h b/submodules/LightweightAccountData/Sources/LightweightAccountData.h new file mode 100644 index 0000000000..e3be399fb1 --- /dev/null +++ b/submodules/LightweightAccountData/Sources/LightweightAccountData.h @@ -0,0 +1,19 @@ +// +// LightweightAccountData.h +// LightweightAccountData +// +// Created by Peter on 6/15/19. +// Copyright © 2019 Telegram LLP. All rights reserved. +// + +#import + +//! Project version number for LightweightAccountData. +FOUNDATION_EXPORT double LightweightAccountDataVersionNumber; + +//! Project version string for LightweightAccountData. +FOUNDATION_EXPORT const unsigned char LightweightAccountDataVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/LightweightAccountData/Sources/SharedAccountInfo.swift b/submodules/LightweightAccountData/Sources/SharedAccountInfo.swift new file mode 100644 index 0000000000..846aada6a6 --- /dev/null +++ b/submodules/LightweightAccountData/Sources/SharedAccountInfo.swift @@ -0,0 +1,99 @@ +import Foundation + +public struct AccountNotificationKey: Codable { + public let id: Data + public let data: Data + + public init(id: Data, data: Data) { + self.id = id + self.data = data + } +} + +public struct AccountDatacenterKey: Codable { + public let id: Int64 + public let data: Data + + public init(id: Int64, data: Data) { + self.id = id + self.data = data + } +} + +public struct AccountDatacenterAddress: Codable { + public let host: String + public let port: Int32 + public let isMedia: Bool + public let secret: Data? + + public init(host: String, port: Int32, isMedia: Bool, secret: Data?) { + self.host = host + self.port = port + self.isMedia = isMedia + self.secret = secret + } +} + +public struct AccountDatacenterInfo: Codable { + public let masterKey: AccountDatacenterKey + public let addressList: [AccountDatacenterAddress] + + public init(masterKey: AccountDatacenterKey, addressList: [AccountDatacenterAddress]) { + self.masterKey = masterKey + self.addressList = addressList + } +} + +public struct AccountProxyConnection: Codable { + public let host: String + public let port: Int32 + public let username: String? + public let password: String? + public let secret: Data? + + public init(host: String, port: Int32, username: String?, password: String?, secret: Data?) { + self.host = host + self.port = port + self.username = username + self.password = password + self.secret = secret + } +} + +public struct StoredAccountInfo: Codable { + public let id: Int64 + public let primaryId: Int32 + public let isTestingEnvironment: Bool + public let peerName: String + public let datacenters: [Int32: AccountDatacenterInfo] + public let notificationKey: AccountNotificationKey + + public init(id: Int64, primaryId: Int32, isTestingEnvironment: Bool, peerName: String, datacenters: [Int32: AccountDatacenterInfo], notificationKey: AccountNotificationKey) { + self.id = id + self.primaryId = primaryId + self.isTestingEnvironment = isTestingEnvironment + self.peerName = peerName + self.datacenters = datacenters + self.notificationKey = notificationKey + } +} + +public struct StoredAccountInfos: Codable { + public let proxy: AccountProxyConnection? + public let accounts: [StoredAccountInfo] + + public init(proxy: AccountProxyConnection?, accounts: [StoredAccountInfo]) { + self.proxy = proxy + self.accounts = accounts + } +} + +public func loadAccountsData(rootPath: String) -> StoredAccountInfos { + guard let data = try? Data(contentsOf: URL(fileURLWithPath: rootPath + "/accounts-shared-data")) else { + return StoredAccountInfos(proxy: nil, accounts: []) + } + guard let value = try? JSONDecoder().decode(StoredAccountInfos.self, from: data) else { + return StoredAccountInfos(proxy: nil, accounts: []) + } + return value +} diff --git a/submodules/MediaPlayer/Info.plist b/submodules/MediaPlayer/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/MediaPlayer/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/TelegramUI/TelegramUI/FFMpegAudioFrameDecoder.swift b/submodules/MediaPlayer/Sources/FFMpegAudioFrameDecoder.swift similarity index 79% rename from submodules/TelegramUI/TelegramUI/FFMpegAudioFrameDecoder.swift rename to submodules/MediaPlayer/Sources/FFMpegAudioFrameDecoder.swift index 52a5687f9e..725051e022 100644 --- a/submodules/TelegramUI/TelegramUI/FFMpegAudioFrameDecoder.swift +++ b/submodules/MediaPlayer/Sources/FFMpegAudioFrameDecoder.swift @@ -40,7 +40,7 @@ final class FFMpegAudioFrameDecoder: MediaTrackFrameDecoder { let bytes = malloc(data.count)! data.copyBytes(to: bytes.assumingMemoryBound(to: UInt8.self), count: data.count) - let status = CMBlockBufferCreateWithMemoryBlock(nil, bytes, data.count, nil, nil, 0, data.count, 0, &blockBuffer) + let status = CMBlockBufferCreateWithMemoryBlock(allocator: nil, memoryBlock: bytes, blockLength: data.count, blockAllocator: nil, customBlockSource: nil, offsetToData: 0, dataLength: data.count, flags: 0, blockBufferOut: &blockBuffer) if status != noErr { return nil } @@ -48,7 +48,7 @@ final class FFMpegAudioFrameDecoder: MediaTrackFrameDecoder { var timingInfo = CMSampleTimingInfo(duration: duration, presentationTimeStamp: pts, decodeTimeStamp: pts) var sampleBuffer: CMSampleBuffer? var sampleSize = data.count - guard CMSampleBufferCreate(nil, blockBuffer, true, nil, nil, nil, 1, 1, &timingInfo, 1, &sampleSize, &sampleBuffer) == noErr else { + guard CMSampleBufferCreate(allocator: nil, dataBuffer: blockBuffer, dataReady: true, makeDataReadyCallback: nil, refcon: nil, formatDescription: nil, sampleCount: 1, sampleTimingEntryCount: 1, sampleTimingArray: &timingInfo, sampleSizeEntryCount: 1, sampleSizeArray: &sampleSize, sampleBufferOut: &sampleBuffer) == noErr else { return nil } diff --git a/submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSource.swift b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSource.swift similarity index 93% rename from submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSource.swift rename to submodules/MediaPlayer/Sources/FFMpegMediaFrameSource.swift index cdf8313ec1..0212c47b8e 100644 --- a/submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSource.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSource.swift @@ -65,7 +65,7 @@ private func contextForCurrentThread() -> FFMpegMediaFrameSourceContext? { return Thread.current.threadDictionary["FFMpegMediaFrameSourceContext"] as? FFMpegMediaFrameSourceContext } -final class FFMpegMediaFrameSource: NSObject, MediaFrameSource { +public final class FFMpegMediaFrameSource: NSObject, MediaFrameSource { private let queue: Queue private let postbox: Postbox private let resourceReference: MediaResourceReference @@ -98,7 +98,7 @@ final class FFMpegMediaFrameSource: NSObject, MediaFrameSource { } } - init(queue: Queue, postbox: Postbox, resourceReference: MediaResourceReference, tempFilePath: String?, streamable: Bool, video: Bool, preferSoftwareDecoding: Bool, fetchAutomatically: Bool, maximumFetchSize: Int? = nil, stallDuration: Double = 1.0, lowWaterDuration: Double = 2.0, highWaterDuration: Double = 3.0) { + public init(queue: Queue, postbox: Postbox, resourceReference: MediaResourceReference, tempFilePath: String?, streamable: Bool, video: Bool, preferSoftwareDecoding: Bool, fetchAutomatically: Bool, maximumFetchSize: Int? = nil, stallDuration: Double = 1.0, lowWaterDuration: Double = 2.0, highWaterDuration: Double = 3.0) { self.queue = queue self.postbox = postbox self.resourceReference = resourceReference @@ -127,19 +127,19 @@ final class FFMpegMediaFrameSource: NSObject, MediaFrameSource { self.taskQueue.terminate() } - func addEventSink(_ f: @escaping (MediaTrackEvent) -> Void) -> Int { + public func addEventSink(_ f: @escaping (MediaTrackEvent) -> Void) -> Int { assert(self.queue.isCurrent()) return self.eventSinkBag.add(f) } - func removeEventSink(_ index: Int) { + public func removeEventSink(_ index: Int) { assert(self.queue.isCurrent()) self.eventSinkBag.remove(index) } - func generateFrames(until timestamp: Double) { + public func generateFrames(until timestamp: Double) { assert(self.queue.isCurrent()) if self.requestedFrameGenerationTimestamp == nil || !self.requestedFrameGenerationTimestamp!.isEqual(to: timestamp) { @@ -149,7 +149,7 @@ final class FFMpegMediaFrameSource: NSObject, MediaFrameSource { } } - func ensureHasFrames(until timestamp: Double) -> Signal { + public func ensureHasFrames(until timestamp: Double) -> Signal { assert(self.queue.isCurrent()) return Signal { subscriber in @@ -220,7 +220,7 @@ final class FFMpegMediaFrameSource: NSObject, MediaFrameSource { } } - func seek(timestamp: Double) -> Signal, MediaFrameSourceSeekError> { + public func seek(timestamp: Double) -> Signal, MediaFrameSourceSeekError> { assert(self.queue.isCurrent()) return Signal { subscriber in diff --git a/submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSourceContext.swift b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift similarity index 94% rename from submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSourceContext.swift rename to submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift index a6b8b0c6fe..3c4187814a 100644 --- a/submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSourceContext.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift @@ -2,7 +2,6 @@ import Foundation import SwiftSignalKit import Postbox import CoreMedia -import TelegramUIPrivateModule import TelegramCore import FFMpeg @@ -370,10 +369,10 @@ final class FFMpegMediaFrameSourceContext: NSObject { let codecId = avFormatContext.codecId(atStreamIndex: streamIndex) - let fpsAndTimebase = avFormatContext.fpsAndTimebase(forStreamIndex: streamIndex, defaultTimeBase: CMTimeMake(1, 40000)) + let fpsAndTimebase = avFormatContext.fpsAndTimebase(forStreamIndex: streamIndex, defaultTimeBase: CMTimeMake(value: 1, timescale: 40000)) let (fps, timebase) = (fpsAndTimebase.fps, fpsAndTimebase.timebase) - let duration = CMTimeMake(avFormatContext.duration(atStreamIndex: streamIndex), timebase.timescale) + let duration = CMTimeMake(value: avFormatContext.duration(atStreamIndex: streamIndex), timescale: timebase.timescale) let metrics = avFormatContext.metricsForStream(at: streamIndex) @@ -422,10 +421,10 @@ final class FFMpegMediaFrameSourceContext: NSObject { let codecContext = FFMpegAVCodecContext(codec: codec) if avFormatContext.codecParams(atStreamIndex: streamIndex, to: codecContext) { if codecContext.open() { - let fpsAndTimebase = avFormatContext.fpsAndTimebase(forStreamIndex: streamIndex, defaultTimeBase: CMTimeMake(1, 40000)) + let fpsAndTimebase = avFormatContext.fpsAndTimebase(forStreamIndex: streamIndex, defaultTimeBase: CMTimeMake(value: 1, timescale: 40000)) let (fps, timebase) = (fpsAndTimebase.fps, fpsAndTimebase.timebase) - let duration = CMTimeMake(avFormatContext.duration(atStreamIndex: streamIndex), timebase.timescale) + let duration = CMTimeMake(value: avFormatContext.duration(atStreamIndex: streamIndex), timescale: timebase.timescale) audioStream = StreamContext(index: Int(streamIndex), codecContext: codecContext, fps: fps, timebase: timebase, duration: duration, decoder: FFMpegAudioFrameDecoder(codecContext: codecContext), rotationAngle: 0.0, aspect: 1.0) break @@ -499,14 +498,14 @@ final class FFMpegMediaFrameSourceContext: NSObject { } else if let audioStream = initializedState.audioStream, Int(packet.streamIndex) == audioStream.index { let packetPts = packet.pts - let pts = CMTimeMake(packetPts, audioStream.timebase.timescale) - let dts = CMTimeMake(packet.dts, audioStream.timebase.timescale) + let pts = CMTimeMake(value: packetPts, timescale: audioStream.timebase.timescale) + let dts = CMTimeMake(value: packet.dts, timescale: audioStream.timebase.timescale) let duration: CMTime let frameDuration = packet.duration if frameDuration != 0 { - duration = CMTimeMake(frameDuration * audioStream.timebase.value, audioStream.timebase.timescale) + duration = CMTimeMake(value: frameDuration * audioStream.timebase.value, timescale: audioStream.timebase.timescale) } else { duration = audioStream.fps } @@ -551,7 +550,7 @@ final class FFMpegMediaFrameSourceContext: NSObject { for stream in [initializedState.videoStream, initializedState.audioStream] { if let stream = stream { - let pts = CMTimeMakeWithSeconds(timestamp, stream.timebase.timescale) + let pts = CMTimeMakeWithSeconds(timestamp, preferredTimescale: stream.timebase.timescale) initializedState.avFormatContext.seekFrame(forStreamIndex: Int32(stream.index), pts: pts.value) break } @@ -568,19 +567,19 @@ final class FFMpegMediaFrameSourceContext: NSObject { videoDescription = FFMpegMediaFrameSourceDescription(duration: videoStream.duration, decoder: videoStream.decoder, rotationAngle: videoStream.rotationAngle, aspect: videoStream.aspect) } - var actualPts: CMTime = CMTimeMake(0, 1) + var actualPts: CMTime = CMTimeMake(value: 0, timescale: 1) var extraVideoFrames: [MediaTrackDecodableFrame] = [] if timestamp.isZero || initializedState.videoStream == nil { for _ in 0 ..< 24 { if let packet = self.readPacketInternal() { if let videoStream = initializedState.videoStream, Int(packet.streamIndex) == videoStream.index { self.packetQueue.append(packet) - let pts = CMTimeMake(packet.pts, videoStream.timebase.timescale) + let pts = CMTimeMake(value: packet.pts, timescale: videoStream.timebase.timescale) actualPts = pts break } else if let audioStream = initializedState.audioStream, Int(packet.streamIndex) == audioStream.index { self.packetQueue.append(packet) - let pts = CMTimeMake(packet.pts, audioStream.timebase.timescale) + let pts = CMTimeMake(value: packet.pts, timescale: audioStream.timebase.timescale) actualPts = pts break } @@ -589,8 +588,8 @@ final class FFMpegMediaFrameSourceContext: NSObject { } } } else if let videoStream = initializedState.videoStream { - let targetPts = CMTimeMakeWithSeconds(Float64(timestamp), videoStream.timebase.timescale) - let limitPts = CMTimeMakeWithSeconds(Float64(timestamp + 0.5), videoStream.timebase.timescale) + let targetPts = CMTimeMakeWithSeconds(Float64(timestamp), preferredTimescale: videoStream.timebase.timescale) + let limitPts = CMTimeMakeWithSeconds(Float64(timestamp + 0.5), preferredTimescale: videoStream.timebase.timescale) var audioPackets: [FFMpegPacket] = [] while !self.readingError { if let packet = self.readPacket() { @@ -627,7 +626,7 @@ final class FFMpegMediaFrameSourceContext: NSObject { } if let audioStream = initializedState.audioStream { self.packetQueue.append(contentsOf: audioPackets.filter({ packet in - let pts = CMTimeMake(packet.pts, audioStream.timebase.timescale) + let pts = CMTimeMake(value: packet.pts, timescale: audioStream.timebase.timescale) if CMTimeCompare(pts, actualPts) >= 0 { return true } else { @@ -651,14 +650,14 @@ final class FFMpegMediaFrameSourceContext: NSObject { private func videoFrameFromPacket(_ packet: FFMpegPacket, videoStream: StreamContext) -> MediaTrackDecodableFrame { let packetPts = packet.pts - let pts = CMTimeMake(packetPts, videoStream.timebase.timescale) - let dts = CMTimeMake(packet.dts, videoStream.timebase.timescale) + let pts = CMTimeMake(value: packetPts, timescale: videoStream.timebase.timescale) + let dts = CMTimeMake(value: packet.dts, timescale: videoStream.timebase.timescale) let duration: CMTime let frameDuration = packet.duration if frameDuration != 0 { - duration = CMTimeMake(frameDuration * videoStream.timebase.value, videoStream.timebase.timescale) + duration = CMTimeMake(value: frameDuration * videoStream.timebase.value, timescale: videoStream.timebase.timescale) } else { duration = videoStream.fps } diff --git a/submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSourceContextHelpers.swift b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContextHelpers.swift similarity index 87% rename from submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSourceContextHelpers.swift rename to submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContextHelpers.swift index 3fd1681e8c..5252375acd 100644 --- a/submodules/TelegramUI/TelegramUI/FFMpegMediaFrameSourceContextHelpers.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContextHelpers.swift @@ -2,8 +2,8 @@ import Foundation import CoreMedia import FFMpeg -final class FFMpegMediaFrameSourceContextHelpers { - static let registerFFMpegGlobals: Void = { +public final class FFMpegMediaFrameSourceContextHelpers { + public static let registerFFMpegGlobals: Void = { FFMpegGlobals.initializeGlobals() return }() @@ -30,7 +30,7 @@ final class FFMpegMediaFrameSourceContextHelpers { extensions.setObject(24 as NSNumber, forKey: "Depth" as NSString) var formatDescription: CMFormatDescription? - CMVideoFormatDescriptionCreate(nil, CMVideoCodecType(formatId), width, height, extensions, &formatDescription) + CMVideoFormatDescriptionCreate(allocator: nil, codecType: CMVideoCodecType(formatId), width: width, height: height, extensions: extensions, formatDescriptionOut: &formatDescription) return formatDescription } @@ -57,7 +57,7 @@ final class FFMpegMediaFrameSourceContextHelpers { extensions.setObject(24 as NSNumber, forKey: "Depth" as NSString) var formatDescription: CMFormatDescription? - guard CMVideoFormatDescriptionCreate(nil, kCMVideoCodecType_MPEG4Video, width, height, extensions, &formatDescription) == noErr else { + guard CMVideoFormatDescriptionCreate(allocator: nil, codecType: kCMVideoCodecType_MPEG4Video, width: width, height: height, extensions: extensions, formatDescriptionOut: &formatDescription) == noErr else { return nil } @@ -86,7 +86,7 @@ final class FFMpegMediaFrameSourceContextHelpers { extensions.setObject(24 as NSNumber, forKey: "Depth" as NSString) var formatDescription: CMFormatDescription? - CMVideoFormatDescriptionCreate(nil, CMVideoCodecType(formatId), width, height, extensions, &formatDescription) + CMVideoFormatDescriptionCreate(allocator: nil, codecType: CMVideoCodecType(formatId), width: width, height: height, extensions: extensions, formatDescriptionOut: &formatDescription) return formatDescription } diff --git a/submodules/TelegramUI/TelegramUI/FFMpegMediaPassthroughVideoFrameDecoder.swift b/submodules/MediaPlayer/Sources/FFMpegMediaPassthroughVideoFrameDecoder.swift similarity index 71% rename from submodules/TelegramUI/TelegramUI/FFMpegMediaPassthroughVideoFrameDecoder.swift rename to submodules/MediaPlayer/Sources/FFMpegMediaPassthroughVideoFrameDecoder.swift index f4291ba09f..f417d3d40a 100644 --- a/submodules/TelegramUI/TelegramUI/FFMpegMediaPassthroughVideoFrameDecoder.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaPassthroughVideoFrameDecoder.swift @@ -15,7 +15,7 @@ final class FFMpegMediaPassthroughVideoFrameDecoder: MediaTrackFrameDecoder { let bytes = malloc(Int(frame.packet.size))! memcpy(bytes, frame.packet.data, Int(frame.packet.size)) - guard CMBlockBufferCreateWithMemoryBlock(nil, bytes, Int(frame.packet.size), nil, nil, 0, Int(frame.packet.size), 0, &blockBuffer) == noErr else { + guard CMBlockBufferCreateWithMemoryBlock(allocator: nil, memoryBlock: bytes, blockLength: Int(frame.packet.size), blockAllocator: nil, customBlockSource: nil, offsetToData: 0, dataLength: Int(frame.packet.size), flags: 0, blockBufferOut: &blockBuffer) == noErr else { free(bytes) return nil } @@ -23,14 +23,14 @@ final class FFMpegMediaPassthroughVideoFrameDecoder: MediaTrackFrameDecoder { var timingInfo = CMSampleTimingInfo(duration: frame.duration, presentationTimeStamp: frame.pts, decodeTimeStamp: frame.dts) var sampleBuffer: CMSampleBuffer? var sampleSize = Int(frame.packet.size) - guard CMSampleBufferCreate(nil, blockBuffer, true, nil, nil, self.videoFormat, 1, 1, &timingInfo, 1, &sampleSize, &sampleBuffer) == noErr else { + guard CMSampleBufferCreate(allocator: nil, dataBuffer: blockBuffer, dataReady: true, makeDataReadyCallback: nil, refcon: nil, formatDescription: self.videoFormat, sampleCount: 1, sampleTimingEntryCount: 1, sampleTimingArray: &timingInfo, sampleSizeEntryCount: 1, sampleSizeArray: &sampleSize, sampleBufferOut: &sampleBuffer) == noErr else { return nil } let resetDecoder = self.resetDecoderOnNextFrame if self.resetDecoderOnNextFrame { self.resetDecoderOnNextFrame = false - let attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer!, true)! as NSArray + let attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer!, createIfNecessary: true)! as NSArray let dict = attachments[0] as! NSMutableDictionary dict.setValue(kCFBooleanTrue as AnyObject, forKey: kCMSampleBufferAttachmentKey_ResetDecoderBeforeDecoding as NSString as String) diff --git a/submodules/TelegramUI/TelegramUI/FFMpegMediaVideoFrameDecoder.swift b/submodules/MediaPlayer/Sources/FFMpegMediaVideoFrameDecoder.swift similarity index 91% rename from submodules/TelegramUI/TelegramUI/FFMpegMediaVideoFrameDecoder.swift rename to submodules/MediaPlayer/Sources/FFMpegMediaVideoFrameDecoder.swift index 1a7be7c32d..29c84c0193 100644 --- a/submodules/TelegramUI/TelegramUI/FFMpegMediaVideoFrameDecoder.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaVideoFrameDecoder.swift @@ -4,7 +4,7 @@ import FFMpeg private let bufferCount = 32 -final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { +public final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { private let codecContext: FFMpegAVCodecContext private let videoFrame: FFMpegAVFrame @@ -14,7 +14,7 @@ final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { private var delayedFrames: [MediaTrackFrame] = [] - init(codecContext: FFMpegAVCodecContext) { + public init(codecContext: FFMpegAVCodecContext) { self.codecContext = codecContext self.videoFrame = FFMpegAVFrame() @@ -44,15 +44,15 @@ final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { } - func decode(frame: MediaTrackDecodableFrame) -> MediaTrackFrame? { + public func decode(frame: MediaTrackDecodableFrame) -> MediaTrackFrame? { return self.decode(frame: frame, ptsOffset: nil) } - func decode(frame: MediaTrackDecodableFrame, ptsOffset: CMTime?) -> MediaTrackFrame? { + public func decode(frame: MediaTrackDecodableFrame, ptsOffset: CMTime?) -> MediaTrackFrame? { let status = frame.packet.send(toDecoder: self.codecContext) if status == 0 { if self.codecContext.receive(into: self.videoFrame) { - var pts = CMTimeMake(self.videoFrame.pts, frame.pts.timescale) + var pts = CMTimeMake(value: self.videoFrame.pts, timescale: frame.pts.timescale) if let ptsOffset = ptsOffset { pts = CMTimeAdd(pts, ptsOffset) } @@ -63,7 +63,7 @@ final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { return nil } - func takeRemainingFrame() -> MediaTrackFrame? { + public func takeRemainingFrame() -> MediaTrackFrame? { if !self.delayedFrames.isEmpty { var minFrameIndex = 0 var minPosition = self.delayedFrames[0].position @@ -170,7 +170,7 @@ final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { CVPixelBufferUnlockBaseAddress(pixelBuffer, []) var formatRef: CMVideoFormatDescription? - let formatStatus = CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer, &formatRef) + let formatStatus = CMVideoFormatDescriptionCreateForImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pixelBuffer, formatDescriptionOut: &formatRef) guard let format = formatRef, formatStatus == 0 else { return nil @@ -179,11 +179,11 @@ final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { var timingInfo = CMSampleTimingInfo(duration: duration, presentationTimeStamp: pts, decodeTimeStamp: pts) var sampleBuffer: CMSampleBuffer? - guard CMSampleBufferCreateReadyWithImageBuffer(kCFAllocatorDefault, pixelBuffer, format, &timingInfo, &sampleBuffer) == noErr else { + guard CMSampleBufferCreateReadyWithImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pixelBuffer, formatDescription: format, sampleTiming: &timingInfo, sampleBufferOut: &sampleBuffer) == noErr else { return nil } - let attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer!, true)! as NSArray + let attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer!, createIfNecessary: true)! as NSArray let dict = attachments[0] as! NSMutableDictionary let resetDecoder = self.resetDecoderOnNextFrame @@ -220,7 +220,7 @@ final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { } - func reset() { + public func reset() { self.codecContext.flushBuffers() self.resetDecoderOnNextFrame = true } diff --git a/submodules/TelegramUI/TelegramUI/MediaFrameSource.swift b/submodules/MediaPlayer/Sources/MediaFrameSource.swift similarity index 58% rename from submodules/TelegramUI/TelegramUI/MediaFrameSource.swift rename to submodules/MediaPlayer/Sources/MediaFrameSource.swift index 37c70372fc..24eaec7b90 100644 --- a/submodules/TelegramUI/TelegramUI/MediaFrameSource.swift +++ b/submodules/MediaPlayer/Sources/MediaFrameSource.swift @@ -2,28 +2,28 @@ import Foundation import SwiftSignalKit import CoreMedia -enum MediaTrackEvent { +public enum MediaTrackEvent { case frames([MediaTrackDecodableFrame]) case endOfStream } -final class MediaFrameSourceSeekResult { - let buffers: MediaPlaybackBuffers - let extraDecodedVideoFrames: [MediaTrackFrame] - let timestamp: CMTime +public final class MediaFrameSourceSeekResult { + public let buffers: MediaPlaybackBuffers + public let extraDecodedVideoFrames: [MediaTrackFrame] + public let timestamp: CMTime - init(buffers: MediaPlaybackBuffers, extraDecodedVideoFrames: [MediaTrackFrame], timestamp: CMTime) { + public init(buffers: MediaPlaybackBuffers, extraDecodedVideoFrames: [MediaTrackFrame], timestamp: CMTime) { self.buffers = buffers self.extraDecodedVideoFrames = extraDecodedVideoFrames self.timestamp = timestamp } } -enum MediaFrameSourceSeekError { +public enum MediaFrameSourceSeekError { case generic } -protocol MediaFrameSource { +public protocol MediaFrameSource { func addEventSink(_ f: @escaping (MediaTrackEvent) -> Void) -> Int func removeEventSink(_ index: Int) func generateFrames(until timestamp: Double) diff --git a/submodules/TelegramUI/TelegramUI/MediaPlaybackData.swift b/submodules/MediaPlayer/Sources/MediaPlaybackData.swift similarity index 60% rename from submodules/TelegramUI/TelegramUI/MediaPlaybackData.swift rename to submodules/MediaPlayer/Sources/MediaPlaybackData.swift index 687daac556..b1cff7fd5f 100644 --- a/submodules/TelegramUI/TelegramUI/MediaPlaybackData.swift +++ b/submodules/MediaPlayer/Sources/MediaPlaybackData.swift @@ -1,9 +1,9 @@ import Foundation import SwiftSignalKit -final class MediaPlaybackBuffers { - let audioBuffer: MediaTrackFrameBuffer? - let videoBuffer: MediaTrackFrameBuffer? +public final class MediaPlaybackBuffers { + public let audioBuffer: MediaTrackFrameBuffer? + public let videoBuffer: MediaTrackFrameBuffer? init(audioBuffer: MediaTrackFrameBuffer?, videoBuffer: MediaTrackFrameBuffer?) { self.audioBuffer = audioBuffer diff --git a/submodules/TelegramUI/TelegramUI/MediaPlayer.swift b/submodules/MediaPlayer/Sources/MediaPlayer.swift similarity index 93% rename from submodules/TelegramUI/TelegramUI/MediaPlayer.swift rename to submodules/MediaPlayer/Sources/MediaPlayer.swift index c0244d6fdc..1c4075e03e 100644 --- a/submodules/TelegramUI/TelegramUI/MediaPlayer.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayer.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import Postbox import CoreMedia import TelegramCore +import TelegramAudio private let traceEvents = false @@ -42,33 +43,33 @@ private enum MediaPlayerState { case playing(MediaPlayerLoadedState) } -enum MediaPlayerActionAtEnd { +public enum MediaPlayerActionAtEnd { case loop((() -> Void)?) case action(() -> Void) case loopDisablingSound(() -> Void) case stop } -enum MediaPlayerPlayOnceWithSoundActionAtEnd { +public enum MediaPlayerPlayOnceWithSoundActionAtEnd { case loop case loopDisablingSound case stop case repeatIfNeeded } -enum MediaPlayerSeek { +public enum MediaPlayerSeek { case none case start case automatic case timecode(Double) } -enum MediaPlayerStreaming { +public enum MediaPlayerStreaming { case none case conservative case earlierStart - var enabled: Bool { + public var enabled: Bool { if case .none = self { return false } else { @@ -76,7 +77,7 @@ enum MediaPlayerStreaming { } } - var parameters: (Double, Double, Double) { + public var parameters: (Double, Double, Double) { switch self { case .none, .conservative: return (1.0, 2.0, 3.0) @@ -270,7 +271,7 @@ private final class MediaPlayerContext { self.audioRenderer?.renderer.setRate(0.0) } else { if !CMTimebaseGetRate(loadedState.controlTimebase.timebase).isEqual(to: 0.0) { - CMTimebaseSetRate(loadedState.controlTimebase.timebase, 0.0) + CMTimebaseSetRate(loadedState.controlTimebase.timebase, rate: 0.0) } } let currentTimestamp = CMTimeGetSeconds(CMTimebaseGetTime(loadedState.controlTimebase.timebase)) @@ -392,9 +393,9 @@ private final class MediaPlayerContext { self.audioRenderer = nil var timebase: CMTimebase? - CMTimebaseCreateWithMasterClock(nil, CMClockGetHostTimeClock(), &timebase) + CMTimebaseCreateWithMasterClock(allocator: nil, masterClock: CMClockGetHostTimeClock(), timebaseOut: &timebase) controlTimebase = MediaPlayerControlTimebase(timebase: timebase!, isAudio: false) - CMTimebaseSetTime(timebase!, seekResult.timestamp) + CMTimebaseSetTime(timebase!, time: seekResult.timestamp) } let loadedState = MediaPlayerLoadedState(frameSource: frameSource, mediaBuffers: buffers, controlTimebase: controlTimebase) @@ -819,7 +820,7 @@ private final class MediaPlayerContext { } } else { if !CMTimebaseGetRate(loadedState.controlTimebase.timebase).isEqual(to: rate) { - CMTimebaseSetRate(loadedState.controlTimebase.timebase, rate) + CMTimebaseSetRate(loadedState.controlTimebase.timebase, rate: rate) } } @@ -894,12 +895,12 @@ private final class MediaPlayerContext { } } -enum MediaPlayerPlaybackStatus: Equatable { +public enum MediaPlayerPlaybackStatus: Equatable { case playing case paused case buffering(initial: Bool, whilePlaying: Bool) - static func ==(lhs: MediaPlayerPlaybackStatus, rhs: MediaPlayerPlaybackStatus) -> Bool { + public static func ==(lhs: MediaPlayerPlaybackStatus, rhs: MediaPlayerPlaybackStatus) -> Bool { switch lhs { case .playing: if case .playing = rhs { @@ -923,28 +924,39 @@ enum MediaPlayerPlaybackStatus: Equatable { } } -struct MediaPlayerStatus: Equatable { - let generationTimestamp: Double - let duration: Double - let dimensions: CGSize - let timestamp: Double - let baseRate: Double - let seekId: Int - let status: MediaPlayerPlaybackStatus - let soundEnabled: Bool +public struct MediaPlayerStatus: Equatable { + public let generationTimestamp: Double + public let duration: Double + public let dimensions: CGSize + public let timestamp: Double + public let baseRate: Double + public let seekId: Int + public let status: MediaPlayerPlaybackStatus + public let soundEnabled: Bool + + public init(generationTimestamp: Double, duration: Double, dimensions: CGSize, timestamp: Double, baseRate: Double, seekId: Int, status: MediaPlayerPlaybackStatus, soundEnabled: Bool) { + self.generationTimestamp = generationTimestamp + self.duration = duration + self.dimensions = dimensions + self.timestamp = timestamp + self.baseRate = baseRate + self.seekId = seekId + self.status = status + self.soundEnabled = soundEnabled + } } -final class MediaPlayer { +public final class MediaPlayer { private let queue = Queue() private var contextRef: Unmanaged? private let statusValue = Promise() - var status: Signal { + public var status: Signal { return self.statusValue.get() } - var actionAtEnd: MediaPlayerActionAtEnd = .stop { + public var actionAtEnd: MediaPlayerActionAtEnd = .stop { didSet { let value = self.actionAtEnd self.queue.async { @@ -955,7 +967,7 @@ final class MediaPlayer { } } - init(audioSessionManager: ManagedAudioSession, postbox: Postbox, resourceReference: MediaResourceReference, tempFilePath: String? = nil, streamable: MediaPlayerStreaming, video: Bool, preferSoftwareDecoding: Bool, playAutomatically: Bool = false, enableSound: Bool, baseRate: Double = 1.0, fetchAutomatically: Bool, playAndRecord: Bool = false, keepAudioSessionWhilePaused: Bool = false, continuePlayingWithoutSoundOnLostAudioSession: Bool = false) { + public init(audioSessionManager: ManagedAudioSession, postbox: Postbox, resourceReference: MediaResourceReference, tempFilePath: String? = nil, streamable: MediaPlayerStreaming, video: Bool, preferSoftwareDecoding: Bool, playAutomatically: Bool = false, enableSound: Bool, baseRate: Double = 1.0, fetchAutomatically: Bool, playAndRecord: Bool = false, keepAudioSessionWhilePaused: Bool = false, continuePlayingWithoutSoundOnLostAudioSession: Bool = false) { self.queue.async { let context = MediaPlayerContext(queue: self.queue, audioSessionManager: audioSessionManager, playerStatus: self.statusValue, postbox: postbox, resourceReference: resourceReference, tempFilePath: tempFilePath, streamable: streamable, video: video, preferSoftwareDecoding: preferSoftwareDecoding, playAutomatically: playAutomatically, enableSound: enableSound, baseRate: baseRate, fetchAutomatically: fetchAutomatically, playAndRecord: playAndRecord, keepAudioSessionWhilePaused: keepAudioSessionWhilePaused, continuePlayingWithoutSoundOnLostAudioSession: continuePlayingWithoutSoundOnLostAudioSession) self.contextRef = Unmanaged.passRetained(context) @@ -969,7 +981,7 @@ final class MediaPlayer { } } - func play() { + public func play() { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.play() @@ -977,7 +989,7 @@ final class MediaPlayer { } } - func playOnceWithSound(playAndRecord: Bool, seek: MediaPlayerSeek = .start) { + public func playOnceWithSound(playAndRecord: Bool, seek: MediaPlayerSeek = .start) { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.playOnceWithSound(playAndRecord: playAndRecord, seek: seek) @@ -985,7 +997,7 @@ final class MediaPlayer { } } - func continuePlayingWithoutSound() { + public func continuePlayingWithoutSound() { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.continuePlayingWithoutSound() @@ -993,7 +1005,7 @@ final class MediaPlayer { } } - func setContinuePlayingWithoutSoundOnLostAudioSession(_ value: Bool) { + public func setContinuePlayingWithoutSoundOnLostAudioSession(_ value: Bool) { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.setContinuePlayingWithoutSoundOnLostAudioSession(value) @@ -1001,7 +1013,7 @@ final class MediaPlayer { } } - func setForceAudioToSpeaker(_ value: Bool) { + public func setForceAudioToSpeaker(_ value: Bool) { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.setForceAudioToSpeaker(value) @@ -1009,7 +1021,7 @@ final class MediaPlayer { } } - func setKeepAudioSessionWhilePaused(_ value: Bool) { + public func setKeepAudioSessionWhilePaused(_ value: Bool) { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.setKeepAudioSessionWhilePaused(value) @@ -1017,7 +1029,7 @@ final class MediaPlayer { } } - func pause() { + public func pause() { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.pause(lostAudioSession: false) @@ -1025,7 +1037,7 @@ final class MediaPlayer { } } - func togglePlayPause() { + public func togglePlayPause() { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.togglePlayPause() @@ -1033,7 +1045,7 @@ final class MediaPlayer { } } - func seek(timestamp: Double, play: Bool? = nil) { + public func seek(timestamp: Double, play: Bool? = nil) { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { if let play = play { @@ -1045,7 +1057,7 @@ final class MediaPlayer { } } - func setBaseRate(_ baseRate: Double) { + public func setBaseRate(_ baseRate: Double) { self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { context.setBaseRate(baseRate) @@ -1053,7 +1065,7 @@ final class MediaPlayer { } } - func attachPlayerNode(_ node: MediaPlayerNode) { + public func attachPlayerNode(_ node: MediaPlayerNode) { let nodeRef: Unmanaged = Unmanaged.passRetained(node) self.queue.async { if let context = self.contextRef?.takeUnretainedValue() { diff --git a/submodules/TelegramUI/TelegramUI/MediaPlayerAudioRenderer.swift b/submodules/MediaPlayer/Sources/MediaPlayerAudioRenderer.swift similarity index 94% rename from submodules/TelegramUI/TelegramUI/MediaPlayerAudioRenderer.swift rename to submodules/MediaPlayer/Sources/MediaPlayerAudioRenderer.swift index 4c2ee07c4d..6d972fed1e 100644 --- a/submodules/TelegramUI/TelegramUI/MediaPlayerAudioRenderer.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerAudioRenderer.swift @@ -3,6 +3,7 @@ import SwiftSignalKit import CoreMedia import AVFoundation import TelegramCore +import TelegramAudio private enum AudioPlayerRendererState { case paused @@ -91,18 +92,18 @@ private func rendererInputProc(refCon: UnsafeMutableRawPointer, ioActionFlags: U context.state = .playing(rate: rate, didSetRate: true) let masterClock: CMClockOrTimebase if #available(iOS 9.0, *) { - masterClock = CMTimebaseCopyMaster(context.timebase)! + masterClock = CMTimebaseCopyMaster(context.timebase) } else { masterClock = CMTimebaseGetMaster(context.timebase)! } - CMTimebaseSetRateAndAnchorTime(context.timebase, rate, CMTimeMake(sampleIndex, 44100), CMSyncGetTime(masterClock)) + CMTimebaseSetRateAndAnchorTime(context.timebase, rate: rate, anchorTime: CMTimeMake(value: sampleIndex, timescale: 44100), immediateMasterTime: CMSyncGetTime(masterClock)) updatedRate = context.updatedRate } else { context.renderTimestampTick += 1 if context.renderTimestampTick % 1000 == 0 { let delta = (Double(sampleIndex) / 44100.0) - CMTimeGetSeconds(CMTimebaseGetTime(context.timebase)) if delta > 0.01 { - CMTimebaseSetTime(context.timebase, CMTimeMake(sampleIndex, 44100)) + CMTimebaseSetTime(context.timebase, time: CMTimeMake(value: sampleIndex, timescale: 44100)) updatedRate = context.updatedRate } } @@ -283,7 +284,7 @@ private final class AudioPlayerRendererContext { } } else { context.state = .paused - CMTimebaseSetRate(context.timebase, 0.0) + CMTimebaseSetRate(context.timebase, rate: 0.0) } } } @@ -297,7 +298,7 @@ private final class AudioPlayerRendererContext { context.notifiedLowWater = false context.overflowData = Data() context.overflowDataMaxChannelSampleIndex = 0 - CMTimebaseSetTime(context.timebase, timestamp) + CMTimebaseSetTime(context.timebase, time: timestamp) switch context.state { case let .playing(rate, _): @@ -592,10 +593,10 @@ private final class AudioPlayerRendererContext { let takeLength = min(dataLength, bytesToRequest) let pts = CMSampleBufferGetPresentationTimeStamp(frame.sampleBuffer) - let bufferSampleIndex = CMTimeConvertScale(pts, 44100, .roundAwayFromZero).value + let bufferSampleIndex = CMTimeConvertScale(pts, timescale: 44100, method: .roundAwayFromZero).value let bytes = malloc(takeLength)! - CMBlockBufferCopyDataBytes(dataBuffer, 0, takeLength, bytes) + CMBlockBufferCopyDataBytes(dataBuffer, atOffset: 0, dataLength: takeLength, destination: bytes) strongSelf.enqueueSamples(Data(bytesNoCopy: bytes.assumingMemoryBound(to: UInt8.self), count: takeLength, deallocator: .free), sampleIndex: bufferSampleIndex) if takeLength < dataLength { @@ -603,7 +604,7 @@ private final class AudioPlayerRendererContext { let copyOffset = context.overflowData.count context.overflowData.count += dataLength - takeLength context.overflowData.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in - CMBlockBufferCopyDataBytes(dataBuffer, takeLength, dataLength - takeLength, bytes.advanced(by: copyOffset)) + CMBlockBufferCopyDataBytes(dataBuffer, atOffset: takeLength, dataLength: dataLength - takeLength, destination: bytes.advanced(by: copyOffset)) } } } @@ -678,34 +679,34 @@ private func audioRendererNativeStreamDescription() -> AudioStreamBasicDescripti return canonicalBasicStreamDescription } -final class MediaPlayerAudioSessionCustomControl { - let activate: () -> Void - let deactivate: () -> Void +public final class MediaPlayerAudioSessionCustomControl { + public let activate: () -> Void + public let deactivate: () -> Void - init(activate: @escaping () -> Void, deactivate: @escaping () -> Void) { + public init(activate: @escaping () -> Void, deactivate: @escaping () -> Void) { self.activate = activate self.deactivate = deactivate } } -enum MediaPlayerAudioSessionControl { +public enum MediaPlayerAudioSessionControl { case manager(ManagedAudioSession) case custom((MediaPlayerAudioSessionCustomControl) -> Disposable) } -final class MediaPlayerAudioRenderer { +public final class MediaPlayerAudioRenderer { private var contextRef: Unmanaged? private let audioClock: CMClock - let audioTimebase: CMTimebase + public let audioTimebase: CMTimebase - init(audioSession: MediaPlayerAudioSessionControl, playAndRecord: Bool, forceAudioToSpeaker: Bool, baseRate: Double, updatedRate: @escaping () -> Void, audioPaused: @escaping () -> Void) { + public init(audioSession: MediaPlayerAudioSessionControl, playAndRecord: Bool, forceAudioToSpeaker: Bool, baseRate: Double, updatedRate: @escaping () -> Void, audioPaused: @escaping () -> Void) { var audioClock: CMClock? - CMAudioClockCreate(nil, &audioClock) + CMAudioClockCreate(allocator: nil, clockOut: &audioClock) self.audioClock = audioClock! var audioTimebase: CMTimebase? - CMTimebaseCreateWithMasterClock(nil, audioClock!, &audioTimebase) + CMTimebaseCreateWithMasterClock(allocator: nil, masterClock: audioClock!, timebaseOut: &audioTimebase) self.audioTimebase = audioTimebase! audioPlayerRendererQueue.async { @@ -721,7 +722,7 @@ final class MediaPlayerAudioRenderer { } } - func start() { + public func start() { audioPlayerRendererQueue.async { if let contextRef = self.contextRef { let context = contextRef.takeUnretainedValue() @@ -730,7 +731,7 @@ final class MediaPlayerAudioRenderer { } } - func stop() { + public func stop() { audioPlayerRendererQueue.async { if let contextRef = self.contextRef { let context = contextRef.takeUnretainedValue() @@ -739,7 +740,7 @@ final class MediaPlayerAudioRenderer { } } - func setRate(_ rate: Double) { + public func setRate(_ rate: Double) { audioPlayerRendererQueue.async { if let contextRef = self.contextRef { let context = contextRef.takeUnretainedValue() @@ -748,7 +749,7 @@ final class MediaPlayerAudioRenderer { } } - func setBaseRate(_ baseRate: Double) { + public func setBaseRate(_ baseRate: Double) { audioPlayerRendererQueue.async { if let contextRef = self.contextRef { let context = contextRef.takeUnretainedValue() @@ -757,7 +758,7 @@ final class MediaPlayerAudioRenderer { } } - func beginRequestingFrames(queue: DispatchQueue, takeFrame: @escaping () -> MediaTrackFrameResult) { + public func beginRequestingFrames(queue: DispatchQueue, takeFrame: @escaping () -> MediaTrackFrameResult) { audioPlayerRendererQueue.async { if let contextRef = self.contextRef { let context = contextRef.takeUnretainedValue() @@ -766,7 +767,7 @@ final class MediaPlayerAudioRenderer { } } - func flushBuffers(at timestamp: CMTime, completion: @escaping () -> Void) { + public func flushBuffers(at timestamp: CMTime, completion: @escaping () -> Void) { audioPlayerRendererQueue.async { if let contextRef = self.contextRef { let context = contextRef.takeUnretainedValue() @@ -775,7 +776,7 @@ final class MediaPlayerAudioRenderer { } } - func setForceAudioToSpeaker(_ value: Bool) { + public func setForceAudioToSpeaker(_ value: Bool) { audioPlayerRendererQueue.async { if let contextRef = self.contextRef { let context = contextRef.takeUnretainedValue() diff --git a/submodules/TelegramUI/TelegramUI/MediaPlayerNode.swift b/submodules/MediaPlayer/Sources/MediaPlayerNode.swift similarity index 93% rename from submodules/TelegramUI/TelegramUI/MediaPlayerNode.swift rename to submodules/MediaPlayer/Sources/MediaPlayerNode.swift index ddb23cff20..bb310b7a9f 100644 --- a/submodules/TelegramUI/TelegramUI/MediaPlayerNode.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerNode.swift @@ -1,5 +1,6 @@ import Foundation import UIKit +import Display import AsyncDisplayKit import SwiftSignalKit import AVFoundation @@ -50,9 +51,9 @@ private enum PollStatus: CustomStringConvertible { } } -final class MediaPlayerNode: ASDisplayNode { - var videoInHierarchy: Bool = false - var updateVideoInHierarchy: ((Bool) -> Void)? +public final class MediaPlayerNode: ASDisplayNode { + public var videoInHierarchy: Bool = false + public var updateVideoInHierarchy: ((Bool) -> Void)? private var videoNode: MediaPlayerNodeDisplayNode @@ -60,7 +61,7 @@ final class MediaPlayerNode: ASDisplayNode { private let videoQueue: Queue - var snapshotNode: ASDisplayNode? { + public var snapshotNode: ASDisplayNode? { didSet { if let snapshotNode = oldValue { snapshotNode.removeFromSupernode() @@ -80,7 +81,7 @@ final class MediaPlayerNode: ASDisplayNode { var currentRotationAngle = 0.0 var currentAspect = 1.0 - var state: (timebase: CMTimebase, requestFrames: Bool, rotationAngle: Double, aspect: Double)? { + public var state: (timebase: CMTimebase, requestFrames: Bool, rotationAngle: Double, aspect: Double)? { didSet { self.updateState() } @@ -171,11 +172,11 @@ final class MediaPlayerNode: ASDisplayNode { let frame = frames[i] let frameTime = CMTimeGetSeconds(frame.position) maxTakenTime = frameTime - let attachments = CMSampleBufferGetSampleAttachmentsArray(frame.sampleBuffer, true)! as NSArray + let attachments = CMSampleBufferGetSampleAttachmentsArray(frame.sampleBuffer, createIfNecessary: true)! as NSArray let dict = attachments[0] as! NSMutableDictionary if i == 0 { - CMSetAttachment(frame.sampleBuffer, kCMSampleBufferAttachmentKey_ResetDecoderBeforeDecoding as NSString, kCFBooleanTrue as AnyObject, kCMAttachmentMode_ShouldPropagate) - CMSetAttachment(frame.sampleBuffer, kCMSampleBufferAttachmentKey_EndsPreviousSampleDuration as NSString, kCFBooleanTrue as AnyObject, kCMAttachmentMode_ShouldPropagate) + CMSetAttachment(frame.sampleBuffer, key: kCMSampleBufferAttachmentKey_ResetDecoderBeforeDecoding as NSString, value: kCFBooleanTrue as AnyObject, attachmentMode: kCMAttachmentMode_ShouldPropagate) + CMSetAttachment(frame.sampleBuffer, key: kCMSampleBufferAttachmentKey_EndsPreviousSampleDuration as NSString, value: kCFBooleanTrue as AnyObject, attachmentMode: kCMAttachmentMode_ShouldPropagate) } if CMTimeCompare(frame.position, atTime) < 0 { dict.setValue(kCFBooleanTrue as AnyObject, forKey: kCMSampleAttachmentKey_DoNotDisplay as NSString as String) @@ -233,7 +234,7 @@ final class MediaPlayerNode: ASDisplayNode { } } - var transformArguments: TransformImageArguments? { + public var transformArguments: TransformImageArguments? { didSet { var cornerRadius: CGFloat = 0.0 if let transformArguments = self.transformArguments { @@ -251,7 +252,7 @@ final class MediaPlayerNode: ASDisplayNode { } } - init(backgroundThread: Bool = false) { + public init(backgroundThread: Bool = false) { self.videoNode = MediaPlayerNodeDisplayNode() if false && backgroundThread { @@ -307,7 +308,7 @@ final class MediaPlayerNode: ASDisplayNode { } } - override var frame: CGRect { + override public var frame: CGRect { didSet { if !oldValue.size.equalTo(self.frame.size) { self.updateLayout() @@ -341,7 +342,7 @@ final class MediaPlayerNode: ASDisplayNode { self.snapshotNode?.frame = fittedRect } - func reset() { + public func reset() { self.videoLayer?.flush() } } diff --git a/submodules/TelegramUI/TelegramUI/MediaPlayerScrubbingNode.swift b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift similarity index 96% rename from submodules/TelegramUI/TelegramUI/MediaPlayerScrubbingNode.swift rename to submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift index abd427a18b..66fa8112da 100644 --- a/submodules/TelegramUI/TelegramUI/MediaPlayerScrubbingNode.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift @@ -3,7 +3,7 @@ import AsyncDisplayKit import Display import SwiftSignalKit -enum MediaPlayerScrubbingNodeCap { +public enum MediaPlayerScrubbingNodeCap { case square case round } @@ -74,13 +74,13 @@ private final class MediaPlayerScrubbingForegroundNode: ASDisplayNode { } } -enum MediaPlayerScrubbingNodeHandle { +public enum MediaPlayerScrubbingNodeHandle { case none case line case circle } -enum MediaPlayerScrubbingNodeContent { +public enum MediaPlayerScrubbingNodeContent { case standard(lineHeight: CGFloat, lineCap: MediaPlayerScrubbingNodeCap, scrubberHandle: MediaPlayerScrubbingNodeHandle, backgroundColor: UIColor, foregroundColor: UIColor) case custom(backgroundNode: ASDisplayNode, foregroundContentNode: ASDisplayNode) } @@ -175,7 +175,7 @@ private final class MediaPlayerScrubbingBufferingNode: ASDisplayNode { } } -final class MediaPlayerScrubbingNode: ASDisplayNode { +public final class MediaPlayerScrubbingNode: ASDisplayNode { private var contentNodes: MediaPlayerScrubbingNodeContentNodes private var displayLink: CADisplayLink? @@ -185,18 +185,18 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { private var scrubbingBeginTimestamp: Double? private var scrubbingTimestampValue: Double? - var playbackStatusUpdated: ((MediaPlayerPlaybackStatus?) -> Void)? - var playerStatusUpdated: ((MediaPlayerStatus?) -> Void)? - var seek: ((Double) -> Void)? + public var playbackStatusUpdated: ((MediaPlayerPlaybackStatus?) -> Void)? + public var playerStatusUpdated: ((MediaPlayerStatus?) -> Void)? + public var seek: ((Double) -> Void)? private let _scrubbingTimestamp = Promise(nil) - var scrubbingTimestamp: Signal { + public var scrubbingTimestamp: Signal { return self._scrubbingTimestamp.get() } - var ignoreSeekId: Int? + public var ignoreSeekId: Int? - var enableScrubbing: Bool = true { + public var enableScrubbing: Bool = true { didSet { switch self.contentNodes { case let .standard(node): @@ -235,7 +235,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { private var statusDisposable: Disposable? private var statusValuePromise = Promise() - var status: Signal? { + public var status: Signal? { didSet { if let status = self.status { self.statusValuePromise.set(status |> map { $0 }) @@ -248,7 +248,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { private var bufferingStatusDisposable: Disposable? private var bufferingStatusValuePromise = Promise<(IndexSet, Int)?>() - var bufferingStatus: Signal<(IndexSet, Int)?, NoError>? { + public var bufferingStatus: Signal<(IndexSet, Int)?, NoError>? { didSet { if let bufferingStatus = self.bufferingStatus { self.bufferingStatusValuePromise.set(bufferingStatus) @@ -327,7 +327,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { } } - init(content: MediaPlayerScrubbingNodeContent) { + public init(content: MediaPlayerScrubbingNodeContent) { self.contentNodes = MediaPlayerScrubbingNode.contentNodesFromContent(content, enableScrubbing: self.enableScrubbing) super.init() @@ -469,7 +469,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { } } - func updateContent(_ content: MediaPlayerScrubbingNodeContent) { + public func updateContent(_ content: MediaPlayerScrubbingNodeContent) { self.contentNodes = MediaPlayerScrubbingNode.contentNodesFromContent(content, enableScrubbing: self.enableScrubbing) self.setupContentNodes() @@ -483,7 +483,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { self.bufferingStatusDisposable?.dispose() } - override var frame: CGRect { + override public var frame: CGRect { didSet { if self.frame.size != oldValue.size { self.updateProgressAnimations() @@ -491,7 +491,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { } } - func updateColors(backgroundColor: UIColor, foregroundColor: UIColor) { + public func updateColors(backgroundColor: UIColor, foregroundColor: UIColor) { switch self.contentNodes { case let .standard(node): switch node.lineCap { @@ -546,7 +546,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { let displayLink = CADisplayLink(target: DisplayLinkProxy({ [weak self] in self?.updateProgress() }), selector: #selector(DisplayLinkProxy.displayLinkEvent)) - displayLink.add(to: .main, forMode: .commonModes) + displayLink.add(to: .main, forMode: RunLoop.Mode.common) self.displayLink = displayLink } self.displayLink?.isPaused = false @@ -690,7 +690,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { } } - override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { var hitBounds = self.bounds let hitTestSlop = self.hitTestSlop hitBounds.origin.x += hitTestSlop.left diff --git a/submodules/TelegramUI/TelegramUI/MediaPlayerTimeTextNode.swift b/submodules/MediaPlayer/Sources/MediaPlayerTimeTextNode.swift similarity index 90% rename from submodules/TelegramUI/TelegramUI/MediaPlayerTimeTextNode.swift rename to submodules/MediaPlayer/Sources/MediaPlayerTimeTextNode.swift index d88db91dc3..e69b7de216 100644 --- a/submodules/TelegramUI/TelegramUI/MediaPlayerTimeTextNode.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerTimeTextNode.swift @@ -5,7 +5,7 @@ import Display private let textFont = Font.regular(13.0) -enum MediaPlayerTimeTextNodeMode { +public enum MediaPlayerTimeTextNodeMode { case normal case reversed } @@ -51,15 +51,15 @@ private final class MediaPlayerTimeTextNodeParameters: NSObject { } } -final class MediaPlayerTimeTextNode: ASDisplayNode { - var alignment: NSTextAlignment = .left - var mode: MediaPlayerTimeTextNodeMode = .normal - var textColor: UIColor { +public final class MediaPlayerTimeTextNode: ASDisplayNode { + public var alignment: NSTextAlignment = .left + public var mode: MediaPlayerTimeTextNodeMode = .normal + public var textColor: UIColor { didSet { self.updateTimestamp() } } - var defaultDuration: Double? { + public var defaultDuration: Double? { didSet { self.updateTimestamp() } @@ -91,7 +91,7 @@ final class MediaPlayerTimeTextNode: ASDisplayNode { private var statusDisposable: Disposable? private var statusValuePromise = Promise() - var status: Signal? { + public var status: Signal? { didSet { if let status = self.status { self.statusValuePromise.set(status) @@ -101,7 +101,7 @@ final class MediaPlayerTimeTextNode: ASDisplayNode { } } - init(textColor: UIColor) { + public init(textColor: UIColor) { self.textColor = textColor super.init() @@ -109,11 +109,11 @@ final class MediaPlayerTimeTextNode: ASDisplayNode { self.isOpaque = false self.statusDisposable = (self.statusValuePromise.get() - |> deliverOnMainQueue).start(next: { [weak self] status in - if let strongSelf = self { - strongSelf.statusValue = status - } - }) + |> deliverOnMainQueue).start(next: { [weak self] status in + if let strongSelf = self { + strongSelf.statusValue = status + } + }) } deinit { @@ -160,7 +160,7 @@ final class MediaPlayerTimeTextNode: ASDisplayNode { } } - override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { + override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { return MediaPlayerTimeTextNodeParameters(state: self.state, alignment: self.alignment, mode: self.mode, textColor: self.textColor) } diff --git a/submodules/MediaPlayer/Sources/MediaTrackDecodableFrame.swift b/submodules/MediaPlayer/Sources/MediaTrackDecodableFrame.swift new file mode 100644 index 0000000000..846c71bdb5 --- /dev/null +++ b/submodules/MediaPlayer/Sources/MediaTrackDecodableFrame.swift @@ -0,0 +1,26 @@ +import Foundation +import CoreMedia +import FFMpeg + +public enum MediaTrackFrameType { + case video + case audio +} + +public final class MediaTrackDecodableFrame { + public let type: MediaTrackFrameType + public let packet: FFMpegPacket + public let pts: CMTime + public let dts: CMTime + public let duration: CMTime + + public init(type: MediaTrackFrameType, packet: FFMpegPacket, pts: CMTime, dts: CMTime, duration: CMTime) { + self.type = type + + self.pts = pts + self.dts = dts + self.duration = duration + + self.packet = packet + } +} diff --git a/submodules/MediaPlayer/Sources/MediaTrackFrame.swift b/submodules/MediaPlayer/Sources/MediaTrackFrame.swift new file mode 100644 index 0000000000..7ddd0d1417 --- /dev/null +++ b/submodules/MediaPlayer/Sources/MediaTrackFrame.swift @@ -0,0 +1,26 @@ +import Foundation +import CoreMedia + +public final class MediaTrackFrame { + public let type: MediaTrackFrameType + public let sampleBuffer: CMSampleBuffer + public let resetDecoder: Bool + public let decoded: Bool + public let rotationAngle: Double + + public init(type: MediaTrackFrameType, sampleBuffer: CMSampleBuffer, resetDecoder: Bool, decoded: Bool, rotationAngle: Double = 0.0) { + self.type = type + self.sampleBuffer = sampleBuffer + self.resetDecoder = resetDecoder + self.decoded = decoded + self.rotationAngle = rotationAngle + } + + public var position: CMTime { + return CMSampleBufferGetPresentationTimeStamp(self.sampleBuffer) + } + + public var duration: CMTime { + return CMSampleBufferGetDuration(self.sampleBuffer) + } +} diff --git a/submodules/TelegramUI/TelegramUI/MediaTrackFrameBuffer.swift b/submodules/MediaPlayer/Sources/MediaTrackFrameBuffer.swift similarity index 94% rename from submodules/TelegramUI/TelegramUI/MediaTrackFrameBuffer.swift rename to submodules/MediaPlayer/Sources/MediaTrackFrameBuffer.swift index 63419f843a..60643ab0f6 100644 --- a/submodules/TelegramUI/TelegramUI/MediaTrackFrameBuffer.swift +++ b/submodules/MediaPlayer/Sources/MediaTrackFrameBuffer.swift @@ -2,13 +2,13 @@ import Foundation import SwiftSignalKit import CoreMedia -enum MediaTrackFrameBufferStatus { +public enum MediaTrackFrameBufferStatus { case buffering case full(until: Double) case finished(at: Double) } -enum MediaTrackFrameResult { +public enum MediaTrackFrameResult { case noFrames case skipFrame case restoreState([MediaTrackFrame], CMTime) @@ -18,7 +18,7 @@ enum MediaTrackFrameResult { private let traceEvents = false -final class MediaTrackFrameBuffer { +public final class MediaTrackFrameBuffer { private let stallDuration: Double private let lowWaterDuration: Double private let highWaterDuration: Double @@ -26,7 +26,7 @@ final class MediaTrackFrameBuffer { private let frameSource: MediaFrameSource private let decoder: MediaTrackFrameDecoder private let type: MediaTrackFrameType - let duration: CMTime + public let duration: CMTime let rotationAngle: Double let aspect: Double @@ -100,7 +100,7 @@ final class MediaTrackFrameBuffer { self.statusUpdated() } - func status(at timestamp: Double) -> MediaTrackFrameBufferStatus { + public func status(at timestamp: Double) -> MediaTrackFrameBufferStatus { var bufferedDuration = 0.0 if let bufferedUntilTime = self.bufferedUntilTime { if CMTimeCompare(bufferedUntilTime, self.duration) >= 0 || self.endOfStream { @@ -139,11 +139,11 @@ final class MediaTrackFrameBuffer { } } - var hasFrames: Bool { + public var hasFrames: Bool { return !self.frames.isEmpty } - func takeFrame() -> MediaTrackFrameResult { + public func takeFrame() -> MediaTrackFrameResult { if !self.frames.isEmpty { let frame = self.frames.removeFirst() if let decodedFrame = self.decoder.decode(frame: frame) { diff --git a/submodules/TelegramUI/TelegramUI/MediaTrackFrameDecoder.swift b/submodules/MediaPlayer/Sources/MediaTrackFrameDecoder.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/MediaTrackFrameDecoder.swift rename to submodules/MediaPlayer/Sources/MediaTrackFrameDecoder.swift diff --git a/submodules/TelegramUI/TelegramUI/RingBuffer.h b/submodules/MediaPlayer/Sources/RingBuffer.h similarity index 100% rename from submodules/TelegramUI/TelegramUI/RingBuffer.h rename to submodules/MediaPlayer/Sources/RingBuffer.h diff --git a/submodules/TelegramUI/TelegramUI/RingBuffer.m b/submodules/MediaPlayer/Sources/RingBuffer.m similarity index 100% rename from submodules/TelegramUI/TelegramUI/RingBuffer.m rename to submodules/MediaPlayer/Sources/RingBuffer.m diff --git a/submodules/TelegramUI/TelegramUI/RingByteBuffer.swift b/submodules/MediaPlayer/Sources/RingByteBuffer.swift similarity index 98% rename from submodules/TelegramUI/TelegramUI/RingByteBuffer.swift rename to submodules/MediaPlayer/Sources/RingByteBuffer.swift index 1d48fbfd5e..8ce25943d3 100644 --- a/submodules/TelegramUI/TelegramUI/RingByteBuffer.swift +++ b/submodules/MediaPlayer/Sources/RingByteBuffer.swift @@ -1,6 +1,5 @@ import Foundation import Darwin -import TelegramUIPrivateModule public final class RingByteBuffer { public let size: Int diff --git a/submodules/MediaPlayer/Sources/UniversalMediaPlayer.h b/submodules/MediaPlayer/Sources/UniversalMediaPlayer.h new file mode 100644 index 0000000000..0a450ef9f3 --- /dev/null +++ b/submodules/MediaPlayer/Sources/UniversalMediaPlayer.h @@ -0,0 +1,9 @@ +#import + +//! Project version number for MediaPlayer. +FOUNDATION_EXPORT double MediaPlayerVersionNumber; + +//! Project version string for MediaPlayer. +FOUNDATION_EXPORT const unsigned char MediaPlayerVersionString[]; + +#import diff --git a/submodules/TelegramUI/TelegramUI/VideoPlayerProxy.swift b/submodules/MediaPlayer/Sources/VideoPlayerProxy.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/VideoPlayerProxy.swift rename to submodules/MediaPlayer/Sources/VideoPlayerProxy.swift diff --git a/submodules/MediaPlayer/UniversalMediaPlayer_Xcode.xcodeproj/project.pbxproj b/submodules/MediaPlayer/UniversalMediaPlayer_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..41bf15175f --- /dev/null +++ b/submodules/MediaPlayer/UniversalMediaPlayer_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,651 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D0750C6E22B28E6600BE5F6E /* RingBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = D0750C6B22B28E6500BE5F6E /* RingBuffer.m */; }; + D0750C6F22B28E6600BE5F6E /* RingByteBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C6C22B28E6600BE5F6E /* RingByteBuffer.swift */; }; + D0750C7022B28E6600BE5F6E /* RingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = D0750C6D22B28E6600BE5F6E /* RingBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE322422B285F70058D3BC /* UniversalMediaPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE322222B285F70058D3BC /* UniversalMediaPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE322C22B2863A0058D3BC /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE322B22B2863A0058D3BC /* Display.framework */; }; + D0AE322E22B2863D0058D3BC /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE322D22B2863D0058D3BC /* AsyncDisplayKit.framework */; }; + D0AE323022B286420058D3BC /* FFMpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE322F22B286420058D3BC /* FFMpeg.framework */; }; + D0AE323222B286450058D3BC /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE323122B286450058D3BC /* Postbox.framework */; }; + D0AE323422B2864A0058D3BC /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE323322B2864A0058D3BC /* TelegramCore.framework */; }; + D0AE323622B286520058D3BC /* TelegramAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE323522B286520058D3BC /* TelegramAudio.framework */; }; + D0AE323822B2865A0058D3BC /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE323722B2865A0058D3BC /* SwiftSignalKit.framework */; }; + D0AE324B22B286A70058D3BC /* MediaFrameSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE323922B286A50058D3BC /* MediaFrameSource.swift */; }; + D0AE324C22B286A70058D3BC /* FFMpegMediaFrameSourceContextHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE323A22B286A50058D3BC /* FFMpegMediaFrameSourceContextHelpers.swift */; }; + D0AE324D22B286A70058D3BC /* FFMpegMediaFrameSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE323B22B286A50058D3BC /* FFMpegMediaFrameSource.swift */; }; + D0AE324E22B286A70058D3BC /* VideoPlayerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE323C22B286A50058D3BC /* VideoPlayerProxy.swift */; }; + D0AE324F22B286A70058D3BC /* MediaPlayerTimeTextNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE323D22B286A60058D3BC /* MediaPlayerTimeTextNode.swift */; }; + D0AE325022B286A70058D3BC /* MediaTrackFrameBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE323E22B286A60058D3BC /* MediaTrackFrameBuffer.swift */; }; + D0AE325122B286A70058D3BC /* MediaPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE323F22B286A60058D3BC /* MediaPlayer.swift */; }; + D0AE325222B286A70058D3BC /* FFMpegMediaFrameSourceContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324022B286A60058D3BC /* FFMpegMediaFrameSourceContext.swift */; }; + D0AE325322B286A70058D3BC /* MediaPlayerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324122B286A60058D3BC /* MediaPlayerNode.swift */; }; + D0AE325422B286A70058D3BC /* MediaTrackFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324222B286A60058D3BC /* MediaTrackFrameDecoder.swift */; }; + D0AE325522B286A70058D3BC /* FFMpegAudioFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324322B286A60058D3BC /* FFMpegAudioFrameDecoder.swift */; }; + D0AE325622B286A70058D3BC /* MediaPlayerAudioRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324422B286A60058D3BC /* MediaPlayerAudioRenderer.swift */; }; + D0AE325722B286A70058D3BC /* MediaPlaybackData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324522B286A70058D3BC /* MediaPlaybackData.swift */; }; + D0AE325822B286A70058D3BC /* FFMpegMediaPassthroughVideoFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324622B286A70058D3BC /* FFMpegMediaPassthroughVideoFrameDecoder.swift */; }; + D0AE325922B286A70058D3BC /* MediaPlayerScrubbingNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324722B286A70058D3BC /* MediaPlayerScrubbingNode.swift */; }; + D0AE325A22B286A70058D3BC /* FFMpegMediaVideoFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324822B286A70058D3BC /* FFMpegMediaVideoFrameDecoder.swift */; }; + D0AE325B22B286A70058D3BC /* MediaTrackDecodableFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324922B286A70058D3BC /* MediaTrackDecodableFrame.swift */; }; + D0AE325C22B286A70058D3BC /* MediaTrackFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324A22B286A70058D3BC /* MediaTrackFrame.swift */; }; + D0AE325E22B286C30058D3BC /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE325D22B286C30058D3BC /* AVFoundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D0750C6B22B28E6500BE5F6E /* RingBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RingBuffer.m; sourceTree = ""; }; + D0750C6C22B28E6600BE5F6E /* RingByteBuffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RingByteBuffer.swift; sourceTree = ""; }; + D0750C6D22B28E6600BE5F6E /* RingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RingBuffer.h; sourceTree = ""; }; + D0AE321F22B285F70058D3BC /* UniversalMediaPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UniversalMediaPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE322222B285F70058D3BC /* UniversalMediaPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UniversalMediaPlayer.h; sourceTree = ""; }; + D0AE322322B285F70058D3BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE322B22B2863A0058D3BC /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE322D22B2863D0058D3BC /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE322F22B286420058D3BC /* FFMpeg.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = FFMpeg.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE323122B286450058D3BC /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE323322B2864A0058D3BC /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE323522B286520058D3BC /* TelegramAudio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramAudio.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE323722B2865A0058D3BC /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE323922B286A50058D3BC /* MediaFrameSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaFrameSource.swift; sourceTree = ""; }; + D0AE323A22B286A50058D3BC /* FFMpegMediaFrameSourceContextHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaFrameSourceContextHelpers.swift; sourceTree = ""; }; + D0AE323B22B286A50058D3BC /* FFMpegMediaFrameSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaFrameSource.swift; sourceTree = ""; }; + D0AE323C22B286A50058D3BC /* VideoPlayerProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerProxy.swift; sourceTree = ""; }; + D0AE323D22B286A60058D3BC /* MediaPlayerTimeTextNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerTimeTextNode.swift; sourceTree = ""; }; + D0AE323E22B286A60058D3BC /* MediaTrackFrameBuffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackFrameBuffer.swift; sourceTree = ""; }; + D0AE323F22B286A60058D3BC /* MediaPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayer.swift; sourceTree = ""; }; + D0AE324022B286A60058D3BC /* FFMpegMediaFrameSourceContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaFrameSourceContext.swift; sourceTree = ""; }; + D0AE324122B286A60058D3BC /* MediaPlayerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerNode.swift; sourceTree = ""; }; + D0AE324222B286A60058D3BC /* MediaTrackFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackFrameDecoder.swift; sourceTree = ""; }; + D0AE324322B286A60058D3BC /* FFMpegAudioFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegAudioFrameDecoder.swift; sourceTree = ""; }; + D0AE324422B286A60058D3BC /* MediaPlayerAudioRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerAudioRenderer.swift; sourceTree = ""; }; + D0AE324522B286A70058D3BC /* MediaPlaybackData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlaybackData.swift; sourceTree = ""; }; + D0AE324622B286A70058D3BC /* FFMpegMediaPassthroughVideoFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaPassthroughVideoFrameDecoder.swift; sourceTree = ""; }; + D0AE324722B286A70058D3BC /* MediaPlayerScrubbingNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerScrubbingNode.swift; sourceTree = ""; }; + D0AE324822B286A70058D3BC /* FFMpegMediaVideoFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaVideoFrameDecoder.swift; sourceTree = ""; }; + D0AE324922B286A70058D3BC /* MediaTrackDecodableFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackDecodableFrame.swift; sourceTree = ""; }; + D0AE324A22B286A70058D3BC /* MediaTrackFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackFrame.swift; sourceTree = ""; }; + D0AE325D22B286C30058D3BC /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE321C22B285F70058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE325E22B286C30058D3BC /* AVFoundation.framework in Frameworks */, + D0AE323822B2865A0058D3BC /* SwiftSignalKit.framework in Frameworks */, + D0AE323622B286520058D3BC /* TelegramAudio.framework in Frameworks */, + D0AE323422B2864A0058D3BC /* TelegramCore.framework in Frameworks */, + D0AE323222B286450058D3BC /* Postbox.framework in Frameworks */, + D0AE323022B286420058D3BC /* FFMpeg.framework in Frameworks */, + D0AE322E22B2863D0058D3BC /* AsyncDisplayKit.framework in Frameworks */, + D0AE322C22B2863A0058D3BC /* Display.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0AE321522B285F70058D3BC = { + isa = PBXGroup; + children = ( + D0AE322322B285F70058D3BC /* Info.plist */, + D0AE322122B285F70058D3BC /* Sources */, + D0AE322022B285F70058D3BC /* Products */, + D0AE322A22B2863A0058D3BC /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE322022B285F70058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE321F22B285F70058D3BC /* UniversalMediaPlayer.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE322122B285F70058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0750C6D22B28E6600BE5F6E /* RingBuffer.h */, + D0750C6B22B28E6500BE5F6E /* RingBuffer.m */, + D0750C6C22B28E6600BE5F6E /* RingByteBuffer.swift */, + D0AE324322B286A60058D3BC /* FFMpegAudioFrameDecoder.swift */, + D0AE323B22B286A50058D3BC /* FFMpegMediaFrameSource.swift */, + D0AE324022B286A60058D3BC /* FFMpegMediaFrameSourceContext.swift */, + D0AE323A22B286A50058D3BC /* FFMpegMediaFrameSourceContextHelpers.swift */, + D0AE324622B286A70058D3BC /* FFMpegMediaPassthroughVideoFrameDecoder.swift */, + D0AE324822B286A70058D3BC /* FFMpegMediaVideoFrameDecoder.swift */, + D0AE323922B286A50058D3BC /* MediaFrameSource.swift */, + D0AE324522B286A70058D3BC /* MediaPlaybackData.swift */, + D0AE323F22B286A60058D3BC /* MediaPlayer.swift */, + D0AE324422B286A60058D3BC /* MediaPlayerAudioRenderer.swift */, + D0AE324122B286A60058D3BC /* MediaPlayerNode.swift */, + D0AE324722B286A70058D3BC /* MediaPlayerScrubbingNode.swift */, + D0AE323D22B286A60058D3BC /* MediaPlayerTimeTextNode.swift */, + D0AE324922B286A70058D3BC /* MediaTrackDecodableFrame.swift */, + D0AE324A22B286A70058D3BC /* MediaTrackFrame.swift */, + D0AE323E22B286A60058D3BC /* MediaTrackFrameBuffer.swift */, + D0AE324222B286A60058D3BC /* MediaTrackFrameDecoder.swift */, + D0AE323C22B286A50058D3BC /* VideoPlayerProxy.swift */, + D0AE322222B285F70058D3BC /* UniversalMediaPlayer.h */, + ); + path = Sources; + sourceTree = ""; + }; + D0AE322A22B2863A0058D3BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0AE325D22B286C30058D3BC /* AVFoundation.framework */, + D0AE323722B2865A0058D3BC /* SwiftSignalKit.framework */, + D0AE323522B286520058D3BC /* TelegramAudio.framework */, + D0AE323322B2864A0058D3BC /* TelegramCore.framework */, + D0AE323122B286450058D3BC /* Postbox.framework */, + D0AE322F22B286420058D3BC /* FFMpeg.framework */, + D0AE322D22B2863D0058D3BC /* AsyncDisplayKit.framework */, + D0AE322B22B2863A0058D3BC /* Display.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE321A22B285F70058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0750C7022B28E6600BE5F6E /* RingBuffer.h in Headers */, + D0AE322422B285F70058D3BC /* UniversalMediaPlayer.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE321E22B285F70058D3BC /* UniversalMediaPlayer */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE322722B285F70058D3BC /* Build configuration list for PBXNativeTarget "UniversalMediaPlayer" */; + buildPhases = ( + D0AE321A22B285F70058D3BC /* Headers */, + D0AE321B22B285F70058D3BC /* Sources */, + D0AE321C22B285F70058D3BC /* Frameworks */, + D0AE321D22B285F70058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = UniversalMediaPlayer; + productName = MediaPlayer; + productReference = D0AE321F22B285F70058D3BC /* UniversalMediaPlayer.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE321622B285F70058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE321E22B285F70058D3BC = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D0AE321922B285F70058D3BC /* Build configuration list for PBXProject "UniversalMediaPlayer_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE321522B285F70058D3BC; + productRefGroup = D0AE322022B285F70058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE321E22B285F70058D3BC /* UniversalMediaPlayer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE321D22B285F70058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE321B22B285F70058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE325522B286A70058D3BC /* FFMpegAudioFrameDecoder.swift in Sources */, + D0AE324C22B286A70058D3BC /* FFMpegMediaFrameSourceContextHelpers.swift in Sources */, + D0AE325A22B286A70058D3BC /* FFMpegMediaVideoFrameDecoder.swift in Sources */, + D0750C6E22B28E6600BE5F6E /* RingBuffer.m in Sources */, + D0AE325422B286A70058D3BC /* MediaTrackFrameDecoder.swift in Sources */, + D0AE325322B286A70058D3BC /* MediaPlayerNode.swift in Sources */, + D0AE325122B286A70058D3BC /* MediaPlayer.swift in Sources */, + D0AE325722B286A70058D3BC /* MediaPlaybackData.swift in Sources */, + D0AE324D22B286A70058D3BC /* FFMpegMediaFrameSource.swift in Sources */, + D0AE324B22B286A70058D3BC /* MediaFrameSource.swift in Sources */, + D0AE325922B286A70058D3BC /* MediaPlayerScrubbingNode.swift in Sources */, + D0AE325622B286A70058D3BC /* MediaPlayerAudioRenderer.swift in Sources */, + D0AE325222B286A70058D3BC /* FFMpegMediaFrameSourceContext.swift in Sources */, + D0AE324E22B286A70058D3BC /* VideoPlayerProxy.swift in Sources */, + D0AE325022B286A70058D3BC /* MediaTrackFrameBuffer.swift in Sources */, + D0AE325C22B286A70058D3BC /* MediaTrackFrame.swift in Sources */, + D0AE324F22B286A70058D3BC /* MediaPlayerTimeTextNode.swift in Sources */, + D0750C6F22B28E6600BE5F6E /* RingByteBuffer.swift in Sources */, + D0AE325822B286A70058D3BC /* FFMpegMediaPassthroughVideoFrameDecoder.swift in Sources */, + D0AE325B22B286A70058D3BC /* MediaTrackDecodableFrame.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B5C22B5BEEA00AD4DE8 /* 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; + }; + D0A25B5D22B5BEEA00AD4DE8 /* 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.UniversalMediaPlayer; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B7522B5BF3D00AD4DE8 /* 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; + }; + D0A25B7622B5BF3D00AD4DE8 /* 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.UniversalMediaPlayer; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE322522B285F70058D3BC /* 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; + }; + D0AE322622B285F70058D3BC /* 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; + }; + D0AE322822B285F70058D3BC /* 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.UniversalMediaPlayer; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE322922B285F70058D3BC /* 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.UniversalMediaPlayer; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE321922B285F70058D3BC /* Build configuration list for PBXProject "UniversalMediaPlayer_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE322522B285F70058D3BC /* DebugAppStoreLLC */, + D0A25B5C22B5BEEA00AD4DE8 /* DebugHockeyapp */, + D0AE322622B285F70058D3BC /* ReleaseAppStoreLLC */, + D0A25B7522B5BF3D00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE322722B285F70058D3BC /* Build configuration list for PBXNativeTarget "UniversalMediaPlayer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE322822B285F70058D3BC /* DebugAppStoreLLC */, + D0A25B5D22B5BEEA00AD4DE8 /* DebugHockeyapp */, + D0AE322922B285F70058D3BC /* ReleaseAppStoreLLC */, + D0A25B7622B5BF3D00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE321622B285F70058D3BC /* Project object */; +} diff --git a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj index d36988960d..5755373742 100644 --- a/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj +++ b/submodules/MtProtoKit/MtProtoKit_Xcode.xcodeproj/project.pbxproj @@ -3088,6 +3088,253 @@ }; name = DebugFork; }; + D0364D4722B3E35B002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_MODULES_AUTOLINK = NO; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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 = 7.1; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + }; + name = HockeyappMacAlpha; + }; + D0364D4822B3E35B002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Telegraph-dzhgyeoibunjpxfckifwvbawfdmi/Build/Products/Debug-iphoneos", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MtProtoKitiOS/MtProtoKit-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(PROJECT_DIR)/openssl", + ); + INFOPLIST_FILE = MtProtoKit/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/openssl/iOS", + ); + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = "-lz"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_MODULE_NAME = MtProtoKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = X834Q8SBVP/; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappMacAlpha; + }; + D0364D4922B3E35B002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_VERSION = A; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "BETA=1", + ); + HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; + INFOPLIST_FILE = MtProtoKitMac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/openssl/OSX", + ); + MACH_O_TYPE = mh_dylib; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-DMtProtoKitMacFramework=1"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappMacAlpha; + }; + D0364D4A22B3E35B002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEPLOYMENT_POSTPROCESSING = NO; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/thirdparty", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/openssl"; + INFOPLIST_FILE = MtProtoKitDynamic/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/openssl/iOS", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-DMtProtoKitDynamicFramework=1"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SEPARATE_STRIP = NO; + SKIP_INSTALL = YES; + STRIPFLAGS = ""; + STRIP_STYLE = debugging; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappMacAlpha; + }; + D0364D4B22B3E35B002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = MtProtoKitDynamicTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = HockeyappMacAlpha; + }; + D0364D4C22B3E35B002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = MtProtoKitStabilityTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.MtProtoKitStabilityTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = HockeyappMacAlpha; + }; D05A833A18AFB3F9007F1076 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5354,6 +5601,7 @@ buildConfigurations = ( D003546D1C173BF0006610DA /* Debug */, D079FD151F06BE440038FADE /* DebugHockeyapp */, + D0364D4C22B3E35B002A6EF0 /* HockeyappMacAlpha */, D021D501219CB1CD0064BEBA /* DebugFork */, D0DB57B51E5C4B470071854C /* DebugAppStore */, D0ADF92D212B3ACC00310BBC /* DebugAppStoreLLC */, @@ -5374,6 +5622,7 @@ buildConfigurations = ( D05A833A18AFB3F9007F1076 /* Debug */, D079FD101F06BE440038FADE /* DebugHockeyapp */, + D0364D4722B3E35B002A6EF0 /* HockeyappMacAlpha */, D021D4FC219CB1CD0064BEBA /* DebugFork */, D0DB57B01E5C4B470071854C /* DebugAppStore */, D0ADF928212B3ACC00310BBC /* DebugAppStoreLLC */, @@ -5394,6 +5643,7 @@ buildConfigurations = ( D079ABAA1AF39B8000076F59 /* Debug */, D079FD121F06BE440038FADE /* DebugHockeyapp */, + D0364D4922B3E35B002A6EF0 /* HockeyappMacAlpha */, D021D4FE219CB1CD0064BEBA /* DebugFork */, D0DB57B21E5C4B470071854C /* DebugAppStore */, D0ADF92A212B3ACC00310BBC /* DebugAppStoreLLC */, @@ -5414,6 +5664,7 @@ buildConfigurations = ( D0CB060A1ADC4483005E298F /* Debug */, D079FD111F06BE440038FADE /* DebugHockeyapp */, + D0364D4822B3E35B002A6EF0 /* HockeyappMacAlpha */, D021D4FD219CB1CD0064BEBA /* DebugFork */, D0DB57B11E5C4B470071854C /* DebugAppStore */, D0ADF929212B3ACC00310BBC /* DebugAppStoreLLC */, @@ -5434,6 +5685,7 @@ buildConfigurations = ( D0D2251E1B4D817B0085E26D /* Debug */, D079FD131F06BE440038FADE /* DebugHockeyapp */, + D0364D4A22B3E35B002A6EF0 /* HockeyappMacAlpha */, D021D4FF219CB1CD0064BEBA /* DebugFork */, D0DB57B31E5C4B470071854C /* DebugAppStore */, D0ADF92B212B3ACC00310BBC /* DebugAppStoreLLC */, @@ -5454,6 +5706,7 @@ buildConfigurations = ( D0D225201B4D817B0085E26D /* Debug */, D079FD141F06BE440038FADE /* DebugHockeyapp */, + D0364D4B22B3E35B002A6EF0 /* HockeyappMacAlpha */, D021D500219CB1CD0064BEBA /* DebugFork */, D0DB57B41E5C4B470071854C /* DebugAppStore */, D0ADF92C212B3ACC00310BBC /* DebugAppStoreLLC */, diff --git a/submodules/Postbox/Postbox/CachedPeerDataTable.swift b/submodules/Postbox/Postbox/CachedPeerDataTable.swift index ee1dcb5f2d..8e4a5dae7b 100644 --- a/submodules/Postbox/Postbox/CachedPeerDataTable.swift +++ b/submodules/Postbox/Postbox/CachedPeerDataTable.swift @@ -54,6 +54,5 @@ final class CachedPeerDataTable: Table { } self.updatedPeerIds.removeAll() - self.cachedDatas.removeAll() } } diff --git a/submodules/Postbox/Postbox/Message.swift b/submodules/Postbox/Postbox/Message.swift index cd327dff00..d2f402bd53 100644 --- a/submodules/Postbox/Postbox/Message.swift +++ b/submodules/Postbox/Postbox/Message.swift @@ -10,7 +10,7 @@ public struct MessageId: Hashable, Comparable, CustomStringConvertible { public var description: String { get { - return "\(namespace):\(id)" + return "\(namespace)_\(id)" } } diff --git a/submodules/Postbox/Postbox/MessageHistoryView.swift b/submodules/Postbox/Postbox/MessageHistoryView.swift index 9d76e6f030..b32d8a04f0 100644 --- a/submodules/Postbox/Postbox/MessageHistoryView.swift +++ b/submodules/Postbox/Postbox/MessageHistoryView.swift @@ -478,36 +478,6 @@ final class MutableMessageHistoryView { self.sampledState = self.state.sample(postbox: postbox) } - /*for operationSet in operations { - for operation in operationSet { - switch operation { - case let .InsertMessage(intermediateMessage): - for i in 0 ..< self.entries.count { - switch self.entries[i] { - case let .MessageEntry(value): - let message = value.message - if message.associatedMessageIds.count != message.associatedMessages.count { - if message.associatedMessageIds.contains(intermediateMessage.id) && message.associatedMessages[intermediateMessage.id] == nil { - var updatedAssociatedMessages = message.associatedMessages - let renderedMessage = renderIntermediateMessage(intermediateMessage) - updatedAssociatedMessages[intermediateMessage.id] = renderedMessage - let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, groupingKey: message.groupingKey, groupInfo: message.groupInfo, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, localTags: message.localTags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: updatedAssociatedMessages, associatedMessageIds: message.associatedMessageIds) - self.entries[i] = .MessageEntry(MessageHistoryMessageEntry(message: updatedMessage, location: value.location, monthLocation: value.monthLocation, attributes: value.attributes)) - hasChanges = true - } - } - break - default: - break - } - } - break - default: - break - } - } - }*/ - for operationSet in operations { for operation in operationSet { switch operation { @@ -786,150 +756,6 @@ public final class MessageHistoryView { self.isLoading = isLoading } - - /*var entries: [MessageHistoryEntry] = [] - if let transientReadStates = mutableView.transientReadStates, case let .peer(states) = transientReadStates { - for entry in mutableView.entries { - switch entry { - case let .MessageEntry(value): - let read: Bool - if value.message.flags.contains(.Incoming) { - read = false - } else if let readState = states[value.message.id.peerId] { - read = readState.isOutgoingMessageIndexRead(value.message.index) - } else { - read = false - } - entries.append(MessageHistoryEntry(message: value.message, isRead: read, location: value.location, monthLocation: value.monthLocation, attributes: value.attributes)) - case .IntermediateMessageEntry: - assertionFailure("unexpected IntermediateMessageEntry in MessageHistoryView.init()") - } - } - } else { - for entry in mutableView.entries { - switch entry { - case let .MessageEntry(value): - entries.append(MessageHistoryEntry(message: value.message, isRead: false, location: value.location, monthLocation: value.monthLocation, attributes: value.attributes)) - case .IntermediateMessageEntry: - assertionFailure("unexpected IntermediateMessageEntry in MessageHistoryView.init()") - } - } - } - var holeEarlier = false - var holeLater = false - if mutableView.clipHoles { - if entries.isEmpty { - if !mutableView.holes.isEmpty { - holeEarlier = true - holeLater = true - } - } else { - var clearAllEntries = false - if case let .message(index) = self.anchorIndex { - for (holeKey, indices) in mutableView.holes { - if holeKey.peerId == index.id.peerId && holeKey.namespace == index.id.namespace && indices.contains(Int(index.id.id)) { - entries.removeAll() - earlierId = nil - holeEarlier = true - laterId = nil - holeLater = true - clearAllEntries = true - break - } - } - } - if !clearAllEntries { - var referenceIndex = entries.count - 1 - for i in 0 ..< entries.count { - if self.anchorIndex.isLessOrEqual(to: entries[i].index) { - referenceIndex = i - break - } - } - var groupStart: (Int, MessageGroupInfo)? - for i in referenceIndex ..< entries.count { - let id = entries[i].message.id - if let holeIndices = mutableView.holes[PeerIdAndNamespace(peerId: id.peerId, namespace: id.namespace)] { - if holeIndices.contains(Int(id.id)) { - if let groupStart = groupStart { - entries.removeSubrange(groupStart.0 ..< entries.count) - } else { - entries.removeSubrange(i ..< entries.count) - } - laterId = nil - holeLater = true - break - } - } - /*if let groupStart = groupStart { - entries.removeSubrange(groupStart.0 ..< entries.count) - laterId = nil - } else { - if i != entries.count - 1 { - entries.removeSubrange(i + 1 ..< entries.count) - laterId = nil - } - }*/ - if let groupInfo = entries[i].message.groupInfo { - if let groupStart = groupStart, groupStart.1 == groupInfo { - } else { - groupStart = (i, groupInfo) - } - } else { - groupStart = nil - } - } - if let groupStart = groupStart, laterId != nil { - entries.removeSubrange(groupStart.0 ..< entries.count) - } - - groupStart = nil - if !entries.isEmpty { - for i in (0 ... min(referenceIndex, entries.count - 1)).reversed() { - let id = entries[i].message.id - if let holeIndices = mutableView.holes[PeerIdAndNamespace(peerId: id.peerId, namespace: id.namespace)] { - if holeIndices.contains(Int(id.id)) { - if let groupStart = groupStart { - entries.removeSubrange(0 ..< groupStart.0 + 1) - } else { - entries.removeSubrange(0 ... i) - } - earlierId = nil - holeEarlier = true - break - } - } - /*if let groupStart = groupStart { - entries.removeSubrange(0 ..< groupStart.0 + 1) - earlierId = nil - } else { - if i != 0 { - entries.removeSubrange(0 ..< i) - earlierId = nil - } - } - break - */ - if let groupInfo = entries[i].message.groupInfo { - if let groupStart = groupStart, groupStart.1 == groupInfo { - } else { - groupStart = (i, groupInfo) - } - } else { - groupStart = nil - } - } - if let groupStart = groupStart, earlierId != nil { - entries.removeSubrange(0 ..< groupStart.0 + 1) - } - } - } - } - } - self.holeEarlier = holeEarlier - self.holeLater = holeLater - self.entries = entries*/ - var topTaggedMessages: [Message] = [] for (_, message) in mutableView.topTaggedMessages { if let message = message { diff --git a/submodules/Postbox/Postbox/MessageHistoryViewState.swift b/submodules/Postbox/Postbox/MessageHistoryViewState.swift index 4c2f8d7a9c..f10678b9d4 100644 --- a/submodules/Postbox/Postbox/MessageHistoryViewState.swift +++ b/submodules/Postbox/Postbox/MessageHistoryViewState.swift @@ -5,6 +5,13 @@ struct PeerIdAndNamespace: Hashable { let namespace: MessageId.Namespace } +private func canContainHoles(_ peerIdAndNamespace: PeerIdAndNamespace, seedConfiguration: SeedConfiguration) -> Bool { + guard let messageNamespaces = seedConfiguration.messageHoles[peerIdAndNamespace.peerId.namespace] else { + return false + } + return messageNamespaces[peerIdAndNamespace.namespace] != nil +} + private struct MessageMonthIndex: Equatable { let year: Int32 let month: Int32 @@ -279,7 +286,7 @@ private func isIndex(index: MessageIndex, closerTo anchor: HistoryViewAnchor, th } } -private func sampleHoleRanges(orderedEntriesBySpace: [PeerIdAndNamespace: OrderedHistoryViewEntries], holes: HistoryViewHoles, anchor: HistoryViewAnchor, tag: MessageTags?, halfLimit: Int) -> (clipRanges: [ClosedRange], sampledHole: SampledHistoryViewHole?) { +private func sampleHoleRanges(orderedEntriesBySpace: [PeerIdAndNamespace: OrderedHistoryViewEntries], holes: HistoryViewHoles, anchor: HistoryViewAnchor, tag: MessageTags?, halfLimit: Int, seedConfiguration: SeedConfiguration) -> (clipRanges: [ClosedRange], sampledHole: SampledHistoryViewHole?) { var clipRanges: [ClosedRange] = [] var sampledHole: (distanceFromAnchor: Int?, hole: SampledHistoryViewHole)? @@ -287,6 +294,7 @@ private func sampleHoleRanges(orderedEntriesBySpace: [PeerIdAndNamespace: Ordere if indices.isEmpty { continue } + assert(canContainHoles(space, seedConfiguration: seedConfiguration)) switch anchor { case .lowerBound, .upperBound: break @@ -628,11 +636,11 @@ struct OrderedHistoryViewEntries { var lowerOrAtAnchor: [MutableMessageHistoryEntry] var higherThanAnchor: [MutableMessageHistoryEntry] - mutating func fixMonotonity() { + mutating func fixMonotony() { if self.lowerOrAtAnchor.count > 1 { for i in 1 ..< self.lowerOrAtAnchor.count { if self.lowerOrAtAnchor[i].index < self.lowerOrAtAnchor[i - 1].index { - //assertionFailure() + assertionFailure() break } } @@ -640,7 +648,7 @@ struct OrderedHistoryViewEntries { if self.higherThanAnchor.count > 1 { for i in 1 ..< self.higherThanAnchor.count { if self.higherThanAnchor[i].index < self.higherThanAnchor[i - 1].index { - // assertionFailure() + assertionFailure() break } } @@ -664,7 +672,7 @@ struct OrderedHistoryViewEntries { } } if fix { - //assertionFailure() + assertionFailure() self.lowerOrAtAnchor.sort(by: { $0.index.id.id < $1.index.id.id }) self.higherThanAnchor.sort(by: { $0.index.id.id < $1.index.id.id }) } @@ -742,6 +750,7 @@ final class HistoryViewLoadedState { let tag: MessageTags? let statistics: MessageHistoryViewOrderStatistics let halfLimit: Int + let seedConfiguration: SeedConfiguration var orderedEntriesBySpace: [PeerIdAndNamespace: OrderedHistoryViewEntries] var holes: HistoryViewHoles var spacesWithRemovals = Set() @@ -752,6 +761,7 @@ final class HistoryViewLoadedState { self.tag = tag self.statistics = statistics self.halfLimit = halfLimit + self.seedConfiguration = postbox.seedConfiguration self.orderedEntriesBySpace = [:] self.holes = holes @@ -805,7 +815,7 @@ final class HistoryViewLoadedState { if lowerOrAtAnchorMessages.count < self.halfLimit { let nextLowerIndex: (index: MessageIndex, includeFrom: Bool) - if let lastMessage = lowerOrAtAnchorMessages.last { + if let lastMessage = lowerOrAtAnchorMessages.min(by: { $0.index < $1.index }) { nextLowerIndex = (lastMessage.index, false) } else { nextLowerIndex = (anchorIndex, true) @@ -814,7 +824,7 @@ final class HistoryViewLoadedState { } if higherThanAnchorMessages.count < self.halfLimit { let nextHigherIndex: MessageIndex - if let lastMessage = higherThanAnchorMessages.last { + if let lastMessage = higherThanAnchorMessages.max(by: { $0.index < $1.index }) { nextHigherIndex = lastMessage.index } else { nextHigherIndex = anchorIndex @@ -872,15 +882,19 @@ final class HistoryViewLoadedState { } } - entries.fixMonotonity() + if canContainHoles(space, seedConfiguration: self.seedConfiguration) { + entries.fixMonotony() + } self.orderedEntriesBySpace[space] = entries } func insertHole(space: PeerIdAndNamespace, range: ClosedRange) -> Bool { + assert(canContainHoles(space, seedConfiguration: self.seedConfiguration)) return self.holes.insertHole(space: space, range: range) } func removeHole(space: PeerIdAndNamespace, range: ClosedRange) -> Bool { + assert(canContainHoles(space, seedConfiguration: self.seedConfiguration)) return self.holes.removeHole(space: space, range: range) } @@ -1097,7 +1111,7 @@ final class HistoryViewLoadedState { self.spacesWithRemovals.removeAll() } let combinedSpacesAndIndicesByDirection = sampleEntries(orderedEntriesBySpace: self.orderedEntriesBySpace, anchor: self.anchor, halfLimit: self.halfLimit) - let (clipRanges, sampledHole) = sampleHoleRanges(orderedEntriesBySpace: self.orderedEntriesBySpace, holes: self.holes, anchor: self.anchor, tag: self.tag, halfLimit: self.halfLimit) + let (clipRanges, sampledHole) = sampleHoleRanges(orderedEntriesBySpace: self.orderedEntriesBySpace, holes: self.holes, anchor: self.anchor, tag: self.tag, halfLimit: self.halfLimit, seedConfiguration: self.seedConfiguration) var holesToLower = false var holesToHigher = false @@ -1164,20 +1178,22 @@ private func fetchHoles(postbox: Postbox, locations: MessageHistoryViewPeerIds, var holesBySpace: [PeerIdAndNamespace: IndexSet] = [:] var peerIds: [PeerId] = [] switch locations { - case let .single(peerId): - peerIds.append(peerId) - case let .associated(peerId, associatedId): - peerIds.append(peerId) - if let associatedId = associatedId { - peerIds.append(associatedId.peerId) - } + case let .single(peerId): + peerIds.append(peerId) + case let .associated(peerId, associatedId): + peerIds.append(peerId) + if let associatedId = associatedId { + peerIds.append(associatedId.peerId) + } } let holeSpace = tag.flatMap(MessageHistoryHoleSpace.tag) ?? .everywhere for peerId in peerIds { for namespace in postbox.messageHistoryHoleIndexTable.existingNamespaces(peerId: peerId, holeSpace: holeSpace) { let indices = postbox.messageHistoryHoleIndexTable.closest(peerId: peerId, namespace: namespace, space: holeSpace, range: 1 ... (Int32.max - 1)) if !indices.isEmpty { - holesBySpace[PeerIdAndNamespace(peerId: peerId, namespace: namespace)] = indices + let peerIdAndNamespace = PeerIdAndNamespace(peerId: peerId, namespace: namespace) + assert(canContainHoles(peerIdAndNamespace, seedConfiguration: postbox.seedConfiguration)) + holesBySpace[peerIdAndNamespace] = indices } } } diff --git a/submodules/Postbox/Postbox/Postbox.swift b/submodules/Postbox/Postbox/Postbox.swift index c106ca29df..6f5097236a 100644 --- a/submodules/Postbox/Postbox/Postbox.swift +++ b/submodules/Postbox/Postbox/Postbox.swift @@ -940,7 +940,7 @@ public func openPostbox(basePath: String, seedConfiguration: SeedConfiguration, #if DEBUG //debugSaveState(basePath: basePath, name: "previous1") - //debugRestoreState(basePath: basePath, name: "previous1") + debugRestoreState(basePath: basePath, name: "previous1") #endif let startTime = CFAbsoluteTimeGetCurrent() @@ -1560,6 +1560,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) { + 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) { diff --git a/submodules/Postbox/Postbox/TimeBasedCleanup.swift b/submodules/Postbox/Postbox/TimeBasedCleanup.swift index 0210a549dc..93f8aefa1e 100644 --- a/submodules/Postbox/Postbox/TimeBasedCleanup.swift +++ b/submodules/Postbox/Postbox/TimeBasedCleanup.swift @@ -59,6 +59,9 @@ private final class TimeBasedCleanupImpl { public func setMaxStoreTime(_ maxStoreTime: Int32) { if self.maxStoreTime != maxStoreTime { self.maxStoreTime = maxStoreTime + #if DEBUG + return; + #endif self.resetScan(maxStoreTime: maxStoreTime) } } diff --git a/submodules/Postbox/Postbox_Xcode.xcodeproj/project.pbxproj b/submodules/Postbox/Postbox_Xcode.xcodeproj/project.pbxproj index b661a6eb47..4f21df125b 100644 --- a/submodules/Postbox/Postbox_Xcode.xcodeproj/project.pbxproj +++ b/submodules/Postbox/Postbox_Xcode.xcodeproj/project.pbxproj @@ -1886,6 +1886,161 @@ }; name = DebugFork; }; + D0364D5122B3E385002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappMacAlpha; + }; + D0364D5222B3E385002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Postbox/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_REFLECTION_METADATA_LEVEL = all; + SWIFT_VERSION = 4.2; + }; + name = HockeyappMacAlpha; + }; + D0364D5322B3E385002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; + buildSettings = { + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "/Users/peter/Documents/PostBoxTest/submodules/SSignalKit/build/Debug-iphoneos", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = PostboxTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 3.0; + }; + name = HockeyappMacAlpha; + }; + D0364D5422B3E385002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + GCC_OPTIMIZATION_LEVEL = s; + INFOPLIST_FILE = PostboxMac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/Postbox/module.private-mac.modulemap"; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + "-DNDEBUG", + ); + OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.PostboxMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 4.2; + }; + name = HockeyappMacAlpha; + }; D079FD0C1F06BE070038FADE /* DebugAppStore */ = { isa = XCBuildConfiguration; baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; @@ -2769,6 +2924,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0B418181D7DFAF3004562A4 /* DebugHockeyapp */, + D0364D5422B3E385002A6EF0 /* HockeyappMacAlpha */, D021D4FB219CB1B90064BEBA /* DebugFork */, D079FD0F1F06BE070038FADE /* DebugAppStore */, D0ADF927212B3AC400310BBC /* DebugAppStoreLLC */, @@ -2784,6 +2940,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0E3A75E1B28A7E300A402D9 /* DebugHockeyapp */, + D0364D5122B3E385002A6EF0 /* HockeyappMacAlpha */, D021D4F8219CB1B90064BEBA /* DebugFork */, D079FD0C1F06BE070038FADE /* DebugAppStore */, D0ADF924212B3AC400310BBC /* DebugAppStoreLLC */, @@ -2799,6 +2956,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0E3A7611B28A7E300A402D9 /* DebugHockeyapp */, + D0364D5222B3E385002A6EF0 /* HockeyappMacAlpha */, D021D4F9219CB1B90064BEBA /* DebugFork */, D079FD0D1F06BE070038FADE /* DebugAppStore */, D0ADF925212B3AC400310BBC /* DebugAppStoreLLC */, @@ -2814,6 +2972,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0E3A7641B28A7E300A402D9 /* DebugHockeyapp */, + D0364D5322B3E385002A6EF0 /* HockeyappMacAlpha */, D021D4FA219CB1B90064BEBA /* DebugFork */, D079FD0E1F06BE070038FADE /* DebugAppStore */, D0ADF926212B3AC400310BBC /* DebugAppStoreLLC */, diff --git a/submodules/RMIntro/Info.plist b/submodules/RMIntro/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/RMIntro/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/RMIntro/RMIntro_Xcode.xcodeproj/project.pbxproj b/submodules/RMIntro/RMIntro_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..db058d16f8 --- /dev/null +++ b/submodules/RMIntro/RMIntro_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,828 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D0A25B8922B5C0CF00AD4DE8 /* LegacyComponents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0A25B8822B5C0CF00AD4DE8 /* LegacyComponents.framework */; }; + D0A25B8A22B5C0CF00AD4DE8 /* LegacyComponents.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0A25B8822B5C0CF00AD4DE8 /* LegacyComponents.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + D0AE304922B1D77E0058D3BC /* RMIntro.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE304722B1D77E0058D3BC /* RMIntro.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE309522B1D8ED0058D3BC /* rngs.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE305622B1D8ED0058D3BC /* rngs.h */; }; + D0AE309622B1D8ED0058D3BC /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE305722B1D8ED0058D3BC /* buffer.c */; }; + D0AE309722B1D8ED0058D3BC /* shader.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE305822B1D8ED0058D3BC /* shader.h */; }; + D0AE309822B1D8ED0058D3BC /* program.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE305922B1D8ED0058D3BC /* program.c */; }; + D0AE309922B1D8ED0058D3BC /* animations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE305A22B1D8ED0058D3BC /* animations.c */; }; + D0AE309A22B1D8ED0058D3BC /* timing.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE305B22B1D8ED0058D3BC /* timing.h */; }; + D0AE309B22B1D8ED0058D3BC /* matrix.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE305C22B1D8ED0058D3BC /* matrix.h */; }; + D0AE309C22B1D8ED0058D3BC /* objects.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE305D22B1D8ED0058D3BC /* objects.h */; }; + D0AE309D22B1D8ED0058D3BC /* buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE305E22B1D8ED0058D3BC /* buffer.h */; }; + D0AE309E22B1D8ED0058D3BC /* rngs.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE305F22B1D8ED0058D3BC /* rngs.c */; }; + D0AE309F22B1D8ED0058D3BC /* macros.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE306022B1D8ED0058D3BC /* macros.h */; }; + D0AE30A022B1D8ED0058D3BC /* math_helper.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE306122B1D8ED0058D3BC /* math_helper.h */; }; + D0AE30A122B1D8ED0058D3BC /* shader.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE306222B1D8ED0058D3BC /* shader.c */; }; + D0AE30A222B1D8ED0058D3BC /* timing.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE306322B1D8ED0058D3BC /* timing.c */; }; + D0AE30A322B1D8ED0058D3BC /* animations.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE306422B1D8ED0058D3BC /* animations.h */; }; + D0AE30A422B1D8ED0058D3BC /* program.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE306522B1D8ED0058D3BC /* program.h */; }; + D0AE30A522B1D8ED0058D3BC /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE306622B1D8ED0058D3BC /* objects.c */; }; + D0AE30A622B1D8ED0058D3BC /* RMIntroViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE306922B1D8ED0058D3BC /* RMIntroViewController.m */; }; + D0AE30A722B1D8ED0058D3BC /* RMGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE306A22B1D8ED0058D3BC /* RMGeometry.h */; }; + D0AE30A822B1D8ED0058D3BC /* platform_gl.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE306B22B1D8ED0058D3BC /* platform_gl.h */; }; + D0AE30A922B1D8ED0058D3BC /* RMIntroPageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE306C22B1D8ED0058D3BC /* RMIntroPageView.h */; }; + D0AE30AA22B1D8ED0058D3BC /* texture_helper.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE306D22B1D8ED0058D3BC /* texture_helper.m */; }; + D0AE30AB22B1D8ED0058D3BC /* ic_bubble_dot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE306F22B1D8ED0058D3BC /* ic_bubble_dot@2x.png */; }; + D0AE30AC22B1D8ED0058D3BC /* powerful_mask@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307022B1D8ED0058D3BC /* powerful_mask@2x.png */; }; + D0AE30AD22B1D8ED0058D3BC /* telegram_sphere@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307122B1D8ED0058D3BC /* telegram_sphere@2x.png */; }; + D0AE30AE22B1D8ED0058D3BC /* powerful_star@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307222B1D8ED0058D3BC /* powerful_star@2x.png */; }; + D0AE30AF22B1D8ED0058D3BC /* private_door@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307322B1D8ED0058D3BC /* private_door@2x.png */; }; + D0AE30B022B1D8ED0058D3BC /* start_arrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307422B1D8ED0058D3BC /* start_arrow@2x.png */; }; + D0AE30B122B1D8ED0058D3BC /* knot_up@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307522B1D8ED0058D3BC /* knot_up@2x.png */; }; + D0AE30B222B1D8ED0058D3BC /* start_arrow_ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307622B1D8ED0058D3BC /* start_arrow_ipad.png */; }; + D0AE30B322B1D8ED0058D3BC /* fast_arrow_shadow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307722B1D8ED0058D3BC /* fast_arrow_shadow@2x.png */; }; + D0AE30B422B1D8ED0058D3BC /* ic_cam@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307822B1D8ED0058D3BC /* ic_cam@2x.png */; }; + D0AE30B522B1D8ED0058D3BC /* start_arrow_ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307922B1D8ED0058D3BC /* start_arrow_ipad@2x.png */; }; + D0AE30B622B1D8ED0058D3BC /* fast_body@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307A22B1D8ED0058D3BC /* fast_body@2x.png */; }; + D0AE30B722B1D8ED0058D3BC /* knot_down@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307B22B1D8ED0058D3BC /* knot_down@2x.png */; }; + D0AE30B822B1D8ED0058D3BC /* fast_arrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307C22B1D8ED0058D3BC /* fast_arrow@2x.png */; }; + D0AE30B922B1D8ED0058D3BC /* ic_pencil@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307D22B1D8ED0058D3BC /* ic_pencil@2x.png */; }; + D0AE30BA22B1D8ED0058D3BC /* ic_smile_eye@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307E22B1D8ED0058D3BC /* ic_smile_eye@2x.png */; }; + D0AE30BB22B1D8ED0058D3BC /* ic_bubble@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE307F22B1D8ED0058D3BC /* ic_bubble@2x.png */; }; + D0AE30BC22B1D8ED0058D3BC /* ic_pin@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308022B1D8ED0058D3BC /* ic_pin@2x.png */; }; + D0AE30BD22B1D8ED0058D3BC /* fast_spiral@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308122B1D8ED0058D3BC /* fast_spiral@2x.png */; }; + D0AE30BE22B1D8ED0058D3BC /* ic_cam_lens@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308222B1D8ED0058D3BC /* ic_cam_lens@2x.png */; }; + D0AE30BF22B1D8ED0058D3BC /* ic_videocam@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308322B1D8ED0058D3BC /* ic_videocam@2x.png */; }; + D0AE30C022B1D8ED0058D3BC /* powerful_infinity_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308422B1D8ED0058D3BC /* powerful_infinity_white@2x.png */; }; + D0AE30C122B1D8ED0058D3BC /* private_screw@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308522B1D8ED0058D3BC /* private_screw@2x.png */; }; + D0AE30C222B1D8ED0058D3BC /* powerful_infinity@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308622B1D8ED0058D3BC /* powerful_infinity@2x.png */; }; + D0AE30C322B1D8ED0058D3BC /* telegram_plane@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308722B1D8ED0058D3BC /* telegram_plane@2x.png */; }; + D0AE30C422B1D8ED0058D3BC /* ic_smile@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AE308822B1D8ED0058D3BC /* ic_smile@2x.png */; }; + D0AE30C522B1D8ED0058D3BC /* RMGeometry.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE308922B1D8ED0058D3BC /* RMGeometry.m */; }; + D0AE30C622B1D8ED0058D3BC /* RMIntroViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE308A22B1D8ED0058D3BC /* RMIntroViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE30C722B1D8ED0058D3BC /* texture_helper.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE308B22B1D8ED0058D3BC /* texture_helper.h */; }; + D0AE30C822B1D8ED0058D3BC /* RMIntroPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE308C22B1D8ED0058D3BC /* RMIntroPageView.m */; }; + D0AE30C922B1D8ED0058D3BC /* platform_log.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE308E22B1D8ED0058D3BC /* platform_log.h */; }; + D0AE30CA22B1D8ED0058D3BC /* platform_macros.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE308F22B1D8ED0058D3BC /* platform_macros.h */; }; + D0AE30CB22B1D8ED0058D3BC /* platform_log.c in Sources */ = {isa = PBXBuildFile; fileRef = D0AE309022B1D8ED0058D3BC /* platform_log.c */; }; + D0AE30CC22B1D8ED0058D3BC /* linmath.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE309322B1D8ED0058D3BC /* linmath.h */; }; + D0AE30CD22B1D8ED0058D3BC /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = D0AE309422B1D8ED0058D3BC /* .gitignore */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + D0A25B8B22B5C0CF00AD4DE8 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + D0A25B8A22B5C0CF00AD4DE8 /* LegacyComponents.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + D0A25B8822B5C0CF00AD4DE8 /* LegacyComponents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LegacyComponents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE304422B1D77E0058D3BC /* RMIntro.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RMIntro.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE304722B1D77E0058D3BC /* RMIntro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RMIntro.h; sourceTree = ""; }; + D0AE304822B1D77E0058D3BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE305622B1D8ED0058D3BC /* rngs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rngs.h; sourceTree = ""; }; + D0AE305722B1D8ED0058D3BC /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = ""; }; + D0AE305822B1D8ED0058D3BC /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = ""; }; + D0AE305922B1D8ED0058D3BC /* program.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = program.c; sourceTree = ""; }; + D0AE305A22B1D8ED0058D3BC /* animations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = animations.c; sourceTree = ""; }; + D0AE305B22B1D8ED0058D3BC /* timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timing.h; sourceTree = ""; }; + D0AE305C22B1D8ED0058D3BC /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matrix.h; sourceTree = ""; }; + D0AE305D22B1D8ED0058D3BC /* objects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = ""; }; + D0AE305E22B1D8ED0058D3BC /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; + D0AE305F22B1D8ED0058D3BC /* rngs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rngs.c; sourceTree = ""; }; + D0AE306022B1D8ED0058D3BC /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; + D0AE306122B1D8ED0058D3BC /* math_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math_helper.h; sourceTree = ""; }; + D0AE306222B1D8ED0058D3BC /* shader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = shader.c; sourceTree = ""; }; + D0AE306322B1D8ED0058D3BC /* timing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timing.c; sourceTree = ""; }; + D0AE306422B1D8ED0058D3BC /* animations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = animations.h; sourceTree = ""; }; + D0AE306522B1D8ED0058D3BC /* program.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = program.h; sourceTree = ""; }; + D0AE306622B1D8ED0058D3BC /* objects.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = objects.c; sourceTree = ""; }; + D0AE306922B1D8ED0058D3BC /* RMIntroViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMIntroViewController.m; sourceTree = ""; }; + D0AE306A22B1D8ED0058D3BC /* RMGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMGeometry.h; sourceTree = ""; }; + D0AE306B22B1D8ED0058D3BC /* platform_gl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_gl.h; sourceTree = ""; }; + D0AE306C22B1D8ED0058D3BC /* RMIntroPageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMIntroPageView.h; sourceTree = ""; }; + D0AE306D22B1D8ED0058D3BC /* texture_helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = texture_helper.m; sourceTree = ""; }; + D0AE306F22B1D8ED0058D3BC /* ic_bubble_dot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_bubble_dot@2x.png"; sourceTree = ""; }; + D0AE307022B1D8ED0058D3BC /* powerful_mask@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_mask@2x.png"; sourceTree = ""; }; + D0AE307122B1D8ED0058D3BC /* telegram_sphere@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_sphere@2x.png"; sourceTree = ""; }; + D0AE307222B1D8ED0058D3BC /* powerful_star@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_star@2x.png"; sourceTree = ""; }; + D0AE307322B1D8ED0058D3BC /* private_door@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "private_door@2x.png"; sourceTree = ""; }; + D0AE307422B1D8ED0058D3BC /* start_arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start_arrow@2x.png"; sourceTree = ""; }; + D0AE307522B1D8ED0058D3BC /* knot_up@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "knot_up@2x.png"; sourceTree = ""; }; + D0AE307622B1D8ED0058D3BC /* start_arrow_ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = start_arrow_ipad.png; sourceTree = ""; }; + D0AE307722B1D8ED0058D3BC /* fast_arrow_shadow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_arrow_shadow@2x.png"; sourceTree = ""; }; + D0AE307822B1D8ED0058D3BC /* ic_cam@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_cam@2x.png"; sourceTree = ""; }; + D0AE307922B1D8ED0058D3BC /* start_arrow_ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start_arrow_ipad@2x.png"; sourceTree = ""; }; + D0AE307A22B1D8ED0058D3BC /* fast_body@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_body@2x.png"; sourceTree = ""; }; + D0AE307B22B1D8ED0058D3BC /* knot_down@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "knot_down@2x.png"; sourceTree = ""; }; + D0AE307C22B1D8ED0058D3BC /* fast_arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_arrow@2x.png"; sourceTree = ""; }; + D0AE307D22B1D8ED0058D3BC /* ic_pencil@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pencil@2x.png"; sourceTree = ""; }; + D0AE307E22B1D8ED0058D3BC /* ic_smile_eye@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_smile_eye@2x.png"; sourceTree = ""; }; + D0AE307F22B1D8ED0058D3BC /* ic_bubble@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_bubble@2x.png"; sourceTree = ""; }; + D0AE308022B1D8ED0058D3BC /* ic_pin@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pin@2x.png"; sourceTree = ""; }; + D0AE308122B1D8ED0058D3BC /* fast_spiral@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_spiral@2x.png"; sourceTree = ""; }; + D0AE308222B1D8ED0058D3BC /* ic_cam_lens@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_cam_lens@2x.png"; sourceTree = ""; }; + D0AE308322B1D8ED0058D3BC /* ic_videocam@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_videocam@2x.png"; sourceTree = ""; }; + D0AE308422B1D8ED0058D3BC /* powerful_infinity_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_infinity_white@2x.png"; sourceTree = ""; }; + D0AE308522B1D8ED0058D3BC /* private_screw@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "private_screw@2x.png"; sourceTree = ""; }; + D0AE308622B1D8ED0058D3BC /* powerful_infinity@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_infinity@2x.png"; sourceTree = ""; }; + D0AE308722B1D8ED0058D3BC /* telegram_plane@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_plane@2x.png"; sourceTree = ""; }; + D0AE308822B1D8ED0058D3BC /* ic_smile@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_smile@2x.png"; sourceTree = ""; }; + D0AE308922B1D8ED0058D3BC /* RMGeometry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMGeometry.m; sourceTree = ""; }; + D0AE308A22B1D8ED0058D3BC /* RMIntroViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMIntroViewController.h; sourceTree = ""; }; + D0AE308B22B1D8ED0058D3BC /* texture_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = texture_helper.h; sourceTree = ""; }; + D0AE308C22B1D8ED0058D3BC /* RMIntroPageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMIntroPageView.m; sourceTree = ""; }; + D0AE308E22B1D8ED0058D3BC /* platform_log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_log.h; sourceTree = ""; }; + D0AE308F22B1D8ED0058D3BC /* platform_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_macros.h; sourceTree = ""; }; + D0AE309022B1D8ED0058D3BC /* platform_log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = platform_log.c; sourceTree = ""; }; + D0AE309322B1D8ED0058D3BC /* linmath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linmath.h; sourceTree = ""; }; + D0AE309422B1D8ED0058D3BC /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE304122B1D77E0058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0A25B8922B5C0CF00AD4DE8 /* LegacyComponents.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0A25B8722B5C0CF00AD4DE8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0A25B8822B5C0CF00AD4DE8 /* LegacyComponents.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + D0AE303A22B1D77E0058D3BC = { + isa = PBXGroup; + children = ( + D0AE304822B1D77E0058D3BC /* Info.plist */, + D0AE304622B1D77E0058D3BC /* Sources */, + D0AE304522B1D77E0058D3BC /* Products */, + D0A25B8722B5C0CF00AD4DE8 /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE304522B1D77E0058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE304422B1D77E0058D3BC /* RMIntro.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE304622B1D77E0058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE309122B1D8ED0058D3BC /* 3rdparty */, + D0AE305522B1D8ED0058D3BC /* core */, + D0AE306722B1D8ED0058D3BC /* platform */, + D0AE304722B1D77E0058D3BC /* RMIntro.h */, + ); + path = Sources; + sourceTree = ""; + }; + D0AE305522B1D8ED0058D3BC /* core */ = { + isa = PBXGroup; + children = ( + D0AE305622B1D8ED0058D3BC /* rngs.h */, + D0AE305722B1D8ED0058D3BC /* buffer.c */, + D0AE305822B1D8ED0058D3BC /* shader.h */, + D0AE305922B1D8ED0058D3BC /* program.c */, + D0AE305A22B1D8ED0058D3BC /* animations.c */, + D0AE305B22B1D8ED0058D3BC /* timing.h */, + D0AE305C22B1D8ED0058D3BC /* matrix.h */, + D0AE305D22B1D8ED0058D3BC /* objects.h */, + D0AE305E22B1D8ED0058D3BC /* buffer.h */, + D0AE305F22B1D8ED0058D3BC /* rngs.c */, + D0AE306022B1D8ED0058D3BC /* macros.h */, + D0AE306122B1D8ED0058D3BC /* math_helper.h */, + D0AE306222B1D8ED0058D3BC /* shader.c */, + D0AE306322B1D8ED0058D3BC /* timing.c */, + D0AE306422B1D8ED0058D3BC /* animations.h */, + D0AE306522B1D8ED0058D3BC /* program.h */, + D0AE306622B1D8ED0058D3BC /* objects.c */, + ); + path = core; + sourceTree = ""; + }; + D0AE306722B1D8ED0058D3BC /* platform */ = { + isa = PBXGroup; + children = ( + D0AE306822B1D8ED0058D3BC /* ios */, + D0AE308D22B1D8ED0058D3BC /* common */, + ); + path = platform; + sourceTree = ""; + }; + D0AE306822B1D8ED0058D3BC /* ios */ = { + isa = PBXGroup; + children = ( + D0AE306922B1D8ED0058D3BC /* RMIntroViewController.m */, + D0AE306A22B1D8ED0058D3BC /* RMGeometry.h */, + D0AE306B22B1D8ED0058D3BC /* platform_gl.h */, + D0AE306C22B1D8ED0058D3BC /* RMIntroPageView.h */, + D0AE306D22B1D8ED0058D3BC /* texture_helper.m */, + D0AE306E22B1D8ED0058D3BC /* Resources */, + D0AE308922B1D8ED0058D3BC /* RMGeometry.m */, + D0AE308A22B1D8ED0058D3BC /* RMIntroViewController.h */, + D0AE308B22B1D8ED0058D3BC /* texture_helper.h */, + D0AE308C22B1D8ED0058D3BC /* RMIntroPageView.m */, + ); + path = ios; + sourceTree = ""; + }; + D0AE306E22B1D8ED0058D3BC /* Resources */ = { + isa = PBXGroup; + children = ( + D0AE306F22B1D8ED0058D3BC /* ic_bubble_dot@2x.png */, + D0AE307022B1D8ED0058D3BC /* powerful_mask@2x.png */, + D0AE307122B1D8ED0058D3BC /* telegram_sphere@2x.png */, + D0AE307222B1D8ED0058D3BC /* powerful_star@2x.png */, + D0AE307322B1D8ED0058D3BC /* private_door@2x.png */, + D0AE307422B1D8ED0058D3BC /* start_arrow@2x.png */, + D0AE307522B1D8ED0058D3BC /* knot_up@2x.png */, + D0AE307622B1D8ED0058D3BC /* start_arrow_ipad.png */, + D0AE307722B1D8ED0058D3BC /* fast_arrow_shadow@2x.png */, + D0AE307822B1D8ED0058D3BC /* ic_cam@2x.png */, + D0AE307922B1D8ED0058D3BC /* start_arrow_ipad@2x.png */, + D0AE307A22B1D8ED0058D3BC /* fast_body@2x.png */, + D0AE307B22B1D8ED0058D3BC /* knot_down@2x.png */, + D0AE307C22B1D8ED0058D3BC /* fast_arrow@2x.png */, + D0AE307D22B1D8ED0058D3BC /* ic_pencil@2x.png */, + D0AE307E22B1D8ED0058D3BC /* ic_smile_eye@2x.png */, + D0AE307F22B1D8ED0058D3BC /* ic_bubble@2x.png */, + D0AE308022B1D8ED0058D3BC /* ic_pin@2x.png */, + D0AE308122B1D8ED0058D3BC /* fast_spiral@2x.png */, + D0AE308222B1D8ED0058D3BC /* ic_cam_lens@2x.png */, + D0AE308322B1D8ED0058D3BC /* ic_videocam@2x.png */, + D0AE308422B1D8ED0058D3BC /* powerful_infinity_white@2x.png */, + D0AE308522B1D8ED0058D3BC /* private_screw@2x.png */, + D0AE308622B1D8ED0058D3BC /* powerful_infinity@2x.png */, + D0AE308722B1D8ED0058D3BC /* telegram_plane@2x.png */, + D0AE308822B1D8ED0058D3BC /* ic_smile@2x.png */, + ); + path = Resources; + sourceTree = ""; + }; + D0AE308D22B1D8ED0058D3BC /* common */ = { + isa = PBXGroup; + children = ( + D0AE308E22B1D8ED0058D3BC /* platform_log.h */, + D0AE308F22B1D8ED0058D3BC /* platform_macros.h */, + D0AE309022B1D8ED0058D3BC /* platform_log.c */, + ); + path = common; + sourceTree = ""; + }; + D0AE309122B1D8ED0058D3BC /* 3rdparty */ = { + isa = PBXGroup; + children = ( + D0AE309222B1D8ED0058D3BC /* linmath */, + D0AE309422B1D8ED0058D3BC /* .gitignore */, + ); + path = 3rdparty; + sourceTree = ""; + }; + D0AE309222B1D8ED0058D3BC /* linmath */ = { + isa = PBXGroup; + children = ( + D0AE309322B1D8ED0058D3BC /* linmath.h */, + ); + path = linmath; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE303F22B1D77E0058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE309B22B1D8ED0058D3BC /* matrix.h in Headers */, + D0AE309C22B1D8ED0058D3BC /* objects.h in Headers */, + D0AE30A822B1D8ED0058D3BC /* platform_gl.h in Headers */, + D0AE309522B1D8ED0058D3BC /* rngs.h in Headers */, + D0AE30CC22B1D8ED0058D3BC /* linmath.h in Headers */, + D0AE309F22B1D8ED0058D3BC /* macros.h in Headers */, + D0AE304922B1D77E0058D3BC /* RMIntro.h in Headers */, + D0AE30C722B1D8ED0058D3BC /* texture_helper.h in Headers */, + D0AE30A922B1D8ED0058D3BC /* RMIntroPageView.h in Headers */, + D0AE30C922B1D8ED0058D3BC /* platform_log.h in Headers */, + D0AE30A022B1D8ED0058D3BC /* math_helper.h in Headers */, + D0AE309D22B1D8ED0058D3BC /* buffer.h in Headers */, + D0AE30A322B1D8ED0058D3BC /* animations.h in Headers */, + D0AE30C622B1D8ED0058D3BC /* RMIntroViewController.h in Headers */, + D0AE30A422B1D8ED0058D3BC /* program.h in Headers */, + D0AE30CA22B1D8ED0058D3BC /* platform_macros.h in Headers */, + D0AE30A722B1D8ED0058D3BC /* RMGeometry.h in Headers */, + D0AE309A22B1D8ED0058D3BC /* timing.h in Headers */, + D0AE309722B1D8ED0058D3BC /* shader.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE304322B1D77E0058D3BC /* RMIntro */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE304C22B1D77E0058D3BC /* Build configuration list for PBXNativeTarget "RMIntro" */; + buildPhases = ( + D0AE303F22B1D77E0058D3BC /* Headers */, + D0AE304022B1D77E0058D3BC /* Sources */, + D0AE304122B1D77E0058D3BC /* Frameworks */, + D0AE304222B1D77E0058D3BC /* Resources */, + D0A25B8B22B5C0CF00AD4DE8 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RMIntro; + productName = RMIntro; + productReference = D0AE304422B1D77E0058D3BC /* RMIntro.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE303B22B1D77E0058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE304322B1D77E0058D3BC = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = D0AE303E22B1D77E0058D3BC /* Build configuration list for PBXProject "RMIntro_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE303A22B1D77E0058D3BC; + productRefGroup = D0AE304522B1D77E0058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE304322B1D77E0058D3BC /* RMIntro */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE304222B1D77E0058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE30B122B1D8ED0058D3BC /* knot_up@2x.png in Resources */, + D0AE30BF22B1D8ED0058D3BC /* ic_videocam@2x.png in Resources */, + D0AE30C222B1D8ED0058D3BC /* powerful_infinity@2x.png in Resources */, + D0AE30C022B1D8ED0058D3BC /* powerful_infinity_white@2x.png in Resources */, + D0AE30BB22B1D8ED0058D3BC /* ic_bubble@2x.png in Resources */, + D0AE30B522B1D8ED0058D3BC /* start_arrow_ipad@2x.png in Resources */, + D0AE30BD22B1D8ED0058D3BC /* fast_spiral@2x.png in Resources */, + D0AE30CD22B1D8ED0058D3BC /* .gitignore in Resources */, + D0AE30B822B1D8ED0058D3BC /* fast_arrow@2x.png in Resources */, + D0AE30AC22B1D8ED0058D3BC /* powerful_mask@2x.png in Resources */, + D0AE30B322B1D8ED0058D3BC /* fast_arrow_shadow@2x.png in Resources */, + D0AE30AB22B1D8ED0058D3BC /* ic_bubble_dot@2x.png in Resources */, + D0AE30BE22B1D8ED0058D3BC /* ic_cam_lens@2x.png in Resources */, + D0AE30C122B1D8ED0058D3BC /* private_screw@2x.png in Resources */, + D0AE30B722B1D8ED0058D3BC /* knot_down@2x.png in Resources */, + D0AE30BA22B1D8ED0058D3BC /* ic_smile_eye@2x.png in Resources */, + D0AE30AE22B1D8ED0058D3BC /* powerful_star@2x.png in Resources */, + D0AE30B222B1D8ED0058D3BC /* start_arrow_ipad.png in Resources */, + D0AE30C422B1D8ED0058D3BC /* ic_smile@2x.png in Resources */, + D0AE30B922B1D8ED0058D3BC /* ic_pencil@2x.png in Resources */, + D0AE30C322B1D8ED0058D3BC /* telegram_plane@2x.png in Resources */, + D0AE30B422B1D8ED0058D3BC /* ic_cam@2x.png in Resources */, + D0AE30B622B1D8ED0058D3BC /* fast_body@2x.png in Resources */, + D0AE30BC22B1D8ED0058D3BC /* ic_pin@2x.png in Resources */, + D0AE30B022B1D8ED0058D3BC /* start_arrow@2x.png in Resources */, + D0AE30AF22B1D8ED0058D3BC /* private_door@2x.png in Resources */, + D0AE30AD22B1D8ED0058D3BC /* telegram_sphere@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE304022B1D77E0058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE309822B1D8ED0058D3BC /* program.c in Sources */, + D0AE30CB22B1D8ED0058D3BC /* platform_log.c in Sources */, + D0AE309E22B1D8ED0058D3BC /* rngs.c in Sources */, + D0AE30C522B1D8ED0058D3BC /* RMGeometry.m in Sources */, + D0AE30A522B1D8ED0058D3BC /* objects.c in Sources */, + D0AE309922B1D8ED0058D3BC /* animations.c in Sources */, + D0AE30A622B1D8ED0058D3BC /* RMIntroViewController.m in Sources */, + D0AE30A222B1D8ED0058D3BC /* timing.c in Sources */, + D0AE30C822B1D8ED0058D3BC /* RMIntroPageView.m in Sources */, + D0AE30A122B1D8ED0058D3BC /* shader.c in Sources */, + D0AE309622B1D8ED0058D3BC /* buffer.c in Sources */, + D0AE30AA22B1D8ED0058D3BC /* texture_helper.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B6A22B5BF0D00AD4DE8 /* 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 = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugHockeyapp; + }; + D0A25B6B22B5BF0D00AD4DE8 /* 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 = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.RMIntro; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B8322B5BF5500AD4DE8 /* 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 = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyappInternal; + }; + D0A25B8422B5BF5500AD4DE8 /* 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 = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.RMIntro; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE304A22B1D77E0058D3BC /* 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 = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStoreLLC; + }; + D0AE304B22B1D77E0058D3BC /* 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 = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStoreLLC; + }; + D0AE304D22B1D77E0058D3BC /* 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 = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.RMIntro; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE304E22B1D77E0058D3BC /* 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 = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.RMIntro; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE303E22B1D77E0058D3BC /* Build configuration list for PBXProject "RMIntro_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE304A22B1D77E0058D3BC /* DebugAppStoreLLC */, + D0A25B6A22B5BF0D00AD4DE8 /* DebugHockeyapp */, + D0AE304B22B1D77E0058D3BC /* ReleaseAppStoreLLC */, + D0A25B8322B5BF5500AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE304C22B1D77E0058D3BC /* Build configuration list for PBXNativeTarget "RMIntro" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE304D22B1D77E0058D3BC /* DebugAppStoreLLC */, + D0A25B6B22B5BF0D00AD4DE8 /* DebugHockeyapp */, + D0AE304E22B1D77E0058D3BC /* ReleaseAppStoreLLC */, + D0A25B8422B5BF5500AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE303B22B1D77E0058D3BC /* Project object */; +} diff --git a/submodules/TelegramUI/third-party/RMIntro/3rdparty/.gitignore b/submodules/RMIntro/Sources/3rdparty/.gitignore similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/3rdparty/.gitignore rename to submodules/RMIntro/Sources/3rdparty/.gitignore diff --git a/submodules/TelegramUI/third-party/RMIntro/3rdparty/linmath/linmath.h b/submodules/RMIntro/Sources/3rdparty/linmath/linmath.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/3rdparty/linmath/linmath.h rename to submodules/RMIntro/Sources/3rdparty/linmath/linmath.h diff --git a/submodules/RMIntro/Sources/RMIntro.h b/submodules/RMIntro/Sources/RMIntro.h new file mode 100644 index 0000000000..80d982ff62 --- /dev/null +++ b/submodules/RMIntro/Sources/RMIntro.h @@ -0,0 +1,10 @@ +#import + +//! Project version number for RMIntro. +FOUNDATION_EXPORT double RMIntroVersionNumber; + +//! Project version string for RMIntro. +FOUNDATION_EXPORT const unsigned char RMIntroVersionString[]; + +#import + diff --git a/submodules/TelegramUI/third-party/RMIntro/core/animations.c b/submodules/RMIntro/Sources/core/animations.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/animations.c rename to submodules/RMIntro/Sources/core/animations.c diff --git a/submodules/TelegramUI/third-party/RMIntro/core/animations.h b/submodules/RMIntro/Sources/core/animations.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/animations.h rename to submodules/RMIntro/Sources/core/animations.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/buffer.c b/submodules/RMIntro/Sources/core/buffer.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/buffer.c rename to submodules/RMIntro/Sources/core/buffer.c diff --git a/submodules/TelegramUI/third-party/RMIntro/core/buffer.h b/submodules/RMIntro/Sources/core/buffer.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/buffer.h rename to submodules/RMIntro/Sources/core/buffer.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/macros.h b/submodules/RMIntro/Sources/core/macros.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/macros.h rename to submodules/RMIntro/Sources/core/macros.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/math_helper.h b/submodules/RMIntro/Sources/core/math_helper.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/math_helper.h rename to submodules/RMIntro/Sources/core/math_helper.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/matrix.h b/submodules/RMIntro/Sources/core/matrix.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/matrix.h rename to submodules/RMIntro/Sources/core/matrix.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/objects.c b/submodules/RMIntro/Sources/core/objects.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/objects.c rename to submodules/RMIntro/Sources/core/objects.c diff --git a/submodules/TelegramUI/third-party/RMIntro/core/objects.h b/submodules/RMIntro/Sources/core/objects.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/objects.h rename to submodules/RMIntro/Sources/core/objects.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/program.c b/submodules/RMIntro/Sources/core/program.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/program.c rename to submodules/RMIntro/Sources/core/program.c diff --git a/submodules/TelegramUI/third-party/RMIntro/core/program.h b/submodules/RMIntro/Sources/core/program.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/program.h rename to submodules/RMIntro/Sources/core/program.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/rngs.c b/submodules/RMIntro/Sources/core/rngs.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/rngs.c rename to submodules/RMIntro/Sources/core/rngs.c diff --git a/submodules/TelegramUI/third-party/RMIntro/core/rngs.h b/submodules/RMIntro/Sources/core/rngs.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/rngs.h rename to submodules/RMIntro/Sources/core/rngs.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/shader.c b/submodules/RMIntro/Sources/core/shader.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/shader.c rename to submodules/RMIntro/Sources/core/shader.c diff --git a/submodules/TelegramUI/third-party/RMIntro/core/shader.h b/submodules/RMIntro/Sources/core/shader.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/shader.h rename to submodules/RMIntro/Sources/core/shader.h diff --git a/submodules/TelegramUI/third-party/RMIntro/core/timing.c b/submodules/RMIntro/Sources/core/timing.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/timing.c rename to submodules/RMIntro/Sources/core/timing.c diff --git a/submodules/TelegramUI/third-party/RMIntro/core/timing.h b/submodules/RMIntro/Sources/core/timing.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/core/timing.h rename to submodules/RMIntro/Sources/core/timing.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/common/platform_log.c b/submodules/RMIntro/Sources/platform/common/platform_log.c similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/common/platform_log.c rename to submodules/RMIntro/Sources/platform/common/platform_log.c diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/common/platform_log.h b/submodules/RMIntro/Sources/platform/common/platform_log.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/common/platform_log.h rename to submodules/RMIntro/Sources/platform/common/platform_log.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/common/platform_macros.h b/submodules/RMIntro/Sources/platform/common/platform_macros.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/common/platform_macros.h rename to submodules/RMIntro/Sources/platform/common/platform_macros.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGeometry.h b/submodules/RMIntro/Sources/platform/ios/RMGeometry.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGeometry.h rename to submodules/RMIntro/Sources/platform/ios/RMGeometry.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGeometry.m b/submodules/RMIntro/Sources/platform/ios/RMGeometry.m similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGeometry.m rename to submodules/RMIntro/Sources/platform/ios/RMGeometry.m diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroPageView.h b/submodules/RMIntro/Sources/platform/ios/RMIntroPageView.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroPageView.h rename to submodules/RMIntro/Sources/platform/ios/RMIntroPageView.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroPageView.m b/submodules/RMIntro/Sources/platform/ios/RMIntroPageView.m similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroPageView.m rename to submodules/RMIntro/Sources/platform/ios/RMIntroPageView.m diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroViewController.h b/submodules/RMIntro/Sources/platform/ios/RMIntroViewController.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroViewController.h rename to submodules/RMIntro/Sources/platform/ios/RMIntroViewController.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroViewController.m b/submodules/RMIntro/Sources/platform/ios/RMIntroViewController.m similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/RMIntroViewController.m rename to submodules/RMIntro/Sources/platform/ios/RMIntroViewController.m diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_arrow@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/fast_arrow@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_arrow@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/fast_arrow@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_arrow_shadow@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/fast_arrow_shadow@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_arrow_shadow@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/fast_arrow_shadow@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_body@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/fast_body@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_body@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/fast_body@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_spiral@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/fast_spiral@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/fast_spiral@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/fast_spiral@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_bubble@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_bubble@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_bubble@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_bubble@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_bubble_dot@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_bubble_dot@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_bubble_dot@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_bubble_dot@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_cam@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_cam@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_cam@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_cam@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_cam_lens@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_cam_lens@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_cam_lens@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_cam_lens@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_pencil@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_pencil@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_pencil@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_pencil@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_pin@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_pin@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_pin@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_pin@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_smile@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_smile@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_smile@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_smile@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_smile_eye@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_smile_eye@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_smile_eye@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_smile_eye@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_videocam@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/ic_videocam@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/ic_videocam@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/ic_videocam@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/knot_down@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/knot_down@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/knot_down@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/knot_down@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/knot_up@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/knot_up@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/knot_up@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/knot_up@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_infinity@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/powerful_infinity@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_infinity@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/powerful_infinity@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_infinity_white@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/powerful_infinity_white@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_infinity_white@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/powerful_infinity_white@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_mask@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/powerful_mask@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_mask@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/powerful_mask@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_star@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/powerful_star@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/powerful_star@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/powerful_star@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/private_door@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/private_door@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/private_door@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/private_door@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/private_screw@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/private_screw@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/private_screw@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/private_screw@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/start_arrow@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/start_arrow@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/start_arrow@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/start_arrow@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/start_arrow_ipad.png b/submodules/RMIntro/Sources/platform/ios/Resources/start_arrow_ipad.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/start_arrow_ipad.png rename to submodules/RMIntro/Sources/platform/ios/Resources/start_arrow_ipad.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/start_arrow_ipad@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/start_arrow_ipad@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/start_arrow_ipad@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/start_arrow_ipad@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/telegram_plane@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/telegram_plane@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/telegram_plane@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/telegram_plane@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/telegram_sphere@2x.png b/submodules/RMIntro/Sources/platform/ios/Resources/telegram_sphere@2x.png similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/Resources/telegram_sphere@2x.png rename to submodules/RMIntro/Sources/platform/ios/Resources/telegram_sphere@2x.png diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/platform_gl.h b/submodules/RMIntro/Sources/platform/ios/platform_gl.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/platform_gl.h rename to submodules/RMIntro/Sources/platform/ios/platform_gl.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/texture_helper.h b/submodules/RMIntro/Sources/platform/ios/texture_helper.h similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/texture_helper.h rename to submodules/RMIntro/Sources/platform/ios/texture_helper.h diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/texture_helper.m b/submodules/RMIntro/Sources/platform/ios/texture_helper.m similarity index 100% rename from submodules/TelegramUI/third-party/RMIntro/platform/ios/texture_helper.m rename to submodules/RMIntro/Sources/platform/ios/texture_helper.m diff --git a/submodules/SSignalKit/SSignalKit_Xcode.xcodeproj/project.pbxproj b/submodules/SSignalKit/SSignalKit_Xcode.xcodeproj/project.pbxproj index 9eeafa5aba..187ad2873e 100644 --- a/submodules/SSignalKit/SSignalKit_Xcode.xcodeproj/project.pbxproj +++ b/submodules/SSignalKit/SSignalKit_Xcode.xcodeproj/project.pbxproj @@ -1145,6 +1145,189 @@ }; name = DebugFork; }; + D0364D5522B3E38E002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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.1; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappMacAlpha; + }; + D0364D5622B3E38E002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + INFOPLIST_FILE = SSignalKit/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + ONLY_ACTIVE_ARCH = NO; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = X834Q8SBVP/; + SKIP_INSTALL = YES; + }; + name = HockeyappMacAlpha; + }; + D0364D5722B3E38E002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = SSignalKitTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + XCTest, + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = HockeyappMacAlpha; + }; + D0364D5822B3E38E002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + ARCHS = "$(ARCHS_STANDARD)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = SwiftSignalKit/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_SWIFT_FLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_REFLECTION_METADATA_LEVEL = none; + SWIFT_VERSION = 4.0; + }; + name = HockeyappMacAlpha; + }; + D0364D5922B3E38E002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = SwiftSignalKitTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = HockeyappMacAlpha; + }; + D0364D5A22B3E38E002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = SwiftSignalKitMac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.SwiftSignalKitMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + }; + name = HockeyappMacAlpha; + }; D0445DEC1A7C2CA500267924 /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2256,6 +2439,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0085B361B282B9800EAF753 /* DebugHockeyapp */, + D0364D5822B3E38E002A6EF0 /* HockeyappMacAlpha */, D021D505219CB1D90064BEBA /* DebugFork */, D0DB57B91E5C4B7A0071854C /* DebugAppStore */, D0ADF931212B3AD400310BBC /* DebugAppStoreLLC */, @@ -2271,6 +2455,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0085B391B282B9800EAF753 /* DebugHockeyapp */, + D0364D5922B3E38E002A6EF0 /* HockeyappMacAlpha */, D021D506219CB1D90064BEBA /* DebugFork */, D0DB57BA1E5C4B7A0071854C /* DebugAppStore */, D0ADF932212B3AD400310BBC /* DebugAppStoreLLC */, @@ -2286,6 +2471,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0445DEC1A7C2CA500267924 /* DebugHockeyapp */, + D0364D5522B3E38E002A6EF0 /* HockeyappMacAlpha */, D021D502219CB1D90064BEBA /* DebugFork */, D0DB57B61E5C4B7A0071854C /* DebugAppStore */, D0ADF92E212B3AD400310BBC /* DebugAppStoreLLC */, @@ -2301,6 +2487,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0445DEF1A7C2CA500267924 /* DebugHockeyapp */, + D0364D5622B3E38E002A6EF0 /* HockeyappMacAlpha */, D021D503219CB1D90064BEBA /* DebugFork */, D0DB57B71E5C4B7A0071854C /* DebugAppStore */, D0ADF92F212B3AD400310BBC /* DebugAppStoreLLC */, @@ -2316,6 +2503,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0445DF21A7C2CA500267924 /* DebugHockeyapp */, + D0364D5722B3E38E002A6EF0 /* HockeyappMacAlpha */, D021D504219CB1D90064BEBA /* DebugFork */, D0DB57B81E5C4B7A0071854C /* DebugAppStore */, D0ADF930212B3AD400310BBC /* DebugAppStoreLLC */, @@ -2331,6 +2519,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0B417F31D7DFA63004562A4 /* DebugHockeyapp */, + D0364D5A22B3E38E002A6EF0 /* HockeyappMacAlpha */, D021D507219CB1D90064BEBA /* DebugFork */, D0DB57BB1E5C4B7A0071854C /* DebugAppStore */, D0ADF933212B3AD400310BBC /* DebugAppStoreLLC */, diff --git a/submodules/SSignalKit/SwiftSignalKit/Timer.swift b/submodules/SSignalKit/SwiftSignalKit/Timer.swift index d52aaae3ea..af8738dd1f 100644 --- a/submodules/SSignalKit/SwiftSignalKit/Timer.swift +++ b/submodules/SSignalKit/SwiftSignalKit/Timer.swift @@ -34,10 +34,10 @@ public final class Timer { if self.`repeat` { let time: DispatchTime = DispatchTime.now() + self.timeout - timer.scheduleRepeating(deadline: time, interval: self.timeout) + timer.schedule(deadline: time, repeating: self.timeout) } else { let time: DispatchTime = DispatchTime.now() + self.timeout - timer.scheduleOneshot(deadline: time) + timer.schedule(deadline: time) } timer.resume() diff --git a/submodules/TelegramApi/Info.plist b/submodules/TelegramApi/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramApi/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/TelegramCore/TelegramCore/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift similarity index 93% rename from submodules/TelegramCore/TelegramCore/Api0.swift rename to submodules/TelegramApi/Sources/Api0.swift index 2ad93261ee..733cbd2782 100644 --- a/submodules/TelegramCore/TelegramCore/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -10,7 +10,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-206066487] = { return Api.InputGeoPoint.parse_inputGeoPoint($0) } dict[-784000893] = { return Api.payments.ValidatedRequestedInfo.parse_validatedRequestedInfo($0) } dict[461151667] = { return Api.ChatFull.parse_chatFull($0) } - dict[-1736252138] = { return Api.ChatFull.parse_channelFull($0) } + dict[277964371] = { return Api.ChatFull.parse_channelFull($0) } dict[1465219162] = { return Api.PollResults.parse_pollResults($0) } dict[-925415106] = { return Api.ChatParticipant.parse_chatParticipant($0) } dict[-636267638] = { return Api.ChatParticipant.parse_chatParticipantCreator($0) } @@ -172,7 +172,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[469489699] = { return Api.Update.parse_updateUserStatus($0) } dict[-1489818765] = { return Api.Update.parse_updateUserName($0) } dict[-1791935732] = { return Api.Update.parse_updateUserPhoto($0) } - dict[-1657903163] = { return Api.Update.parse_updateContactLink($0) } dict[314359194] = { return Api.Update.parse_updateNewEncryptedMessage($0) } dict[386986326] = { return Api.Update.parse_updateEncryptedChatTyping($0) } dict[-1264392051] = { return Api.Update.parse_updateEncryption($0) } @@ -234,7 +233,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[856380452] = { return Api.Update.parse_updateReadChannelInbox($0) } dict[-1667805217] = { return Api.Update.parse_updateReadHistoryInbox($0) } dict[1786671974] = { return Api.Update.parse_updatePeerSettings($0) } - dict[1602468195] = { return Api.Update.parse_updateContactLocated($0) } + dict[-1263546448] = { return Api.Update.parse_updatePeerLocated($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) } @@ -247,7 +246,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-55902537] = { return Api.InputDialogPeer.parse_inputDialogPeer($0) } dict[1684014375] = { return Api.InputDialogPeer.parse_inputDialogPeerFolder($0) } dict[-994444869] = { return Api.Error.parse_error($0) } - dict[-1150339286] = { return Api.ContactLocated.parse_contactLocated($0) } dict[-1560655744] = { return Api.KeyboardButton.parse_keyboardButton($0) } dict[629866245] = { return Api.KeyboardButton.parse_keyboardButtonUrl($0) } dict[1748655686] = { return Api.KeyboardButton.parse_keyboardButtonCallback($0) } @@ -384,6 +382,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1895328189] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionStopPoll($0) } dict[1129042607] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionChangePhoto($0) } dict[-1569748965] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionChangeLinkedChat($0) } + dict[241923758] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionChangeLocation($0) } dict[-526508104] = { return Api.help.ProxyData.parse_proxyDataEmpty($0) } dict[737668643] = { return Api.help.ProxyData.parse_proxyDataPromo($0) } dict[-543777747] = { return Api.auth.ExportedAuthorization.parse_exportedAuthorization($0) } @@ -407,6 +406,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-512463606] = { return Api.ReportReason.parse_inputReportReasonOther($0) } dict[-1685456582] = { return Api.ReportReason.parse_inputReportReasonCopyright($0) } dict[-1376497949] = { return Api.ReportReason.parse_inputReportReasonChildAbuse($0) } + dict[-606798099] = { return Api.ReportReason.parse_inputReportReasonGeoIrrelevant($0) } dict[-247351839] = { return Api.InputEncryptedChat.parse_inputEncryptedChat($0) } dict[-524237339] = { return Api.PageTableRow.parse_pageTableRow($0) } dict[-40996577] = { return Api.DraftMessage.parse_draftMessage($0) } @@ -456,6 +456,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[871426631] = { return Api.SecureCredentialsEncrypted.parse_secureCredentialsEncrypted($0) } dict[157948117] = { return Api.upload.File.parse_file($0) } dict[-242427324] = { return Api.upload.File.parse_fileCdnRedirect($0) } + dict[-1078612597] = { return Api.ChannelLocation.parse_channelLocationEmpty($0) } + dict[547062491] = { return Api.ChannelLocation.parse_channelLocation($0) } dict[182649427] = { return Api.MessageRange.parse_messageRange($0) } dict[946083368] = { return Api.messages.StickerSetInstallResult.parse_stickerSetInstallResultSuccess($0) } dict[904138920] = { return Api.messages.StickerSetInstallResult.parse_stickerSetInstallResultArchive($0) } @@ -702,9 +704,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1674235686] = { return Api.account.AutoDownloadSettings.parse_autoDownloadSettings($0) } dict[-445792507] = { return Api.DialogPeer.parse_dialogPeer($0) } dict[1363483106] = { return Api.DialogPeer.parse_dialogPeerFolder($0) } - dict[1599050311] = { return Api.ContactLink.parse_contactLinkUnknown($0) } - dict[-17968211] = { return Api.ContactLink.parse_contactLinkNone($0) } - dict[-721239344] = { return Api.ContactLink.parse_contactLinkContact($0) } dict[-104284986] = { return Api.WebDocument.parse_webDocumentNoProxy($0) } dict[475467473] = { return Api.WebDocument.parse_webDocument($0) } dict[-1290580579] = { return Api.contacts.Found.parse_found($0) } @@ -757,6 +756,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-931638658] = { return Api.EncryptedChat.parse_encryptedChatRequested($0) } dict[-94974410] = { return Api.EncryptedChat.parse_encryptedChat($0) } dict[332848423] = { return Api.EncryptedChat.parse_encryptedChatDiscarded($0) } + dict[-901375139] = { return Api.PeerLocated.parse_peerLocated($0) } dict[922273905] = { return Api.Document.parse_documentEmpty($0) } dict[-1683841855] = { return Api.Document.parse_document($0) } dict[-1707344487] = { return Api.messages.HighScores.parse_highScores($0) } @@ -765,8 +765,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) @@ -774,17 +774,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 @@ -819,7 +819,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.messages.StickerSet: _1.serialize(buffer, boxed) @@ -929,8 +929,6 @@ struct Api { _1.serialize(buffer, boxed) case let _1 as Api.Error: _1.serialize(buffer, boxed) - case let _1 as Api.ContactLocated: - _1.serialize(buffer, boxed) case let _1 as Api.KeyboardButton: _1.serialize(buffer, boxed) case let _1 as Api.ContactStatus: @@ -1095,6 +1093,8 @@ struct Api { _1.serialize(buffer, boxed) case let _1 as Api.upload.File: _1.serialize(buffer, boxed) + case let _1 as Api.ChannelLocation: + _1.serialize(buffer, boxed) case let _1 as Api.MessageRange: _1.serialize(buffer, boxed) case let _1 as Api.messages.StickerSetInstallResult: @@ -1285,8 +1285,6 @@ struct Api { _1.serialize(buffer, boxed) case let _1 as Api.DialogPeer: _1.serialize(buffer, boxed) - case let _1 as Api.ContactLink: - _1.serialize(buffer, boxed) case let _1 as Api.WebDocument: _1.serialize(buffer, boxed) case let _1 as Api.contacts.Found: @@ -1325,6 +1323,8 @@ struct Api { _1.serialize(buffer, boxed) case let _1 as Api.EncryptedChat: _1.serialize(buffer, boxed) + case let _1 as Api.PeerLocated: + _1.serialize(buffer, boxed) case let _1 as Api.Document: _1.serialize(buffer, boxed) case let _1 as Api.messages.HighScores: @@ -1339,12 +1339,12 @@ struct Api { } } -extension Api { -struct messages { - enum StickerSet: TypeConstructorDescription { +public extension Api { +public struct messages { + public enum StickerSet: TypeConstructorDescription { case stickerSet(set: Api.StickerSet, packs: [Api.StickerPack], documents: [Api.Document]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .stickerSet(let set, let packs, let documents): if boxed { @@ -1365,14 +1365,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .stickerSet(let set, let packs, let documents): return ("stickerSet", [("set", set), ("packs", packs), ("documents", documents)]) } } - static func parse_stickerSet(_ reader: BufferReader) -> StickerSet? { + public static func parse_stickerSet(_ reader: BufferReader) -> StickerSet? { var _1: Api.StickerSet? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.StickerSet @@ -1397,10 +1397,10 @@ struct messages { } } - enum ArchivedStickers: TypeConstructorDescription { + public enum ArchivedStickers: TypeConstructorDescription { case archivedStickers(count: Int32, sets: [Api.StickerSetCovered]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .archivedStickers(let count, let sets): if boxed { @@ -1416,14 +1416,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .archivedStickers(let count, let sets): return ("archivedStickers", [("count", count), ("sets", sets)]) } } - static func parse_archivedStickers(_ reader: BufferReader) -> ArchivedStickers? { + public static func parse_archivedStickers(_ reader: BufferReader) -> ArchivedStickers? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.StickerSetCovered]? @@ -1441,11 +1441,11 @@ struct messages { } } - enum SentEncryptedMessage: TypeConstructorDescription { + public enum SentEncryptedMessage: TypeConstructorDescription { case sentEncryptedMessage(date: Int32) case sentEncryptedFile(date: Int32, file: Api.EncryptedFile) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .sentEncryptedMessage(let date): if boxed { @@ -1463,7 +1463,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .sentEncryptedMessage(let date): return ("sentEncryptedMessage", [("date", date)]) @@ -1472,7 +1472,7 @@ struct messages { } } - static func parse_sentEncryptedMessage(_ reader: BufferReader) -> SentEncryptedMessage? { + public static func parse_sentEncryptedMessage(_ reader: BufferReader) -> SentEncryptedMessage? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -1483,7 +1483,7 @@ struct messages { return nil } } - static func parse_sentEncryptedFile(_ reader: BufferReader) -> SentEncryptedMessage? { + public static func parse_sentEncryptedFile(_ reader: BufferReader) -> SentEncryptedMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Api.EncryptedFile? @@ -1501,11 +1501,11 @@ struct messages { } } - enum Stickers: TypeConstructorDescription { + public enum Stickers: TypeConstructorDescription { case stickersNotModified case stickers(hash: Int32, stickers: [Api.Document]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .stickersNotModified: if boxed { @@ -1527,7 +1527,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .stickersNotModified: return ("stickersNotModified", []) @@ -1536,10 +1536,10 @@ struct messages { } } - static func parse_stickersNotModified(_ reader: BufferReader) -> Stickers? { + public static func parse_stickersNotModified(_ reader: BufferReader) -> Stickers? { return Api.messages.Stickers.stickersNotModified } - static func parse_stickers(_ reader: BufferReader) -> Stickers? { + public static func parse_stickers(_ reader: BufferReader) -> Stickers? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.Document]? @@ -1557,11 +1557,11 @@ struct messages { } } - enum FoundStickerSets: TypeConstructorDescription { + public enum FoundStickerSets: TypeConstructorDescription { case foundStickerSetsNotModified case foundStickerSets(hash: Int32, sets: [Api.StickerSetCovered]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .foundStickerSetsNotModified: if boxed { @@ -1583,7 +1583,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .foundStickerSetsNotModified: return ("foundStickerSetsNotModified", []) @@ -1592,10 +1592,10 @@ struct messages { } } - static func parse_foundStickerSetsNotModified(_ reader: BufferReader) -> FoundStickerSets? { + public static func parse_foundStickerSetsNotModified(_ reader: BufferReader) -> FoundStickerSets? { return Api.messages.FoundStickerSets.foundStickerSetsNotModified } - static func parse_foundStickerSets(_ reader: BufferReader) -> FoundStickerSets? { + public static func parse_foundStickerSets(_ reader: BufferReader) -> FoundStickerSets? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.StickerSetCovered]? @@ -1613,10 +1613,10 @@ struct messages { } } - enum FoundGifs: TypeConstructorDescription { + public enum FoundGifs: TypeConstructorDescription { case foundGifs(nextOffset: Int32, results: [Api.FoundGif]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .foundGifs(let nextOffset, let results): if boxed { @@ -1632,14 +1632,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .foundGifs(let nextOffset, let results): return ("foundGifs", [("nextOffset", nextOffset), ("results", results)]) } } - static func parse_foundGifs(_ reader: BufferReader) -> FoundGifs? { + public static func parse_foundGifs(_ reader: BufferReader) -> FoundGifs? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.FoundGif]? @@ -1657,10 +1657,10 @@ struct messages { } } - enum BotResults: TypeConstructorDescription { + public enum BotResults: TypeConstructorDescription { case botResults(flags: Int32, queryId: Int64, nextOffset: String?, switchPm: Api.InlineBotSwitchPM?, results: [Api.BotInlineResult], cacheTime: Int32, users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .botResults(let flags, let queryId, let nextOffset, let switchPm, let results, let cacheTime, let users): if boxed { @@ -1685,14 +1685,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .botResults(let flags, let queryId, let nextOffset, let switchPm, let results, let cacheTime, let users): return ("botResults", [("flags", flags), ("queryId", queryId), ("nextOffset", nextOffset), ("switchPm", switchPm), ("results", results), ("cacheTime", cacheTime), ("users", users)]) } } - static func parse_botResults(_ reader: BufferReader) -> BotResults? { + public static func parse_botResults(_ reader: BufferReader) -> BotResults? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -1729,10 +1729,10 @@ struct messages { } } - enum BotCallbackAnswer: TypeConstructorDescription { + public enum BotCallbackAnswer: TypeConstructorDescription { case botCallbackAnswer(flags: Int32, message: String?, url: String?, cacheTime: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .botCallbackAnswer(let flags, let message, let url, let cacheTime): if boxed { @@ -1746,14 +1746,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .botCallbackAnswer(let flags, let message, let url, let cacheTime): return ("botCallbackAnswer", [("flags", flags), ("message", message), ("url", url), ("cacheTime", cacheTime)]) } } - static func parse_botCallbackAnswer(_ reader: BufferReader) -> BotCallbackAnswer? { + public static func parse_botCallbackAnswer(_ reader: BufferReader) -> BotCallbackAnswer? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -1775,11 +1775,11 @@ struct messages { } } - enum Chats: TypeConstructorDescription { + public enum Chats: TypeConstructorDescription { case chats(chats: [Api.Chat]) case chatsSlice(count: Int32, chats: [Api.Chat]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chats(let chats): if boxed { @@ -1805,7 +1805,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chats(let chats): return ("chats", [("chats", chats)]) @@ -1814,7 +1814,7 @@ struct messages { } } - static func parse_chats(_ reader: BufferReader) -> Chats? { + public static func parse_chats(_ reader: BufferReader) -> Chats? { var _1: [Api.Chat]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self) @@ -1827,7 +1827,7 @@ struct messages { return nil } } - static func parse_chatsSlice(_ reader: BufferReader) -> Chats? { + public static func parse_chatsSlice(_ reader: BufferReader) -> Chats? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.Chat]? @@ -1845,11 +1845,11 @@ struct messages { } } - enum DhConfig: TypeConstructorDescription { + public enum DhConfig: TypeConstructorDescription { case dhConfigNotModified(random: Buffer) case dhConfig(g: Int32, p: Buffer, version: Int32, random: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .dhConfigNotModified(let random): if boxed { @@ -1869,7 +1869,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .dhConfigNotModified(let random): return ("dhConfigNotModified", [("random", random)]) @@ -1878,7 +1878,7 @@ struct messages { } } - static func parse_dhConfigNotModified(_ reader: BufferReader) -> DhConfig? { + public static func parse_dhConfigNotModified(_ reader: BufferReader) -> DhConfig? { var _1: Buffer? _1 = parseBytes(reader) let _c1 = _1 != nil @@ -1889,7 +1889,7 @@ struct messages { return nil } } - static func parse_dhConfig(_ reader: BufferReader) -> DhConfig? { + public static func parse_dhConfig(_ reader: BufferReader) -> DhConfig? { var _1: Int32? _1 = reader.readInt32() var _2: Buffer? @@ -1911,10 +1911,10 @@ struct messages { } } - enum AffectedHistory: TypeConstructorDescription { + public enum AffectedHistory: TypeConstructorDescription { case affectedHistory(pts: Int32, ptsCount: Int32, offset: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .affectedHistory(let pts, let ptsCount, let offset): if boxed { @@ -1927,14 +1927,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .affectedHistory(let pts, let ptsCount, let offset): return ("affectedHistory", [("pts", pts), ("ptsCount", ptsCount), ("offset", offset)]) } } - static func parse_affectedHistory(_ reader: BufferReader) -> AffectedHistory? { + public static func parse_affectedHistory(_ reader: BufferReader) -> AffectedHistory? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -1953,10 +1953,10 @@ struct messages { } } - enum MessageEditData: TypeConstructorDescription { + public enum MessageEditData: TypeConstructorDescription { case messageEditData(flags: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageEditData(let flags): if boxed { @@ -1967,14 +1967,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageEditData(let flags): return ("messageEditData", [("flags", flags)]) } } - static func parse_messageEditData(_ reader: BufferReader) -> MessageEditData? { + public static func parse_messageEditData(_ reader: BufferReader) -> MessageEditData? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -1987,10 +1987,10 @@ struct messages { } } - enum ChatFull: TypeConstructorDescription { + public enum ChatFull: TypeConstructorDescription { case chatFull(fullChat: Api.ChatFull, chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatFull(let fullChat, let chats, let users): if boxed { @@ -2011,14 +2011,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatFull(let fullChat, let chats, let users): return ("chatFull", [("fullChat", fullChat), ("chats", chats), ("users", users)]) } } - static func parse_chatFull(_ reader: BufferReader) -> ChatFull? { + public static func parse_chatFull(_ reader: BufferReader) -> ChatFull? { var _1: Api.ChatFull? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.ChatFull @@ -2043,10 +2043,10 @@ struct messages { } } - enum SearchCounter: TypeConstructorDescription { + public enum SearchCounter: TypeConstructorDescription { case searchCounter(flags: Int32, filter: Api.MessagesFilter, count: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .searchCounter(let flags, let filter, let count): if boxed { @@ -2059,14 +2059,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .searchCounter(let flags, let filter, let count): return ("searchCounter", [("flags", flags), ("filter", filter), ("count", count)]) } } - static func parse_searchCounter(_ reader: BufferReader) -> SearchCounter? { + public static func parse_searchCounter(_ reader: BufferReader) -> SearchCounter? { var _1: Int32? _1 = reader.readInt32() var _2: Api.MessagesFilter? @@ -2087,11 +2087,11 @@ struct messages { } } - enum StickerSetInstallResult: TypeConstructorDescription { + public enum StickerSetInstallResult: TypeConstructorDescription { case stickerSetInstallResultSuccess case stickerSetInstallResultArchive(sets: [Api.StickerSetCovered]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .stickerSetInstallResultSuccess: if boxed { @@ -2112,7 +2112,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .stickerSetInstallResultSuccess: return ("stickerSetInstallResultSuccess", []) @@ -2121,10 +2121,10 @@ struct messages { } } - static func parse_stickerSetInstallResultSuccess(_ reader: BufferReader) -> StickerSetInstallResult? { + public static func parse_stickerSetInstallResultSuccess(_ reader: BufferReader) -> StickerSetInstallResult? { return Api.messages.StickerSetInstallResult.stickerSetInstallResultSuccess } - static func parse_stickerSetInstallResultArchive(_ reader: BufferReader) -> StickerSetInstallResult? { + public static func parse_stickerSetInstallResultArchive(_ reader: BufferReader) -> StickerSetInstallResult? { var _1: [Api.StickerSetCovered]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StickerSetCovered.self) @@ -2139,10 +2139,10 @@ struct messages { } } - enum AffectedMessages: TypeConstructorDescription { + public enum AffectedMessages: TypeConstructorDescription { case affectedMessages(pts: Int32, ptsCount: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .affectedMessages(let pts, let ptsCount): if boxed { @@ -2154,14 +2154,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .affectedMessages(let pts, let ptsCount): return ("affectedMessages", [("pts", pts), ("ptsCount", ptsCount)]) } } - static func parse_affectedMessages(_ reader: BufferReader) -> AffectedMessages? { + public static func parse_affectedMessages(_ reader: BufferReader) -> AffectedMessages? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2177,11 +2177,11 @@ struct messages { } } - enum SavedGifs: TypeConstructorDescription { + public enum SavedGifs: TypeConstructorDescription { case savedGifsNotModified case savedGifs(hash: Int32, gifs: [Api.Document]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .savedGifsNotModified: if boxed { @@ -2203,7 +2203,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .savedGifsNotModified: return ("savedGifsNotModified", []) @@ -2212,10 +2212,10 @@ struct messages { } } - static func parse_savedGifsNotModified(_ reader: BufferReader) -> SavedGifs? { + public static func parse_savedGifsNotModified(_ reader: BufferReader) -> SavedGifs? { return Api.messages.SavedGifs.savedGifsNotModified } - static func parse_savedGifs(_ reader: BufferReader) -> SavedGifs? { + public static func parse_savedGifs(_ reader: BufferReader) -> SavedGifs? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.Document]? @@ -2233,13 +2233,13 @@ struct messages { } } - enum Messages: TypeConstructorDescription { + public enum Messages: TypeConstructorDescription { case messages(messages: [Api.Message], chats: [Api.Chat], users: [Api.User]) case messagesNotModified(count: Int32) case channelMessages(flags: Int32, pts: Int32, count: Int32, messages: [Api.Message], chats: [Api.Chat], users: [Api.User]) case messagesSlice(flags: Int32, count: Int32, nextRate: Int32?, messages: [Api.Message], chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messages(let messages, let chats, let users): if boxed { @@ -2316,7 +2316,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messages(let messages, let chats, let users): return ("messages", [("messages", messages), ("chats", chats), ("users", users)]) @@ -2329,7 +2329,7 @@ struct messages { } } - static func parse_messages(_ reader: BufferReader) -> Messages? { + public static func parse_messages(_ reader: BufferReader) -> Messages? { var _1: [Api.Message]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Message.self) @@ -2352,7 +2352,7 @@ struct messages { return nil } } - static func parse_messagesNotModified(_ reader: BufferReader) -> Messages? { + public static func parse_messagesNotModified(_ reader: BufferReader) -> Messages? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -2363,7 +2363,7 @@ struct messages { return nil } } - static func parse_channelMessages(_ reader: BufferReader) -> Messages? { + public static func parse_channelMessages(_ reader: BufferReader) -> Messages? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2395,7 +2395,7 @@ struct messages { return nil } } - static func parse_messagesSlice(_ reader: BufferReader) -> Messages? { + public static func parse_messagesSlice(_ reader: BufferReader) -> Messages? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2429,10 +2429,10 @@ struct messages { } } - enum PeerDialogs: TypeConstructorDescription { + public enum PeerDialogs: TypeConstructorDescription { case peerDialogs(dialogs: [Api.Dialog], messages: [Api.Message], chats: [Api.Chat], users: [Api.User], state: Api.updates.State) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .peerDialogs(let dialogs, let messages, let chats, let users, let state): if boxed { @@ -2463,14 +2463,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .peerDialogs(let dialogs, let messages, let chats, let users, let state): return ("peerDialogs", [("dialogs", dialogs), ("messages", messages), ("chats", chats), ("users", users), ("state", state)]) } } - static func parse_peerDialogs(_ reader: BufferReader) -> PeerDialogs? { + public static func parse_peerDialogs(_ reader: BufferReader) -> PeerDialogs? { var _1: [Api.Dialog]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Dialog.self) @@ -2505,11 +2505,11 @@ struct messages { } } - enum RecentStickers: TypeConstructorDescription { + public enum RecentStickers: TypeConstructorDescription { case recentStickersNotModified case recentStickers(hash: Int32, packs: [Api.StickerPack], stickers: [Api.Document], dates: [Int32]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .recentStickersNotModified: if boxed { @@ -2541,7 +2541,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .recentStickersNotModified: return ("recentStickersNotModified", []) @@ -2550,10 +2550,10 @@ struct messages { } } - static func parse_recentStickersNotModified(_ reader: BufferReader) -> RecentStickers? { + public static func parse_recentStickersNotModified(_ reader: BufferReader) -> RecentStickers? { return Api.messages.RecentStickers.recentStickersNotModified } - static func parse_recentStickers(_ reader: BufferReader) -> RecentStickers? { + public static func parse_recentStickers(_ reader: BufferReader) -> RecentStickers? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.StickerPack]? @@ -2581,11 +2581,11 @@ struct messages { } } - enum FeaturedStickers: TypeConstructorDescription { + public enum FeaturedStickers: TypeConstructorDescription { case featuredStickersNotModified case featuredStickers(hash: Int32, sets: [Api.StickerSetCovered], unread: [Int64]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .featuredStickersNotModified: if boxed { @@ -2612,7 +2612,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .featuredStickersNotModified: return ("featuredStickersNotModified", []) @@ -2621,10 +2621,10 @@ struct messages { } } - static func parse_featuredStickersNotModified(_ reader: BufferReader) -> FeaturedStickers? { + public static func parse_featuredStickersNotModified(_ reader: BufferReader) -> FeaturedStickers? { return Api.messages.FeaturedStickers.featuredStickersNotModified } - static func parse_featuredStickers(_ reader: BufferReader) -> FeaturedStickers? { + public static func parse_featuredStickers(_ reader: BufferReader) -> FeaturedStickers? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.StickerSetCovered]? @@ -2647,12 +2647,12 @@ struct messages { } } - enum Dialogs: TypeConstructorDescription { + public enum Dialogs: TypeConstructorDescription { case dialogs(dialogs: [Api.Dialog], messages: [Api.Message], chats: [Api.Chat], users: [Api.User]) case dialogsSlice(count: Int32, dialogs: [Api.Dialog], messages: [Api.Message], chats: [Api.Chat], users: [Api.User]) case dialogsNotModified(count: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .dialogs(let dialogs, let messages, let chats, let users): if boxed { @@ -2714,7 +2714,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .dialogs(let dialogs, let messages, let chats, let users): return ("dialogs", [("dialogs", dialogs), ("messages", messages), ("chats", chats), ("users", users)]) @@ -2725,7 +2725,7 @@ struct messages { } } - static func parse_dialogs(_ reader: BufferReader) -> Dialogs? { + public static func parse_dialogs(_ reader: BufferReader) -> Dialogs? { var _1: [Api.Dialog]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Dialog.self) @@ -2753,7 +2753,7 @@ struct messages { return nil } } - static func parse_dialogsSlice(_ reader: BufferReader) -> Dialogs? { + public static func parse_dialogsSlice(_ reader: BufferReader) -> Dialogs? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.Dialog]? @@ -2784,7 +2784,7 @@ struct messages { return nil } } - static func parse_dialogsNotModified(_ reader: BufferReader) -> Dialogs? { + public static func parse_dialogsNotModified(_ reader: BufferReader) -> Dialogs? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -2797,11 +2797,11 @@ struct messages { } } - enum FavedStickers: TypeConstructorDescription { + public enum FavedStickers: TypeConstructorDescription { case favedStickersNotModified case favedStickers(hash: Int32, packs: [Api.StickerPack], stickers: [Api.Document]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .favedStickersNotModified: if boxed { @@ -2828,7 +2828,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .favedStickersNotModified: return ("favedStickersNotModified", []) @@ -2837,10 +2837,10 @@ struct messages { } } - static func parse_favedStickersNotModified(_ reader: BufferReader) -> FavedStickers? { + public static func parse_favedStickersNotModified(_ reader: BufferReader) -> FavedStickers? { return Api.messages.FavedStickers.favedStickersNotModified } - static func parse_favedStickers(_ reader: BufferReader) -> FavedStickers? { + public static func parse_favedStickers(_ reader: BufferReader) -> FavedStickers? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.StickerPack]? @@ -2863,11 +2863,11 @@ struct messages { } } - enum AllStickers: TypeConstructorDescription { + public enum AllStickers: TypeConstructorDescription { case allStickersNotModified case allStickers(hash: Int32, sets: [Api.StickerSet]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .allStickersNotModified: if boxed { @@ -2889,7 +2889,7 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .allStickersNotModified: return ("allStickersNotModified", []) @@ -2898,10 +2898,10 @@ struct messages { } } - static func parse_allStickersNotModified(_ reader: BufferReader) -> AllStickers? { + public static func parse_allStickersNotModified(_ reader: BufferReader) -> AllStickers? { return Api.messages.AllStickers.allStickersNotModified } - static func parse_allStickers(_ reader: BufferReader) -> AllStickers? { + public static func parse_allStickers(_ reader: BufferReader) -> AllStickers? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.StickerSet]? @@ -2919,10 +2919,10 @@ struct messages { } } - enum HighScores: TypeConstructorDescription { + public enum HighScores: TypeConstructorDescription { case highScores(scores: [Api.HighScore], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .highScores(let scores, let users): if boxed { @@ -2942,14 +2942,14 @@ struct messages { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .highScores(let scores, let users): return ("highScores", [("scores", scores), ("users", users)]) } } - static func parse_highScores(_ reader: BufferReader) -> HighScores? { + public static func parse_highScores(_ reader: BufferReader) -> HighScores? { var _1: [Api.HighScore]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.HighScore.self) diff --git a/submodules/TelegramCore/TelegramCore/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift similarity index 88% rename from submodules/TelegramCore/TelegramCore/Api1.swift rename to submodules/TelegramApi/Sources/Api1.swift index 98bc5ae237..4e43658dfa 100644 --- a/submodules/TelegramCore/TelegramCore/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -1,9 +1,9 @@ -extension Api { - enum InputGeoPoint: TypeConstructorDescription { +public extension Api { + public enum InputGeoPoint: TypeConstructorDescription { case inputGeoPointEmpty case inputGeoPoint(lat: Double, long: Double) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputGeoPointEmpty: if boxed { @@ -21,7 +21,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputGeoPointEmpty: return ("inputGeoPointEmpty", []) @@ -30,10 +30,10 @@ extension Api { } } - static func parse_inputGeoPointEmpty(_ reader: BufferReader) -> InputGeoPoint? { + public static func parse_inputGeoPointEmpty(_ reader: BufferReader) -> InputGeoPoint? { return Api.InputGeoPoint.inputGeoPointEmpty } - static func parse_inputGeoPoint(_ reader: BufferReader) -> InputGeoPoint? { + public static func parse_inputGeoPoint(_ reader: BufferReader) -> InputGeoPoint? { var _1: Double? _1 = reader.readDouble() var _2: Double? @@ -49,11 +49,11 @@ extension Api { } } - enum ChatFull: TypeConstructorDescription { + public enum ChatFull: TypeConstructorDescription { case chatFull(flags: Int32, id: Int32, about: String, participants: Api.ChatParticipants, chatPhoto: Api.Photo?, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo]?, pinnedMsgId: Int32?, folderId: Int32?) - case channelFull(flags: Int32, id: Int32, about: String, participantsCount: Int32?, adminsCount: Int32?, kickedCount: Int32?, bannedCount: Int32?, onlineCount: Int32?, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, chatPhoto: Api.Photo, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo], migratedFromChatId: Int32?, migratedFromMaxId: Int32?, pinnedMsgId: Int32?, stickerset: Api.StickerSet?, availableMinId: Int32?, folderId: Int32?, linkedChatId: Int32?, pts: Int32) + case channelFull(flags: Int32, id: Int32, about: String, participantsCount: Int32?, adminsCount: Int32?, kickedCount: Int32?, bannedCount: Int32?, onlineCount: Int32?, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, chatPhoto: Api.Photo, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo], migratedFromChatId: Int32?, migratedFromMaxId: Int32?, pinnedMsgId: Int32?, stickerset: Api.StickerSet?, availableMinId: Int32?, folderId: Int32?, linkedChatId: Int32?, location: Api.ChannelLocation?, pts: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatFull(let flags, let id, let about, let participants, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let pinnedMsgId, let folderId): if boxed { @@ -74,9 +74,9 @@ extension Api { if Int(flags) & Int(1 << 6) != 0 {serializeInt32(pinnedMsgId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 11) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} break - case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let pts): + case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let pts): if boxed { - buffer.appendInt32(-1736252138) + buffer.appendInt32(277964371) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -103,22 +103,23 @@ extension Api { if Int(flags) & Int(1 << 8) != 0 {stickerset!.serialize(buffer, true)} if Int(flags) & Int(1 << 9) != 0 {serializeInt32(availableMinId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 11) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 13) != 0 {serializeInt32(linkedChatId!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 14) != 0 {serializeInt32(linkedChatId!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 15) != 0 {location!.serialize(buffer, true)} serializeInt32(pts, buffer: buffer, boxed: false) break } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatFull(let flags, let id, let about, let participants, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let pinnedMsgId, let folderId): return ("chatFull", [("flags", flags), ("id", id), ("about", about), ("participants", participants), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("pinnedMsgId", pinnedMsgId), ("folderId", folderId)]) - case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let pts): - return ("channelFull", [("flags", flags), ("id", id), ("about", about), ("participantsCount", participantsCount), ("adminsCount", adminsCount), ("kickedCount", kickedCount), ("bannedCount", bannedCount), ("onlineCount", onlineCount), ("readInboxMaxId", readInboxMaxId), ("readOutboxMaxId", readOutboxMaxId), ("unreadCount", unreadCount), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("migratedFromChatId", migratedFromChatId), ("migratedFromMaxId", migratedFromMaxId), ("pinnedMsgId", pinnedMsgId), ("stickerset", stickerset), ("availableMinId", availableMinId), ("folderId", folderId), ("linkedChatId", linkedChatId), ("pts", pts)]) + case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let pts): + return ("channelFull", [("flags", flags), ("id", id), ("about", about), ("participantsCount", participantsCount), ("adminsCount", adminsCount), ("kickedCount", kickedCount), ("bannedCount", bannedCount), ("onlineCount", onlineCount), ("readInboxMaxId", readInboxMaxId), ("readOutboxMaxId", readOutboxMaxId), ("unreadCount", unreadCount), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("migratedFromChatId", migratedFromChatId), ("migratedFromMaxId", migratedFromMaxId), ("pinnedMsgId", pinnedMsgId), ("stickerset", stickerset), ("availableMinId", availableMinId), ("folderId", folderId), ("linkedChatId", linkedChatId), ("location", location), ("pts", pts)]) } } - static func parse_chatFull(_ reader: BufferReader) -> ChatFull? { + public static func parse_chatFull(_ reader: BufferReader) -> ChatFull? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -166,7 +167,7 @@ extension Api { return nil } } - static func parse_channelFull(_ reader: BufferReader) -> ChatFull? { + public static func parse_channelFull(_ reader: BufferReader) -> ChatFull? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -220,9 +221,13 @@ extension Api { var _21: Int32? if Int(_1!) & Int(1 << 11) != 0 {_21 = reader.readInt32() } var _22: Int32? - if Int(_1!) & Int(1 << 13) != 0 {_22 = reader.readInt32() } - var _23: Int32? - _23 = reader.readInt32() + if Int(_1!) & Int(1 << 14) != 0 {_22 = reader.readInt32() } + var _23: Api.ChannelLocation? + if Int(_1!) & Int(1 << 15) != 0 {if let signature = reader.readInt32() { + _23 = Api.parse(reader, signature: signature) as? Api.ChannelLocation + } } + var _24: Int32? + _24 = reader.readInt32() let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil @@ -244,10 +249,11 @@ extension Api { let _c19 = (Int(_1!) & Int(1 << 8) == 0) || _19 != nil let _c20 = (Int(_1!) & Int(1 << 9) == 0) || _20 != nil let _c21 = (Int(_1!) & Int(1 << 11) == 0) || _21 != nil - let _c22 = (Int(_1!) & Int(1 << 13) == 0) || _22 != nil - let _c23 = _23 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 && _c19 && _c20 && _c21 && _c22 && _c23 { - return Api.ChatFull.channelFull(flags: _1!, id: _2!, about: _3!, participantsCount: _4, adminsCount: _5, kickedCount: _6, bannedCount: _7, onlineCount: _8, readInboxMaxId: _9!, readOutboxMaxId: _10!, unreadCount: _11!, chatPhoto: _12!, notifySettings: _13!, exportedInvite: _14!, botInfo: _15!, migratedFromChatId: _16, migratedFromMaxId: _17, pinnedMsgId: _18, stickerset: _19, availableMinId: _20, folderId: _21, linkedChatId: _22, pts: _23!) + let _c22 = (Int(_1!) & Int(1 << 14) == 0) || _22 != nil + let _c23 = (Int(_1!) & Int(1 << 15) == 0) || _23 != nil + let _c24 = _24 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 && _c19 && _c20 && _c21 && _c22 && _c23 && _c24 { + return Api.ChatFull.channelFull(flags: _1!, id: _2!, about: _3!, participantsCount: _4, adminsCount: _5, kickedCount: _6, bannedCount: _7, onlineCount: _8, readInboxMaxId: _9!, readOutboxMaxId: _10!, unreadCount: _11!, chatPhoto: _12!, notifySettings: _13!, exportedInvite: _14!, botInfo: _15!, migratedFromChatId: _16, migratedFromMaxId: _17, pinnedMsgId: _18, stickerset: _19, availableMinId: _20, folderId: _21, linkedChatId: _22, location: _23, pts: _24!) } else { return nil @@ -255,10 +261,10 @@ extension Api { } } - enum PollResults: TypeConstructorDescription { + public enum PollResults: TypeConstructorDescription { case pollResults(flags: Int32, results: [Api.PollAnswerVoters]?, totalVoters: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pollResults(let flags, let results, let totalVoters): if boxed { @@ -275,14 +281,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pollResults(let flags, let results, let totalVoters): return ("pollResults", [("flags", flags), ("results", results), ("totalVoters", totalVoters)]) } } - static func parse_pollResults(_ reader: BufferReader) -> PollResults? { + public static func parse_pollResults(_ reader: BufferReader) -> PollResults? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.PollAnswerVoters]? @@ -303,12 +309,12 @@ extension Api { } } - enum ChatParticipant: TypeConstructorDescription { + public enum ChatParticipant: TypeConstructorDescription { case chatParticipant(userId: Int32, inviterId: Int32, date: Int32) case chatParticipantCreator(userId: Int32) case chatParticipantAdmin(userId: Int32, inviterId: Int32, date: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatParticipant(let userId, let inviterId, let date): if boxed { @@ -335,7 +341,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatParticipant(let userId, let inviterId, let date): return ("chatParticipant", [("userId", userId), ("inviterId", inviterId), ("date", date)]) @@ -346,7 +352,7 @@ extension Api { } } - static func parse_chatParticipant(_ reader: BufferReader) -> ChatParticipant? { + public static func parse_chatParticipant(_ reader: BufferReader) -> ChatParticipant? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -363,7 +369,7 @@ extension Api { return nil } } - static func parse_chatParticipantCreator(_ reader: BufferReader) -> ChatParticipant? { + public static func parse_chatParticipantCreator(_ reader: BufferReader) -> ChatParticipant? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -374,7 +380,7 @@ extension Api { return nil } } - static func parse_chatParticipantAdmin(_ reader: BufferReader) -> ChatParticipant? { + public static func parse_chatParticipantAdmin(_ reader: BufferReader) -> ChatParticipant? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -393,10 +399,10 @@ extension Api { } } - enum CdnConfig: TypeConstructorDescription { + public enum CdnConfig: TypeConstructorDescription { case cdnConfig(publicKeys: [Api.CdnPublicKey]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .cdnConfig(let publicKeys): if boxed { @@ -411,14 +417,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .cdnConfig(let publicKeys): return ("cdnConfig", [("publicKeys", publicKeys)]) } } - static func parse_cdnConfig(_ reader: BufferReader) -> CdnConfig? { + public static func parse_cdnConfig(_ reader: BufferReader) -> CdnConfig? { var _1: [Api.CdnPublicKey]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.CdnPublicKey.self) @@ -433,7 +439,7 @@ extension Api { } } - indirect enum PageBlock: TypeConstructorDescription { + indirect public enum PageBlock: TypeConstructorDescription { case pageBlockUnsupported case pageBlockTitle(text: Api.RichText) case pageBlockSubtitle(text: Api.RichText) @@ -464,7 +470,7 @@ extension Api { case pageBlockRelatedArticles(title: Api.RichText, articles: [Api.PageRelatedArticle]) case pageBlockMap(geo: Api.GeoPoint, zoom: Int32, w: Int32, h: Int32, caption: Api.PageCaption) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pageBlockUnsupported: if boxed { @@ -709,7 +715,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pageBlockUnsupported: return ("pageBlockUnsupported", []) @@ -772,10 +778,10 @@ extension Api { } } - static func parse_pageBlockUnsupported(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockUnsupported(_ reader: BufferReader) -> PageBlock? { return Api.PageBlock.pageBlockUnsupported } - static func parse_pageBlockTitle(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockTitle(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -788,7 +794,7 @@ extension Api { return nil } } - static func parse_pageBlockSubtitle(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockSubtitle(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -801,7 +807,7 @@ extension Api { return nil } } - static func parse_pageBlockAuthorDate(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockAuthorDate(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -817,7 +823,7 @@ extension Api { return nil } } - static func parse_pageBlockHeader(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockHeader(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -830,7 +836,7 @@ extension Api { return nil } } - static func parse_pageBlockSubheader(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockSubheader(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -843,7 +849,7 @@ extension Api { return nil } } - static func parse_pageBlockParagraph(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockParagraph(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -856,7 +862,7 @@ extension Api { return nil } } - static func parse_pageBlockPreformatted(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockPreformatted(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -872,7 +878,7 @@ extension Api { return nil } } - static func parse_pageBlockFooter(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockFooter(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -885,10 +891,10 @@ extension Api { return nil } } - static func parse_pageBlockDivider(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockDivider(_ reader: BufferReader) -> PageBlock? { return Api.PageBlock.pageBlockDivider } - static func parse_pageBlockAnchor(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockAnchor(_ reader: BufferReader) -> PageBlock? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -899,7 +905,7 @@ extension Api { return nil } } - static func parse_pageBlockBlockquote(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockBlockquote(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -917,7 +923,7 @@ extension Api { return nil } } - static func parse_pageBlockPullquote(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockPullquote(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -935,7 +941,7 @@ extension Api { return nil } } - static func parse_pageBlockCover(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockCover(_ reader: BufferReader) -> PageBlock? { var _1: Api.PageBlock? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.PageBlock @@ -948,7 +954,7 @@ extension Api { return nil } } - static func parse_pageBlockChannel(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockChannel(_ reader: BufferReader) -> PageBlock? { var _1: Api.Chat? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Chat @@ -961,7 +967,7 @@ extension Api { return nil } } - static func parse_pageBlockKicker(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockKicker(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -974,7 +980,7 @@ extension Api { return nil } } - static func parse_pageBlockTable(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockTable(_ reader: BufferReader) -> PageBlock? { var _1: Int32? _1 = reader.readInt32() var _2: Api.RichText? @@ -995,7 +1001,7 @@ extension Api { return nil } } - static func parse_pageBlockPhoto(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockPhoto(_ reader: BufferReader) -> PageBlock? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -1020,7 +1026,7 @@ extension Api { return nil } } - static func parse_pageBlockVideo(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockVideo(_ reader: BufferReader) -> PageBlock? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -1039,7 +1045,7 @@ extension Api { return nil } } - static func parse_pageBlockAudio(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockAudio(_ reader: BufferReader) -> PageBlock? { var _1: Int64? _1 = reader.readInt64() var _2: Api.PageCaption? @@ -1055,7 +1061,7 @@ extension Api { return nil } } - static func parse_pageBlockEmbed(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockEmbed(_ reader: BufferReader) -> PageBlock? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -1086,7 +1092,7 @@ extension Api { return nil } } - static func parse_pageBlockEmbedPost(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockEmbedPost(_ reader: BufferReader) -> PageBlock? { var _1: String? _1 = parseString(reader) var _2: Int64? @@ -1119,7 +1125,7 @@ extension Api { return nil } } - static func parse_pageBlockCollage(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockCollage(_ reader: BufferReader) -> PageBlock? { var _1: [Api.PageBlock]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageBlock.self) @@ -1137,7 +1143,7 @@ extension Api { return nil } } - static func parse_pageBlockSlideshow(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockSlideshow(_ reader: BufferReader) -> PageBlock? { var _1: [Api.PageBlock]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageBlock.self) @@ -1155,7 +1161,7 @@ extension Api { return nil } } - static func parse_pageBlockList(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockList(_ reader: BufferReader) -> PageBlock? { var _1: [Api.PageListItem]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageListItem.self) @@ -1168,7 +1174,7 @@ extension Api { return nil } } - static func parse_pageBlockOrderedList(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockOrderedList(_ reader: BufferReader) -> PageBlock? { var _1: [Api.PageListOrderedItem]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageListOrderedItem.self) @@ -1181,7 +1187,7 @@ extension Api { return nil } } - static func parse_pageBlockDetails(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockDetails(_ reader: BufferReader) -> PageBlock? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.PageBlock]? @@ -1202,7 +1208,7 @@ extension Api { return nil } } - static func parse_pageBlockRelatedArticles(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockRelatedArticles(_ reader: BufferReader) -> PageBlock? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -1220,7 +1226,7 @@ extension Api { return nil } } - static func parse_pageBlockMap(_ reader: BufferReader) -> PageBlock? { + public static func parse_pageBlockMap(_ reader: BufferReader) -> PageBlock? { var _1: Api.GeoPoint? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.GeoPoint @@ -1249,11 +1255,11 @@ extension Api { } } - enum SecureRequiredType: TypeConstructorDescription { + public enum SecureRequiredType: TypeConstructorDescription { case secureRequiredType(flags: Int32, type: Api.SecureValueType) case secureRequiredTypeOneOf(types: [Api.SecureRequiredType]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureRequiredType(let flags, let type): if boxed { @@ -1275,7 +1281,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureRequiredType(let flags, let type): return ("secureRequiredType", [("flags", flags), ("type", type)]) @@ -1284,7 +1290,7 @@ extension Api { } } - static func parse_secureRequiredType(_ reader: BufferReader) -> SecureRequiredType? { + public static func parse_secureRequiredType(_ reader: BufferReader) -> SecureRequiredType? { var _1: Int32? _1 = reader.readInt32() var _2: Api.SecureValueType? @@ -1300,7 +1306,7 @@ extension Api { return nil } } - static func parse_secureRequiredTypeOneOf(_ reader: BufferReader) -> SecureRequiredType? { + public static func parse_secureRequiredTypeOneOf(_ reader: BufferReader) -> SecureRequiredType? { var _1: [Api.SecureRequiredType]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.SecureRequiredType.self) @@ -1315,7 +1321,7 @@ extension Api { } } - enum JSONValue: TypeConstructorDescription { + public enum JSONValue: TypeConstructorDescription { case jsonNull case jsonBool(value: Api.Bool) case jsonNumber(value: Double) @@ -1323,7 +1329,7 @@ extension Api { case jsonArray(value: [Api.JSONValue]) case jsonObject(value: [Api.JSONObjectValue]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .jsonNull: if boxed { @@ -1372,7 +1378,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .jsonNull: return ("jsonNull", []) @@ -1389,10 +1395,10 @@ extension Api { } } - static func parse_jsonNull(_ reader: BufferReader) -> JSONValue? { + public static func parse_jsonNull(_ reader: BufferReader) -> JSONValue? { return Api.JSONValue.jsonNull } - static func parse_jsonBool(_ reader: BufferReader) -> JSONValue? { + public static func parse_jsonBool(_ reader: BufferReader) -> JSONValue? { var _1: Api.Bool? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Bool @@ -1405,7 +1411,7 @@ extension Api { return nil } } - static func parse_jsonNumber(_ reader: BufferReader) -> JSONValue? { + public static func parse_jsonNumber(_ reader: BufferReader) -> JSONValue? { var _1: Double? _1 = reader.readDouble() let _c1 = _1 != nil @@ -1416,7 +1422,7 @@ extension Api { return nil } } - static func parse_jsonString(_ reader: BufferReader) -> JSONValue? { + public static func parse_jsonString(_ reader: BufferReader) -> JSONValue? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -1427,7 +1433,7 @@ extension Api { return nil } } - static func parse_jsonArray(_ reader: BufferReader) -> JSONValue? { + public static func parse_jsonArray(_ reader: BufferReader) -> JSONValue? { var _1: [Api.JSONValue]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.JSONValue.self) @@ -1440,7 +1446,7 @@ extension Api { return nil } } - static func parse_jsonObject(_ reader: BufferReader) -> JSONValue? { + public static func parse_jsonObject(_ reader: BufferReader) -> JSONValue? { var _1: [Api.JSONObjectValue]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.JSONObjectValue.self) @@ -1455,11 +1461,11 @@ extension Api { } } - enum Photo: TypeConstructorDescription { + 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 { @@ -1486,7 +1492,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .photoEmpty(let id): return ("photoEmpty", [("id", id)]) @@ -1495,7 +1501,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 @@ -1506,7 +1512,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? @@ -1539,14 +1545,14 @@ extension Api { } } - enum Chat: TypeConstructorDescription { + public enum Chat: TypeConstructorDescription { case chatEmpty(id: Int32) 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?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatEmpty(let id): if boxed { @@ -1607,7 +1613,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatEmpty(let id): return ("chatEmpty", [("id", id)]) @@ -1622,7 +1628,7 @@ extension Api { } } - static func parse_chatEmpty(_ reader: BufferReader) -> Chat? { + public static func parse_chatEmpty(_ reader: BufferReader) -> Chat? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -1633,7 +1639,7 @@ extension Api { return nil } } - static func parse_chatForbidden(_ reader: BufferReader) -> Chat? { + public static func parse_chatForbidden(_ reader: BufferReader) -> Chat? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -1647,7 +1653,7 @@ extension Api { return nil } } - static func parse_channelForbidden(_ reader: BufferReader) -> Chat? { + public static func parse_channelForbidden(_ reader: BufferReader) -> Chat? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -1670,7 +1676,7 @@ extension Api { return nil } } - static func parse_chat(_ reader: BufferReader) -> Chat? { + public static func parse_chat(_ reader: BufferReader) -> Chat? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -1716,7 +1722,7 @@ extension Api { return nil } } - static func parse_channel(_ reader: BufferReader) -> Chat? { + public static func parse_channel(_ reader: BufferReader) -> Chat? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -1773,10 +1779,10 @@ extension Api { } } - enum StatsURL: TypeConstructorDescription { + public enum StatsURL: TypeConstructorDescription { case statsURL(url: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .statsURL(let url): if boxed { @@ -1787,14 +1793,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .statsURL(let url): return ("statsURL", [("url", url)]) } } - static func parse_statsURL(_ reader: BufferReader) -> StatsURL? { + public static func parse_statsURL(_ reader: BufferReader) -> StatsURL? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -1807,11 +1813,11 @@ extension Api { } } - enum ChatInvite: TypeConstructorDescription { + public enum ChatInvite: TypeConstructorDescription { case chatInviteAlready(chat: Api.Chat) case chatInvite(flags: Int32, title: String, photo: Api.Photo, participantsCount: Int32, participants: [Api.User]?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatInviteAlready(let chat): if boxed { @@ -1836,7 +1842,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatInviteAlready(let chat): return ("chatInviteAlready", [("chat", chat)]) @@ -1845,7 +1851,7 @@ extension Api { } } - static func parse_chatInviteAlready(_ reader: BufferReader) -> ChatInvite? { + public static func parse_chatInviteAlready(_ reader: BufferReader) -> ChatInvite? { var _1: Api.Chat? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Chat @@ -1858,7 +1864,7 @@ extension Api { return nil } } - static func parse_chatInvite(_ reader: BufferReader) -> ChatInvite? { + public static func parse_chatInvite(_ reader: BufferReader) -> ChatInvite? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -1887,10 +1893,10 @@ extension Api { } } - enum AutoDownloadSettings: TypeConstructorDescription { + public enum AutoDownloadSettings: TypeConstructorDescription { case autoDownloadSettings(flags: Int32, photoSizeMax: Int32, videoSizeMax: Int32, fileSizeMax: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .autoDownloadSettings(let flags, let photoSizeMax, let videoSizeMax, let fileSizeMax): if boxed { @@ -1904,14 +1910,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .autoDownloadSettings(let flags, let photoSizeMax, let videoSizeMax, let fileSizeMax): return ("autoDownloadSettings", [("flags", flags), ("photoSizeMax", photoSizeMax), ("videoSizeMax", videoSizeMax), ("fileSizeMax", fileSizeMax)]) } } - static func parse_autoDownloadSettings(_ reader: BufferReader) -> AutoDownloadSettings? { + public static func parse_autoDownloadSettings(_ reader: BufferReader) -> AutoDownloadSettings? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -1933,11 +1939,11 @@ extension Api { } } - enum StickerSetCovered: TypeConstructorDescription { + public enum StickerSetCovered: TypeConstructorDescription { case stickerSetCovered(set: Api.StickerSet, cover: Api.Document) case stickerSetMultiCovered(set: Api.StickerSet, covers: [Api.Document]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .stickerSetCovered(let set, let cover): if boxed { @@ -1960,7 +1966,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .stickerSetCovered(let set, let cover): return ("stickerSetCovered", [("set", set), ("cover", cover)]) @@ -1969,7 +1975,7 @@ extension Api { } } - static func parse_stickerSetCovered(_ reader: BufferReader) -> StickerSetCovered? { + public static func parse_stickerSetCovered(_ reader: BufferReader) -> StickerSetCovered? { var _1: Api.StickerSet? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.StickerSet @@ -1987,7 +1993,7 @@ extension Api { return nil } } - static func parse_stickerSetMultiCovered(_ reader: BufferReader) -> StickerSetCovered? { + public static func parse_stickerSetMultiCovered(_ reader: BufferReader) -> StickerSetCovered? { var _1: Api.StickerSet? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.StickerSet @@ -2007,14 +2013,14 @@ extension Api { } } - enum RecentMeUrl: TypeConstructorDescription { + public enum RecentMeUrl: TypeConstructorDescription { case recentMeUrlUnknown(url: String) case recentMeUrlUser(url: String, userId: Int32) case recentMeUrlChat(url: String, chatId: Int32) case recentMeUrlChatInvite(url: String, chatInvite: Api.ChatInvite) case recentMeUrlStickerSet(url: String, set: Api.StickerSetCovered) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .recentMeUrlUnknown(let url): if boxed { @@ -2053,7 +2059,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .recentMeUrlUnknown(let url): return ("recentMeUrlUnknown", [("url", url)]) @@ -2068,7 +2074,7 @@ extension Api { } } - static func parse_recentMeUrlUnknown(_ reader: BufferReader) -> RecentMeUrl? { + public static func parse_recentMeUrlUnknown(_ reader: BufferReader) -> RecentMeUrl? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -2079,7 +2085,7 @@ extension Api { return nil } } - static func parse_recentMeUrlUser(_ reader: BufferReader) -> RecentMeUrl? { + public static func parse_recentMeUrlUser(_ reader: BufferReader) -> RecentMeUrl? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -2093,7 +2099,7 @@ extension Api { return nil } } - static func parse_recentMeUrlChat(_ reader: BufferReader) -> RecentMeUrl? { + public static func parse_recentMeUrlChat(_ reader: BufferReader) -> RecentMeUrl? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -2107,7 +2113,7 @@ extension Api { return nil } } - static func parse_recentMeUrlChatInvite(_ reader: BufferReader) -> RecentMeUrl? { + public static func parse_recentMeUrlChatInvite(_ reader: BufferReader) -> RecentMeUrl? { var _1: String? _1 = parseString(reader) var _2: Api.ChatInvite? @@ -2123,7 +2129,7 @@ extension Api { return nil } } - static func parse_recentMeUrlStickerSet(_ reader: BufferReader) -> RecentMeUrl? { + public static func parse_recentMeUrlStickerSet(_ reader: BufferReader) -> RecentMeUrl? { var _1: String? _1 = parseString(reader) var _2: Api.StickerSetCovered? @@ -2141,7 +2147,7 @@ extension Api { } } - indirect enum RichText: TypeConstructorDescription { + indirect public enum RichText: TypeConstructorDescription { case textEmpty case textPlain(text: String) case textBold(text: Api.RichText) @@ -2159,7 +2165,7 @@ extension Api { case textImage(documentId: Int64, w: Int32, h: Int32) case textAnchor(text: Api.RichText, name: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .textEmpty: if boxed { @@ -2271,7 +2277,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .textEmpty: return ("textEmpty", []) @@ -2308,10 +2314,10 @@ extension Api { } } - static func parse_textEmpty(_ reader: BufferReader) -> RichText? { + public static func parse_textEmpty(_ reader: BufferReader) -> RichText? { return Api.RichText.textEmpty } - static func parse_textPlain(_ reader: BufferReader) -> RichText? { + public static func parse_textPlain(_ reader: BufferReader) -> RichText? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -2322,7 +2328,7 @@ extension Api { return nil } } - static func parse_textBold(_ reader: BufferReader) -> RichText? { + public static func parse_textBold(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2335,7 +2341,7 @@ extension Api { return nil } } - static func parse_textItalic(_ reader: BufferReader) -> RichText? { + public static func parse_textItalic(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2348,7 +2354,7 @@ extension Api { return nil } } - static func parse_textUnderline(_ reader: BufferReader) -> RichText? { + public static func parse_textUnderline(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2361,7 +2367,7 @@ extension Api { return nil } } - static func parse_textStrike(_ reader: BufferReader) -> RichText? { + public static func parse_textStrike(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2374,7 +2380,7 @@ extension Api { return nil } } - static func parse_textFixed(_ reader: BufferReader) -> RichText? { + public static func parse_textFixed(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2387,7 +2393,7 @@ extension Api { return nil } } - static func parse_textUrl(_ reader: BufferReader) -> RichText? { + public static func parse_textUrl(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2406,7 +2412,7 @@ extension Api { return nil } } - static func parse_textEmail(_ reader: BufferReader) -> RichText? { + public static func parse_textEmail(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2422,7 +2428,7 @@ extension Api { return nil } } - static func parse_textConcat(_ reader: BufferReader) -> RichText? { + public static func parse_textConcat(_ reader: BufferReader) -> RichText? { var _1: [Api.RichText]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RichText.self) @@ -2435,7 +2441,7 @@ extension Api { return nil } } - static func parse_textSubscript(_ reader: BufferReader) -> RichText? { + public static func parse_textSubscript(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2448,7 +2454,7 @@ extension Api { return nil } } - static func parse_textSuperscript(_ reader: BufferReader) -> RichText? { + public static func parse_textSuperscript(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2461,7 +2467,7 @@ extension Api { return nil } } - static func parse_textMarked(_ reader: BufferReader) -> RichText? { + public static func parse_textMarked(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2474,7 +2480,7 @@ extension Api { return nil } } - static func parse_textPhone(_ reader: BufferReader) -> RichText? { + public static func parse_textPhone(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2490,7 +2496,7 @@ extension Api { return nil } } - static func parse_textImage(_ reader: BufferReader) -> RichText? { + public static func parse_textImage(_ reader: BufferReader) -> RichText? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -2507,7 +2513,7 @@ extension Api { return nil } } - static func parse_textAnchor(_ reader: BufferReader) -> RichText? { + public static func parse_textAnchor(_ reader: BufferReader) -> RichText? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -2525,10 +2531,10 @@ extension Api { } } - enum UserFull: TypeConstructorDescription { + public enum UserFull: TypeConstructorDescription { case userFull(flags: Int32, user: Api.User, about: String?, settings: Api.PeerSettings, profilePhoto: Api.Photo?, notifySettings: Api.PeerNotifySettings, botInfo: Api.BotInfo?, pinnedMsgId: Int32?, commonChatsCount: Int32, folderId: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .userFull(let flags, let user, let about, let settings, let profilePhoto, let notifySettings, let botInfo, let pinnedMsgId, let commonChatsCount, let folderId): if boxed { @@ -2548,14 +2554,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .userFull(let flags, let user, let about, let settings, let profilePhoto, let notifySettings, let botInfo, let pinnedMsgId, let commonChatsCount, let folderId): return ("userFull", [("flags", flags), ("user", user), ("about", about), ("settings", settings), ("profilePhoto", profilePhoto), ("notifySettings", notifySettings), ("botInfo", botInfo), ("pinnedMsgId", pinnedMsgId), ("commonChatsCount", commonChatsCount), ("folderId", folderId)]) } } - static func parse_userFull(_ reader: BufferReader) -> UserFull? { + public static func parse_userFull(_ reader: BufferReader) -> UserFull? { var _1: Int32? _1 = reader.readInt32() var _2: Api.User? @@ -2605,11 +2611,11 @@ extension Api { } } - enum InputChannel: TypeConstructorDescription { + public enum InputChannel: TypeConstructorDescription { case inputChannelEmpty case inputChannel(channelId: Int32, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputChannelEmpty: if boxed { @@ -2627,7 +2633,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputChannelEmpty: return ("inputChannelEmpty", []) @@ -2636,10 +2642,10 @@ extension Api { } } - static func parse_inputChannelEmpty(_ reader: BufferReader) -> InputChannel? { + public static func parse_inputChannelEmpty(_ reader: BufferReader) -> InputChannel? { return Api.InputChannel.inputChannelEmpty } - static func parse_inputChannel(_ reader: BufferReader) -> InputChannel? { + public static func parse_inputChannel(_ reader: BufferReader) -> InputChannel? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -2655,10 +2661,10 @@ extension Api { } } - enum DcOption: TypeConstructorDescription { + public enum DcOption: TypeConstructorDescription { case dcOption(flags: Int32, id: Int32, ipAddress: String, port: Int32, secret: Buffer?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .dcOption(let flags, let id, let ipAddress, let port, let secret): if boxed { @@ -2673,14 +2679,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .dcOption(let flags, let id, let ipAddress, let port, let secret): return ("dcOption", [("flags", flags), ("id", id), ("ipAddress", ipAddress), ("port", port), ("secret", secret)]) } } - static func parse_dcOption(_ reader: BufferReader) -> DcOption? { + public static func parse_dcOption(_ reader: BufferReader) -> DcOption? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2705,10 +2711,10 @@ extension Api { } } - enum PollAnswerVoters: TypeConstructorDescription { + public enum PollAnswerVoters: TypeConstructorDescription { case pollAnswerVoters(flags: Int32, option: Buffer, voters: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pollAnswerVoters(let flags, let option, let voters): if boxed { @@ -2721,14 +2727,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pollAnswerVoters(let flags, let option, let voters): return ("pollAnswerVoters", [("flags", flags), ("option", option), ("voters", voters)]) } } - static func parse_pollAnswerVoters(_ reader: BufferReader) -> PollAnswerVoters? { + public static func parse_pollAnswerVoters(_ reader: BufferReader) -> PollAnswerVoters? { var _1: Int32? _1 = reader.readInt32() var _2: Buffer? @@ -2747,10 +2753,10 @@ extension Api { } } - enum LangPackLanguage: TypeConstructorDescription { + public enum LangPackLanguage: TypeConstructorDescription { case langPackLanguage(flags: Int32, name: String, nativeName: String, langCode: String, baseLangCode: String?, pluralCode: String, stringsCount: Int32, translatedCount: Int32, translationsUrl: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .langPackLanguage(let flags, let name, let nativeName, let langCode, let baseLangCode, let pluralCode, let stringsCount, let translatedCount, let translationsUrl): if boxed { @@ -2769,14 +2775,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .langPackLanguage(let flags, let name, let nativeName, let langCode, let baseLangCode, let pluralCode, let stringsCount, let translatedCount, let translationsUrl): return ("langPackLanguage", [("flags", flags), ("name", name), ("nativeName", nativeName), ("langCode", langCode), ("baseLangCode", baseLangCode), ("pluralCode", pluralCode), ("stringsCount", stringsCount), ("translatedCount", translatedCount), ("translationsUrl", translationsUrl)]) } } - static func parse_langPackLanguage(_ reader: BufferReader) -> LangPackLanguage? { + public static func parse_langPackLanguage(_ reader: BufferReader) -> LangPackLanguage? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -2813,10 +2819,10 @@ extension Api { } } - enum LangPackDifference: TypeConstructorDescription { + public enum LangPackDifference: TypeConstructorDescription { case langPackDifference(langCode: String, fromVersion: Int32, version: Int32, strings: [Api.LangPackString]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .langPackDifference(let langCode, let fromVersion, let version, let strings): if boxed { @@ -2834,14 +2840,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .langPackDifference(let langCode, let fromVersion, let version, let strings): return ("langPackDifference", [("langCode", langCode), ("fromVersion", fromVersion), ("version", version), ("strings", strings)]) } } - static func parse_langPackDifference(_ reader: BufferReader) -> LangPackDifference? { + public static func parse_langPackDifference(_ reader: BufferReader) -> LangPackDifference? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -2865,10 +2871,10 @@ extension Api { } } - enum WallPaperSettings: TypeConstructorDescription { + public enum WallPaperSettings: TypeConstructorDescription { case wallPaperSettings(flags: Int32, backgroundColor: Int32?, intensity: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .wallPaperSettings(let flags, let backgroundColor, let intensity): if boxed { @@ -2881,14 +2887,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .wallPaperSettings(let flags, let backgroundColor, let intensity): return ("wallPaperSettings", [("flags", flags), ("backgroundColor", backgroundColor), ("intensity", intensity)]) } } - static func parse_wallPaperSettings(_ reader: BufferReader) -> WallPaperSettings? { + public static func parse_wallPaperSettings(_ reader: BufferReader) -> WallPaperSettings? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2907,10 +2913,10 @@ extension Api { } } - enum EmojiURL: TypeConstructorDescription { + public enum EmojiURL: TypeConstructorDescription { case EmojiURL(url: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .EmojiURL(let url): if boxed { @@ -2921,14 +2927,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .EmojiURL(let url): return ("EmojiURL", [("url", url)]) } } - static func parse_EmojiURL(_ reader: BufferReader) -> EmojiURL? { + public static func parse_EmojiURL(_ reader: BufferReader) -> EmojiURL? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -2941,11 +2947,11 @@ extension Api { } } - enum InputCheckPasswordSRP: TypeConstructorDescription { + public enum InputCheckPasswordSRP: TypeConstructorDescription { case inputCheckPasswordEmpty case inputCheckPasswordSRP(srpId: Int64, A: Buffer, M1: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputCheckPasswordEmpty: if boxed { @@ -2964,7 +2970,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputCheckPasswordEmpty: return ("inputCheckPasswordEmpty", []) @@ -2973,10 +2979,10 @@ extension Api { } } - static func parse_inputCheckPasswordEmpty(_ reader: BufferReader) -> InputCheckPasswordSRP? { + public static func parse_inputCheckPasswordEmpty(_ reader: BufferReader) -> InputCheckPasswordSRP? { return Api.InputCheckPasswordSRP.inputCheckPasswordEmpty } - static func parse_inputCheckPasswordSRP(_ reader: BufferReader) -> InputCheckPasswordSRP? { + public static func parse_inputCheckPasswordSRP(_ reader: BufferReader) -> InputCheckPasswordSRP? { var _1: Int64? _1 = reader.readInt64() var _2: Buffer? @@ -2995,13 +3001,13 @@ extension Api { } } - enum InputEncryptedFile: TypeConstructorDescription { + public enum InputEncryptedFile: TypeConstructorDescription { case inputEncryptedFileEmpty case inputEncryptedFileUploaded(id: Int64, parts: Int32, md5Checksum: String, keyFingerprint: Int32) case inputEncryptedFile(id: Int64, accessHash: Int64) case inputEncryptedFileBigUploaded(id: Int64, parts: Int32, keyFingerprint: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputEncryptedFileEmpty: if boxed { @@ -3036,7 +3042,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputEncryptedFileEmpty: return ("inputEncryptedFileEmpty", []) @@ -3049,10 +3055,10 @@ extension Api { } } - static func parse_inputEncryptedFileEmpty(_ reader: BufferReader) -> InputEncryptedFile? { + public static func parse_inputEncryptedFileEmpty(_ reader: BufferReader) -> InputEncryptedFile? { return Api.InputEncryptedFile.inputEncryptedFileEmpty } - static func parse_inputEncryptedFileUploaded(_ reader: BufferReader) -> InputEncryptedFile? { + public static func parse_inputEncryptedFileUploaded(_ reader: BufferReader) -> InputEncryptedFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -3072,7 +3078,7 @@ extension Api { return nil } } - static func parse_inputEncryptedFile(_ reader: BufferReader) -> InputEncryptedFile? { + public static func parse_inputEncryptedFile(_ reader: BufferReader) -> InputEncryptedFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -3086,7 +3092,7 @@ extension Api { return nil } } - static func parse_inputEncryptedFileBigUploaded(_ reader: BufferReader) -> InputEncryptedFile? { + public static func parse_inputEncryptedFileBigUploaded(_ reader: BufferReader) -> InputEncryptedFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -3105,10 +3111,10 @@ extension Api { } } - enum ExportedMessageLink: TypeConstructorDescription { + public enum ExportedMessageLink: TypeConstructorDescription { case exportedMessageLink(link: String, html: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .exportedMessageLink(let link, let html): if boxed { @@ -3120,14 +3126,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .exportedMessageLink(let link, let html): return ("exportedMessageLink", [("link", link), ("html", html)]) } } - static func parse_exportedMessageLink(_ reader: BufferReader) -> ExportedMessageLink? { + public static func parse_exportedMessageLink(_ reader: BufferReader) -> ExportedMessageLink? { var _1: String? _1 = parseString(reader) var _2: String? @@ -3143,11 +3149,11 @@ extension Api { } } - enum InputFile: TypeConstructorDescription { + public enum InputFile: TypeConstructorDescription { case inputFile(id: Int64, parts: Int32, name: String, md5Checksum: String) case inputFileBig(id: Int64, parts: Int32, name: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputFile(let id, let parts, let name, let md5Checksum): if boxed { @@ -3169,7 +3175,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputFile(let id, let parts, let name, let md5Checksum): return ("inputFile", [("id", id), ("parts", parts), ("name", name), ("md5Checksum", md5Checksum)]) @@ -3178,7 +3184,7 @@ extension Api { } } - static func parse_inputFile(_ reader: BufferReader) -> InputFile? { + public static func parse_inputFile(_ reader: BufferReader) -> InputFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -3198,7 +3204,7 @@ extension Api { return nil } } - static func parse_inputFileBig(_ reader: BufferReader) -> InputFile? { + public static func parse_inputFileBig(_ reader: BufferReader) -> InputFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -3217,12 +3223,12 @@ extension Api { } } - enum Peer: TypeConstructorDescription { + public enum Peer: TypeConstructorDescription { case peerUser(userId: Int32) case peerChat(chatId: Int32) case peerChannel(channelId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .peerUser(let userId): if boxed { @@ -3245,7 +3251,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .peerUser(let userId): return ("peerUser", [("userId", userId)]) @@ -3256,7 +3262,7 @@ extension Api { } } - static func parse_peerUser(_ reader: BufferReader) -> Peer? { + public static func parse_peerUser(_ reader: BufferReader) -> Peer? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3267,7 +3273,7 @@ extension Api { return nil } } - static func parse_peerChat(_ reader: BufferReader) -> Peer? { + public static func parse_peerChat(_ reader: BufferReader) -> Peer? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3278,7 +3284,7 @@ extension Api { return nil } } - static func parse_peerChannel(_ reader: BufferReader) -> Peer? { + public static func parse_peerChannel(_ reader: BufferReader) -> Peer? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3291,10 +3297,10 @@ extension Api { } } - enum PaymentRequestedInfo: TypeConstructorDescription { + public enum PaymentRequestedInfo: TypeConstructorDescription { case paymentRequestedInfo(flags: Int32, name: String?, phone: String?, email: String?, shippingAddress: Api.PostAddress?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .paymentRequestedInfo(let flags, let name, let phone, let email, let shippingAddress): if boxed { @@ -3309,14 +3315,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .paymentRequestedInfo(let flags, let name, let phone, let email, let shippingAddress): return ("paymentRequestedInfo", [("flags", flags), ("name", name), ("phone", phone), ("email", email), ("shippingAddress", shippingAddress)]) } } - static func parse_paymentRequestedInfo(_ reader: BufferReader) -> PaymentRequestedInfo? { + public static func parse_paymentRequestedInfo(_ reader: BufferReader) -> PaymentRequestedInfo? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -3343,7 +3349,7 @@ extension Api { } } - enum UserStatus: TypeConstructorDescription { + public enum UserStatus: TypeConstructorDescription { case userStatusEmpty case userStatusOnline(expires: Int32) case userStatusOffline(wasOnline: Int32) @@ -3351,7 +3357,7 @@ extension Api { case userStatusLastWeek case userStatusLastMonth - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .userStatusEmpty: if boxed { @@ -3392,7 +3398,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .userStatusEmpty: return ("userStatusEmpty", []) @@ -3409,10 +3415,10 @@ extension Api { } } - static func parse_userStatusEmpty(_ reader: BufferReader) -> UserStatus? { + public static func parse_userStatusEmpty(_ reader: BufferReader) -> UserStatus? { return Api.UserStatus.userStatusEmpty } - static func parse_userStatusOnline(_ reader: BufferReader) -> UserStatus? { + public static func parse_userStatusOnline(_ reader: BufferReader) -> UserStatus? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3423,7 +3429,7 @@ extension Api { return nil } } - static func parse_userStatusOffline(_ reader: BufferReader) -> UserStatus? { + public static func parse_userStatusOffline(_ reader: BufferReader) -> UserStatus? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3434,21 +3440,21 @@ extension Api { return nil } } - static func parse_userStatusRecently(_ reader: BufferReader) -> UserStatus? { + public static func parse_userStatusRecently(_ reader: BufferReader) -> UserStatus? { return Api.UserStatus.userStatusRecently } - static func parse_userStatusLastWeek(_ reader: BufferReader) -> UserStatus? { + public static func parse_userStatusLastWeek(_ reader: BufferReader) -> UserStatus? { return Api.UserStatus.userStatusLastWeek } - static func parse_userStatusLastMonth(_ reader: BufferReader) -> UserStatus? { + public static func parse_userStatusLastMonth(_ reader: BufferReader) -> UserStatus? { return Api.UserStatus.userStatusLastMonth } } - enum Folder: TypeConstructorDescription { + public enum Folder: TypeConstructorDescription { case folder(flags: Int32, id: Int32, title: String, photo: Api.ChatPhoto?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .folder(let flags, let id, let title, let photo): if boxed { @@ -3462,14 +3468,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .folder(let flags, let id, let title, let photo): return ("folder", [("flags", flags), ("id", id), ("title", title), ("photo", photo)]) } } - static func parse_folder(_ reader: BufferReader) -> Folder? { + public static func parse_folder(_ reader: BufferReader) -> Folder? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -3493,11 +3499,11 @@ extension Api { } } - enum Dialog: TypeConstructorDescription { + public enum Dialog: TypeConstructorDescription { case dialog(flags: Int32, peer: Api.Peer, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, unreadMentionsCount: Int32, notifySettings: Api.PeerNotifySettings, pts: Int32?, draft: Api.DraftMessage?, folderId: Int32?) case dialogFolder(flags: Int32, folder: Api.Folder, peer: Api.Peer, topMessage: Int32, unreadMutedPeersCount: Int32, unreadUnmutedPeersCount: Int32, unreadMutedMessagesCount: Int32, unreadUnmutedMessagesCount: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .dialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let notifySettings, let pts, let draft, let folderId): if boxed { @@ -3531,7 +3537,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .dialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let notifySettings, let pts, let draft, let folderId): return ("dialog", [("flags", flags), ("peer", peer), ("topMessage", topMessage), ("readInboxMaxId", readInboxMaxId), ("readOutboxMaxId", readOutboxMaxId), ("unreadCount", unreadCount), ("unreadMentionsCount", unreadMentionsCount), ("notifySettings", notifySettings), ("pts", pts), ("draft", draft), ("folderId", folderId)]) @@ -3540,7 +3546,7 @@ extension Api { } } - static func parse_dialog(_ reader: BufferReader) -> Dialog? { + public static func parse_dialog(_ reader: BufferReader) -> Dialog? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Peer? @@ -3587,7 +3593,7 @@ extension Api { return nil } } - static func parse_dialogFolder(_ reader: BufferReader) -> Dialog? { + public static func parse_dialogFolder(_ reader: BufferReader) -> Dialog? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Folder? @@ -3625,7 +3631,7 @@ extension Api { } } - enum SendMessageAction: TypeConstructorDescription { + public enum SendMessageAction: TypeConstructorDescription { case sendMessageTypingAction case sendMessageCancelAction case sendMessageRecordVideoAction @@ -3640,7 +3646,7 @@ extension Api { case sendMessageRecordRoundAction case sendMessageUploadRoundAction(progress: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .sendMessageTypingAction: if boxed { @@ -3723,7 +3729,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .sendMessageTypingAction: return ("sendMessageTypingAction", []) @@ -3754,16 +3760,16 @@ extension Api { } } - static func parse_sendMessageTypingAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageTypingAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageTypingAction } - static func parse_sendMessageCancelAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageCancelAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageCancelAction } - static func parse_sendMessageRecordVideoAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageRecordVideoAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageRecordVideoAction } - static func parse_sendMessageUploadVideoAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageUploadVideoAction(_ reader: BufferReader) -> SendMessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3774,10 +3780,10 @@ extension Api { return nil } } - static func parse_sendMessageRecordAudioAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageRecordAudioAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageRecordAudioAction } - static func parse_sendMessageUploadAudioAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageUploadAudioAction(_ reader: BufferReader) -> SendMessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3788,7 +3794,7 @@ extension Api { return nil } } - static func parse_sendMessageUploadPhotoAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageUploadPhotoAction(_ reader: BufferReader) -> SendMessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3799,7 +3805,7 @@ extension Api { return nil } } - static func parse_sendMessageUploadDocumentAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageUploadDocumentAction(_ reader: BufferReader) -> SendMessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3810,19 +3816,19 @@ extension Api { return nil } } - static func parse_sendMessageGeoLocationAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageGeoLocationAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageGeoLocationAction } - static func parse_sendMessageChooseContactAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageChooseContactAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageChooseContactAction } - static func parse_sendMessageGamePlayAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageGamePlayAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageGamePlayAction } - static func parse_sendMessageRecordRoundAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageRecordRoundAction(_ reader: BufferReader) -> SendMessageAction? { return Api.SendMessageAction.sendMessageRecordRoundAction } - static func parse_sendMessageUploadRoundAction(_ reader: BufferReader) -> SendMessageAction? { + public static func parse_sendMessageUploadRoundAction(_ reader: BufferReader) -> SendMessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -3835,7 +3841,7 @@ extension Api { } } - enum PrivacyKey: TypeConstructorDescription { + public enum PrivacyKey: TypeConstructorDescription { case privacyKeyStatusTimestamp case privacyKeyChatInvite case privacyKeyPhoneCall @@ -3844,7 +3850,7 @@ extension Api { case privacyKeyProfilePhoto case privacyKeyPhoneNumber - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .privacyKeyStatusTimestamp: if boxed { @@ -3891,7 +3897,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .privacyKeyStatusTimestamp: return ("privacyKeyStatusTimestamp", []) @@ -3910,30 +3916,30 @@ extension Api { } } - static func parse_privacyKeyStatusTimestamp(_ reader: BufferReader) -> PrivacyKey? { + public static func parse_privacyKeyStatusTimestamp(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyStatusTimestamp } - static func parse_privacyKeyChatInvite(_ reader: BufferReader) -> PrivacyKey? { + public static func parse_privacyKeyChatInvite(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyChatInvite } - static func parse_privacyKeyPhoneCall(_ reader: BufferReader) -> PrivacyKey? { + public static func parse_privacyKeyPhoneCall(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyPhoneCall } - static func parse_privacyKeyPhoneP2P(_ reader: BufferReader) -> PrivacyKey? { + public static func parse_privacyKeyPhoneP2P(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyPhoneP2P } - static func parse_privacyKeyForwards(_ reader: BufferReader) -> PrivacyKey? { + public static func parse_privacyKeyForwards(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyForwards } - static func parse_privacyKeyProfilePhoto(_ reader: BufferReader) -> PrivacyKey? { + public static func parse_privacyKeyProfilePhoto(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyProfilePhoto } - static func parse_privacyKeyPhoneNumber(_ reader: BufferReader) -> PrivacyKey? { + public static func parse_privacyKeyPhoneNumber(_ reader: BufferReader) -> PrivacyKey? { return Api.PrivacyKey.privacyKeyPhoneNumber } } - enum Update: TypeConstructorDescription { + public enum Update: TypeConstructorDescription { case updateNewMessage(message: Api.Message, pts: Int32, ptsCount: Int32) case updateMessageID(id: Int32, randomId: Int64) case updateDeleteMessages(messages: [Int32], pts: Int32, ptsCount: Int32) @@ -3943,7 +3949,6 @@ extension Api { case updateUserStatus(userId: Int32, status: Api.UserStatus) case updateUserName(userId: Int32, firstName: String, lastName: String, username: String) case updateUserPhoto(userId: Int32, date: Int32, photo: Api.UserProfilePhoto, previous: Api.Bool) - case updateContactLink(userId: Int32, myLink: Api.ContactLink, foreignLink: Api.ContactLink) case updateNewEncryptedMessage(message: Api.EncryptedMessage, qts: Int32) case updateEncryptedChatTyping(chatId: Int32) case updateEncryption(chat: Api.EncryptedChat, date: Int32) @@ -4005,9 +4010,9 @@ extension Api { case updateReadChannelInbox(flags: Int32, folderId: Int32?, channelId: Int32, maxId: Int32, stillUnreadCount: Int32, pts: Int32) case updateReadHistoryInbox(flags: Int32, folderId: Int32?, peer: Api.Peer, maxId: Int32, stillUnreadCount: Int32, pts: Int32, ptsCount: Int32) case updatePeerSettings(peer: Api.Peer, settings: Api.PeerSettings) - case updateContactLocated(contacts: [Api.ContactLocated]) + case updatePeerLocated(peers: [Api.PeerLocated]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .updateNewMessage(let message, let pts, let ptsCount): if boxed { @@ -4082,14 +4087,6 @@ extension Api { photo.serialize(buffer, true) previous.serialize(buffer, true) break - case .updateContactLink(let userId, let myLink, let foreignLink): - if boxed { - buffer.appendInt32(-1657903163) - } - serializeInt32(userId, buffer: buffer, boxed: false) - myLink.serialize(buffer, true) - foreignLink.serialize(buffer, true) - break case .updateNewEncryptedMessage(let message, let qts): if boxed { buffer.appendInt32(314359194) @@ -4605,20 +4602,20 @@ extension Api { peer.serialize(buffer, true) settings.serialize(buffer, true) break - case .updateContactLocated(let contacts): + case .updatePeerLocated(let peers): if boxed { - buffer.appendInt32(1602468195) + buffer.appendInt32(-1263546448) } buffer.appendInt32(481674261) - buffer.appendInt32(Int32(contacts.count)) - for item in contacts { + buffer.appendInt32(Int32(peers.count)) + for item in peers { item.serialize(buffer, true) } break } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .updateNewMessage(let message, let pts, let ptsCount): return ("updateNewMessage", [("message", message), ("pts", pts), ("ptsCount", ptsCount)]) @@ -4638,8 +4635,6 @@ extension Api { return ("updateUserName", [("userId", userId), ("firstName", firstName), ("lastName", lastName), ("username", username)]) case .updateUserPhoto(let userId, let date, let photo, let previous): return ("updateUserPhoto", [("userId", userId), ("date", date), ("photo", photo), ("previous", previous)]) - case .updateContactLink(let userId, let myLink, let foreignLink): - return ("updateContactLink", [("userId", userId), ("myLink", myLink), ("foreignLink", foreignLink)]) case .updateNewEncryptedMessage(let message, let qts): return ("updateNewEncryptedMessage", [("message", message), ("qts", qts)]) case .updateEncryptedChatTyping(let chatId): @@ -4762,12 +4757,12 @@ extension Api { return ("updateReadHistoryInbox", [("flags", flags), ("folderId", folderId), ("peer", peer), ("maxId", maxId), ("stillUnreadCount", stillUnreadCount), ("pts", pts), ("ptsCount", ptsCount)]) case .updatePeerSettings(let peer, let settings): return ("updatePeerSettings", [("peer", peer), ("settings", settings)]) - case .updateContactLocated(let contacts): - return ("updateContactLocated", [("contacts", contacts)]) + case .updatePeerLocated(let peers): + return ("updatePeerLocated", [("peers", peers)]) } } - static func parse_updateNewMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateNewMessage(_ reader: BufferReader) -> Update? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -4786,7 +4781,7 @@ extension Api { return nil } } - static func parse_updateMessageID(_ reader: BufferReader) -> Update? { + public static func parse_updateMessageID(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -4800,7 +4795,7 @@ extension Api { return nil } } - static func parse_updateDeleteMessages(_ reader: BufferReader) -> Update? { + public static func parse_updateDeleteMessages(_ reader: BufferReader) -> Update? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -4819,7 +4814,7 @@ extension Api { return nil } } - static func parse_updateUserTyping(_ reader: BufferReader) -> Update? { + public static func parse_updateUserTyping(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Api.SendMessageAction? @@ -4835,7 +4830,7 @@ extension Api { return nil } } - static func parse_updateChatUserTyping(_ reader: BufferReader) -> Update? { + public static func parse_updateChatUserTyping(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -4854,7 +4849,7 @@ extension Api { return nil } } - static func parse_updateChatParticipants(_ reader: BufferReader) -> Update? { + public static func parse_updateChatParticipants(_ reader: BufferReader) -> Update? { var _1: Api.ChatParticipants? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.ChatParticipants @@ -4867,7 +4862,7 @@ extension Api { return nil } } - static func parse_updateUserStatus(_ reader: BufferReader) -> Update? { + public static func parse_updateUserStatus(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Api.UserStatus? @@ -4883,7 +4878,7 @@ extension Api { return nil } } - static func parse_updateUserName(_ reader: BufferReader) -> Update? { + public static func parse_updateUserName(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -4903,7 +4898,7 @@ extension Api { return nil } } - static func parse_updateUserPhoto(_ reader: BufferReader) -> Update? { + public static func parse_updateUserPhoto(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -4927,28 +4922,7 @@ extension Api { return nil } } - static func parse_updateContactLink(_ reader: BufferReader) -> Update? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Api.ContactLink? - if let signature = reader.readInt32() { - _2 = Api.parse(reader, signature: signature) as? Api.ContactLink - } - var _3: Api.ContactLink? - if let signature = reader.readInt32() { - _3 = Api.parse(reader, signature: signature) as? Api.ContactLink - } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.Update.updateContactLink(userId: _1!, myLink: _2!, foreignLink: _3!) - } - else { - return nil - } - } - static func parse_updateNewEncryptedMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateNewEncryptedMessage(_ reader: BufferReader) -> Update? { var _1: Api.EncryptedMessage? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.EncryptedMessage @@ -4964,7 +4938,7 @@ extension Api { return nil } } - static func parse_updateEncryptedChatTyping(_ reader: BufferReader) -> Update? { + public static func parse_updateEncryptedChatTyping(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -4975,7 +4949,7 @@ extension Api { return nil } } - static func parse_updateEncryption(_ reader: BufferReader) -> Update? { + public static func parse_updateEncryption(_ reader: BufferReader) -> Update? { var _1: Api.EncryptedChat? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.EncryptedChat @@ -4991,7 +4965,7 @@ extension Api { return nil } } - static func parse_updateEncryptedMessagesRead(_ reader: BufferReader) -> Update? { + public static func parse_updateEncryptedMessagesRead(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5008,7 +4982,7 @@ extension Api { return nil } } - static func parse_updateChatParticipantAdd(_ reader: BufferReader) -> Update? { + public static func parse_updateChatParticipantAdd(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5031,7 +5005,7 @@ extension Api { return nil } } - static func parse_updateChatParticipantDelete(_ reader: BufferReader) -> Update? { + public static func parse_updateChatParticipantDelete(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5048,7 +5022,7 @@ extension Api { return nil } } - static func parse_updateDcOptions(_ reader: BufferReader) -> Update? { + public static func parse_updateDcOptions(_ reader: BufferReader) -> Update? { var _1: [Api.DcOption]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.DcOption.self) @@ -5061,7 +5035,7 @@ extension Api { return nil } } - static func parse_updateUserBlocked(_ reader: BufferReader) -> Update? { + public static func parse_updateUserBlocked(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Bool? @@ -5077,7 +5051,7 @@ extension Api { return nil } } - static func parse_updateNotifySettings(_ reader: BufferReader) -> Update? { + public static func parse_updateNotifySettings(_ reader: BufferReader) -> Update? { var _1: Api.NotifyPeer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.NotifyPeer @@ -5095,7 +5069,7 @@ extension Api { return nil } } - static func parse_updateServiceNotification(_ reader: BufferReader) -> Update? { + public static func parse_updateServiceNotification(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5125,7 +5099,7 @@ extension Api { return nil } } - static func parse_updatePrivacy(_ reader: BufferReader) -> Update? { + public static func parse_updatePrivacy(_ reader: BufferReader) -> Update? { var _1: Api.PrivacyKey? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.PrivacyKey @@ -5143,7 +5117,7 @@ extension Api { return nil } } - static func parse_updateUserPhone(_ reader: BufferReader) -> Update? { + public static func parse_updateUserPhone(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -5157,7 +5131,7 @@ extension Api { return nil } } - static func parse_updateReadHistoryOutbox(_ reader: BufferReader) -> Update? { + public static func parse_updateReadHistoryOutbox(_ reader: BufferReader) -> Update? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -5179,7 +5153,7 @@ extension Api { return nil } } - static func parse_updateWebPage(_ reader: BufferReader) -> Update? { + public static func parse_updateWebPage(_ reader: BufferReader) -> Update? { var _1: Api.WebPage? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.WebPage @@ -5198,7 +5172,7 @@ extension Api { return nil } } - static func parse_updateReadMessagesContents(_ reader: BufferReader) -> Update? { + public static func parse_updateReadMessagesContents(_ reader: BufferReader) -> Update? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -5217,7 +5191,7 @@ extension Api { return nil } } - static func parse_updateChannelTooLong(_ reader: BufferReader) -> Update? { + public static func parse_updateChannelTooLong(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5234,7 +5208,7 @@ extension Api { return nil } } - static func parse_updateChannel(_ reader: BufferReader) -> Update? { + public static func parse_updateChannel(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -5245,7 +5219,7 @@ extension Api { return nil } } - static func parse_updateNewChannelMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateNewChannelMessage(_ reader: BufferReader) -> Update? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -5264,7 +5238,7 @@ extension Api { return nil } } - static func parse_updateDeleteChannelMessages(_ reader: BufferReader) -> Update? { + public static func parse_updateDeleteChannelMessages(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: [Int32]? @@ -5286,7 +5260,7 @@ extension Api { return nil } } - static func parse_updateChannelMessageViews(_ reader: BufferReader) -> Update? { + public static func parse_updateChannelMessageViews(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5303,7 +5277,7 @@ extension Api { return nil } } - static func parse_updateChatParticipantAdmin(_ reader: BufferReader) -> Update? { + public static func parse_updateChatParticipantAdmin(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5325,7 +5299,7 @@ extension Api { return nil } } - static func parse_updateNewStickerSet(_ reader: BufferReader) -> Update? { + public static func parse_updateNewStickerSet(_ reader: BufferReader) -> Update? { var _1: Api.messages.StickerSet? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.messages.StickerSet @@ -5338,7 +5312,7 @@ extension Api { return nil } } - static func parse_updateStickerSetsOrder(_ reader: BufferReader) -> Update? { + public static func parse_updateStickerSetsOrder(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: [Int64]? @@ -5354,13 +5328,13 @@ extension Api { return nil } } - static func parse_updateStickerSets(_ reader: BufferReader) -> Update? { + public static func parse_updateStickerSets(_ reader: BufferReader) -> Update? { return Api.Update.updateStickerSets } - static func parse_updateSavedGifs(_ reader: BufferReader) -> Update? { + public static func parse_updateSavedGifs(_ reader: BufferReader) -> Update? { return Api.Update.updateSavedGifs } - static func parse_updateBotInlineQuery(_ reader: BufferReader) -> Update? { + public static func parse_updateBotInlineQuery(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -5388,7 +5362,7 @@ extension Api { return nil } } - static func parse_updateBotInlineSend(_ reader: BufferReader) -> Update? { + public static func parse_updateBotInlineSend(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5418,7 +5392,7 @@ extension Api { return nil } } - static func parse_updateEditChannelMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateEditChannelMessage(_ reader: BufferReader) -> Update? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -5437,7 +5411,7 @@ extension Api { return nil } } - static func parse_updateChannelPinnedMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateChannelPinnedMessage(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5451,7 +5425,7 @@ extension Api { return nil } } - static func parse_updateBotCallbackQuery(_ reader: BufferReader) -> Update? { + public static func parse_updateBotCallbackQuery(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -5485,7 +5459,7 @@ extension Api { return nil } } - static func parse_updateEditMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateEditMessage(_ reader: BufferReader) -> Update? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -5504,7 +5478,7 @@ extension Api { return nil } } - static func parse_updateInlineBotCallbackQuery(_ reader: BufferReader) -> Update? { + public static func parse_updateInlineBotCallbackQuery(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -5535,7 +5509,7 @@ extension Api { return nil } } - static func parse_updateReadChannelOutbox(_ reader: BufferReader) -> Update? { + public static func parse_updateReadChannelOutbox(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5549,7 +5523,7 @@ extension Api { return nil } } - static func parse_updateDraftMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateDraftMessage(_ reader: BufferReader) -> Update? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -5567,19 +5541,19 @@ extension Api { return nil } } - static func parse_updateReadFeaturedStickers(_ reader: BufferReader) -> Update? { + public static func parse_updateReadFeaturedStickers(_ reader: BufferReader) -> Update? { return Api.Update.updateReadFeaturedStickers } - static func parse_updateRecentStickers(_ reader: BufferReader) -> Update? { + public static func parse_updateRecentStickers(_ reader: BufferReader) -> Update? { return Api.Update.updateRecentStickers } - static func parse_updateConfig(_ reader: BufferReader) -> Update? { + public static func parse_updateConfig(_ reader: BufferReader) -> Update? { return Api.Update.updateConfig } - static func parse_updatePtsChanged(_ reader: BufferReader) -> Update? { + public static func parse_updatePtsChanged(_ reader: BufferReader) -> Update? { return Api.Update.updatePtsChanged } - static func parse_updateChannelWebPage(_ reader: BufferReader) -> Update? { + public static func parse_updateChannelWebPage(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Api.WebPage? @@ -5601,7 +5575,7 @@ extension Api { return nil } } - static func parse_updateBotWebhookJSON(_ reader: BufferReader) -> Update? { + public static func parse_updateBotWebhookJSON(_ reader: BufferReader) -> Update? { var _1: Api.DataJSON? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.DataJSON @@ -5614,7 +5588,7 @@ extension Api { return nil } } - static func parse_updateBotWebhookJSONQuery(_ reader: BufferReader) -> Update? { + public static func parse_updateBotWebhookJSONQuery(_ reader: BufferReader) -> Update? { var _1: Int64? _1 = reader.readInt64() var _2: Api.DataJSON? @@ -5633,7 +5607,7 @@ extension Api { return nil } } - static func parse_updateBotShippingQuery(_ reader: BufferReader) -> Update? { + public static func parse_updateBotShippingQuery(_ reader: BufferReader) -> Update? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -5655,7 +5629,7 @@ extension Api { return nil } } - static func parse_updateBotPrecheckoutQuery(_ reader: BufferReader) -> Update? { + public static func parse_updateBotPrecheckoutQuery(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -5689,7 +5663,7 @@ extension Api { return nil } } - static func parse_updatePhoneCall(_ reader: BufferReader) -> Update? { + public static func parse_updatePhoneCall(_ reader: BufferReader) -> Update? { var _1: Api.PhoneCall? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.PhoneCall @@ -5702,7 +5676,7 @@ extension Api { return nil } } - static func parse_updateLangPack(_ reader: BufferReader) -> Update? { + public static func parse_updateLangPack(_ reader: BufferReader) -> Update? { var _1: Api.LangPackDifference? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.LangPackDifference @@ -5715,10 +5689,10 @@ extension Api { return nil } } - static func parse_updateFavedStickers(_ reader: BufferReader) -> Update? { + public static func parse_updateFavedStickers(_ reader: BufferReader) -> Update? { return Api.Update.updateFavedStickers } - static func parse_updateChannelReadMessagesContents(_ reader: BufferReader) -> Update? { + public static func parse_updateChannelReadMessagesContents(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: [Int32]? @@ -5734,10 +5708,10 @@ extension Api { return nil } } - static func parse_updateContactsReset(_ reader: BufferReader) -> Update? { + public static func parse_updateContactsReset(_ reader: BufferReader) -> Update? { return Api.Update.updateContactsReset } - static func parse_updateChannelAvailableMessages(_ reader: BufferReader) -> Update? { + public static func parse_updateChannelAvailableMessages(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5751,7 +5725,7 @@ extension Api { return nil } } - static func parse_updateDialogUnreadMark(_ reader: BufferReader) -> Update? { + public static func parse_updateDialogUnreadMark(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Api.DialogPeer? @@ -5767,7 +5741,7 @@ extension Api { return nil } } - static func parse_updateLangPackTooLong(_ reader: BufferReader) -> Update? { + public static func parse_updateLangPackTooLong(_ reader: BufferReader) -> Update? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -5778,7 +5752,7 @@ extension Api { return nil } } - static func parse_updateUserPinnedMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateUserPinnedMessage(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5792,7 +5766,7 @@ extension Api { return nil } } - static func parse_updateMessagePoll(_ reader: BufferReader) -> Update? { + public static func parse_updateMessagePoll(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -5816,7 +5790,7 @@ extension Api { return nil } } - static func parse_updateChatDefaultBannedRights(_ reader: BufferReader) -> Update? { + public static func parse_updateChatDefaultBannedRights(_ reader: BufferReader) -> Update? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -5837,7 +5811,7 @@ extension Api { return nil } } - static func parse_updateChatPinnedMessage(_ reader: BufferReader) -> Update? { + public static func parse_updateChatPinnedMessage(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5854,7 +5828,7 @@ extension Api { return nil } } - static func parse_updateFolderPeers(_ reader: BufferReader) -> Update? { + public static func parse_updateFolderPeers(_ reader: BufferReader) -> Update? { var _1: [Api.FolderPeer]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.FolderPeer.self) @@ -5873,7 +5847,7 @@ extension Api { return nil } } - static func parse_updateDialogPinned(_ reader: BufferReader) -> Update? { + public static func parse_updateDialogPinned(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5892,7 +5866,7 @@ extension Api { return nil } } - static func parse_updatePinnedDialogs(_ reader: BufferReader) -> Update? { + public static func parse_updatePinnedDialogs(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5911,7 +5885,7 @@ extension Api { return nil } } - static func parse_updateReadChannelInbox(_ reader: BufferReader) -> Update? { + public static func parse_updateReadChannelInbox(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5937,7 +5911,7 @@ extension Api { return nil } } - static func parse_updateReadHistoryInbox(_ reader: BufferReader) -> Update? { + public static func parse_updateReadHistoryInbox(_ reader: BufferReader) -> Update? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -5968,7 +5942,7 @@ extension Api { return nil } } - static func parse_updatePeerSettings(_ reader: BufferReader) -> Update? { + public static func parse_updatePeerSettings(_ reader: BufferReader) -> Update? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -5986,14 +5960,14 @@ extension Api { return nil } } - static func parse_updateContactLocated(_ reader: BufferReader) -> Update? { - var _1: [Api.ContactLocated]? + public static func parse_updatePeerLocated(_ reader: BufferReader) -> Update? { + var _1: [Api.PeerLocated]? if let _ = reader.readInt32() { - _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ContactLocated.self) + _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PeerLocated.self) } let _c1 = _1 != nil if _c1 { - return Api.Update.updateContactLocated(contacts: _1!) + return Api.Update.updatePeerLocated(peers: _1!) } else { return nil @@ -6001,10 +5975,10 @@ extension Api { } } - enum PopularContact: TypeConstructorDescription { + public enum PopularContact: TypeConstructorDescription { case popularContact(clientId: Int64, importers: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .popularContact(let clientId, let importers): if boxed { @@ -6016,14 +5990,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .popularContact(let clientId, let importers): return ("popularContact", [("clientId", clientId), ("importers", importers)]) } } - static func parse_popularContact(_ reader: BufferReader) -> PopularContact? { + public static func parse_popularContact(_ reader: BufferReader) -> PopularContact? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -6039,10 +6013,10 @@ extension Api { } } - enum FolderPeer: TypeConstructorDescription { + public enum FolderPeer: TypeConstructorDescription { case folderPeer(peer: Api.Peer, folderId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .folderPeer(let peer, let folderId): if boxed { @@ -6054,14 +6028,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .folderPeer(let peer, let folderId): return ("folderPeer", [("peer", peer), ("folderId", folderId)]) } } - static func parse_folderPeer(_ reader: BufferReader) -> FolderPeer? { + public static func parse_folderPeer(_ reader: BufferReader) -> FolderPeer? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -6079,14 +6053,14 @@ extension Api { } } - enum ChannelParticipant: TypeConstructorDescription { + public enum ChannelParticipant: TypeConstructorDescription { case channelParticipant(userId: Int32, date: Int32) case channelParticipantSelf(userId: Int32, inviterId: Int32, date: Int32) case channelParticipantCreator(userId: Int32) case channelParticipantBanned(flags: Int32, userId: Int32, kickedBy: Int32, date: Int32, bannedRights: Api.ChatBannedRights) case channelParticipantAdmin(flags: Int32, userId: Int32, inviterId: Int32?, promotedBy: Int32, date: Int32, adminRights: Api.ChatAdminRights) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelParticipant(let userId, let date): if boxed { @@ -6133,7 +6107,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelParticipant(let userId, let date): return ("channelParticipant", [("userId", userId), ("date", date)]) @@ -6148,7 +6122,7 @@ extension Api { } } - static func parse_channelParticipant(_ reader: BufferReader) -> ChannelParticipant? { + public static func parse_channelParticipant(_ reader: BufferReader) -> ChannelParticipant? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -6162,7 +6136,7 @@ extension Api { return nil } } - static func parse_channelParticipantSelf(_ reader: BufferReader) -> ChannelParticipant? { + public static func parse_channelParticipantSelf(_ reader: BufferReader) -> ChannelParticipant? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -6179,7 +6153,7 @@ extension Api { return nil } } - static func parse_channelParticipantCreator(_ reader: BufferReader) -> ChannelParticipant? { + public static func parse_channelParticipantCreator(_ reader: BufferReader) -> ChannelParticipant? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -6190,7 +6164,7 @@ extension Api { return nil } } - static func parse_channelParticipantBanned(_ reader: BufferReader) -> ChannelParticipant? { + public static func parse_channelParticipantBanned(_ reader: BufferReader) -> ChannelParticipant? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -6215,7 +6189,7 @@ extension Api { return nil } } - static func parse_channelParticipantAdmin(_ reader: BufferReader) -> ChannelParticipant? { + public static func parse_channelParticipantAdmin(_ reader: BufferReader) -> ChannelParticipant? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -6245,11 +6219,11 @@ extension Api { } } - enum InputDialogPeer: TypeConstructorDescription { + public enum InputDialogPeer: TypeConstructorDescription { case inputDialogPeer(peer: Api.InputPeer) case inputDialogPeerFolder(folderId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputDialogPeer(let peer): if boxed { @@ -6266,7 +6240,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputDialogPeer(let peer): return ("inputDialogPeer", [("peer", peer)]) @@ -6275,7 +6249,7 @@ extension Api { } } - static func parse_inputDialogPeer(_ reader: BufferReader) -> InputDialogPeer? { + public static func parse_inputDialogPeer(_ reader: BufferReader) -> InputDialogPeer? { var _1: Api.InputPeer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputPeer @@ -6288,7 +6262,7 @@ extension Api { return nil } } - static func parse_inputDialogPeerFolder(_ reader: BufferReader) -> InputDialogPeer? { + public static func parse_inputDialogPeerFolder(_ reader: BufferReader) -> InputDialogPeer? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -6301,10 +6275,10 @@ extension Api { } } - enum Error: TypeConstructorDescription { + public enum Error: TypeConstructorDescription { case error(code: Int32, text: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .error(let code, let text): if boxed { @@ -6316,14 +6290,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .error(let code, let text): return ("error", [("code", code), ("text", text)]) } } - static func parse_error(_ reader: BufferReader) -> Error? { + public static func parse_error(_ reader: BufferReader) -> Error? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -6339,49 +6313,7 @@ extension Api { } } - enum ContactLocated: TypeConstructorDescription { - case contactLocated(userId: Int32, expires: Int32, distance: Int32) - - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .contactLocated(let userId, let expires, let distance): - if boxed { - buffer.appendInt32(-1150339286) - } - serializeInt32(userId, buffer: buffer, boxed: false) - serializeInt32(expires, buffer: buffer, boxed: false) - serializeInt32(distance, buffer: buffer, boxed: false) - break - } - } - - func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .contactLocated(let userId, let expires, let distance): - return ("contactLocated", [("userId", userId), ("expires", expires), ("distance", distance)]) - } - } - - static func parse_contactLocated(_ reader: BufferReader) -> ContactLocated? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: Int32? - _3 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.ContactLocated.contactLocated(userId: _1!, expires: _2!, distance: _3!) - } - else { - return nil - } - } - - } - enum KeyboardButton: TypeConstructorDescription { + public enum KeyboardButton: TypeConstructorDescription { case keyboardButton(text: String) case keyboardButtonUrl(text: String, url: String) case keyboardButtonCallback(text: String, data: Buffer) @@ -6393,7 +6325,7 @@ extension Api { case keyboardButtonUrlAuth(flags: Int32, text: String, fwdText: String?, url: String, buttonId: Int32) case inputKeyboardButtonUrlAuth(flags: Int32, text: String, fwdText: String?, url: String, bot: Api.InputUser) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .keyboardButton(let text): if boxed { @@ -6470,7 +6402,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .keyboardButton(let text): return ("keyboardButton", [("text", text)]) @@ -6495,7 +6427,7 @@ extension Api { } } - static func parse_keyboardButton(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButton(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -6506,7 +6438,7 @@ extension Api { return nil } } - static func parse_keyboardButtonUrl(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonUrl(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) var _2: String? @@ -6520,7 +6452,7 @@ extension Api { return nil } } - static func parse_keyboardButtonCallback(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonCallback(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) var _2: Buffer? @@ -6534,7 +6466,7 @@ extension Api { return nil } } - static func parse_keyboardButtonRequestPhone(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonRequestPhone(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -6545,7 +6477,7 @@ extension Api { return nil } } - static func parse_keyboardButtonRequestGeoLocation(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonRequestGeoLocation(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -6556,7 +6488,7 @@ extension Api { return nil } } - static func parse_keyboardButtonSwitchInline(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonSwitchInline(_ reader: BufferReader) -> KeyboardButton? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -6573,7 +6505,7 @@ extension Api { return nil } } - static func parse_keyboardButtonGame(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonGame(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -6584,7 +6516,7 @@ extension Api { return nil } } - static func parse_keyboardButtonBuy(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonBuy(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -6595,7 +6527,7 @@ extension Api { return nil } } - static func parse_keyboardButtonUrlAuth(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_keyboardButtonUrlAuth(_ reader: BufferReader) -> KeyboardButton? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -6618,7 +6550,7 @@ extension Api { return nil } } - static func parse_inputKeyboardButtonUrlAuth(_ reader: BufferReader) -> KeyboardButton? { + public static func parse_inputKeyboardButtonUrlAuth(_ reader: BufferReader) -> KeyboardButton? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -6645,10 +6577,10 @@ extension Api { } } - enum ContactStatus: TypeConstructorDescription { + public enum ContactStatus: TypeConstructorDescription { case contactStatus(userId: Int32, status: Api.UserStatus) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .contactStatus(let userId, let status): if boxed { @@ -6660,14 +6592,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .contactStatus(let userId, let status): return ("contactStatus", [("userId", userId), ("status", status)]) } } - static func parse_contactStatus(_ reader: BufferReader) -> ContactStatus? { + public static func parse_contactStatus(_ reader: BufferReader) -> ContactStatus? { var _1: Int32? _1 = reader.readInt32() var _2: Api.UserStatus? @@ -6685,11 +6617,11 @@ extension Api { } } - enum SecureFile: TypeConstructorDescription { + public enum SecureFile: TypeConstructorDescription { case secureFileEmpty case secureFile(id: Int64, accessHash: Int64, size: Int32, dcId: Int32, date: Int32, fileHash: Buffer, secret: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureFileEmpty: if boxed { @@ -6712,7 +6644,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureFileEmpty: return ("secureFileEmpty", []) @@ -6721,10 +6653,10 @@ extension Api { } } - static func parse_secureFileEmpty(_ reader: BufferReader) -> SecureFile? { + public static func parse_secureFileEmpty(_ reader: BufferReader) -> SecureFile? { return Api.SecureFile.secureFileEmpty } - static func parse_secureFile(_ reader: BufferReader) -> SecureFile? { + public static func parse_secureFile(_ reader: BufferReader) -> SecureFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -6755,13 +6687,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 { @@ -6799,7 +6731,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .photoSizeEmpty(let type): return ("photoSizeEmpty", [("type", type)]) @@ -6812,7 +6744,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 @@ -6823,7 +6755,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? @@ -6848,7 +6780,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? @@ -6873,7 +6805,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? @@ -6889,10 +6821,10 @@ extension Api { } } - enum InlineBotSwitchPM: TypeConstructorDescription { + public enum InlineBotSwitchPM: TypeConstructorDescription { case inlineBotSwitchPM(text: String, startParam: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inlineBotSwitchPM(let text, let startParam): if boxed { @@ -6904,14 +6836,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inlineBotSwitchPM(let text, let startParam): return ("inlineBotSwitchPM", [("text", text), ("startParam", startParam)]) } } - static func parse_inlineBotSwitchPM(_ reader: BufferReader) -> InlineBotSwitchPM? { + public static func parse_inlineBotSwitchPM(_ reader: BufferReader) -> InlineBotSwitchPM? { var _1: String? _1 = parseString(reader) var _2: String? @@ -6927,10 +6859,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 { @@ -6942,14 +6874,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? @@ -6965,10 +6897,10 @@ extension Api { } } - enum Poll: TypeConstructorDescription { + public enum Poll: TypeConstructorDescription { case poll(id: Int64, flags: Int32, question: String, answers: [Api.PollAnswer]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .poll(let id, let flags, let question, let answers): if boxed { @@ -6986,14 +6918,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .poll(let id, let flags, let question, let answers): return ("poll", [("id", id), ("flags", flags), ("question", question), ("answers", answers)]) } } - static func parse_poll(_ reader: BufferReader) -> Poll? { + public static func parse_poll(_ reader: BufferReader) -> Poll? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -7017,13 +6949,13 @@ extension Api { } } - enum InputNotifyPeer: TypeConstructorDescription { + public enum InputNotifyPeer: TypeConstructorDescription { case inputNotifyUsers case inputNotifyChats case inputNotifyBroadcasts case inputNotifyPeer(peer: Api.InputPeer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputNotifyUsers: if boxed { @@ -7052,7 +6984,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputNotifyUsers: return ("inputNotifyUsers", []) @@ -7065,16 +6997,16 @@ extension Api { } } - static func parse_inputNotifyUsers(_ reader: BufferReader) -> InputNotifyPeer? { + public static func parse_inputNotifyUsers(_ reader: BufferReader) -> InputNotifyPeer? { return Api.InputNotifyPeer.inputNotifyUsers } - static func parse_inputNotifyChats(_ reader: BufferReader) -> InputNotifyPeer? { + public static func parse_inputNotifyChats(_ reader: BufferReader) -> InputNotifyPeer? { return Api.InputNotifyPeer.inputNotifyChats } - static func parse_inputNotifyBroadcasts(_ reader: BufferReader) -> InputNotifyPeer? { + public static func parse_inputNotifyBroadcasts(_ reader: BufferReader) -> InputNotifyPeer? { return Api.InputNotifyPeer.inputNotifyBroadcasts } - static func parse_inputNotifyPeer(_ reader: BufferReader) -> InputNotifyPeer? { + public static func parse_inputNotifyPeer(_ reader: BufferReader) -> InputNotifyPeer? { var _1: Api.InputPeer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputPeer @@ -7089,11 +7021,11 @@ extension Api { } } - enum EncryptedMessage: TypeConstructorDescription { + public enum EncryptedMessage: TypeConstructorDescription { case encryptedMessage(randomId: Int64, chatId: Int32, date: Int32, bytes: Buffer, file: Api.EncryptedFile) case encryptedMessageService(randomId: Int64, chatId: Int32, date: Int32, bytes: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .encryptedMessage(let randomId, let chatId, let date, let bytes, let file): if boxed { @@ -7117,7 +7049,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .encryptedMessage(let randomId, let chatId, let date, let bytes, let file): return ("encryptedMessage", [("randomId", randomId), ("chatId", chatId), ("date", date), ("bytes", bytes), ("file", file)]) @@ -7126,7 +7058,7 @@ extension Api { } } - static func parse_encryptedMessage(_ reader: BufferReader) -> EncryptedMessage? { + public static func parse_encryptedMessage(_ reader: BufferReader) -> EncryptedMessage? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -7151,7 +7083,7 @@ extension Api { return nil } } - static func parse_encryptedMessageService(_ reader: BufferReader) -> EncryptedMessage? { + public static func parse_encryptedMessageService(_ reader: BufferReader) -> EncryptedMessage? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -7173,7 +7105,7 @@ extension Api { } } - enum ChannelParticipantsFilter: TypeConstructorDescription { + public enum ChannelParticipantsFilter: TypeConstructorDescription { case channelParticipantsRecent case channelParticipantsAdmins case channelParticipantsBots @@ -7182,7 +7114,7 @@ extension Api { case channelParticipantsKicked(q: String) case channelParticipantsContacts(q: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelParticipantsRecent: if boxed { @@ -7229,7 +7161,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelParticipantsRecent: return ("channelParticipantsRecent", []) @@ -7248,16 +7180,16 @@ extension Api { } } - static func parse_channelParticipantsRecent(_ reader: BufferReader) -> ChannelParticipantsFilter? { + public static func parse_channelParticipantsRecent(_ reader: BufferReader) -> ChannelParticipantsFilter? { return Api.ChannelParticipantsFilter.channelParticipantsRecent } - static func parse_channelParticipantsAdmins(_ reader: BufferReader) -> ChannelParticipantsFilter? { + public static func parse_channelParticipantsAdmins(_ reader: BufferReader) -> ChannelParticipantsFilter? { return Api.ChannelParticipantsFilter.channelParticipantsAdmins } - static func parse_channelParticipantsBots(_ reader: BufferReader) -> ChannelParticipantsFilter? { + public static func parse_channelParticipantsBots(_ reader: BufferReader) -> ChannelParticipantsFilter? { return Api.ChannelParticipantsFilter.channelParticipantsBots } - static func parse_channelParticipantsBanned(_ reader: BufferReader) -> ChannelParticipantsFilter? { + public static func parse_channelParticipantsBanned(_ reader: BufferReader) -> ChannelParticipantsFilter? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -7268,7 +7200,7 @@ extension Api { return nil } } - static func parse_channelParticipantsSearch(_ reader: BufferReader) -> ChannelParticipantsFilter? { + public static func parse_channelParticipantsSearch(_ reader: BufferReader) -> ChannelParticipantsFilter? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -7279,7 +7211,7 @@ extension Api { return nil } } - static func parse_channelParticipantsKicked(_ reader: BufferReader) -> ChannelParticipantsFilter? { + public static func parse_channelParticipantsKicked(_ reader: BufferReader) -> ChannelParticipantsFilter? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -7290,7 +7222,7 @@ extension Api { return nil } } - static func parse_channelParticipantsContacts(_ reader: BufferReader) -> ChannelParticipantsFilter? { + public static func parse_channelParticipantsContacts(_ reader: BufferReader) -> ChannelParticipantsFilter? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -7303,13 +7235,13 @@ extension Api { } } - enum WebPage: TypeConstructorDescription { + 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 - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .webPageEmpty(let id): if boxed { @@ -7356,7 +7288,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .webPageEmpty(let id): return ("webPageEmpty", [("id", id)]) @@ -7369,7 +7301,7 @@ extension Api { } } - static func parse_webPageEmpty(_ reader: BufferReader) -> WebPage? { + public static func parse_webPageEmpty(_ reader: BufferReader) -> WebPage? { var _1: Int64? _1 = reader.readInt64() let _c1 = _1 != nil @@ -7380,7 +7312,7 @@ extension Api { return nil } } - static func parse_webPagePending(_ reader: BufferReader) -> WebPage? { + public static func parse_webPagePending(_ reader: BufferReader) -> WebPage? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -7394,7 +7326,7 @@ extension Api { return nil } } - static func parse_webPage(_ reader: BufferReader) -> WebPage? { + public static func parse_webPage(_ reader: BufferReader) -> WebPage? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -7462,12 +7394,12 @@ extension Api { return nil } } - static func parse_webPageNotModified(_ reader: BufferReader) -> WebPage? { + public static func parse_webPageNotModified(_ reader: BufferReader) -> WebPage? { return Api.WebPage.webPageNotModified } } - enum InputBotInlineMessage: TypeConstructorDescription { + public enum InputBotInlineMessage: TypeConstructorDescription { case inputBotInlineMessageText(flags: Int32, message: String, entities: [Api.MessageEntity]?, replyMarkup: Api.ReplyMarkup?) case inputBotInlineMessageMediaGeo(flags: Int32, geoPoint: Api.InputGeoPoint, replyMarkup: Api.ReplyMarkup?) case inputBotInlineMessageGame(flags: Int32, replyMarkup: Api.ReplyMarkup?) @@ -7475,7 +7407,7 @@ extension Api { case inputBotInlineMessageMediaVenue(flags: Int32, geoPoint: Api.InputGeoPoint, title: String, address: String, provider: String, venueId: String, venueType: String, replyMarkup: Api.ReplyMarkup?) case inputBotInlineMessageMediaContact(flags: Int32, phoneNumber: String, firstName: String, lastName: String, vcard: String, replyMarkup: Api.ReplyMarkup?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputBotInlineMessageText(let flags, let message, let entities, let replyMarkup): if boxed { @@ -7545,7 +7477,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputBotInlineMessageText(let flags, let message, let entities, let replyMarkup): return ("inputBotInlineMessageText", [("flags", flags), ("message", message), ("entities", entities), ("replyMarkup", replyMarkup)]) @@ -7562,7 +7494,7 @@ extension Api { } } - static func parse_inputBotInlineMessageText(_ reader: BufferReader) -> InputBotInlineMessage? { + public static func parse_inputBotInlineMessageText(_ reader: BufferReader) -> InputBotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -7586,7 +7518,7 @@ extension Api { return nil } } - static func parse_inputBotInlineMessageMediaGeo(_ reader: BufferReader) -> InputBotInlineMessage? { + public static func parse_inputBotInlineMessageMediaGeo(_ reader: BufferReader) -> InputBotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputGeoPoint? @@ -7607,7 +7539,7 @@ extension Api { return nil } } - static func parse_inputBotInlineMessageGame(_ reader: BufferReader) -> InputBotInlineMessage? { + public static func parse_inputBotInlineMessageGame(_ reader: BufferReader) -> InputBotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Api.ReplyMarkup? @@ -7623,7 +7555,7 @@ extension Api { return nil } } - static func parse_inputBotInlineMessageMediaAuto(_ reader: BufferReader) -> InputBotInlineMessage? { + public static func parse_inputBotInlineMessageMediaAuto(_ reader: BufferReader) -> InputBotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -7647,7 +7579,7 @@ extension Api { return nil } } - static func parse_inputBotInlineMessageMediaVenue(_ reader: BufferReader) -> InputBotInlineMessage? { + public static func parse_inputBotInlineMessageMediaVenue(_ reader: BufferReader) -> InputBotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputGeoPoint? @@ -7683,7 +7615,7 @@ extension Api { return nil } } - static func parse_inputBotInlineMessageMediaContact(_ reader: BufferReader) -> InputBotInlineMessage? { + public static func parse_inputBotInlineMessageMediaContact(_ reader: BufferReader) -> InputBotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -7713,10 +7645,10 @@ extension Api { } } - enum KeyboardButtonRow: TypeConstructorDescription { + public enum KeyboardButtonRow: TypeConstructorDescription { case keyboardButtonRow(buttons: [Api.KeyboardButton]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .keyboardButtonRow(let buttons): if boxed { @@ -7731,14 +7663,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .keyboardButtonRow(let buttons): return ("keyboardButtonRow", [("buttons", buttons)]) } } - static func parse_keyboardButtonRow(_ reader: BufferReader) -> KeyboardButtonRow? { + public static func parse_keyboardButtonRow(_ reader: BufferReader) -> KeyboardButtonRow? { var _1: [Api.KeyboardButton]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.KeyboardButton.self) @@ -7753,10 +7685,10 @@ extension Api { } } - enum StickerSet: TypeConstructorDescription { + public enum StickerSet: TypeConstructorDescription { case stickerSet(flags: Int32, installedDate: Int32?, id: Int64, accessHash: Int64, title: String, shortName: String, thumb: Api.PhotoSize?, thumbDcId: Int32?, count: Int32, hash: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .stickerSet(let flags, let installedDate, let id, let accessHash, let title, let shortName, let thumb, let thumbDcId, let count, let hash): if boxed { @@ -7776,14 +7708,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .stickerSet(let flags, let installedDate, let id, let accessHash, let title, let shortName, let thumb, let thumbDcId, let count, let hash): return ("stickerSet", [("flags", flags), ("installedDate", installedDate), ("id", id), ("accessHash", accessHash), ("title", title), ("shortName", shortName), ("thumb", thumb), ("thumbDcId", thumbDcId), ("count", count), ("hash", hash)]) } } - static func parse_stickerSet(_ reader: BufferReader) -> StickerSet? { + public static func parse_stickerSet(_ reader: BufferReader) -> StickerSet? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -7825,10 +7757,10 @@ extension Api { } } - enum SecureSecretSettings: TypeConstructorDescription { + public enum SecureSecretSettings: TypeConstructorDescription { case secureSecretSettings(secureAlgo: Api.SecurePasswordKdfAlgo, secureSecret: Buffer, secureSecretId: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureSecretSettings(let secureAlgo, let secureSecret, let secureSecretId): if boxed { @@ -7841,14 +7773,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureSecretSettings(let secureAlgo, let secureSecret, let secureSecretId): return ("secureSecretSettings", [("secureAlgo", secureAlgo), ("secureSecret", secureSecret), ("secureSecretId", secureSecretId)]) } } - static func parse_secureSecretSettings(_ reader: BufferReader) -> SecureSecretSettings? { + public static func parse_secureSecretSettings(_ reader: BufferReader) -> SecureSecretSettings? { var _1: Api.SecurePasswordKdfAlgo? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecurePasswordKdfAlgo @@ -7869,10 +7801,10 @@ extension Api { } } - enum InputContact: TypeConstructorDescription { + public enum InputContact: TypeConstructorDescription { case inputPhoneContact(clientId: Int64, phone: String, firstName: String, lastName: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPhoneContact(let clientId, let phone, let firstName, let lastName): if boxed { @@ -7886,14 +7818,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPhoneContact(let clientId, let phone, let firstName, let lastName): return ("inputPhoneContact", [("clientId", clientId), ("phone", phone), ("firstName", firstName), ("lastName", lastName)]) } } - static func parse_inputPhoneContact(_ reader: BufferReader) -> InputContact? { + public static func parse_inputPhoneContact(_ reader: BufferReader) -> InputContact? { var _1: Int64? _1 = reader.readInt64() var _2: String? @@ -7915,7 +7847,7 @@ extension Api { } } - enum TopPeerCategory: TypeConstructorDescription { + public enum TopPeerCategory: TypeConstructorDescription { case topPeerCategoryBotsPM case topPeerCategoryBotsInline case topPeerCategoryCorrespondents @@ -7925,7 +7857,7 @@ extension Api { case topPeerCategoryForwardUsers case topPeerCategoryForwardChats - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .topPeerCategoryBotsPM: if boxed { @@ -7978,7 +7910,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .topPeerCategoryBotsPM: return ("topPeerCategoryBotsPM", []) @@ -7999,37 +7931,37 @@ extension Api { } } - static func parse_topPeerCategoryBotsPM(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryBotsPM(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryBotsPM } - static func parse_topPeerCategoryBotsInline(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryBotsInline(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryBotsInline } - static func parse_topPeerCategoryCorrespondents(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryCorrespondents(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryCorrespondents } - static func parse_topPeerCategoryGroups(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryGroups(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryGroups } - static func parse_topPeerCategoryChannels(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryChannels(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryChannels } - static func parse_topPeerCategoryPhoneCalls(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryPhoneCalls(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryPhoneCalls } - static func parse_topPeerCategoryForwardUsers(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryForwardUsers(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryForwardUsers } - static func parse_topPeerCategoryForwardChats(_ reader: BufferReader) -> TopPeerCategory? { + public static func parse_topPeerCategoryForwardChats(_ reader: BufferReader) -> TopPeerCategory? { return Api.TopPeerCategory.topPeerCategoryForwardChats } } - enum ChannelMessagesFilter: TypeConstructorDescription { + public enum ChannelMessagesFilter: TypeConstructorDescription { case channelMessagesFilterEmpty case channelMessagesFilter(flags: Int32, ranges: [Api.MessageRange]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelMessagesFilterEmpty: if boxed { @@ -8051,7 +7983,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelMessagesFilterEmpty: return ("channelMessagesFilterEmpty", []) @@ -8060,10 +7992,10 @@ extension Api { } } - static func parse_channelMessagesFilterEmpty(_ reader: BufferReader) -> ChannelMessagesFilter? { + public static func parse_channelMessagesFilterEmpty(_ reader: BufferReader) -> ChannelMessagesFilter? { return Api.ChannelMessagesFilter.channelMessagesFilterEmpty } - static func parse_channelMessagesFilter(_ reader: BufferReader) -> ChannelMessagesFilter? { + public static func parse_channelMessagesFilter(_ reader: BufferReader) -> ChannelMessagesFilter? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.MessageRange]? @@ -8081,11 +8013,11 @@ extension Api { } } - enum InputDocument: TypeConstructorDescription { + public enum InputDocument: TypeConstructorDescription { case inputDocumentEmpty case inputDocument(id: Int64, accessHash: Int64, fileReference: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputDocumentEmpty: if boxed { @@ -8104,7 +8036,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputDocumentEmpty: return ("inputDocumentEmpty", []) @@ -8113,10 +8045,10 @@ extension Api { } } - static func parse_inputDocumentEmpty(_ reader: BufferReader) -> InputDocument? { + public static func parse_inputDocumentEmpty(_ reader: BufferReader) -> InputDocument? { return Api.InputDocument.inputDocumentEmpty } - static func parse_inputDocument(_ reader: BufferReader) -> InputDocument? { + public static func parse_inputDocument(_ reader: BufferReader) -> InputDocument? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -8135,10 +8067,10 @@ extension Api { } } - enum PollAnswer: TypeConstructorDescription { + public enum PollAnswer: TypeConstructorDescription { case pollAnswer(text: String, option: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pollAnswer(let text, let option): if boxed { @@ -8150,14 +8082,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pollAnswer(let text, let option): return ("pollAnswer", [("text", text), ("option", option)]) } } - static func parse_pollAnswer(_ reader: BufferReader) -> PollAnswer? { + public static func parse_pollAnswer(_ reader: BufferReader) -> PollAnswer? { var _1: String? _1 = parseString(reader) var _2: Buffer? @@ -8173,10 +8105,10 @@ extension Api { } } - enum SecureData: TypeConstructorDescription { + public enum SecureData: TypeConstructorDescription { case secureData(data: Buffer, dataHash: Buffer, secret: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureData(let data, let dataHash, let secret): if boxed { @@ -8189,14 +8121,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureData(let data, let dataHash, let secret): return ("secureData", [("data", data), ("dataHash", dataHash), ("secret", secret)]) } } - static func parse_secureData(_ reader: BufferReader) -> SecureData? { + public static func parse_secureData(_ reader: BufferReader) -> SecureData? { var _1: Buffer? _1 = parseBytes(reader) var _2: Buffer? @@ -8215,7 +8147,7 @@ extension Api { } } - enum InputMedia: TypeConstructorDescription { + public enum InputMedia: TypeConstructorDescription { case inputMediaEmpty case inputMediaGeoPoint(geoPoint: Api.InputGeoPoint) case inputMediaGifExternal(url: String, q: String) @@ -8232,7 +8164,7 @@ extension Api { case inputMediaPoll(poll: Api.Poll) case inputMediaGeoLive(flags: Int32, geoPoint: Api.InputGeoPoint, period: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputMediaEmpty: if boxed { @@ -8375,7 +8307,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputMediaEmpty: return ("inputMediaEmpty", []) @@ -8410,10 +8342,10 @@ extension Api { } } - static func parse_inputMediaEmpty(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaEmpty(_ reader: BufferReader) -> InputMedia? { return Api.InputMedia.inputMediaEmpty } - static func parse_inputMediaGeoPoint(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaGeoPoint(_ reader: BufferReader) -> InputMedia? { var _1: Api.InputGeoPoint? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputGeoPoint @@ -8426,7 +8358,7 @@ extension Api { return nil } } - static func parse_inputMediaGifExternal(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaGifExternal(_ reader: BufferReader) -> InputMedia? { var _1: String? _1 = parseString(reader) var _2: String? @@ -8440,7 +8372,7 @@ extension Api { return nil } } - static func parse_inputMediaGame(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaGame(_ reader: BufferReader) -> InputMedia? { var _1: Api.InputGame? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputGame @@ -8453,7 +8385,7 @@ extension Api { return nil } } - static func parse_inputMediaVenue(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaVenue(_ reader: BufferReader) -> InputMedia? { var _1: Api.InputGeoPoint? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputGeoPoint @@ -8481,7 +8413,7 @@ extension Api { return nil } } - static func parse_inputMediaInvoice(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaInvoice(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -8522,7 +8454,7 @@ extension Api { return nil } } - static func parse_inputMediaUploadedPhoto(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaUploadedPhoto(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputFile? @@ -8546,7 +8478,7 @@ extension Api { return nil } } - static func parse_inputMediaUploadedDocument(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaUploadedDocument(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputFile? @@ -8583,7 +8515,7 @@ extension Api { return nil } } - static func parse_inputMediaPhoto(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaPhoto(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputPhoto? @@ -8602,7 +8534,7 @@ extension Api { return nil } } - static func parse_inputMediaDocument(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaDocument(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputDocument? @@ -8621,7 +8553,7 @@ extension Api { return nil } } - static func parse_inputMediaPhotoExternal(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaPhotoExternal(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -8638,7 +8570,7 @@ extension Api { return nil } } - static func parse_inputMediaDocumentExternal(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaDocumentExternal(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -8655,7 +8587,7 @@ extension Api { return nil } } - static func parse_inputMediaContact(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaContact(_ reader: BufferReader) -> InputMedia? { var _1: String? _1 = parseString(reader) var _2: String? @@ -8675,7 +8607,7 @@ extension Api { return nil } } - static func parse_inputMediaPoll(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaPoll(_ reader: BufferReader) -> InputMedia? { var _1: Api.Poll? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Poll @@ -8688,7 +8620,7 @@ extension Api { return nil } } - static func parse_inputMediaGeoLive(_ reader: BufferReader) -> InputMedia? { + public static func parse_inputMediaGeoLive(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputGeoPoint? @@ -8709,14 +8641,14 @@ extension Api { } } - enum InputPeer: TypeConstructorDescription { + public enum InputPeer: TypeConstructorDescription { case inputPeerEmpty case inputPeerSelf case inputPeerChat(chatId: Int32) case inputPeerUser(userId: Int32, accessHash: Int64) case inputPeerChannel(channelId: Int32, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPeerEmpty: if boxed { @@ -8753,7 +8685,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPeerEmpty: return ("inputPeerEmpty", []) @@ -8768,13 +8700,13 @@ extension Api { } } - static func parse_inputPeerEmpty(_ reader: BufferReader) -> InputPeer? { + public static func parse_inputPeerEmpty(_ reader: BufferReader) -> InputPeer? { return Api.InputPeer.inputPeerEmpty } - static func parse_inputPeerSelf(_ reader: BufferReader) -> InputPeer? { + public static func parse_inputPeerSelf(_ reader: BufferReader) -> InputPeer? { return Api.InputPeer.inputPeerSelf } - static func parse_inputPeerChat(_ reader: BufferReader) -> InputPeer? { + public static func parse_inputPeerChat(_ reader: BufferReader) -> InputPeer? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -8785,7 +8717,7 @@ extension Api { return nil } } - static func parse_inputPeerUser(_ reader: BufferReader) -> InputPeer? { + public static func parse_inputPeerUser(_ reader: BufferReader) -> InputPeer? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -8799,7 +8731,7 @@ extension Api { return nil } } - static func parse_inputPeerChannel(_ reader: BufferReader) -> InputPeer? { + public static func parse_inputPeerChannel(_ reader: BufferReader) -> InputPeer? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -8815,10 +8747,10 @@ extension Api { } } - enum Contact: TypeConstructorDescription { + public enum Contact: TypeConstructorDescription { case contact(userId: Int32, mutual: Api.Bool) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .contact(let userId, let mutual): if boxed { @@ -8830,14 +8762,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .contact(let userId, let mutual): return ("contact", [("userId", userId), ("mutual", mutual)]) } } - static func parse_contact(_ reader: BufferReader) -> Contact? { + public static func parse_contact(_ reader: BufferReader) -> Contact? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Bool? @@ -8855,10 +8787,10 @@ extension Api { } } - enum FileHash: TypeConstructorDescription { + public enum FileHash: TypeConstructorDescription { case fileHash(offset: Int32, limit: Int32, hash: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .fileHash(let offset, let limit, let hash): if boxed { @@ -8871,14 +8803,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .fileHash(let offset, let limit, let hash): return ("fileHash", [("offset", offset), ("limit", limit), ("hash", hash)]) } } - static func parse_fileHash(_ reader: BufferReader) -> FileHash? { + public static func parse_fileHash(_ reader: BufferReader) -> FileHash? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -8897,11 +8829,11 @@ extension Api { } } - enum BotInlineResult: TypeConstructorDescription { + public enum BotInlineResult: TypeConstructorDescription { case botInlineMediaResult(flags: Int32, id: String, type: String, photo: Api.Photo?, document: Api.Document?, title: String?, description: String?, sendMessage: Api.BotInlineMessage) case botInlineResult(flags: Int32, id: String, type: String, title: String?, description: String?, url: String?, thumb: Api.WebDocument?, content: Api.WebDocument?, sendMessage: Api.BotInlineMessage) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .botInlineMediaResult(let flags, let id, let type, let photo, let document, let title, let description, let sendMessage): if boxed { @@ -8933,7 +8865,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .botInlineMediaResult(let flags, let id, let type, let photo, let document, let title, let description, let sendMessage): return ("botInlineMediaResult", [("flags", flags), ("id", id), ("type", type), ("photo", photo), ("document", document), ("title", title), ("description", description), ("sendMessage", sendMessage)]) @@ -8942,7 +8874,7 @@ extension Api { } } - static func parse_botInlineMediaResult(_ reader: BufferReader) -> BotInlineResult? { + public static func parse_botInlineMediaResult(_ reader: BufferReader) -> BotInlineResult? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -8980,7 +8912,7 @@ extension Api { return nil } } - static func parse_botInlineResult(_ reader: BufferReader) -> BotInlineResult? { + public static func parse_botInlineResult(_ reader: BufferReader) -> BotInlineResult? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -9023,10 +8955,10 @@ extension Api { } } - enum InputSingleMedia: TypeConstructorDescription { + public enum InputSingleMedia: TypeConstructorDescription { case inputSingleMedia(flags: Int32, media: Api.InputMedia, randomId: Int64, message: String, entities: [Api.MessageEntity]?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputSingleMedia(let flags, let media, let randomId, let message, let entities): if boxed { @@ -9045,14 +8977,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputSingleMedia(let flags, let media, let randomId, let message, let entities): return ("inputSingleMedia", [("flags", flags), ("media", media), ("randomId", randomId), ("message", message), ("entities", entities)]) } } - static func parse_inputSingleMedia(_ reader: BufferReader) -> InputSingleMedia? { + public static func parse_inputSingleMedia(_ reader: BufferReader) -> InputSingleMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputMedia? @@ -9081,7 +9013,7 @@ extension Api { } } - enum InputPrivacyRule: TypeConstructorDescription { + public enum InputPrivacyRule: TypeConstructorDescription { case inputPrivacyValueAllowContacts case inputPrivacyValueAllowAll case inputPrivacyValueAllowUsers(users: [Api.InputUser]) @@ -9091,7 +9023,7 @@ extension Api { case inputPrivacyValueAllowChatParticipants(chats: [Int32]) case inputPrivacyValueDisallowChatParticipants(chats: [Int32]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPrivacyValueAllowContacts: if boxed { @@ -9160,7 +9092,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPrivacyValueAllowContacts: return ("inputPrivacyValueAllowContacts", []) @@ -9181,13 +9113,13 @@ extension Api { } } - static func parse_inputPrivacyValueAllowContacts(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueAllowContacts(_ reader: BufferReader) -> InputPrivacyRule? { return Api.InputPrivacyRule.inputPrivacyValueAllowContacts } - static func parse_inputPrivacyValueAllowAll(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueAllowAll(_ reader: BufferReader) -> InputPrivacyRule? { return Api.InputPrivacyRule.inputPrivacyValueAllowAll } - static func parse_inputPrivacyValueAllowUsers(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueAllowUsers(_ reader: BufferReader) -> InputPrivacyRule? { var _1: [Api.InputUser]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputUser.self) @@ -9200,13 +9132,13 @@ extension Api { return nil } } - static func parse_inputPrivacyValueDisallowContacts(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueDisallowContacts(_ reader: BufferReader) -> InputPrivacyRule? { return Api.InputPrivacyRule.inputPrivacyValueDisallowContacts } - static func parse_inputPrivacyValueDisallowAll(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueDisallowAll(_ reader: BufferReader) -> InputPrivacyRule? { return Api.InputPrivacyRule.inputPrivacyValueDisallowAll } - static func parse_inputPrivacyValueDisallowUsers(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueDisallowUsers(_ reader: BufferReader) -> InputPrivacyRule? { var _1: [Api.InputUser]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputUser.self) @@ -9219,7 +9151,7 @@ extension Api { return nil } } - static func parse_inputPrivacyValueAllowChatParticipants(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueAllowChatParticipants(_ reader: BufferReader) -> InputPrivacyRule? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -9232,7 +9164,7 @@ extension Api { return nil } } - static func parse_inputPrivacyValueDisallowChatParticipants(_ reader: BufferReader) -> InputPrivacyRule? { + public static func parse_inputPrivacyValueDisallowChatParticipants(_ reader: BufferReader) -> InputPrivacyRule? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -9247,7 +9179,7 @@ extension Api { } } - enum ChannelAdminLogEventAction: TypeConstructorDescription { + public enum ChannelAdminLogEventAction: TypeConstructorDescription { case channelAdminLogEventActionChangeTitle(prevValue: String, newValue: String) case channelAdminLogEventActionChangeAbout(prevValue: String, newValue: String) case channelAdminLogEventActionChangeUsername(prevValue: String, newValue: String) @@ -9267,8 +9199,9 @@ extension Api { case channelAdminLogEventActionStopPoll(message: Api.Message) case channelAdminLogEventActionChangePhoto(prevPhoto: Api.Photo, newPhoto: Api.Photo) case channelAdminLogEventActionChangeLinkedChat(prevValue: Int32, newValue: Int32) + case channelAdminLogEventActionChangeLocation(prevValue: Api.ChannelLocation, newValue: Api.ChannelLocation) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelAdminLogEventActionChangeTitle(let prevValue, let newValue): if boxed { @@ -9394,10 +9327,17 @@ extension Api { serializeInt32(prevValue, buffer: buffer, boxed: false) serializeInt32(newValue, buffer: buffer, boxed: false) break + case .channelAdminLogEventActionChangeLocation(let prevValue, let newValue): + if boxed { + buffer.appendInt32(241923758) + } + prevValue.serialize(buffer, true) + newValue.serialize(buffer, true) + break } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelAdminLogEventActionChangeTitle(let prevValue, let newValue): return ("channelAdminLogEventActionChangeTitle", [("prevValue", prevValue), ("newValue", newValue)]) @@ -9437,10 +9377,12 @@ extension Api { return ("channelAdminLogEventActionChangePhoto", [("prevPhoto", prevPhoto), ("newPhoto", newPhoto)]) case .channelAdminLogEventActionChangeLinkedChat(let prevValue, let newValue): return ("channelAdminLogEventActionChangeLinkedChat", [("prevValue", prevValue), ("newValue", newValue)]) + case .channelAdminLogEventActionChangeLocation(let prevValue, let newValue): + return ("channelAdminLogEventActionChangeLocation", [("prevValue", prevValue), ("newValue", newValue)]) } } - static func parse_channelAdminLogEventActionChangeTitle(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionChangeTitle(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: String? _1 = parseString(reader) var _2: String? @@ -9454,7 +9396,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionChangeAbout(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionChangeAbout(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: String? _1 = parseString(reader) var _2: String? @@ -9468,7 +9410,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionChangeUsername(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionChangeUsername(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: String? _1 = parseString(reader) var _2: String? @@ -9482,7 +9424,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionToggleInvites(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionToggleInvites(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Bool? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Bool @@ -9495,7 +9437,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionToggleSignatures(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionToggleSignatures(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Bool? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Bool @@ -9508,7 +9450,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionUpdatePinned(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionUpdatePinned(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -9521,7 +9463,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionEditMessage(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionEditMessage(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -9539,7 +9481,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionDeleteMessage(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionDeleteMessage(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -9552,13 +9494,13 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionParticipantJoin(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionParticipantJoin(_ reader: BufferReader) -> ChannelAdminLogEventAction? { return Api.ChannelAdminLogEventAction.channelAdminLogEventActionParticipantJoin } - static func parse_channelAdminLogEventActionParticipantLeave(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionParticipantLeave(_ reader: BufferReader) -> ChannelAdminLogEventAction? { return Api.ChannelAdminLogEventAction.channelAdminLogEventActionParticipantLeave } - static func parse_channelAdminLogEventActionParticipantInvite(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionParticipantInvite(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.ChannelParticipant? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant @@ -9571,7 +9513,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionParticipantToggleBan(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionParticipantToggleBan(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.ChannelParticipant? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant @@ -9589,7 +9531,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionParticipantToggleAdmin(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionParticipantToggleAdmin(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.ChannelParticipant? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant @@ -9607,7 +9549,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionChangeStickerSet(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionChangeStickerSet(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.InputStickerSet? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputStickerSet @@ -9625,7 +9567,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionTogglePreHistoryHidden(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionTogglePreHistoryHidden(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Bool? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Bool @@ -9638,7 +9580,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionDefaultBannedRights(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionDefaultBannedRights(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.ChatBannedRights? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.ChatBannedRights @@ -9656,7 +9598,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionStopPoll(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionStopPoll(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Message? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Message @@ -9669,7 +9611,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionChangePhoto(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionChangePhoto(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Api.Photo? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Photo @@ -9687,7 +9629,7 @@ extension Api { return nil } } - static func parse_channelAdminLogEventActionChangeLinkedChat(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + public static func parse_channelAdminLogEventActionChangeLinkedChat(_ reader: BufferReader) -> ChannelAdminLogEventAction? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -9701,13 +9643,31 @@ extension Api { return nil } } + public static func parse_channelAdminLogEventActionChangeLocation(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + var _1: Api.ChannelLocation? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.ChannelLocation + } + var _2: Api.ChannelLocation? + if let signature = reader.readInt32() { + _2 = Api.parse(reader, signature: signature) as? Api.ChannelLocation + } + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.ChannelAdminLogEventAction.channelAdminLogEventActionChangeLocation(prevValue: _1!, newValue: _2!) + } + else { + return nil + } + } } - enum SecurePlainData: TypeConstructorDescription { + public enum SecurePlainData: TypeConstructorDescription { case securePlainPhone(phone: String) case securePlainEmail(email: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .securePlainPhone(let phone): if boxed { @@ -9724,7 +9684,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .securePlainPhone(let phone): return ("securePlainPhone", [("phone", phone)]) @@ -9733,7 +9693,7 @@ extension Api { } } - static func parse_securePlainPhone(_ reader: BufferReader) -> SecurePlainData? { + public static func parse_securePlainPhone(_ reader: BufferReader) -> SecurePlainData? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -9744,7 +9704,7 @@ extension Api { return nil } } - static func parse_securePlainEmail(_ reader: BufferReader) -> SecurePlainData? { + public static func parse_securePlainEmail(_ reader: BufferReader) -> SecurePlainData? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -9757,10 +9717,10 @@ extension Api { } } - enum PageTableCell: TypeConstructorDescription { + public enum PageTableCell: TypeConstructorDescription { case pageTableCell(flags: Int32, text: Api.RichText?, colspan: Int32?, rowspan: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pageTableCell(let flags, let text, let colspan, let rowspan): if boxed { @@ -9774,14 +9734,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pageTableCell(let flags, let text, let colspan, let rowspan): return ("pageTableCell", [("flags", flags), ("text", text), ("colspan", colspan), ("rowspan", rowspan)]) } } - static func parse_pageTableCell(_ reader: BufferReader) -> PageTableCell? { + public static func parse_pageTableCell(_ reader: BufferReader) -> PageTableCell? { var _1: Int32? _1 = reader.readInt32() var _2: Api.RichText? @@ -9805,10 +9765,10 @@ extension Api { } } - enum ChatBannedRights: TypeConstructorDescription { + public enum ChatBannedRights: TypeConstructorDescription { case chatBannedRights(flags: Int32, untilDate: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatBannedRights(let flags, let untilDate): if boxed { @@ -9820,14 +9780,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatBannedRights(let flags, let untilDate): return ("chatBannedRights", [("flags", flags), ("untilDate", untilDate)]) } } - static func parse_chatBannedRights(_ reader: BufferReader) -> ChatBannedRights? { + public static func parse_chatBannedRights(_ reader: BufferReader) -> ChatBannedRights? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -9843,10 +9803,10 @@ extension Api { } } - enum LabeledPrice: TypeConstructorDescription { + public enum LabeledPrice: TypeConstructorDescription { case labeledPrice(label: String, amount: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .labeledPrice(let label, let amount): if boxed { @@ -9858,14 +9818,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .labeledPrice(let label, let amount): return ("labeledPrice", [("label", label), ("amount", amount)]) } } - static func parse_labeledPrice(_ reader: BufferReader) -> LabeledPrice? { + public static func parse_labeledPrice(_ reader: BufferReader) -> LabeledPrice? { var _1: String? _1 = parseString(reader) var _2: Int64? @@ -9881,10 +9841,10 @@ extension Api { } } - enum InputSecureValue: TypeConstructorDescription { + public enum InputSecureValue: TypeConstructorDescription { case inputSecureValue(flags: Int32, type: Api.SecureValueType, data: Api.SecureData?, frontSide: Api.InputSecureFile?, reverseSide: Api.InputSecureFile?, selfie: Api.InputSecureFile?, translation: [Api.InputSecureFile]?, files: [Api.InputSecureFile]?, plainData: Api.SecurePlainData?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputSecureValue(let flags, let type, let data, let frontSide, let reverseSide, let selfie, let translation, let files, let plainData): if boxed { @@ -9911,14 +9871,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputSecureValue(let flags, let type, let data, let frontSide, let reverseSide, let selfie, let translation, let files, let plainData): return ("inputSecureValue", [("flags", flags), ("type", type), ("data", data), ("frontSide", frontSide), ("reverseSide", reverseSide), ("selfie", selfie), ("translation", translation), ("files", files), ("plainData", plainData)]) } } - static func parse_inputSecureValue(_ reader: BufferReader) -> InputSecureValue? { + public static func parse_inputSecureValue(_ reader: BufferReader) -> InputSecureValue? { var _1: Int32? _1 = reader.readInt32() var _2: Api.SecureValueType? @@ -9971,15 +9931,16 @@ extension Api { } } - enum ReportReason: TypeConstructorDescription { + public enum ReportReason: TypeConstructorDescription { case inputReportReasonSpam case inputReportReasonViolence case inputReportReasonPornography case inputReportReasonOther(text: String) case inputReportReasonCopyright case inputReportReasonChildAbuse + case inputReportReasonGeoIrrelevant - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputReportReasonSpam: if boxed { @@ -10016,11 +9977,17 @@ extension Api { buffer.appendInt32(-1376497949) } + break + case .inputReportReasonGeoIrrelevant: + if boxed { + buffer.appendInt32(-606798099) + } + break } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputReportReasonSpam: return ("inputReportReasonSpam", []) @@ -10034,19 +10001,21 @@ extension Api { return ("inputReportReasonCopyright", []) case .inputReportReasonChildAbuse: return ("inputReportReasonChildAbuse", []) + case .inputReportReasonGeoIrrelevant: + return ("inputReportReasonGeoIrrelevant", []) } } - static func parse_inputReportReasonSpam(_ reader: BufferReader) -> ReportReason? { + public static func parse_inputReportReasonSpam(_ reader: BufferReader) -> ReportReason? { return Api.ReportReason.inputReportReasonSpam } - static func parse_inputReportReasonViolence(_ reader: BufferReader) -> ReportReason? { + public static func parse_inputReportReasonViolence(_ reader: BufferReader) -> ReportReason? { return Api.ReportReason.inputReportReasonViolence } - static func parse_inputReportReasonPornography(_ reader: BufferReader) -> ReportReason? { + public static func parse_inputReportReasonPornography(_ reader: BufferReader) -> ReportReason? { return Api.ReportReason.inputReportReasonPornography } - static func parse_inputReportReasonOther(_ reader: BufferReader) -> ReportReason? { + public static func parse_inputReportReasonOther(_ reader: BufferReader) -> ReportReason? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -10057,18 +10026,21 @@ extension Api { return nil } } - static func parse_inputReportReasonCopyright(_ reader: BufferReader) -> ReportReason? { + public static func parse_inputReportReasonCopyright(_ reader: BufferReader) -> ReportReason? { return Api.ReportReason.inputReportReasonCopyright } - static func parse_inputReportReasonChildAbuse(_ reader: BufferReader) -> ReportReason? { + public static func parse_inputReportReasonChildAbuse(_ reader: BufferReader) -> ReportReason? { return Api.ReportReason.inputReportReasonChildAbuse } + public static func parse_inputReportReasonGeoIrrelevant(_ reader: BufferReader) -> ReportReason? { + return Api.ReportReason.inputReportReasonGeoIrrelevant + } } - enum InputEncryptedChat: TypeConstructorDescription { + public enum InputEncryptedChat: TypeConstructorDescription { case inputEncryptedChat(chatId: Int32, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputEncryptedChat(let chatId, let accessHash): if boxed { @@ -10080,14 +10052,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputEncryptedChat(let chatId, let accessHash): return ("inputEncryptedChat", [("chatId", chatId), ("accessHash", accessHash)]) } } - static func parse_inputEncryptedChat(_ reader: BufferReader) -> InputEncryptedChat? { + public static func parse_inputEncryptedChat(_ reader: BufferReader) -> InputEncryptedChat? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -10103,10 +10075,10 @@ extension Api { } } - enum PageTableRow: TypeConstructorDescription { + public enum PageTableRow: TypeConstructorDescription { case pageTableRow(cells: [Api.PageTableCell]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pageTableRow(let cells): if boxed { @@ -10121,14 +10093,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pageTableRow(let cells): return ("pageTableRow", [("cells", cells)]) } } - static func parse_pageTableRow(_ reader: BufferReader) -> PageTableRow? { + public static func parse_pageTableRow(_ reader: BufferReader) -> PageTableRow? { var _1: [Api.PageTableCell]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageTableCell.self) @@ -10143,11 +10115,11 @@ extension Api { } } - enum DraftMessage: TypeConstructorDescription { + public enum DraftMessage: TypeConstructorDescription { case draftMessage(flags: Int32, replyToMsgId: Int32?, message: String, entities: [Api.MessageEntity]?, date: Int32) case draftMessageEmpty(flags: Int32, date: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .draftMessage(let flags, let replyToMsgId, let message, let entities, let date): if boxed { @@ -10173,7 +10145,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .draftMessage(let flags, let replyToMsgId, let message, let entities, let date): return ("draftMessage", [("flags", flags), ("replyToMsgId", replyToMsgId), ("message", message), ("entities", entities), ("date", date)]) @@ -10182,7 +10154,7 @@ extension Api { } } - static func parse_draftMessage(_ reader: BufferReader) -> DraftMessage? { + public static func parse_draftMessage(_ reader: BufferReader) -> DraftMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -10207,7 +10179,7 @@ extension Api { return nil } } - static func parse_draftMessageEmpty(_ reader: BufferReader) -> DraftMessage? { + public static func parse_draftMessageEmpty(_ reader: BufferReader) -> DraftMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -10223,11 +10195,11 @@ extension Api { } } - enum EncryptedFile: TypeConstructorDescription { + public enum EncryptedFile: TypeConstructorDescription { case encryptedFileEmpty case encryptedFile(id: Int64, accessHash: Int64, size: Int32, dcId: Int32, keyFingerprint: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .encryptedFileEmpty: if boxed { @@ -10248,7 +10220,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .encryptedFileEmpty: return ("encryptedFileEmpty", []) @@ -10257,10 +10229,10 @@ extension Api { } } - static func parse_encryptedFileEmpty(_ reader: BufferReader) -> EncryptedFile? { + public static func parse_encryptedFileEmpty(_ reader: BufferReader) -> EncryptedFile? { return Api.EncryptedFile.encryptedFileEmpty } - static func parse_encryptedFile(_ reader: BufferReader) -> EncryptedFile? { + public static func parse_encryptedFile(_ reader: BufferReader) -> EncryptedFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -10285,7 +10257,7 @@ extension Api { } } - enum SecureValueError: TypeConstructorDescription { + public enum SecureValueError: TypeConstructorDescription { case secureValueErrorData(type: Api.SecureValueType, dataHash: Buffer, field: String, text: String) case secureValueErrorFrontSide(type: Api.SecureValueType, fileHash: Buffer, text: String) case secureValueErrorReverseSide(type: Api.SecureValueType, fileHash: Buffer, text: String) @@ -10296,7 +10268,7 @@ extension Api { case secureValueErrorTranslationFile(type: Api.SecureValueType, fileHash: Buffer, text: String) case secureValueErrorTranslationFiles(type: Api.SecureValueType, fileHash: [Buffer], text: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureValueErrorData(let type, let dataHash, let field, let text): if boxed { @@ -10382,7 +10354,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureValueErrorData(let type, let dataHash, let field, let text): return ("secureValueErrorData", [("type", type), ("dataHash", dataHash), ("field", field), ("text", text)]) @@ -10405,7 +10377,7 @@ extension Api { } } - static func parse_secureValueErrorData(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorData(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10427,7 +10399,7 @@ extension Api { return nil } } - static func parse_secureValueErrorFrontSide(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorFrontSide(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10446,7 +10418,7 @@ extension Api { return nil } } - static func parse_secureValueErrorReverseSide(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorReverseSide(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10465,7 +10437,7 @@ extension Api { return nil } } - static func parse_secureValueErrorSelfie(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorSelfie(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10484,7 +10456,7 @@ extension Api { return nil } } - static func parse_secureValueErrorFile(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorFile(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10503,7 +10475,7 @@ extension Api { return nil } } - static func parse_secureValueErrorFiles(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorFiles(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10524,7 +10496,7 @@ extension Api { return nil } } - static func parse_secureValueError(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueError(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10543,7 +10515,7 @@ extension Api { return nil } } - static func parse_secureValueErrorTranslationFile(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorTranslationFile(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10562,7 +10534,7 @@ extension Api { return nil } } - static func parse_secureValueErrorTranslationFiles(_ reader: BufferReader) -> SecureValueError? { + public static func parse_secureValueErrorTranslationFiles(_ reader: BufferReader) -> SecureValueError? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -10585,13 +10557,13 @@ extension Api { } } - enum NotifyPeer: TypeConstructorDescription { + public enum NotifyPeer: TypeConstructorDescription { case notifyPeer(peer: Api.Peer) case notifyUsers case notifyChats case notifyBroadcasts - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .notifyPeer(let peer): if boxed { @@ -10620,7 +10592,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .notifyPeer(let peer): return ("notifyPeer", [("peer", peer)]) @@ -10633,7 +10605,7 @@ extension Api { } } - static func parse_notifyPeer(_ reader: BufferReader) -> NotifyPeer? { + public static func parse_notifyPeer(_ reader: BufferReader) -> NotifyPeer? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -10646,18 +10618,18 @@ extension Api { return nil } } - static func parse_notifyUsers(_ reader: BufferReader) -> NotifyPeer? { + public static func parse_notifyUsers(_ reader: BufferReader) -> NotifyPeer? { return Api.NotifyPeer.notifyUsers } - static func parse_notifyChats(_ reader: BufferReader) -> NotifyPeer? { + public static func parse_notifyChats(_ reader: BufferReader) -> NotifyPeer? { return Api.NotifyPeer.notifyChats } - static func parse_notifyBroadcasts(_ reader: BufferReader) -> NotifyPeer? { + public static func parse_notifyBroadcasts(_ reader: BufferReader) -> NotifyPeer? { return Api.NotifyPeer.notifyBroadcasts } } - enum InputPrivacyKey: TypeConstructorDescription { + public enum InputPrivacyKey: TypeConstructorDescription { case inputPrivacyKeyStatusTimestamp case inputPrivacyKeyChatInvite case inputPrivacyKeyPhoneCall @@ -10666,7 +10638,7 @@ extension Api { case inputPrivacyKeyProfilePhoto case inputPrivacyKeyPhoneNumber - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPrivacyKeyStatusTimestamp: if boxed { @@ -10713,7 +10685,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPrivacyKeyStatusTimestamp: return ("inputPrivacyKeyStatusTimestamp", []) @@ -10732,36 +10704,36 @@ extension Api { } } - static func parse_inputPrivacyKeyStatusTimestamp(_ reader: BufferReader) -> InputPrivacyKey? { + public static func parse_inputPrivacyKeyStatusTimestamp(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyStatusTimestamp } - static func parse_inputPrivacyKeyChatInvite(_ reader: BufferReader) -> InputPrivacyKey? { + public static func parse_inputPrivacyKeyChatInvite(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyChatInvite } - static func parse_inputPrivacyKeyPhoneCall(_ reader: BufferReader) -> InputPrivacyKey? { + public static func parse_inputPrivacyKeyPhoneCall(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyPhoneCall } - static func parse_inputPrivacyKeyPhoneP2P(_ reader: BufferReader) -> InputPrivacyKey? { + public static func parse_inputPrivacyKeyPhoneP2P(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyPhoneP2P } - static func parse_inputPrivacyKeyForwards(_ reader: BufferReader) -> InputPrivacyKey? { + public static func parse_inputPrivacyKeyForwards(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyForwards } - static func parse_inputPrivacyKeyProfilePhoto(_ reader: BufferReader) -> InputPrivacyKey? { + public static func parse_inputPrivacyKeyProfilePhoto(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyProfilePhoto } - static func parse_inputPrivacyKeyPhoneNumber(_ reader: BufferReader) -> InputPrivacyKey? { + public static func parse_inputPrivacyKeyPhoneNumber(_ reader: BufferReader) -> InputPrivacyKey? { return Api.InputPrivacyKey.inputPrivacyKeyPhoneNumber } } - enum ReplyMarkup: TypeConstructorDescription { + public enum ReplyMarkup: TypeConstructorDescription { case replyKeyboardHide(flags: Int32) case replyKeyboardForceReply(flags: Int32) case replyKeyboardMarkup(flags: Int32, rows: [Api.KeyboardButtonRow]) case replyInlineMarkup(rows: [Api.KeyboardButtonRow]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .replyKeyboardHide(let flags): if boxed { @@ -10799,7 +10771,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .replyKeyboardHide(let flags): return ("replyKeyboardHide", [("flags", flags)]) @@ -10812,7 +10784,7 @@ extension Api { } } - static func parse_replyKeyboardHide(_ reader: BufferReader) -> ReplyMarkup? { + public static func parse_replyKeyboardHide(_ reader: BufferReader) -> ReplyMarkup? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -10823,7 +10795,7 @@ extension Api { return nil } } - static func parse_replyKeyboardForceReply(_ reader: BufferReader) -> ReplyMarkup? { + public static func parse_replyKeyboardForceReply(_ reader: BufferReader) -> ReplyMarkup? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -10834,7 +10806,7 @@ extension Api { return nil } } - static func parse_replyKeyboardMarkup(_ reader: BufferReader) -> ReplyMarkup? { + public static func parse_replyKeyboardMarkup(_ reader: BufferReader) -> ReplyMarkup? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.KeyboardButtonRow]? @@ -10850,7 +10822,7 @@ extension Api { return nil } } - static func parse_replyInlineMarkup(_ reader: BufferReader) -> ReplyMarkup? { + public static func parse_replyInlineMarkup(_ reader: BufferReader) -> ReplyMarkup? { var _1: [Api.KeyboardButtonRow]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.KeyboardButtonRow.self) @@ -10865,10 +10837,10 @@ extension Api { } } - enum EmojiKeywordsDifference: TypeConstructorDescription { + public enum EmojiKeywordsDifference: TypeConstructorDescription { case emojiKeywordsDifference(langCode: String, fromVersion: Int32, version: Int32, keywords: [Api.EmojiKeyword]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .emojiKeywordsDifference(let langCode, let fromVersion, let version, let keywords): if boxed { @@ -10886,14 +10858,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .emojiKeywordsDifference(let langCode, let fromVersion, let version, let keywords): return ("emojiKeywordsDifference", [("langCode", langCode), ("fromVersion", fromVersion), ("version", version), ("keywords", keywords)]) } } - static func parse_emojiKeywordsDifference(_ reader: BufferReader) -> EmojiKeywordsDifference? { + public static func parse_emojiKeywordsDifference(_ reader: BufferReader) -> EmojiKeywordsDifference? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -10917,10 +10889,10 @@ extension Api { } } - enum HighScore: TypeConstructorDescription { + public enum HighScore: TypeConstructorDescription { case highScore(pos: Int32, userId: Int32, score: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .highScore(let pos, let userId, let score): if boxed { @@ -10933,14 +10905,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .highScore(let pos, let userId, let score): return ("highScore", [("pos", pos), ("userId", userId), ("score", score)]) } } - static func parse_highScore(_ reader: BufferReader) -> HighScore? { + public static func parse_highScore(_ reader: BufferReader) -> HighScore? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -10959,10 +10931,10 @@ extension Api { } } - enum TopPeer: TypeConstructorDescription { + public enum TopPeer: TypeConstructorDescription { case topPeer(peer: Api.Peer, rating: Double) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .topPeer(let peer, let rating): if boxed { @@ -10974,14 +10946,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .topPeer(let peer, let rating): return ("topPeer", [("peer", peer), ("rating", rating)]) } } - static func parse_topPeer(_ reader: BufferReader) -> TopPeer? { + public static func parse_topPeer(_ reader: BufferReader) -> TopPeer? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -10999,10 +10971,10 @@ extension Api { } } - enum SecureValue: TypeConstructorDescription { + public enum SecureValue: TypeConstructorDescription { case secureValue(flags: Int32, type: Api.SecureValueType, data: Api.SecureData?, frontSide: Api.SecureFile?, reverseSide: Api.SecureFile?, selfie: Api.SecureFile?, translation: [Api.SecureFile]?, files: [Api.SecureFile]?, plainData: Api.SecurePlainData?, hash: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureValue(let flags, let type, let data, let frontSide, let reverseSide, let selfie, let translation, let files, let plainData, let hash): if boxed { @@ -11030,14 +11002,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureValue(let flags, let type, let data, let frontSide, let reverseSide, let selfie, let translation, let files, let plainData, let hash): return ("secureValue", [("flags", flags), ("type", type), ("data", data), ("frontSide", frontSide), ("reverseSide", reverseSide), ("selfie", selfie), ("translation", translation), ("files", files), ("plainData", plainData), ("hash", hash)]) } } - static func parse_secureValue(_ reader: BufferReader) -> SecureValue? { + public static func parse_secureValue(_ reader: BufferReader) -> SecureValue? { var _1: Int32? _1 = reader.readInt32() var _2: Api.SecureValueType? @@ -11093,10 +11065,10 @@ extension Api { } } - enum SecureValueHash: TypeConstructorDescription { + public enum SecureValueHash: TypeConstructorDescription { case secureValueHash(type: Api.SecureValueType, hash: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureValueHash(let type, let hash): if boxed { @@ -11108,14 +11080,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureValueHash(let type, let hash): return ("secureValueHash", [("type", type), ("hash", hash)]) } } - static func parse_secureValueHash(_ reader: BufferReader) -> SecureValueHash? { + public static func parse_secureValueHash(_ reader: BufferReader) -> SecureValueHash? { var _1: Api.SecureValueType? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.SecureValueType @@ -11133,10 +11105,10 @@ extension Api { } } - enum ContactBlocked: TypeConstructorDescription { + public enum ContactBlocked: TypeConstructorDescription { case contactBlocked(userId: Int32, date: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .contactBlocked(let userId, let date): if boxed { @@ -11148,14 +11120,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .contactBlocked(let userId, let date): return ("contactBlocked", [("userId", userId), ("date", date)]) } } - static func parse_contactBlocked(_ reader: BufferReader) -> ContactBlocked? { + public static func parse_contactBlocked(_ reader: BufferReader) -> ContactBlocked? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -11171,11 +11143,11 @@ extension Api { } } - enum PageListItem: TypeConstructorDescription { + public enum PageListItem: TypeConstructorDescription { case pageListItemText(text: Api.RichText) case pageListItemBlocks(blocks: [Api.PageBlock]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pageListItemText(let text): if boxed { @@ -11196,7 +11168,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pageListItemText(let text): return ("pageListItemText", [("text", text)]) @@ -11205,7 +11177,7 @@ extension Api { } } - static func parse_pageListItemText(_ reader: BufferReader) -> PageListItem? { + public static func parse_pageListItemText(_ reader: BufferReader) -> PageListItem? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -11218,7 +11190,7 @@ extension Api { return nil } } - static func parse_pageListItemBlocks(_ reader: BufferReader) -> PageListItem? { + public static func parse_pageListItemBlocks(_ reader: BufferReader) -> PageListItem? { var _1: [Api.PageBlock]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageBlock.self) @@ -11233,12 +11205,12 @@ extension Api { } } - enum InputUser: TypeConstructorDescription { + public enum InputUser: TypeConstructorDescription { case inputUserEmpty case inputUserSelf case inputUser(userId: Int32, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputUserEmpty: if boxed { @@ -11262,7 +11234,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputUserEmpty: return ("inputUserEmpty", []) @@ -11273,13 +11245,13 @@ extension Api { } } - static func parse_inputUserEmpty(_ reader: BufferReader) -> InputUser? { + public static func parse_inputUserEmpty(_ reader: BufferReader) -> InputUser? { return Api.InputUser.inputUserEmpty } - static func parse_inputUserSelf(_ reader: BufferReader) -> InputUser? { + public static func parse_inputUserSelf(_ reader: BufferReader) -> InputUser? { return Api.InputUser.inputUserSelf } - static func parse_inputUser(_ reader: BufferReader) -> InputUser? { + public static func parse_inputUser(_ reader: BufferReader) -> InputUser? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -11295,10 +11267,10 @@ extension Api { } } - enum Page: TypeConstructorDescription { + public enum Page: TypeConstructorDescription { case page(flags: Int32, url: String, blocks: [Api.PageBlock], photos: [Api.Photo], documents: [Api.Document]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .page(let flags, let url, let blocks, let photos, let documents): if boxed { @@ -11325,14 +11297,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .page(let flags, let url, let blocks, let photos, let documents): return ("page", [("flags", flags), ("url", url), ("blocks", blocks), ("photos", photos), ("documents", documents)]) } } - static func parse_page(_ reader: BufferReader) -> Page? { + public static func parse_page(_ reader: BufferReader) -> Page? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -11363,10 +11335,10 @@ extension Api { } } - enum SecureCredentialsEncrypted: TypeConstructorDescription { + public enum SecureCredentialsEncrypted: TypeConstructorDescription { case secureCredentialsEncrypted(data: Buffer, hash: Buffer, secret: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureCredentialsEncrypted(let data, let hash, let secret): if boxed { @@ -11379,14 +11351,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureCredentialsEncrypted(let data, let hash, let secret): return ("secureCredentialsEncrypted", [("data", data), ("hash", hash), ("secret", secret)]) } } - static func parse_secureCredentialsEncrypted(_ reader: BufferReader) -> SecureCredentialsEncrypted? { + public static func parse_secureCredentialsEncrypted(_ reader: BufferReader) -> SecureCredentialsEncrypted? { var _1: Buffer? _1 = parseBytes(reader) var _2: Buffer? @@ -11405,10 +11377,62 @@ extension Api { } } - enum MessageRange: TypeConstructorDescription { + public enum ChannelLocation: TypeConstructorDescription { + case channelLocationEmpty + case channelLocation(geoPoint: Api.GeoPoint, address: String) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .channelLocationEmpty: + if boxed { + buffer.appendInt32(-1078612597) + } + + break + case .channelLocation(let geoPoint, let address): + if boxed { + buffer.appendInt32(547062491) + } + geoPoint.serialize(buffer, true) + serializeString(address, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .channelLocationEmpty: + return ("channelLocationEmpty", []) + case .channelLocation(let geoPoint, let address): + return ("channelLocation", [("geoPoint", geoPoint), ("address", address)]) + } + } + + public static func parse_channelLocationEmpty(_ reader: BufferReader) -> ChannelLocation? { + return Api.ChannelLocation.channelLocationEmpty + } + public static func parse_channelLocation(_ reader: BufferReader) -> ChannelLocation? { + var _1: Api.GeoPoint? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.GeoPoint + } + var _2: String? + _2 = parseString(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.ChannelLocation.channelLocation(geoPoint: _1!, address: _2!) + } + else { + return nil + } + } + + } + public enum MessageRange: TypeConstructorDescription { case messageRange(minId: Int32, maxId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageRange(let minId, let maxId): if boxed { @@ -11420,14 +11444,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageRange(let minId, let maxId): return ("messageRange", [("minId", minId), ("maxId", maxId)]) } } - static func parse_messageRange(_ reader: BufferReader) -> MessageRange? { + public static func parse_messageRange(_ reader: BufferReader) -> MessageRange? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -11443,10 +11467,10 @@ extension Api { } } - enum Config: TypeConstructorDescription { + public enum Config: TypeConstructorDescription { case config(flags: Int32, date: Int32, expires: Int32, testMode: Api.Bool, thisDc: Int32, dcOptions: [Api.DcOption], dcTxtDomainName: String, chatSizeMax: Int32, megagroupSizeMax: Int32, forwardedCountMax: Int32, onlineUpdatePeriodMs: Int32, offlineBlurTimeoutMs: Int32, offlineIdleTimeoutMs: Int32, onlineCloudTimeoutMs: Int32, notifyCloudDelayMs: Int32, notifyDefaultDelayMs: Int32, pushChatPeriodMs: Int32, pushChatLimit: Int32, savedGifsLimit: Int32, editTimeLimit: Int32, revokeTimeLimit: Int32, revokePmTimeLimit: Int32, ratingEDecay: Int32, stickersRecentLimit: Int32, stickersFavedLimit: Int32, channelsReadMediaPeriod: Int32, tmpSessions: Int32?, pinnedDialogsCountMax: Int32, pinnedInfolderCountMax: Int32, callReceiveTimeoutMs: Int32, callRingTimeoutMs: Int32, callConnectTimeoutMs: Int32, callPacketTimeoutMs: Int32, meUrlPrefix: String, autoupdateUrlPrefix: String?, gifSearchUsername: String?, venueSearchUsername: String?, imgSearchUsername: String?, staticMapsProvider: String?, captionLengthMax: Int32, messageLengthMax: Int32, webfileDcId: Int32, suggestedLangCode: String?, langPackVersion: Int32?, baseLangPackVersion: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .config(let flags, let date, let expires, let testMode, let thisDc, let dcOptions, let dcTxtDomainName, let chatSizeMax, let megagroupSizeMax, let forwardedCountMax, let onlineUpdatePeriodMs, let offlineBlurTimeoutMs, let offlineIdleTimeoutMs, let onlineCloudTimeoutMs, let notifyCloudDelayMs, let notifyDefaultDelayMs, let pushChatPeriodMs, let pushChatLimit, let savedGifsLimit, let editTimeLimit, let revokeTimeLimit, let revokePmTimeLimit, let ratingEDecay, let stickersRecentLimit, let stickersFavedLimit, let channelsReadMediaPeriod, let tmpSessions, let pinnedDialogsCountMax, let pinnedInfolderCountMax, let callReceiveTimeoutMs, let callRingTimeoutMs, let callConnectTimeoutMs, let callPacketTimeoutMs, let meUrlPrefix, let autoupdateUrlPrefix, let gifSearchUsername, let venueSearchUsername, let imgSearchUsername, let staticMapsProvider, let captionLengthMax, let messageLengthMax, let webfileDcId, let suggestedLangCode, let langPackVersion, let baseLangPackVersion): if boxed { @@ -11505,14 +11529,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .config(let flags, let date, let expires, let testMode, let thisDc, let dcOptions, let dcTxtDomainName, let chatSizeMax, let megagroupSizeMax, let forwardedCountMax, let onlineUpdatePeriodMs, let offlineBlurTimeoutMs, let offlineIdleTimeoutMs, let onlineCloudTimeoutMs, let notifyCloudDelayMs, let notifyDefaultDelayMs, let pushChatPeriodMs, let pushChatLimit, let savedGifsLimit, let editTimeLimit, let revokeTimeLimit, let revokePmTimeLimit, let ratingEDecay, let stickersRecentLimit, let stickersFavedLimit, let channelsReadMediaPeriod, let tmpSessions, let pinnedDialogsCountMax, let pinnedInfolderCountMax, let callReceiveTimeoutMs, let callRingTimeoutMs, let callConnectTimeoutMs, let callPacketTimeoutMs, let meUrlPrefix, let autoupdateUrlPrefix, let gifSearchUsername, let venueSearchUsername, let imgSearchUsername, let staticMapsProvider, let captionLengthMax, let messageLengthMax, let webfileDcId, let suggestedLangCode, let langPackVersion, let baseLangPackVersion): return ("config", [("flags", flags), ("date", date), ("expires", expires), ("testMode", testMode), ("thisDc", thisDc), ("dcOptions", dcOptions), ("dcTxtDomainName", dcTxtDomainName), ("chatSizeMax", chatSizeMax), ("megagroupSizeMax", megagroupSizeMax), ("forwardedCountMax", forwardedCountMax), ("onlineUpdatePeriodMs", onlineUpdatePeriodMs), ("offlineBlurTimeoutMs", offlineBlurTimeoutMs), ("offlineIdleTimeoutMs", offlineIdleTimeoutMs), ("onlineCloudTimeoutMs", onlineCloudTimeoutMs), ("notifyCloudDelayMs", notifyCloudDelayMs), ("notifyDefaultDelayMs", notifyDefaultDelayMs), ("pushChatPeriodMs", pushChatPeriodMs), ("pushChatLimit", pushChatLimit), ("savedGifsLimit", savedGifsLimit), ("editTimeLimit", editTimeLimit), ("revokeTimeLimit", revokeTimeLimit), ("revokePmTimeLimit", revokePmTimeLimit), ("ratingEDecay", ratingEDecay), ("stickersRecentLimit", stickersRecentLimit), ("stickersFavedLimit", stickersFavedLimit), ("channelsReadMediaPeriod", channelsReadMediaPeriod), ("tmpSessions", tmpSessions), ("pinnedDialogsCountMax", pinnedDialogsCountMax), ("pinnedInfolderCountMax", pinnedInfolderCountMax), ("callReceiveTimeoutMs", callReceiveTimeoutMs), ("callRingTimeoutMs", callRingTimeoutMs), ("callConnectTimeoutMs", callConnectTimeoutMs), ("callPacketTimeoutMs", callPacketTimeoutMs), ("meUrlPrefix", meUrlPrefix), ("autoupdateUrlPrefix", autoupdateUrlPrefix), ("gifSearchUsername", gifSearchUsername), ("venueSearchUsername", venueSearchUsername), ("imgSearchUsername", imgSearchUsername), ("staticMapsProvider", staticMapsProvider), ("captionLengthMax", captionLengthMax), ("messageLengthMax", messageLengthMax), ("webfileDcId", webfileDcId), ("suggestedLangCode", suggestedLangCode), ("langPackVersion", langPackVersion), ("baseLangPackVersion", baseLangPackVersion)]) } } - static func parse_config(_ reader: BufferReader) -> Config? { + public static func parse_config(_ reader: BufferReader) -> Config? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -11661,10 +11685,10 @@ extension Api { } } - enum TopPeerCategoryPeers: TypeConstructorDescription { + public enum TopPeerCategoryPeers: TypeConstructorDescription { case topPeerCategoryPeers(category: Api.TopPeerCategory, count: Int32, peers: [Api.TopPeer]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .topPeerCategoryPeers(let category, let count, let peers): if boxed { @@ -11681,14 +11705,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .topPeerCategoryPeers(let category, let count, let peers): return ("topPeerCategoryPeers", [("category", category), ("count", count), ("peers", peers)]) } } - static func parse_topPeerCategoryPeers(_ reader: BufferReader) -> TopPeerCategoryPeers? { + public static func parse_topPeerCategoryPeers(_ reader: BufferReader) -> TopPeerCategoryPeers? { var _1: Api.TopPeerCategory? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.TopPeerCategory @@ -11711,10 +11735,10 @@ extension Api { } } - enum Game: TypeConstructorDescription { + public enum Game: TypeConstructorDescription { case game(flags: Int32, id: Int64, accessHash: Int64, shortName: String, title: String, description: String, photo: Api.Photo, document: Api.Document?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .game(let flags, let id, let accessHash, let shortName, let title, let description, let photo, let document): if boxed { @@ -11732,14 +11756,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .game(let flags, let id, let accessHash, let shortName, let title, let description, let photo, let document): return ("game", [("flags", flags), ("id", id), ("accessHash", accessHash), ("shortName", shortName), ("title", title), ("description", description), ("photo", photo), ("document", document)]) } } - static func parse_game(_ reader: BufferReader) -> Game? { + public static func parse_game(_ reader: BufferReader) -> Game? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -11777,10 +11801,10 @@ extension Api { } } - enum ChatAdminRights: TypeConstructorDescription { + public enum ChatAdminRights: TypeConstructorDescription { case chatAdminRights(flags: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatAdminRights(let flags): if boxed { @@ -11791,14 +11815,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatAdminRights(let flags): return ("chatAdminRights", [("flags", flags)]) } } - static func parse_chatAdminRights(_ reader: BufferReader) -> ChatAdminRights? { + public static func parse_chatAdminRights(_ reader: BufferReader) -> ChatAdminRights? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -11811,12 +11835,12 @@ extension Api { } } - enum SecurePasswordKdfAlgo: TypeConstructorDescription { + public enum SecurePasswordKdfAlgo: TypeConstructorDescription { case securePasswordKdfAlgoUnknown case securePasswordKdfAlgoPBKDF2HMACSHA512iter100000(salt: Buffer) case securePasswordKdfAlgoSHA512(salt: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .securePasswordKdfAlgoUnknown: if boxed { @@ -11839,7 +11863,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .securePasswordKdfAlgoUnknown: return ("securePasswordKdfAlgoUnknown", []) @@ -11850,10 +11874,10 @@ extension Api { } } - static func parse_securePasswordKdfAlgoUnknown(_ reader: BufferReader) -> SecurePasswordKdfAlgo? { + public static func parse_securePasswordKdfAlgoUnknown(_ reader: BufferReader) -> SecurePasswordKdfAlgo? { return Api.SecurePasswordKdfAlgo.securePasswordKdfAlgoUnknown } - static func parse_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000(_ reader: BufferReader) -> SecurePasswordKdfAlgo? { + public static func parse_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000(_ reader: BufferReader) -> SecurePasswordKdfAlgo? { var _1: Buffer? _1 = parseBytes(reader) let _c1 = _1 != nil @@ -11864,7 +11888,7 @@ extension Api { return nil } } - static func parse_securePasswordKdfAlgoSHA512(_ reader: BufferReader) -> SecurePasswordKdfAlgo? { + public static func parse_securePasswordKdfAlgoSHA512(_ reader: BufferReader) -> SecurePasswordKdfAlgo? { var _1: Buffer? _1 = parseBytes(reader) let _c1 = _1 != nil @@ -11877,10 +11901,10 @@ extension Api { } } - enum BotCommand: TypeConstructorDescription { + public enum BotCommand: TypeConstructorDescription { case botCommand(command: String, description: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .botCommand(let command, let description): if boxed { @@ -11892,14 +11916,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .botCommand(let command, let description): return ("botCommand", [("command", command), ("description", description)]) } } - static func parse_botCommand(_ reader: BufferReader) -> BotCommand? { + public static func parse_botCommand(_ reader: BufferReader) -> BotCommand? { var _1: String? _1 = parseString(reader) var _2: String? @@ -11915,10 +11939,10 @@ extension Api { } } - enum CdnPublicKey: TypeConstructorDescription { + public enum CdnPublicKey: TypeConstructorDescription { case cdnPublicKey(dcId: Int32, publicKey: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .cdnPublicKey(let dcId, let publicKey): if boxed { @@ -11930,14 +11954,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .cdnPublicKey(let dcId, let publicKey): return ("cdnPublicKey", [("dcId", dcId), ("publicKey", publicKey)]) } } - static func parse_cdnPublicKey(_ reader: BufferReader) -> CdnPublicKey? { + public static func parse_cdnPublicKey(_ reader: BufferReader) -> CdnPublicKey? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -11953,11 +11977,11 @@ extension Api { } } - enum InputGame: TypeConstructorDescription { + public enum InputGame: TypeConstructorDescription { case inputGameID(id: Int64, accessHash: Int64) case inputGameShortName(botId: Api.InputUser, shortName: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputGameID(let id, let accessHash): if boxed { @@ -11976,7 +12000,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputGameID(let id, let accessHash): return ("inputGameID", [("id", id), ("accessHash", accessHash)]) @@ -11985,7 +12009,7 @@ extension Api { } } - static func parse_inputGameID(_ reader: BufferReader) -> InputGame? { + public static func parse_inputGameID(_ reader: BufferReader) -> InputGame? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -11999,7 +12023,7 @@ extension Api { return nil } } - static func parse_inputGameShortName(_ reader: BufferReader) -> InputGame? { + public static func parse_inputGameShortName(_ reader: BufferReader) -> InputGame? { var _1: Api.InputUser? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputUser @@ -12017,12 +12041,12 @@ extension Api { } } - enum InputMessage: TypeConstructorDescription { + public enum InputMessage: TypeConstructorDescription { case inputMessageID(id: Int32) case inputMessageReplyTo(id: Int32) case inputMessagePinned - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputMessageID(let id): if boxed { @@ -12045,7 +12069,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputMessageID(let id): return ("inputMessageID", [("id", id)]) @@ -12056,7 +12080,7 @@ extension Api { } } - static func parse_inputMessageID(_ reader: BufferReader) -> InputMessage? { + public static func parse_inputMessageID(_ reader: BufferReader) -> InputMessage? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -12067,7 +12091,7 @@ extension Api { return nil } } - static func parse_inputMessageReplyTo(_ reader: BufferReader) -> InputMessage? { + public static func parse_inputMessageReplyTo(_ reader: BufferReader) -> InputMessage? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -12078,15 +12102,15 @@ extension Api { return nil } } - static func parse_inputMessagePinned(_ reader: BufferReader) -> InputMessage? { + public static func parse_inputMessagePinned(_ reader: BufferReader) -> InputMessage? { return Api.InputMessage.inputMessagePinned } } - enum PhoneCallProtocol: TypeConstructorDescription { + public enum PhoneCallProtocol: TypeConstructorDescription { case phoneCallProtocol(flags: Int32, minLayer: Int32, maxLayer: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .phoneCallProtocol(let flags, let minLayer, let maxLayer): if boxed { @@ -12099,14 +12123,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .phoneCallProtocol(let flags, let minLayer, let maxLayer): return ("phoneCallProtocol", [("flags", flags), ("minLayer", minLayer), ("maxLayer", maxLayer)]) } } - static func parse_phoneCallProtocol(_ reader: BufferReader) -> PhoneCallProtocol? { + public static func parse_phoneCallProtocol(_ reader: BufferReader) -> PhoneCallProtocol? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -12125,10 +12149,10 @@ extension Api { } } - enum MessageFwdAuthor: TypeConstructorDescription { + public enum MessageFwdAuthor: TypeConstructorDescription { case messageFwdAuthor(channelId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageFwdAuthor(let channelId): if boxed { @@ -12139,14 +12163,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageFwdAuthor(let channelId): return ("messageFwdAuthor", [("channelId", channelId)]) } } - static func parse_messageFwdAuthor(_ reader: BufferReader) -> MessageFwdAuthor? { + public static func parse_messageFwdAuthor(_ reader: BufferReader) -> MessageFwdAuthor? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -12159,10 +12183,10 @@ extension Api { } } - enum WallPaper: TypeConstructorDescription { + public enum WallPaper: TypeConstructorDescription { case wallPaper(id: Int64, flags: Int32, accessHash: Int64, slug: String, document: Api.Document, settings: Api.WallPaperSettings?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .wallPaper(let id, let flags, let accessHash, let slug, let document, let settings): if boxed { @@ -12178,14 +12202,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .wallPaper(let id, let flags, let accessHash, let slug, let document, let settings): return ("wallPaper", [("id", id), ("flags", flags), ("accessHash", accessHash), ("slug", slug), ("document", document), ("settings", settings)]) } } - static func parse_wallPaper(_ reader: BufferReader) -> WallPaper? { + public static func parse_wallPaper(_ reader: BufferReader) -> WallPaper? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -12217,10 +12241,10 @@ extension Api { } } - enum Invoice: TypeConstructorDescription { + public enum Invoice: TypeConstructorDescription { case invoice(flags: Int32, currency: String, prices: [Api.LabeledPrice]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .invoice(let flags, let currency, let prices): if boxed { @@ -12237,14 +12261,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .invoice(let flags, let currency, let prices): return ("invoice", [("flags", flags), ("currency", currency), ("prices", prices)]) } } - static func parse_invoice(_ reader: BufferReader) -> Invoice? { + public static func parse_invoice(_ reader: BufferReader) -> Invoice? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -12265,10 +12289,10 @@ extension Api { } } - enum PeerSettings: TypeConstructorDescription { + public enum PeerSettings: TypeConstructorDescription { case peerSettings(flags: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .peerSettings(let flags): if boxed { @@ -12279,14 +12303,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .peerSettings(let flags): return ("peerSettings", [("flags", flags)]) } } - static func parse_peerSettings(_ reader: BufferReader) -> PeerSettings? { + public static func parse_peerSettings(_ reader: BufferReader) -> PeerSettings? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -12299,12 +12323,12 @@ extension Api { } } - enum InputChatPhoto: TypeConstructorDescription { + public enum InputChatPhoto: TypeConstructorDescription { case inputChatPhotoEmpty case inputChatUploadedPhoto(file: Api.InputFile) case inputChatPhoto(id: Api.InputPhoto) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputChatPhotoEmpty: if boxed { @@ -12327,7 +12351,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputChatPhotoEmpty: return ("inputChatPhotoEmpty", []) @@ -12338,10 +12362,10 @@ extension Api { } } - static func parse_inputChatPhotoEmpty(_ reader: BufferReader) -> InputChatPhoto? { + public static func parse_inputChatPhotoEmpty(_ reader: BufferReader) -> InputChatPhoto? { return Api.InputChatPhoto.inputChatPhotoEmpty } - static func parse_inputChatUploadedPhoto(_ reader: BufferReader) -> InputChatPhoto? { + public static func parse_inputChatUploadedPhoto(_ reader: BufferReader) -> InputChatPhoto? { var _1: Api.InputFile? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputFile @@ -12354,7 +12378,7 @@ extension Api { return nil } } - static func parse_inputChatPhoto(_ reader: BufferReader) -> InputChatPhoto? { + public static func parse_inputChatPhoto(_ reader: BufferReader) -> InputChatPhoto? { var _1: Api.InputPhoto? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputPhoto @@ -12369,10 +12393,10 @@ extension Api { } } - enum PaymentCharge: TypeConstructorDescription { + public enum PaymentCharge: TypeConstructorDescription { case paymentCharge(id: String, providerChargeId: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .paymentCharge(let id, let providerChargeId): if boxed { @@ -12384,14 +12408,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .paymentCharge(let id, let providerChargeId): return ("paymentCharge", [("id", id), ("providerChargeId", providerChargeId)]) } } - static func parse_paymentCharge(_ reader: BufferReader) -> PaymentCharge? { + public static func parse_paymentCharge(_ reader: BufferReader) -> PaymentCharge? { var _1: String? _1 = parseString(reader) var _2: String? @@ -12407,7 +12431,7 @@ extension Api { } } - enum Updates: TypeConstructorDescription { + public enum Updates: TypeConstructorDescription { case updatesTooLong case updateShortMessage(flags: Int32, id: Int32, userId: Int32, message: String, pts: Int32, ptsCount: Int32, date: Int32, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, entities: [Api.MessageEntity]?) case updateShortChatMessage(flags: Int32, id: Int32, fromId: Int32, chatId: Int32, message: String, pts: Int32, ptsCount: Int32, date: Int32, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, entities: [Api.MessageEntity]?) @@ -12416,7 +12440,7 @@ extension Api { case updates(updates: [Api.Update], users: [Api.User], chats: [Api.Chat], date: Int32, seq: Int32) case updateShortSentMessage(flags: Int32, id: Int32, pts: Int32, ptsCount: Int32, date: Int32, media: Api.MessageMedia?, entities: [Api.MessageEntity]?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .updatesTooLong: if boxed { @@ -12536,7 +12560,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .updatesTooLong: return ("updatesTooLong", []) @@ -12555,10 +12579,10 @@ extension Api { } } - static func parse_updatesTooLong(_ reader: BufferReader) -> Updates? { + public static func parse_updatesTooLong(_ reader: BufferReader) -> Updates? { return Api.Updates.updatesTooLong } - static func parse_updateShortMessage(_ reader: BufferReader) -> Updates? { + public static func parse_updateShortMessage(_ reader: BufferReader) -> Updates? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -12603,7 +12627,7 @@ extension Api { return nil } } - static func parse_updateShortChatMessage(_ reader: BufferReader) -> Updates? { + public static func parse_updateShortChatMessage(_ reader: BufferReader) -> Updates? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -12651,7 +12675,7 @@ extension Api { return nil } } - static func parse_updateShort(_ reader: BufferReader) -> Updates? { + public static func parse_updateShort(_ reader: BufferReader) -> Updates? { var _1: Api.Update? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Update @@ -12667,7 +12691,7 @@ extension Api { return nil } } - static func parse_updatesCombined(_ reader: BufferReader) -> Updates? { + public static func parse_updatesCombined(_ reader: BufferReader) -> Updates? { var _1: [Api.Update]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Update.self) @@ -12699,7 +12723,7 @@ extension Api { return nil } } - static func parse_updates(_ reader: BufferReader) -> Updates? { + public static func parse_updates(_ reader: BufferReader) -> Updates? { var _1: [Api.Update]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Update.self) @@ -12728,7 +12752,7 @@ extension Api { return nil } } - static func parse_updateShortSentMessage(_ reader: BufferReader) -> Updates? { + public static func parse_updateShortSentMessage(_ reader: BufferReader) -> Updates? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -12763,7 +12787,7 @@ extension Api { } } - enum MessageMedia: TypeConstructorDescription { + public enum MessageMedia: TypeConstructorDescription { case messageMediaEmpty case messageMediaGeo(geo: Api.GeoPoint) case messageMediaUnsupported @@ -12777,7 +12801,7 @@ extension Api { case messageMediaContact(phoneNumber: String, firstName: String, lastName: String, vcard: String, userId: Int32) case messageMediaPoll(poll: Api.Poll, results: Api.PollResults) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageMediaEmpty: if boxed { @@ -12876,7 +12900,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageMediaEmpty: return ("messageMediaEmpty", []) @@ -12905,10 +12929,10 @@ extension Api { } } - static func parse_messageMediaEmpty(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaEmpty(_ reader: BufferReader) -> MessageMedia? { return Api.MessageMedia.messageMediaEmpty } - static func parse_messageMediaGeo(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaGeo(_ reader: BufferReader) -> MessageMedia? { var _1: Api.GeoPoint? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.GeoPoint @@ -12921,10 +12945,10 @@ extension Api { return nil } } - static func parse_messageMediaUnsupported(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaUnsupported(_ reader: BufferReader) -> MessageMedia? { return Api.MessageMedia.messageMediaUnsupported } - static func parse_messageMediaWebPage(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaWebPage(_ reader: BufferReader) -> MessageMedia? { var _1: Api.WebPage? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.WebPage @@ -12937,7 +12961,7 @@ extension Api { return nil } } - static func parse_messageMediaGame(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaGame(_ reader: BufferReader) -> MessageMedia? { var _1: Api.Game? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Game @@ -12950,7 +12974,7 @@ extension Api { return nil } } - static func parse_messageMediaInvoice(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaInvoice(_ reader: BufferReader) -> MessageMedia? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -12984,7 +13008,7 @@ extension Api { return nil } } - static func parse_messageMediaGeoLive(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaGeoLive(_ reader: BufferReader) -> MessageMedia? { var _1: Api.GeoPoint? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.GeoPoint @@ -13000,7 +13024,7 @@ extension Api { return nil } } - static func parse_messageMediaVenue(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaVenue(_ reader: BufferReader) -> MessageMedia? { var _1: Api.GeoPoint? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.GeoPoint @@ -13028,7 +13052,7 @@ extension Api { return nil } } - static func parse_messageMediaPhoto(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaPhoto(_ reader: BufferReader) -> MessageMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Photo? @@ -13047,7 +13071,7 @@ extension Api { return nil } } - static func parse_messageMediaDocument(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaDocument(_ reader: BufferReader) -> MessageMedia? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Document? @@ -13066,7 +13090,7 @@ extension Api { return nil } } - static func parse_messageMediaContact(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaContact(_ reader: BufferReader) -> MessageMedia? { var _1: String? _1 = parseString(reader) var _2: String? @@ -13089,7 +13113,7 @@ extension Api { return nil } } - static func parse_messageMediaPoll(_ reader: BufferReader) -> MessageMedia? { + public static func parse_messageMediaPoll(_ reader: BufferReader) -> MessageMedia? { var _1: Api.Poll? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Poll @@ -13109,10 +13133,10 @@ extension Api { } } - enum PaymentSavedCredentials: TypeConstructorDescription { + public enum PaymentSavedCredentials: TypeConstructorDescription { case paymentSavedCredentialsCard(id: String, title: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .paymentSavedCredentialsCard(let id, let title): if boxed { @@ -13124,14 +13148,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .paymentSavedCredentialsCard(let id, let title): return ("paymentSavedCredentialsCard", [("id", id), ("title", title)]) } } - static func parse_paymentSavedCredentialsCard(_ reader: BufferReader) -> PaymentSavedCredentials? { + public static func parse_paymentSavedCredentialsCard(_ reader: BufferReader) -> PaymentSavedCredentials? { var _1: String? _1 = parseString(reader) var _2: String? @@ -13147,10 +13171,10 @@ extension Api { } } - enum Null: TypeConstructorDescription { + public enum Null: TypeConstructorDescription { case null - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .null: if boxed { @@ -13161,19 +13185,19 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .null: return ("null", []) } } - static func parse_null(_ reader: BufferReader) -> Null? { + public static func parse_null(_ reader: BufferReader) -> Null? { return Api.Null.null } } - 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?) @@ -13182,7 +13206,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 { @@ -13240,7 +13264,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)]) @@ -13259,7 +13283,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? @@ -13273,10 +13297,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? @@ -13300,7 +13324,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? @@ -13320,7 +13344,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? @@ -13343,7 +13367,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 @@ -13354,16 +13378,16 @@ extension Api { return nil } } - static func parse_documentAttributeHasStickers(_ reader: BufferReader) -> DocumentAttribute? { + public static func parse_documentAttributeHasStickers(_ reader: BufferReader) -> DocumentAttribute? { return Api.DocumentAttribute.documentAttributeHasStickers } } - enum ChatPhoto: TypeConstructorDescription { + public enum ChatPhoto: TypeConstructorDescription { case chatPhotoEmpty case chatPhoto(photoSmall: Api.FileLocation, photoBig: Api.FileLocation, dcId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatPhotoEmpty: if boxed { @@ -13382,7 +13406,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatPhotoEmpty: return ("chatPhotoEmpty", []) @@ -13391,10 +13415,10 @@ extension Api { } } - static func parse_chatPhotoEmpty(_ reader: BufferReader) -> ChatPhoto? { + public static func parse_chatPhotoEmpty(_ reader: BufferReader) -> ChatPhoto? { return Api.ChatPhoto.chatPhotoEmpty } - static func parse_chatPhoto(_ reader: BufferReader) -> ChatPhoto? { + public static func parse_chatPhoto(_ reader: BufferReader) -> ChatPhoto? { var _1: Api.FileLocation? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.FileLocation @@ -13417,10 +13441,10 @@ extension Api { } } - enum PageCaption: TypeConstructorDescription { + public enum PageCaption: TypeConstructorDescription { case pageCaption(text: Api.RichText, credit: Api.RichText) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pageCaption(let text, let credit): if boxed { @@ -13432,14 +13456,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pageCaption(let text, let credit): return ("pageCaption", [("text", text), ("credit", credit)]) } } - static func parse_pageCaption(_ reader: BufferReader) -> PageCaption? { + public static func parse_pageCaption(_ reader: BufferReader) -> PageCaption? { var _1: Api.RichText? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.RichText @@ -13459,12 +13483,12 @@ extension Api { } } - enum UrlAuthResult: TypeConstructorDescription { + public enum UrlAuthResult: TypeConstructorDescription { case urlAuthResultRequest(flags: Int32, bot: Api.User, domain: String) case urlAuthResultAccepted(url: String) case urlAuthResultDefault - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .urlAuthResultRequest(let flags, let bot, let domain): if boxed { @@ -13489,7 +13513,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .urlAuthResultRequest(let flags, let bot, let domain): return ("urlAuthResultRequest", [("flags", flags), ("bot", bot), ("domain", domain)]) @@ -13500,7 +13524,7 @@ extension Api { } } - static func parse_urlAuthResultRequest(_ reader: BufferReader) -> UrlAuthResult? { + public static func parse_urlAuthResultRequest(_ reader: BufferReader) -> UrlAuthResult? { var _1: Int32? _1 = reader.readInt32() var _2: Api.User? @@ -13519,7 +13543,7 @@ extension Api { return nil } } - static func parse_urlAuthResultAccepted(_ reader: BufferReader) -> UrlAuthResult? { + public static func parse_urlAuthResultAccepted(_ reader: BufferReader) -> UrlAuthResult? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -13530,17 +13554,17 @@ extension Api { return nil } } - static func parse_urlAuthResultDefault(_ reader: BufferReader) -> UrlAuthResult? { + public static func parse_urlAuthResultDefault(_ reader: BufferReader) -> UrlAuthResult? { return Api.UrlAuthResult.urlAuthResultDefault } } - 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 { @@ -13564,7 +13588,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputStickerSetEmpty: return ("inputStickerSetEmpty", []) @@ -13575,10 +13599,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? @@ -13592,7 +13616,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 @@ -13605,10 +13629,10 @@ extension Api { } } - enum BotInfo: TypeConstructorDescription { + public enum BotInfo: TypeConstructorDescription { case botInfo(userId: Int32, description: String, commands: [Api.BotCommand]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .botInfo(let userId, let description, let commands): if boxed { @@ -13625,14 +13649,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .botInfo(let userId, let description, let commands): return ("botInfo", [("userId", userId), ("description", description), ("commands", commands)]) } } - static func parse_botInfo(_ reader: BufferReader) -> BotInfo? { + public static func parse_botInfo(_ reader: BufferReader) -> BotInfo? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -13653,11 +13677,11 @@ extension Api { } } - enum FoundGif: TypeConstructorDescription { + public enum FoundGif: TypeConstructorDescription { case foundGif(url: String, thumbUrl: String, contentUrl: String, contentType: String, w: Int32, h: Int32) case foundGifCached(url: String, photo: Api.Photo, document: Api.Document) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .foundGif(let url, let thumbUrl, let contentUrl, let contentType, let w, let h): if boxed { @@ -13681,7 +13705,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .foundGif(let url, let thumbUrl, let contentUrl, let contentType, let w, let h): return ("foundGif", [("url", url), ("thumbUrl", thumbUrl), ("contentUrl", contentUrl), ("contentType", contentType), ("w", w), ("h", h)]) @@ -13690,7 +13714,7 @@ extension Api { } } - static func parse_foundGif(_ reader: BufferReader) -> FoundGif? { + public static func parse_foundGif(_ reader: BufferReader) -> FoundGif? { var _1: String? _1 = parseString(reader) var _2: String? @@ -13716,7 +13740,7 @@ extension Api { return nil } } - static func parse_foundGifCached(_ reader: BufferReader) -> FoundGif? { + public static func parse_foundGifCached(_ reader: BufferReader) -> FoundGif? { var _1: String? _1 = parseString(reader) var _2: Api.Photo? @@ -13739,11 +13763,11 @@ extension Api { } } - enum User: TypeConstructorDescription { + 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?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .userEmpty(let id): if boxed { @@ -13772,7 +13796,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .userEmpty(let id): return ("userEmpty", [("id", id)]) @@ -13781,7 +13805,7 @@ extension Api { } } - static func parse_userEmpty(_ reader: BufferReader) -> User? { + public static func parse_userEmpty(_ reader: BufferReader) -> User? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -13792,7 +13816,7 @@ extension Api { return nil } } - static func parse_user(_ reader: BufferReader) -> User? { + public static func parse_user(_ reader: BufferReader) -> User? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -13845,12 +13869,12 @@ extension Api { } } - enum Message: TypeConstructorDescription { + 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?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageEmpty(let id): if boxed { @@ -13898,7 +13922,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageEmpty(let id): return ("messageEmpty", [("id", id)]) @@ -13909,7 +13933,7 @@ extension Api { } } - static func parse_messageEmpty(_ reader: BufferReader) -> Message? { + public static func parse_messageEmpty(_ reader: BufferReader) -> Message? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -13920,7 +13944,7 @@ extension Api { return nil } } - static func parse_messageService(_ reader: BufferReader) -> Message? { + public static func parse_messageService(_ reader: BufferReader) -> Message? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -13953,7 +13977,7 @@ extension Api { return nil } } - static func parse_message(_ reader: BufferReader) -> Message? { + public static func parse_message(_ reader: BufferReader) -> Message? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -14021,7 +14045,7 @@ extension Api { } } - enum InputFileLocation: TypeConstructorDescription { + public enum InputFileLocation: TypeConstructorDescription { case inputEncryptedFileLocation(id: Int64, accessHash: Int64) case inputSecureFileLocation(id: Int64, accessHash: Int64) case inputFileLocation(volumeId: Int64, localId: Int32, secret: Int64, fileReference: Buffer) @@ -14030,7 +14054,7 @@ extension Api { case inputPeerPhotoFileLocation(flags: Int32, peer: Api.InputPeer, volumeId: Int64, localId: Int32) case inputStickerSetThumb(stickerset: Api.InputStickerSet, volumeId: Int64, localId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputEncryptedFileLocation(let id, let accessHash): if boxed { @@ -14093,7 +14117,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputEncryptedFileLocation(let id, let accessHash): return ("inputEncryptedFileLocation", [("id", id), ("accessHash", accessHash)]) @@ -14112,7 +14136,7 @@ extension Api { } } - static func parse_inputEncryptedFileLocation(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputEncryptedFileLocation(_ reader: BufferReader) -> InputFileLocation? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -14126,7 +14150,7 @@ extension Api { return nil } } - static func parse_inputSecureFileLocation(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputSecureFileLocation(_ reader: BufferReader) -> InputFileLocation? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -14140,7 +14164,7 @@ extension Api { return nil } } - static func parse_inputFileLocation(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputFileLocation(_ reader: BufferReader) -> InputFileLocation? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -14160,7 +14184,7 @@ extension Api { return nil } } - static func parse_inputPhotoFileLocation(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputPhotoFileLocation(_ reader: BufferReader) -> InputFileLocation? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -14180,7 +14204,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? @@ -14200,7 +14224,7 @@ extension Api { return nil } } - static func parse_inputPeerPhotoFileLocation(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputPeerPhotoFileLocation(_ reader: BufferReader) -> InputFileLocation? { var _1: Int32? _1 = reader.readInt32() var _2: Api.InputPeer? @@ -14222,7 +14246,7 @@ extension Api { return nil } } - static func parse_inputStickerSetThumb(_ reader: BufferReader) -> InputFileLocation? { + public static func parse_inputStickerSetThumb(_ reader: BufferReader) -> InputFileLocation? { var _1: Api.InputStickerSet? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputStickerSet @@ -14243,11 +14267,11 @@ extension Api { } } - enum GeoPoint: TypeConstructorDescription { + public enum GeoPoint: TypeConstructorDescription { case geoPointEmpty case geoPoint(long: Double, lat: Double, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .geoPointEmpty: if boxed { @@ -14266,7 +14290,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .geoPointEmpty: return ("geoPointEmpty", []) @@ -14275,10 +14299,10 @@ extension Api { } } - static func parse_geoPointEmpty(_ reader: BufferReader) -> GeoPoint? { + public static func parse_geoPointEmpty(_ reader: BufferReader) -> GeoPoint? { return Api.GeoPoint.geoPointEmpty } - static func parse_geoPoint(_ reader: BufferReader) -> GeoPoint? { + public static func parse_geoPoint(_ reader: BufferReader) -> GeoPoint? { var _1: Double? _1 = reader.readDouble() var _2: Double? @@ -14297,10 +14321,10 @@ extension Api { } } - enum InputPhoneCall: TypeConstructorDescription { + public enum InputPhoneCall: TypeConstructorDescription { case inputPhoneCall(id: Int64, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPhoneCall(let id, let accessHash): if boxed { @@ -14312,14 +14336,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPhoneCall(let id, let accessHash): return ("inputPhoneCall", [("id", id), ("accessHash", accessHash)]) } } - static func parse_inputPhoneCall(_ reader: BufferReader) -> InputPhoneCall? { + public static func parse_inputPhoneCall(_ reader: BufferReader) -> InputPhoneCall? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -14335,10 +14359,10 @@ extension Api { } } - enum ReceivedNotifyMessage: TypeConstructorDescription { + public enum ReceivedNotifyMessage: TypeConstructorDescription { case receivedNotifyMessage(id: Int32, flags: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .receivedNotifyMessage(let id, let flags): if boxed { @@ -14350,14 +14374,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .receivedNotifyMessage(let id, let flags): return ("receivedNotifyMessage", [("id", id), ("flags", flags)]) } } - static func parse_receivedNotifyMessage(_ reader: BufferReader) -> ReceivedNotifyMessage? { + public static func parse_receivedNotifyMessage(_ reader: BufferReader) -> ReceivedNotifyMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -14373,11 +14397,11 @@ extension Api { } } - enum ChatParticipants: TypeConstructorDescription { + public enum ChatParticipants: TypeConstructorDescription { case chatParticipantsForbidden(flags: Int32, chatId: Int32, selfParticipant: Api.ChatParticipant?) case chatParticipants(chatId: Int32, participants: [Api.ChatParticipant], version: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatParticipantsForbidden(let flags, let chatId, let selfParticipant): if boxed { @@ -14402,7 +14426,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatParticipantsForbidden(let flags, let chatId, let selfParticipant): return ("chatParticipantsForbidden", [("flags", flags), ("chatId", chatId), ("selfParticipant", selfParticipant)]) @@ -14411,7 +14435,7 @@ extension Api { } } - static func parse_chatParticipantsForbidden(_ reader: BufferReader) -> ChatParticipants? { + public static func parse_chatParticipantsForbidden(_ reader: BufferReader) -> ChatParticipants? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -14430,7 +14454,7 @@ extension Api { return nil } } - static func parse_chatParticipants(_ reader: BufferReader) -> ChatParticipants? { + public static func parse_chatParticipants(_ reader: BufferReader) -> ChatParticipants? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.ChatParticipant]? @@ -14451,13 +14475,13 @@ extension Api { } } - enum InputPaymentCredentials: TypeConstructorDescription { + public enum InputPaymentCredentials: TypeConstructorDescription { case inputPaymentCredentialsSaved(id: String, tmpPassword: Buffer) case inputPaymentCredentials(flags: Int32, data: Api.DataJSON) case inputPaymentCredentialsApplePay(paymentData: Api.DataJSON) case inputPaymentCredentialsAndroidPay(paymentToken: Api.DataJSON, googleTransactionId: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPaymentCredentialsSaved(let id, let tmpPassword): if boxed { @@ -14489,7 +14513,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPaymentCredentialsSaved(let id, let tmpPassword): return ("inputPaymentCredentialsSaved", [("id", id), ("tmpPassword", tmpPassword)]) @@ -14502,7 +14526,7 @@ extension Api { } } - static func parse_inputPaymentCredentialsSaved(_ reader: BufferReader) -> InputPaymentCredentials? { + public static func parse_inputPaymentCredentialsSaved(_ reader: BufferReader) -> InputPaymentCredentials? { var _1: String? _1 = parseString(reader) var _2: Buffer? @@ -14516,7 +14540,7 @@ extension Api { return nil } } - static func parse_inputPaymentCredentials(_ reader: BufferReader) -> InputPaymentCredentials? { + public static func parse_inputPaymentCredentials(_ reader: BufferReader) -> InputPaymentCredentials? { var _1: Int32? _1 = reader.readInt32() var _2: Api.DataJSON? @@ -14532,7 +14556,7 @@ extension Api { return nil } } - static func parse_inputPaymentCredentialsApplePay(_ reader: BufferReader) -> InputPaymentCredentials? { + public static func parse_inputPaymentCredentialsApplePay(_ reader: BufferReader) -> InputPaymentCredentials? { var _1: Api.DataJSON? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.DataJSON @@ -14545,7 +14569,7 @@ extension Api { return nil } } - static func parse_inputPaymentCredentialsAndroidPay(_ reader: BufferReader) -> InputPaymentCredentials? { + public static func parse_inputPaymentCredentialsAndroidPay(_ reader: BufferReader) -> InputPaymentCredentials? { var _1: Api.DataJSON? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.DataJSON @@ -14563,10 +14587,10 @@ extension Api { } } - enum ShippingOption: TypeConstructorDescription { + public enum ShippingOption: TypeConstructorDescription { case shippingOption(id: String, title: String, prices: [Api.LabeledPrice]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .shippingOption(let id, let title, let prices): if boxed { @@ -14583,14 +14607,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .shippingOption(let id, let title, let prices): return ("shippingOption", [("id", id), ("title", title), ("prices", prices)]) } } - static func parse_shippingOption(_ reader: BufferReader) -> ShippingOption? { + public static func parse_shippingOption(_ reader: BufferReader) -> ShippingOption? { var _1: String? _1 = parseString(reader) var _2: String? @@ -14611,11 +14635,11 @@ extension Api { } } - enum InputSecureFile: TypeConstructorDescription { + public enum InputSecureFile: TypeConstructorDescription { case inputSecureFileUploaded(id: Int64, parts: Int32, md5Checksum: String, fileHash: Buffer, secret: Buffer) case inputSecureFile(id: Int64, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputSecureFileUploaded(let id, let parts, let md5Checksum, let fileHash, let secret): if boxed { @@ -14637,7 +14661,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputSecureFileUploaded(let id, let parts, let md5Checksum, let fileHash, let secret): return ("inputSecureFileUploaded", [("id", id), ("parts", parts), ("md5Checksum", md5Checksum), ("fileHash", fileHash), ("secret", secret)]) @@ -14646,7 +14670,7 @@ extension Api { } } - static func parse_inputSecureFileUploaded(_ reader: BufferReader) -> InputSecureFile? { + public static func parse_inputSecureFileUploaded(_ reader: BufferReader) -> InputSecureFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -14669,7 +14693,7 @@ extension Api { return nil } } - static func parse_inputSecureFile(_ reader: BufferReader) -> InputSecureFile? { + public static func parse_inputSecureFile(_ reader: BufferReader) -> InputSecureFile? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -14685,10 +14709,10 @@ extension Api { } } - enum PostAddress: TypeConstructorDescription { + public enum PostAddress: TypeConstructorDescription { case postAddress(streetLine1: String, streetLine2: String, city: String, state: String, countryIso2: String, postCode: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .postAddress(let streetLine1, let streetLine2, let city, let state, let countryIso2, let postCode): if boxed { @@ -14704,14 +14728,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .postAddress(let streetLine1, let streetLine2, let city, let state, let countryIso2, let postCode): return ("postAddress", [("streetLine1", streetLine1), ("streetLine2", streetLine2), ("city", city), ("state", state), ("countryIso2", countryIso2), ("postCode", postCode)]) } } - static func parse_postAddress(_ reader: BufferReader) -> PostAddress? { + public static func parse_postAddress(_ reader: BufferReader) -> PostAddress? { var _1: String? _1 = parseString(reader) var _2: String? @@ -14739,10 +14763,10 @@ extension Api { } } - enum InputFolderPeer: TypeConstructorDescription { + public enum InputFolderPeer: TypeConstructorDescription { case inputFolderPeer(peer: Api.InputPeer, folderId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputFolderPeer(let peer, let folderId): if boxed { @@ -14754,14 +14778,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputFolderPeer(let peer, let folderId): return ("inputFolderPeer", [("peer", peer), ("folderId", folderId)]) } } - static func parse_inputFolderPeer(_ reader: BufferReader) -> InputFolderPeer? { + public static func parse_inputFolderPeer(_ reader: BufferReader) -> InputFolderPeer? { var _1: Api.InputPeer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputPeer @@ -14779,10 +14803,10 @@ extension Api { } } - enum DataJSON: TypeConstructorDescription { + public enum DataJSON: TypeConstructorDescription { case dataJSON(data: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .dataJSON(let data): if boxed { @@ -14793,14 +14817,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .dataJSON(let data): return ("dataJSON", [("data", data)]) } } - static func parse_dataJSON(_ reader: BufferReader) -> DataJSON? { + public static func parse_dataJSON(_ reader: BufferReader) -> DataJSON? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -14813,11 +14837,11 @@ extension Api { } } - enum InputWallPaper: TypeConstructorDescription { + public enum InputWallPaper: TypeConstructorDescription { case inputWallPaper(id: Int64, accessHash: Int64) case inputWallPaperSlug(slug: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputWallPaper(let id, let accessHash): if boxed { @@ -14835,7 +14859,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputWallPaper(let id, let accessHash): return ("inputWallPaper", [("id", id), ("accessHash", accessHash)]) @@ -14844,7 +14868,7 @@ extension Api { } } - static func parse_inputWallPaper(_ reader: BufferReader) -> InputWallPaper? { + public static func parse_inputWallPaper(_ reader: BufferReader) -> InputWallPaper? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -14858,7 +14882,7 @@ extension Api { return nil } } - static func parse_inputWallPaperSlug(_ reader: BufferReader) -> InputWallPaper? { + public static func parse_inputWallPaperSlug(_ reader: BufferReader) -> InputWallPaper? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -14871,11 +14895,11 @@ extension Api { } } - enum InputStickeredMedia: TypeConstructorDescription { + public enum InputStickeredMedia: TypeConstructorDescription { case inputStickeredMediaPhoto(id: Api.InputPhoto) case inputStickeredMediaDocument(id: Api.InputDocument) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputStickeredMediaPhoto(let id): if boxed { @@ -14892,7 +14916,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputStickeredMediaPhoto(let id): return ("inputStickeredMediaPhoto", [("id", id)]) @@ -14901,7 +14925,7 @@ extension Api { } } - static func parse_inputStickeredMediaPhoto(_ reader: BufferReader) -> InputStickeredMedia? { + public static func parse_inputStickeredMediaPhoto(_ reader: BufferReader) -> InputStickeredMedia? { var _1: Api.InputPhoto? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputPhoto @@ -14914,7 +14938,7 @@ extension Api { return nil } } - static func parse_inputStickeredMediaDocument(_ reader: BufferReader) -> InputStickeredMedia? { + public static func parse_inputStickeredMediaDocument(_ reader: BufferReader) -> InputStickeredMedia? { var _1: Api.InputDocument? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputDocument @@ -14929,13 +14953,13 @@ extension Api { } } - enum PhoneCallDiscardReason: TypeConstructorDescription { + public enum PhoneCallDiscardReason: TypeConstructorDescription { case phoneCallDiscardReasonMissed case phoneCallDiscardReasonDisconnect case phoneCallDiscardReasonHangup case phoneCallDiscardReasonBusy - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .phoneCallDiscardReasonMissed: if boxed { @@ -14964,7 +14988,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .phoneCallDiscardReasonMissed: return ("phoneCallDiscardReasonMissed", []) @@ -14977,24 +15001,24 @@ extension Api { } } - static func parse_phoneCallDiscardReasonMissed(_ reader: BufferReader) -> PhoneCallDiscardReason? { + public static func parse_phoneCallDiscardReasonMissed(_ reader: BufferReader) -> PhoneCallDiscardReason? { return Api.PhoneCallDiscardReason.phoneCallDiscardReasonMissed } - static func parse_phoneCallDiscardReasonDisconnect(_ reader: BufferReader) -> PhoneCallDiscardReason? { + public static func parse_phoneCallDiscardReasonDisconnect(_ reader: BufferReader) -> PhoneCallDiscardReason? { return Api.PhoneCallDiscardReason.phoneCallDiscardReasonDisconnect } - static func parse_phoneCallDiscardReasonHangup(_ reader: BufferReader) -> PhoneCallDiscardReason? { + public static func parse_phoneCallDiscardReasonHangup(_ reader: BufferReader) -> PhoneCallDiscardReason? { return Api.PhoneCallDiscardReason.phoneCallDiscardReasonHangup } - static func parse_phoneCallDiscardReasonBusy(_ reader: BufferReader) -> PhoneCallDiscardReason? { + public static func parse_phoneCallDiscardReasonBusy(_ reader: BufferReader) -> PhoneCallDiscardReason? { return Api.PhoneCallDiscardReason.phoneCallDiscardReasonBusy } } - enum NearestDc: TypeConstructorDescription { + public enum NearestDc: TypeConstructorDescription { case nearestDc(country: String, thisDc: Int32, nearestDc: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .nearestDc(let country, let thisDc, let nearestDc): if boxed { @@ -15007,14 +15031,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .nearestDc(let country, let thisDc, let nearestDc): return ("nearestDc", [("country", country), ("thisDc", thisDc), ("nearestDc", nearestDc)]) } } - static func parse_nearestDc(_ reader: BufferReader) -> NearestDc? { + public static func parse_nearestDc(_ reader: BufferReader) -> NearestDc? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -15033,10 +15057,10 @@ extension Api { } } - enum JSONObjectValue: TypeConstructorDescription { + public enum JSONObjectValue: TypeConstructorDescription { case jsonObjectValue(key: String, value: Api.JSONValue) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .jsonObjectValue(let key, let value): if boxed { @@ -15048,14 +15072,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .jsonObjectValue(let key, let value): return ("jsonObjectValue", [("key", key), ("value", value)]) } } - static func parse_jsonObjectValue(_ reader: BufferReader) -> JSONObjectValue? { + public static func parse_jsonObjectValue(_ reader: BufferReader) -> JSONObjectValue? { var _1: String? _1 = parseString(reader) var _2: Api.JSONValue? @@ -15073,10 +15097,10 @@ extension Api { } } - enum InputWebDocument: TypeConstructorDescription { + public enum InputWebDocument: TypeConstructorDescription { case inputWebDocument(url: String, size: Int32, mimeType: String, attributes: [Api.DocumentAttribute]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputWebDocument(let url, let size, let mimeType, let attributes): if boxed { @@ -15094,14 +15118,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputWebDocument(let url, let size, let mimeType, let attributes): return ("inputWebDocument", [("url", url), ("size", size), ("mimeType", mimeType), ("attributes", attributes)]) } } - static func parse_inputWebDocument(_ reader: BufferReader) -> InputWebDocument? { + public static func parse_inputWebDocument(_ reader: BufferReader) -> InputWebDocument? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -15125,10 +15149,10 @@ extension Api { } } - enum ChannelAdminLogEvent: TypeConstructorDescription { + public enum ChannelAdminLogEvent: TypeConstructorDescription { case channelAdminLogEvent(id: Int64, date: Int32, userId: Int32, action: Api.ChannelAdminLogEventAction) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelAdminLogEvent(let id, let date, let userId, let action): if boxed { @@ -15142,14 +15166,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelAdminLogEvent(let id, let date, let userId, let action): return ("channelAdminLogEvent", [("id", id), ("date", date), ("userId", userId), ("action", action)]) } } - static func parse_channelAdminLogEvent(_ reader: BufferReader) -> ChannelAdminLogEvent? { + public static func parse_channelAdminLogEvent(_ reader: BufferReader) -> ChannelAdminLogEvent? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -15173,11 +15197,11 @@ extension Api { } } - enum Bool: TypeConstructorDescription { + public enum Bool: TypeConstructorDescription { case boolFalse case boolTrue - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .boolFalse: if boxed { @@ -15194,7 +15218,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .boolFalse: return ("boolFalse", []) @@ -15203,20 +15227,20 @@ extension Api { } } - static func parse_boolFalse(_ reader: BufferReader) -> Bool? { + public static func parse_boolFalse(_ reader: BufferReader) -> Bool? { return Api.Bool.boolFalse } - static func parse_boolTrue(_ reader: BufferReader) -> Bool? { + public static func parse_boolTrue(_ reader: BufferReader) -> Bool? { return Api.Bool.boolTrue } } - enum LangPackString: TypeConstructorDescription { + public enum LangPackString: TypeConstructorDescription { case langPackString(key: String, value: String) case langPackStringPluralized(flags: Int32, key: String, zeroValue: String?, oneValue: String?, twoValue: String?, fewValue: String?, manyValue: String?, otherValue: String) case langPackStringDeleted(key: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .langPackString(let key, let value): if boxed { @@ -15247,7 +15271,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .langPackString(let key, let value): return ("langPackString", [("key", key), ("value", value)]) @@ -15258,7 +15282,7 @@ extension Api { } } - static func parse_langPackString(_ reader: BufferReader) -> LangPackString? { + public static func parse_langPackString(_ reader: BufferReader) -> LangPackString? { var _1: String? _1 = parseString(reader) var _2: String? @@ -15272,7 +15296,7 @@ extension Api { return nil } } - static func parse_langPackStringPluralized(_ reader: BufferReader) -> LangPackString? { + public static func parse_langPackStringPluralized(_ reader: BufferReader) -> LangPackString? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -15304,7 +15328,7 @@ extension Api { return nil } } - static func parse_langPackStringDeleted(_ reader: BufferReader) -> LangPackString? { + public static func parse_langPackStringDeleted(_ reader: BufferReader) -> LangPackString? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -15317,12 +15341,12 @@ extension Api { } } - enum InputWebFileLocation: TypeConstructorDescription { + public enum InputWebFileLocation: TypeConstructorDescription { case inputWebFileLocation(url: String, accessHash: Int64) case inputWebFileGeoMessageLocation(peer: Api.InputPeer, msgId: Int32, w: Int32, h: Int32, zoom: Int32, scale: Int32) case inputWebFileGeoPointLocation(geoPoint: Api.InputGeoPoint, accessHash: Int64, w: Int32, h: Int32, zoom: Int32, scale: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputWebFileLocation(let url, let accessHash): if boxed { @@ -15356,7 +15380,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputWebFileLocation(let url, let accessHash): return ("inputWebFileLocation", [("url", url), ("accessHash", accessHash)]) @@ -15367,7 +15391,7 @@ extension Api { } } - static func parse_inputWebFileLocation(_ reader: BufferReader) -> InputWebFileLocation? { + public static func parse_inputWebFileLocation(_ reader: BufferReader) -> InputWebFileLocation? { var _1: String? _1 = parseString(reader) var _2: Int64? @@ -15381,7 +15405,7 @@ extension Api { return nil } } - static func parse_inputWebFileGeoMessageLocation(_ reader: BufferReader) -> InputWebFileLocation? { + public static func parse_inputWebFileGeoMessageLocation(_ reader: BufferReader) -> InputWebFileLocation? { var _1: Api.InputPeer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputPeer @@ -15409,7 +15433,7 @@ extension Api { return nil } } - static func parse_inputWebFileGeoPointLocation(_ reader: BufferReader) -> InputWebFileLocation? { + public static func parse_inputWebFileGeoPointLocation(_ reader: BufferReader) -> InputWebFileLocation? { var _1: Api.InputGeoPoint? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.InputGeoPoint @@ -15439,10 +15463,10 @@ extension Api { } } - enum MessageFwdHeader: TypeConstructorDescription { + public enum MessageFwdHeader: TypeConstructorDescription { case messageFwdHeader(flags: Int32, fromId: Int32?, fromName: String?, date: Int32, channelId: Int32?, channelPost: Int32?, postAuthor: String?, savedFromPeer: Api.Peer?, savedFromMsgId: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageFwdHeader(let flags, let fromId, let fromName, let date, let channelId, let channelPost, let postAuthor, let savedFromPeer, let savedFromMsgId): if boxed { @@ -15461,14 +15485,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageFwdHeader(let flags, let fromId, let fromName, let date, let channelId, let channelPost, let postAuthor, let savedFromPeer, let savedFromMsgId): return ("messageFwdHeader", [("flags", flags), ("fromId", fromId), ("fromName", fromName), ("date", date), ("channelId", channelId), ("channelPost", channelPost), ("postAuthor", postAuthor), ("savedFromPeer", savedFromPeer), ("savedFromMsgId", savedFromMsgId)]) } } - static func parse_messageFwdHeader(_ reader: BufferReader) -> MessageFwdHeader? { + public static func parse_messageFwdHeader(_ reader: BufferReader) -> MessageFwdHeader? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -15507,7 +15531,7 @@ extension Api { } } - enum MessagesFilter: TypeConstructorDescription { + public enum MessagesFilter: TypeConstructorDescription { case inputMessagesFilterEmpty case inputMessagesFilterPhotos case inputMessagesFilterVideo @@ -15527,7 +15551,7 @@ extension Api { case inputMessagesFilterGeo case inputMessagesFilterContacts - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputMessagesFilterEmpty: if boxed { @@ -15640,7 +15664,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputMessagesFilterEmpty: return ("inputMessagesFilterEmpty", []) @@ -15681,40 +15705,40 @@ extension Api { } } - static func parse_inputMessagesFilterEmpty(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterEmpty(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterEmpty } - static func parse_inputMessagesFilterPhotos(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterPhotos(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterPhotos } - static func parse_inputMessagesFilterVideo(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterVideo(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterVideo } - static func parse_inputMessagesFilterPhotoVideo(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterPhotoVideo(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterPhotoVideo } - static func parse_inputMessagesFilterPhotoVideoDocuments(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterPhotoVideoDocuments(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterPhotoVideoDocuments } - static func parse_inputMessagesFilterDocument(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterDocument(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterDocument } - static func parse_inputMessagesFilterUrl(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterUrl(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterUrl } - static func parse_inputMessagesFilterGif(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterGif(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterGif } - static func parse_inputMessagesFilterVoice(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterVoice(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterVoice } - static func parse_inputMessagesFilterMusic(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterMusic(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterMusic } - static func parse_inputMessagesFilterChatPhotos(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterChatPhotos(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterChatPhotos } - static func parse_inputMessagesFilterPhoneCalls(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterPhoneCalls(_ reader: BufferReader) -> MessagesFilter? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -15725,31 +15749,31 @@ extension Api { return nil } } - static func parse_inputMessagesFilterRoundVoice(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterRoundVoice(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterRoundVoice } - static func parse_inputMessagesFilterRoundVideo(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterRoundVideo(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterRoundVideo } - static func parse_inputMessagesFilterMyMentions(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterMyMentions(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterMyMentions } - static func parse_inputMessagesFilterMyMentionsUnread(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterMyMentionsUnread(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterMyMentionsUnread } - static func parse_inputMessagesFilterGeo(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterGeo(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterGeo } - static func parse_inputMessagesFilterContacts(_ reader: BufferReader) -> MessagesFilter? { + public static func parse_inputMessagesFilterContacts(_ reader: BufferReader) -> MessagesFilter? { return Api.MessagesFilter.inputMessagesFilterContacts } } - enum EmojiKeyword: TypeConstructorDescription { + public enum EmojiKeyword: TypeConstructorDescription { case emojiKeyword(keyword: String, emoticons: [String]) case emojiKeywordDeleted(keyword: String, emoticons: [String]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .emojiKeyword(let keyword, let emoticons): if boxed { @@ -15776,7 +15800,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .emojiKeyword(let keyword, let emoticons): return ("emojiKeyword", [("keyword", keyword), ("emoticons", emoticons)]) @@ -15785,7 +15809,7 @@ extension Api { } } - static func parse_emojiKeyword(_ reader: BufferReader) -> EmojiKeyword? { + public static func parse_emojiKeyword(_ reader: BufferReader) -> EmojiKeyword? { var _1: String? _1 = parseString(reader) var _2: [String]? @@ -15801,7 +15825,7 @@ extension Api { return nil } } - static func parse_emojiKeywordDeleted(_ reader: BufferReader) -> EmojiKeyword? { + public static func parse_emojiKeywordDeleted(_ reader: BufferReader) -> EmojiKeyword? { var _1: String? _1 = parseString(reader) var _2: [String]? @@ -15819,14 +15843,14 @@ extension Api { } } - enum BotInlineMessage: TypeConstructorDescription { + public enum BotInlineMessage: TypeConstructorDescription { case botInlineMessageText(flags: Int32, message: String, entities: [Api.MessageEntity]?, replyMarkup: Api.ReplyMarkup?) case botInlineMessageMediaGeo(flags: Int32, geo: Api.GeoPoint, replyMarkup: Api.ReplyMarkup?) case botInlineMessageMediaAuto(flags: Int32, message: String, entities: [Api.MessageEntity]?, replyMarkup: Api.ReplyMarkup?) case botInlineMessageMediaVenue(flags: Int32, geo: Api.GeoPoint, title: String, address: String, provider: String, venueId: String, venueType: String, replyMarkup: Api.ReplyMarkup?) case botInlineMessageMediaContact(flags: Int32, phoneNumber: String, firstName: String, lastName: String, vcard: String, replyMarkup: Api.ReplyMarkup?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .botInlineMessageText(let flags, let message, let entities, let replyMarkup): if boxed { @@ -15889,7 +15913,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .botInlineMessageText(let flags, let message, let entities, let replyMarkup): return ("botInlineMessageText", [("flags", flags), ("message", message), ("entities", entities), ("replyMarkup", replyMarkup)]) @@ -15904,7 +15928,7 @@ extension Api { } } - static func parse_botInlineMessageText(_ reader: BufferReader) -> BotInlineMessage? { + public static func parse_botInlineMessageText(_ reader: BufferReader) -> BotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -15928,7 +15952,7 @@ extension Api { return nil } } - static func parse_botInlineMessageMediaGeo(_ reader: BufferReader) -> BotInlineMessage? { + public static func parse_botInlineMessageMediaGeo(_ reader: BufferReader) -> BotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Api.GeoPoint? @@ -15949,7 +15973,7 @@ extension Api { return nil } } - static func parse_botInlineMessageMediaAuto(_ reader: BufferReader) -> BotInlineMessage? { + public static func parse_botInlineMessageMediaAuto(_ reader: BufferReader) -> BotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -15973,7 +15997,7 @@ extension Api { return nil } } - static func parse_botInlineMessageMediaVenue(_ reader: BufferReader) -> BotInlineMessage? { + public static func parse_botInlineMessageMediaVenue(_ reader: BufferReader) -> BotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: Api.GeoPoint? @@ -16009,7 +16033,7 @@ extension Api { return nil } } - static func parse_botInlineMessageMediaContact(_ reader: BufferReader) -> BotInlineMessage? { + public static func parse_botInlineMessageMediaContact(_ reader: BufferReader) -> BotInlineMessage? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -16039,10 +16063,10 @@ extension Api { } } - enum InputPeerNotifySettings: TypeConstructorDescription { + public enum InputPeerNotifySettings: TypeConstructorDescription { case inputPeerNotifySettings(flags: Int32, showPreviews: Api.Bool?, silent: Api.Bool?, muteUntil: Int32?, sound: String?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPeerNotifySettings(let flags, let showPreviews, let silent, let muteUntil, let sound): if boxed { @@ -16057,14 +16081,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPeerNotifySettings(let flags, let showPreviews, let silent, let muteUntil, let sound): return ("inputPeerNotifySettings", [("flags", flags), ("showPreviews", showPreviews), ("silent", silent), ("muteUntil", muteUntil), ("sound", sound)]) } } - static func parse_inputPeerNotifySettings(_ reader: BufferReader) -> InputPeerNotifySettings? { + public static func parse_inputPeerNotifySettings(_ reader: BufferReader) -> InputPeerNotifySettings? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Bool? @@ -16093,11 +16117,11 @@ extension Api { } } - enum ExportedChatInvite: TypeConstructorDescription { + public enum ExportedChatInvite: TypeConstructorDescription { case chatInviteEmpty case chatInviteExported(link: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatInviteEmpty: if boxed { @@ -16114,7 +16138,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatInviteEmpty: return ("chatInviteEmpty", []) @@ -16123,10 +16147,10 @@ extension Api { } } - static func parse_chatInviteEmpty(_ reader: BufferReader) -> ExportedChatInvite? { + public static func parse_chatInviteEmpty(_ reader: BufferReader) -> ExportedChatInvite? { return Api.ExportedChatInvite.chatInviteEmpty } - static func parse_chatInviteExported(_ reader: BufferReader) -> ExportedChatInvite? { + public static func parse_chatInviteExported(_ reader: BufferReader) -> ExportedChatInvite? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -16139,10 +16163,10 @@ extension Api { } } - enum Authorization: TypeConstructorDescription { + public enum Authorization: TypeConstructorDescription { case authorization(flags: Int32, hash: Int64, deviceModel: String, platform: String, systemVersion: String, apiId: Int32, appName: String, appVersion: String, dateCreated: Int32, dateActive: Int32, ip: String, country: String, region: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .authorization(let flags, let hash, let deviceModel, let platform, let systemVersion, let apiId, let appName, let appVersion, let dateCreated, let dateActive, let ip, let country, let region): if boxed { @@ -16165,14 +16189,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .authorization(let flags, let hash, let deviceModel, let platform, let systemVersion, let apiId, let appName, let appVersion, let dateCreated, let dateActive, let ip, let country, let region): return ("authorization", [("flags", flags), ("hash", hash), ("deviceModel", deviceModel), ("platform", platform), ("systemVersion", systemVersion), ("apiId", apiId), ("appName", appName), ("appVersion", appVersion), ("dateCreated", dateCreated), ("dateActive", dateActive), ("ip", ip), ("country", country), ("region", region)]) } } - static func parse_authorization(_ reader: BufferReader) -> Authorization? { + public static func parse_authorization(_ reader: BufferReader) -> Authorization? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -16221,10 +16245,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 { @@ -16238,14 +16262,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? @@ -16267,10 +16291,10 @@ extension Api { } } - enum PhoneConnection: TypeConstructorDescription { + public enum PhoneConnection: TypeConstructorDescription { case phoneConnection(id: Int64, ip: String, ipv6: String, port: Int32, peerTag: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .phoneConnection(let id, let ip, let ipv6, let port, let peerTag): if boxed { @@ -16285,14 +16309,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .phoneConnection(let id, let ip, let ipv6, let port, let peerTag): return ("phoneConnection", [("id", id), ("ip", ip), ("ipv6", ipv6), ("port", port), ("peerTag", peerTag)]) } } - static func parse_phoneConnection(_ reader: BufferReader) -> PhoneConnection? { + public static func parse_phoneConnection(_ reader: BufferReader) -> PhoneConnection? { var _1: Int64? _1 = reader.readInt64() var _2: String? @@ -16317,10 +16341,10 @@ extension Api { } } - enum AccountDaysTTL: TypeConstructorDescription { + public enum AccountDaysTTL: TypeConstructorDescription { case accountDaysTTL(days: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .accountDaysTTL(let days): if boxed { @@ -16331,14 +16355,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .accountDaysTTL(let days): return ("accountDaysTTL", [("days", days)]) } } - static func parse_accountDaysTTL(_ reader: BufferReader) -> AccountDaysTTL? { + public static func parse_accountDaysTTL(_ reader: BufferReader) -> AccountDaysTTL? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -16351,7 +16375,7 @@ extension Api { } } - enum SecureValueType: TypeConstructorDescription { + public enum SecureValueType: TypeConstructorDescription { case secureValueTypePersonalDetails case secureValueTypePassport case secureValueTypeDriverLicense @@ -16366,7 +16390,7 @@ extension Api { case secureValueTypePhone case secureValueTypeEmail - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .secureValueTypePersonalDetails: if boxed { @@ -16449,7 +16473,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .secureValueTypePersonalDetails: return ("secureValueTypePersonalDetails", []) @@ -16480,52 +16504,52 @@ extension Api { } } - static func parse_secureValueTypePersonalDetails(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypePersonalDetails(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypePersonalDetails } - static func parse_secureValueTypePassport(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypePassport(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypePassport } - static func parse_secureValueTypeDriverLicense(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeDriverLicense(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeDriverLicense } - static func parse_secureValueTypeIdentityCard(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeIdentityCard(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeIdentityCard } - static func parse_secureValueTypeInternalPassport(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeInternalPassport(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeInternalPassport } - static func parse_secureValueTypeAddress(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeAddress(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeAddress } - static func parse_secureValueTypeUtilityBill(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeUtilityBill(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeUtilityBill } - static func parse_secureValueTypeBankStatement(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeBankStatement(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeBankStatement } - static func parse_secureValueTypeRentalAgreement(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeRentalAgreement(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeRentalAgreement } - static func parse_secureValueTypePassportRegistration(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypePassportRegistration(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypePassportRegistration } - static func parse_secureValueTypeTemporaryRegistration(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeTemporaryRegistration(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeTemporaryRegistration } - static func parse_secureValueTypePhone(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypePhone(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypePhone } - static func parse_secureValueTypeEmail(_ reader: BufferReader) -> SecureValueType? { + public static func parse_secureValueTypeEmail(_ reader: BufferReader) -> SecureValueType? { return Api.SecureValueType.secureValueTypeEmail } } - enum PasswordKdfAlgo: TypeConstructorDescription { + public enum PasswordKdfAlgo: TypeConstructorDescription { case passwordKdfAlgoUnknown case passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(salt1: Buffer, salt2: Buffer, g: Int32, p: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .passwordKdfAlgoUnknown: if boxed { @@ -16545,7 +16569,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .passwordKdfAlgoUnknown: return ("passwordKdfAlgoUnknown", []) @@ -16554,10 +16578,10 @@ extension Api { } } - static func parse_passwordKdfAlgoUnknown(_ reader: BufferReader) -> PasswordKdfAlgo? { + public static func parse_passwordKdfAlgoUnknown(_ reader: BufferReader) -> PasswordKdfAlgo? { return Api.PasswordKdfAlgo.passwordKdfAlgoUnknown } - static func parse_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(_ reader: BufferReader) -> PasswordKdfAlgo? { + public static func parse_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(_ reader: BufferReader) -> PasswordKdfAlgo? { var _1: Buffer? _1 = parseBytes(reader) var _2: Buffer? @@ -16579,13 +16603,13 @@ extension Api { } } - enum InputBotInlineResult: TypeConstructorDescription { + public enum InputBotInlineResult: TypeConstructorDescription { case inputBotInlineResultPhoto(id: String, type: String, photo: Api.InputPhoto, sendMessage: Api.InputBotInlineMessage) case inputBotInlineResultDocument(flags: Int32, id: String, type: String, title: String?, description: String?, document: Api.InputDocument, sendMessage: Api.InputBotInlineMessage) case inputBotInlineResultGame(id: String, shortName: String, sendMessage: Api.InputBotInlineMessage) case inputBotInlineResult(flags: Int32, id: String, type: String, title: String?, description: String?, url: String?, thumb: Api.InputWebDocument?, content: Api.InputWebDocument?, sendMessage: Api.InputBotInlineMessage) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputBotInlineResultPhoto(let id, let type, let photo, let sendMessage): if boxed { @@ -16633,7 +16657,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputBotInlineResultPhoto(let id, let type, let photo, let sendMessage): return ("inputBotInlineResultPhoto", [("id", id), ("type", type), ("photo", photo), ("sendMessage", sendMessage)]) @@ -16646,7 +16670,7 @@ extension Api { } } - static func parse_inputBotInlineResultPhoto(_ reader: BufferReader) -> InputBotInlineResult? { + public static func parse_inputBotInlineResultPhoto(_ reader: BufferReader) -> InputBotInlineResult? { var _1: String? _1 = parseString(reader) var _2: String? @@ -16670,7 +16694,7 @@ extension Api { return nil } } - static func parse_inputBotInlineResultDocument(_ reader: BufferReader) -> InputBotInlineResult? { + public static func parse_inputBotInlineResultDocument(_ reader: BufferReader) -> InputBotInlineResult? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -16703,7 +16727,7 @@ extension Api { return nil } } - static func parse_inputBotInlineResultGame(_ reader: BufferReader) -> InputBotInlineResult? { + public static func parse_inputBotInlineResultGame(_ reader: BufferReader) -> InputBotInlineResult? { var _1: String? _1 = parseString(reader) var _2: String? @@ -16722,7 +16746,7 @@ extension Api { return nil } } - static func parse_inputBotInlineResult(_ reader: BufferReader) -> InputBotInlineResult? { + public static func parse_inputBotInlineResult(_ reader: BufferReader) -> InputBotInlineResult? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -16765,7 +16789,7 @@ extension Api { } } - enum PrivacyRule: TypeConstructorDescription { + public enum PrivacyRule: TypeConstructorDescription { case privacyValueAllowContacts case privacyValueAllowAll case privacyValueAllowUsers(users: [Int32]) @@ -16775,7 +16799,7 @@ extension Api { case privacyValueAllowChatParticipants(chats: [Int32]) case privacyValueDisallowChatParticipants(chats: [Int32]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .privacyValueAllowContacts: if boxed { @@ -16844,7 +16868,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .privacyValueAllowContacts: return ("privacyValueAllowContacts", []) @@ -16865,13 +16889,13 @@ extension Api { } } - static func parse_privacyValueAllowContacts(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueAllowContacts(_ reader: BufferReader) -> PrivacyRule? { return Api.PrivacyRule.privacyValueAllowContacts } - static func parse_privacyValueAllowAll(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueAllowAll(_ reader: BufferReader) -> PrivacyRule? { return Api.PrivacyRule.privacyValueAllowAll } - static func parse_privacyValueAllowUsers(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueAllowUsers(_ reader: BufferReader) -> PrivacyRule? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -16884,13 +16908,13 @@ extension Api { return nil } } - static func parse_privacyValueDisallowContacts(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueDisallowContacts(_ reader: BufferReader) -> PrivacyRule? { return Api.PrivacyRule.privacyValueDisallowContacts } - static func parse_privacyValueDisallowAll(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueDisallowAll(_ reader: BufferReader) -> PrivacyRule? { return Api.PrivacyRule.privacyValueDisallowAll } - static func parse_privacyValueDisallowUsers(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueDisallowUsers(_ reader: BufferReader) -> PrivacyRule? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -16903,7 +16927,7 @@ extension Api { return nil } } - static func parse_privacyValueAllowChatParticipants(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueAllowChatParticipants(_ reader: BufferReader) -> PrivacyRule? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -16916,7 +16940,7 @@ extension Api { return nil } } - static func parse_privacyValueDisallowChatParticipants(_ reader: BufferReader) -> PrivacyRule? { + public static func parse_privacyValueDisallowChatParticipants(_ reader: BufferReader) -> PrivacyRule? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -16931,7 +16955,7 @@ extension Api { } } - enum MessageAction: TypeConstructorDescription { + public enum MessageAction: TypeConstructorDescription { case messageActionEmpty case messageActionChatCreate(title: String, users: [Int32]) case messageActionChatEditTitle(title: String) @@ -16956,7 +16980,7 @@ extension Api { case messageActionSecureValuesSent(types: [Api.SecureValueType]) case messageActionContactSignUp - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageActionEmpty: if boxed { @@ -17129,7 +17153,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageActionEmpty: return ("messageActionEmpty", []) @@ -17180,10 +17204,10 @@ extension Api { } } - static func parse_messageActionEmpty(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionEmpty(_ reader: BufferReader) -> MessageAction? { return Api.MessageAction.messageActionEmpty } - static func parse_messageActionChatCreate(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatCreate(_ reader: BufferReader) -> MessageAction? { var _1: String? _1 = parseString(reader) var _2: [Int32]? @@ -17199,7 +17223,7 @@ extension Api { return nil } } - static func parse_messageActionChatEditTitle(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatEditTitle(_ reader: BufferReader) -> MessageAction? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -17210,7 +17234,7 @@ extension Api { return nil } } - static func parse_messageActionChatEditPhoto(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatEditPhoto(_ reader: BufferReader) -> MessageAction? { var _1: Api.Photo? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Photo @@ -17223,10 +17247,10 @@ extension Api { return nil } } - static func parse_messageActionChatDeletePhoto(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatDeletePhoto(_ reader: BufferReader) -> MessageAction? { return Api.MessageAction.messageActionChatDeletePhoto } - static func parse_messageActionChatAddUser(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatAddUser(_ reader: BufferReader) -> MessageAction? { var _1: [Int32]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) @@ -17239,7 +17263,7 @@ extension Api { return nil } } - static func parse_messageActionChatDeleteUser(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatDeleteUser(_ reader: BufferReader) -> MessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -17250,7 +17274,7 @@ extension Api { return nil } } - static func parse_messageActionChatJoinedByLink(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatJoinedByLink(_ reader: BufferReader) -> MessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -17261,7 +17285,7 @@ extension Api { return nil } } - static func parse_messageActionChannelCreate(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChannelCreate(_ reader: BufferReader) -> MessageAction? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -17272,7 +17296,7 @@ extension Api { return nil } } - static func parse_messageActionChatMigrateTo(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChatMigrateTo(_ reader: BufferReader) -> MessageAction? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -17283,7 +17307,7 @@ extension Api { return nil } } - static func parse_messageActionChannelMigrateFrom(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionChannelMigrateFrom(_ reader: BufferReader) -> MessageAction? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -17297,13 +17321,13 @@ extension Api { return nil } } - static func parse_messageActionPinMessage(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionPinMessage(_ reader: BufferReader) -> MessageAction? { return Api.MessageAction.messageActionPinMessage } - static func parse_messageActionHistoryClear(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionHistoryClear(_ reader: BufferReader) -> MessageAction? { return Api.MessageAction.messageActionHistoryClear } - static func parse_messageActionGameScore(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionGameScore(_ reader: BufferReader) -> MessageAction? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -17317,7 +17341,7 @@ extension Api { return nil } } - static func parse_messageActionPaymentSentMe(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionPaymentSentMe(_ reader: BufferReader) -> MessageAction? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -17350,7 +17374,7 @@ extension Api { return nil } } - static func parse_messageActionPaymentSent(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionPaymentSent(_ reader: BufferReader) -> MessageAction? { var _1: String? _1 = parseString(reader) var _2: Int64? @@ -17364,7 +17388,7 @@ extension Api { return nil } } - static func parse_messageActionPhoneCall(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionPhoneCall(_ reader: BufferReader) -> MessageAction? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -17386,10 +17410,10 @@ extension Api { return nil } } - static func parse_messageActionScreenshotTaken(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionScreenshotTaken(_ reader: BufferReader) -> MessageAction? { return Api.MessageAction.messageActionScreenshotTaken } - static func parse_messageActionCustomAction(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionCustomAction(_ reader: BufferReader) -> MessageAction? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -17400,7 +17424,7 @@ extension Api { return nil } } - static func parse_messageActionBotAllowed(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionBotAllowed(_ reader: BufferReader) -> MessageAction? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -17411,7 +17435,7 @@ extension Api { return nil } } - static func parse_messageActionSecureValuesSentMe(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionSecureValuesSentMe(_ reader: BufferReader) -> MessageAction? { var _1: [Api.SecureValue]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.SecureValue.self) @@ -17429,7 +17453,7 @@ extension Api { return nil } } - static func parse_messageActionSecureValuesSent(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionSecureValuesSent(_ reader: BufferReader) -> MessageAction? { var _1: [Api.SecureValueType]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.SecureValueType.self) @@ -17442,12 +17466,12 @@ extension Api { return nil } } - static func parse_messageActionContactSignUp(_ reader: BufferReader) -> MessageAction? { + public static func parse_messageActionContactSignUp(_ reader: BufferReader) -> MessageAction? { return Api.MessageAction.messageActionContactSignUp } } - enum PhoneCall: TypeConstructorDescription { + public enum PhoneCall: TypeConstructorDescription { case phoneCallEmpty(id: Int64) case phoneCallWaiting(flags: Int32, id: Int64, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32, protocol: Api.PhoneCallProtocol, receiveDate: Int32?) case phoneCallRequested(flags: Int32, id: Int64, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32, gAHash: Buffer, protocol: Api.PhoneCallProtocol) @@ -17455,7 +17479,7 @@ extension Api { case phoneCall(flags: Int32, id: Int64, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32, gAOrB: Buffer, keyFingerprint: Int64, protocol: Api.PhoneCallProtocol, connections: [Api.PhoneConnection], startDate: Int32) case phoneCallDiscarded(flags: Int32, id: Int64, reason: Api.PhoneCallDiscardReason?, duration: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .phoneCallEmpty(let id): if boxed { @@ -17534,7 +17558,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .phoneCallEmpty(let id): return ("phoneCallEmpty", [("id", id)]) @@ -17551,7 +17575,7 @@ extension Api { } } - static func parse_phoneCallEmpty(_ reader: BufferReader) -> PhoneCall? { + public static func parse_phoneCallEmpty(_ reader: BufferReader) -> PhoneCall? { var _1: Int64? _1 = reader.readInt64() let _c1 = _1 != nil @@ -17562,7 +17586,7 @@ extension Api { return nil } } - static func parse_phoneCallWaiting(_ reader: BufferReader) -> PhoneCall? { + public static func parse_phoneCallWaiting(_ reader: BufferReader) -> PhoneCall? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -17596,7 +17620,7 @@ extension Api { return nil } } - static func parse_phoneCallRequested(_ reader: BufferReader) -> PhoneCall? { + public static func parse_phoneCallRequested(_ reader: BufferReader) -> PhoneCall? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -17630,7 +17654,7 @@ extension Api { return nil } } - static func parse_phoneCallAccepted(_ reader: BufferReader) -> PhoneCall? { + public static func parse_phoneCallAccepted(_ reader: BufferReader) -> PhoneCall? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -17664,7 +17688,7 @@ extension Api { return nil } } - static func parse_phoneCall(_ reader: BufferReader) -> PhoneCall? { + public static func parse_phoneCall(_ reader: BufferReader) -> PhoneCall? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -17709,7 +17733,7 @@ extension Api { return nil } } - static func parse_phoneCallDiscarded(_ reader: BufferReader) -> PhoneCall? { + public static func parse_phoneCallDiscarded(_ reader: BufferReader) -> PhoneCall? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -17733,11 +17757,11 @@ extension Api { } } - enum DialogPeer: TypeConstructorDescription { + public enum DialogPeer: TypeConstructorDescription { case dialogPeer(peer: Api.Peer) case dialogPeerFolder(folderId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .dialogPeer(let peer): if boxed { @@ -17754,7 +17778,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .dialogPeer(let peer): return ("dialogPeer", [("peer", peer)]) @@ -17763,7 +17787,7 @@ extension Api { } } - static func parse_dialogPeer(_ reader: BufferReader) -> DialogPeer? { + public static func parse_dialogPeer(_ reader: BufferReader) -> DialogPeer? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -17776,7 +17800,7 @@ extension Api { return nil } } - static func parse_dialogPeerFolder(_ reader: BufferReader) -> DialogPeer? { + public static func parse_dialogPeerFolder(_ reader: BufferReader) -> DialogPeer? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -17789,61 +17813,11 @@ extension Api { } } - enum ContactLink: TypeConstructorDescription { - case contactLinkUnknown - case contactLinkNone - case contactLinkContact - - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .contactLinkUnknown: - if boxed { - buffer.appendInt32(1599050311) - } - - break - case .contactLinkNone: - if boxed { - buffer.appendInt32(-17968211) - } - - break - case .contactLinkContact: - if boxed { - buffer.appendInt32(-721239344) - } - - break - } - } - - func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .contactLinkUnknown: - return ("contactLinkUnknown", []) - case .contactLinkNone: - return ("contactLinkNone", []) - case .contactLinkContact: - return ("contactLinkContact", []) - } - } - - static func parse_contactLinkUnknown(_ reader: BufferReader) -> ContactLink? { - return Api.ContactLink.contactLinkUnknown - } - static func parse_contactLinkNone(_ reader: BufferReader) -> ContactLink? { - return Api.ContactLink.contactLinkNone - } - static func parse_contactLinkContact(_ reader: BufferReader) -> ContactLink? { - return Api.ContactLink.contactLinkContact - } - - } - enum WebDocument: TypeConstructorDescription { + public enum WebDocument: TypeConstructorDescription { case webDocumentNoProxy(url: String, size: Int32, mimeType: String, attributes: [Api.DocumentAttribute]) case webDocument(url: String, accessHash: Int64, size: Int32, mimeType: String, attributes: [Api.DocumentAttribute]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .webDocumentNoProxy(let url, let size, let mimeType, let attributes): if boxed { @@ -17875,7 +17849,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .webDocumentNoProxy(let url, let size, let mimeType, let attributes): return ("webDocumentNoProxy", [("url", url), ("size", size), ("mimeType", mimeType), ("attributes", attributes)]) @@ -17884,7 +17858,7 @@ extension Api { } } - static func parse_webDocumentNoProxy(_ reader: BufferReader) -> WebDocument? { + public static func parse_webDocumentNoProxy(_ reader: BufferReader) -> WebDocument? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -17906,7 +17880,7 @@ extension Api { return nil } } - static func parse_webDocument(_ reader: BufferReader) -> WebDocument? { + public static func parse_webDocument(_ reader: BufferReader) -> WebDocument? { var _1: String? _1 = parseString(reader) var _2: Int64? @@ -17933,10 +17907,10 @@ extension Api { } } - enum ChannelAdminLogEventsFilter: TypeConstructorDescription { + public enum ChannelAdminLogEventsFilter: TypeConstructorDescription { case channelAdminLogEventsFilter(flags: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelAdminLogEventsFilter(let flags): if boxed { @@ -17947,14 +17921,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelAdminLogEventsFilter(let flags): return ("channelAdminLogEventsFilter", [("flags", flags)]) } } - static func parse_channelAdminLogEventsFilter(_ reader: BufferReader) -> ChannelAdminLogEventsFilter? { + public static func parse_channelAdminLogEventsFilter(_ reader: BufferReader) -> ChannelAdminLogEventsFilter? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -17967,11 +17941,11 @@ extension Api { } } - enum PeerNotifySettings: TypeConstructorDescription { + public enum PeerNotifySettings: TypeConstructorDescription { case peerNotifySettingsEmpty case peerNotifySettings(flags: Int32, showPreviews: Api.Bool?, silent: Api.Bool?, muteUntil: Int32?, sound: String?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .peerNotifySettingsEmpty: if boxed { @@ -17992,7 +17966,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .peerNotifySettingsEmpty: return ("peerNotifySettingsEmpty", []) @@ -18001,10 +17975,10 @@ extension Api { } } - static func parse_peerNotifySettingsEmpty(_ reader: BufferReader) -> PeerNotifySettings? { + public static func parse_peerNotifySettingsEmpty(_ reader: BufferReader) -> PeerNotifySettings? { return Api.PeerNotifySettings.peerNotifySettingsEmpty } - static func parse_peerNotifySettings(_ reader: BufferReader) -> PeerNotifySettings? { + public static func parse_peerNotifySettings(_ reader: BufferReader) -> PeerNotifySettings? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Bool? @@ -18033,10 +18007,10 @@ extension Api { } } - enum InputBotInlineMessageID: TypeConstructorDescription { + public enum InputBotInlineMessageID: TypeConstructorDescription { case inputBotInlineMessageID(dcId: Int32, id: Int64, accessHash: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputBotInlineMessageID(let dcId, let id, let accessHash): if boxed { @@ -18049,14 +18023,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputBotInlineMessageID(let dcId, let id, let accessHash): return ("inputBotInlineMessageID", [("dcId", dcId), ("id", id), ("accessHash", accessHash)]) } } - static func parse_inputBotInlineMessageID(_ reader: BufferReader) -> InputBotInlineMessageID? { + public static func parse_inputBotInlineMessageID(_ reader: BufferReader) -> InputBotInlineMessageID? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -18075,10 +18049,10 @@ extension Api { } } - enum PageRelatedArticle: TypeConstructorDescription { + public enum PageRelatedArticle: TypeConstructorDescription { case pageRelatedArticle(flags: Int32, url: String, webpageId: Int64, title: String?, description: String?, photoId: Int64?, author: String?, publishedDate: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pageRelatedArticle(let flags, let url, let webpageId, let title, let description, let photoId, let author, let publishedDate): if boxed { @@ -18096,14 +18070,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pageRelatedArticle(let flags, let url, let webpageId, let title, let description, let photoId, let author, let publishedDate): return ("pageRelatedArticle", [("flags", flags), ("url", url), ("webpageId", webpageId), ("title", title), ("description", description), ("photoId", photoId), ("author", author), ("publishedDate", publishedDate)]) } } - static func parse_pageRelatedArticle(_ reader: BufferReader) -> PageRelatedArticle? { + public static func parse_pageRelatedArticle(_ reader: BufferReader) -> PageRelatedArticle? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -18137,10 +18111,10 @@ extension Api { } } - enum StickerPack: TypeConstructorDescription { + public enum StickerPack: TypeConstructorDescription { case stickerPack(emoticon: String, documents: [Int64]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .stickerPack(let emoticon, let documents): if boxed { @@ -18156,14 +18130,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .stickerPack(let emoticon, let documents): return ("stickerPack", [("emoticon", emoticon), ("documents", documents)]) } } - static func parse_stickerPack(_ reader: BufferReader) -> StickerPack? { + public static func parse_stickerPack(_ reader: BufferReader) -> StickerPack? { var _1: String? _1 = parseString(reader) var _2: [Int64]? @@ -18181,11 +18155,11 @@ extension Api { } } - enum UserProfilePhoto: TypeConstructorDescription { + public enum UserProfilePhoto: TypeConstructorDescription { case userProfilePhotoEmpty case userProfilePhoto(photoId: Int64, photoSmall: Api.FileLocation, photoBig: Api.FileLocation, dcId: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .userProfilePhotoEmpty: if boxed { @@ -18205,7 +18179,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .userProfilePhotoEmpty: return ("userProfilePhotoEmpty", []) @@ -18214,10 +18188,10 @@ extension Api { } } - static func parse_userProfilePhotoEmpty(_ reader: BufferReader) -> UserProfilePhoto? { + public static func parse_userProfilePhotoEmpty(_ reader: BufferReader) -> UserProfilePhoto? { return Api.UserProfilePhoto.userProfilePhotoEmpty } - static func parse_userProfilePhoto(_ reader: BufferReader) -> UserProfilePhoto? { + public static func parse_userProfilePhoto(_ reader: BufferReader) -> UserProfilePhoto? { var _1: Int64? _1 = reader.readInt64() var _2: Api.FileLocation? @@ -18243,10 +18217,10 @@ extension Api { } } - enum ChatOnlines: TypeConstructorDescription { + public enum ChatOnlines: TypeConstructorDescription { case chatOnlines(onlines: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .chatOnlines(let onlines): if boxed { @@ -18257,14 +18231,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .chatOnlines(let onlines): return ("chatOnlines", [("onlines", onlines)]) } } - static func parse_chatOnlines(_ reader: BufferReader) -> ChatOnlines? { + public static func parse_chatOnlines(_ reader: BufferReader) -> ChatOnlines? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -18277,10 +18251,10 @@ extension Api { } } - enum InputAppEvent: TypeConstructorDescription { + public enum InputAppEvent: TypeConstructorDescription { case inputAppEvent(time: Double, type: String, peer: Int64, data: Api.JSONValue) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputAppEvent(let time, let type, let peer, let data): if boxed { @@ -18294,14 +18268,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputAppEvent(let time, let type, let peer, let data): return ("inputAppEvent", [("time", time), ("type", type), ("peer", peer), ("data", data)]) } } - static func parse_inputAppEvent(_ reader: BufferReader) -> InputAppEvent? { + public static func parse_inputAppEvent(_ reader: BufferReader) -> InputAppEvent? { var _1: Double? _1 = reader.readDouble() var _2: String? @@ -18325,7 +18299,7 @@ extension Api { } } - enum MessageEntity: TypeConstructorDescription { + public enum MessageEntity: TypeConstructorDescription { case messageEntityUnknown(offset: Int32, length: Int32) case messageEntityMention(offset: Int32, length: Int32) case messageEntityHashtag(offset: Int32, length: Int32) @@ -18345,7 +18319,7 @@ extension Api { case messageEntityStrike(offset: Int32, length: Int32) case messageEntityBlockquote(offset: Int32, length: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .messageEntityUnknown(let offset, let length): if boxed { @@ -18480,7 +18454,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .messageEntityUnknown(let offset, let length): return ("messageEntityUnknown", [("offset", offset), ("length", length)]) @@ -18521,7 +18495,7 @@ extension Api { } } - static func parse_messageEntityUnknown(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityUnknown(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18535,7 +18509,7 @@ extension Api { return nil } } - static func parse_messageEntityMention(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityMention(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18549,7 +18523,7 @@ extension Api { return nil } } - static func parse_messageEntityHashtag(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityHashtag(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18563,7 +18537,7 @@ extension Api { return nil } } - static func parse_messageEntityBotCommand(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityBotCommand(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18577,7 +18551,7 @@ extension Api { return nil } } - static func parse_messageEntityUrl(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityUrl(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18591,7 +18565,7 @@ extension Api { return nil } } - static func parse_messageEntityEmail(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityEmail(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18605,7 +18579,7 @@ extension Api { return nil } } - static func parse_messageEntityBold(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityBold(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18619,7 +18593,7 @@ extension Api { return nil } } - static func parse_messageEntityItalic(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityItalic(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18633,7 +18607,7 @@ extension Api { return nil } } - static func parse_messageEntityCode(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityCode(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18647,7 +18621,7 @@ extension Api { return nil } } - static func parse_messageEntityPre(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityPre(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18664,7 +18638,7 @@ extension Api { return nil } } - static func parse_messageEntityTextUrl(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityTextUrl(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18681,7 +18655,7 @@ extension Api { return nil } } - static func parse_messageEntityMentionName(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityMentionName(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18698,7 +18672,7 @@ extension Api { return nil } } - static func parse_inputMessageEntityMentionName(_ reader: BufferReader) -> MessageEntity? { + public static func parse_inputMessageEntityMentionName(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18717,7 +18691,7 @@ extension Api { return nil } } - static func parse_messageEntityPhone(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityPhone(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18731,7 +18705,7 @@ extension Api { return nil } } - static func parse_messageEntityCashtag(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityCashtag(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18745,7 +18719,7 @@ extension Api { return nil } } - static func parse_messageEntityUnderline(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityUnderline(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18759,7 +18733,7 @@ extension Api { return nil } } - static func parse_messageEntityStrike(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityStrike(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18773,7 +18747,7 @@ extension Api { return nil } } - static func parse_messageEntityBlockquote(_ reader: BufferReader) -> MessageEntity? { + public static func parse_messageEntityBlockquote(_ reader: BufferReader) -> MessageEntity? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -18789,11 +18763,11 @@ extension Api { } } - enum InputPhoto: TypeConstructorDescription { + public enum InputPhoto: TypeConstructorDescription { case inputPhotoEmpty case inputPhoto(id: Int64, accessHash: Int64, fileReference: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inputPhotoEmpty: if boxed { @@ -18812,7 +18786,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inputPhotoEmpty: return ("inputPhotoEmpty", []) @@ -18821,10 +18795,10 @@ extension Api { } } - static func parse_inputPhotoEmpty(_ reader: BufferReader) -> InputPhoto? { + public static func parse_inputPhotoEmpty(_ reader: BufferReader) -> InputPhoto? { return Api.InputPhoto.inputPhotoEmpty } - static func parse_inputPhoto(_ reader: BufferReader) -> InputPhoto? { + public static func parse_inputPhoto(_ reader: BufferReader) -> InputPhoto? { var _1: Int64? _1 = reader.readInt64() var _2: Int64? @@ -18843,11 +18817,11 @@ extension Api { } } - enum PageListOrderedItem: TypeConstructorDescription { + public enum PageListOrderedItem: TypeConstructorDescription { case pageListOrderedItemText(num: String, text: Api.RichText) case pageListOrderedItemBlocks(num: String, blocks: [Api.PageBlock]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .pageListOrderedItemText(let num, let text): if boxed { @@ -18870,7 +18844,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .pageListOrderedItemText(let num, let text): return ("pageListOrderedItemText", [("num", num), ("text", text)]) @@ -18879,7 +18853,7 @@ extension Api { } } - static func parse_pageListOrderedItemText(_ reader: BufferReader) -> PageListOrderedItem? { + public static func parse_pageListOrderedItemText(_ reader: BufferReader) -> PageListOrderedItem? { var _1: String? _1 = parseString(reader) var _2: Api.RichText? @@ -18895,7 +18869,7 @@ extension Api { return nil } } - static func parse_pageListOrderedItemBlocks(_ reader: BufferReader) -> PageListOrderedItem? { + public static func parse_pageListOrderedItemBlocks(_ reader: BufferReader) -> PageListOrderedItem? { var _1: String? _1 = parseString(reader) var _2: [Api.PageBlock]? @@ -18913,14 +18887,14 @@ extension Api { } } - enum EncryptedChat: TypeConstructorDescription { + public enum EncryptedChat: TypeConstructorDescription { case encryptedChatEmpty(id: Int32) case encryptedChatWaiting(id: Int32, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32) case encryptedChatRequested(id: Int32, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32, gA: Buffer) case encryptedChat(id: Int32, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32, gAOrB: Buffer, keyFingerprint: Int64) case encryptedChatDiscarded(id: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .encryptedChatEmpty(let id): if boxed { @@ -18970,7 +18944,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .encryptedChatEmpty(let id): return ("encryptedChatEmpty", [("id", id)]) @@ -18985,7 +18959,7 @@ extension Api { } } - static func parse_encryptedChatEmpty(_ reader: BufferReader) -> EncryptedChat? { + public static func parse_encryptedChatEmpty(_ reader: BufferReader) -> EncryptedChat? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -18996,7 +18970,7 @@ extension Api { return nil } } - static func parse_encryptedChatWaiting(_ reader: BufferReader) -> EncryptedChat? { + public static func parse_encryptedChatWaiting(_ reader: BufferReader) -> EncryptedChat? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -19019,7 +18993,7 @@ extension Api { return nil } } - static func parse_encryptedChatRequested(_ reader: BufferReader) -> EncryptedChat? { + public static func parse_encryptedChatRequested(_ reader: BufferReader) -> EncryptedChat? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -19045,7 +19019,7 @@ extension Api { return nil } } - static func parse_encryptedChat(_ reader: BufferReader) -> EncryptedChat? { + public static func parse_encryptedChat(_ reader: BufferReader) -> EncryptedChat? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -19074,7 +19048,7 @@ extension Api { return nil } } - static func parse_encryptedChatDiscarded(_ reader: BufferReader) -> EncryptedChat? { + public static func parse_encryptedChatDiscarded(_ reader: BufferReader) -> EncryptedChat? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -19087,11 +19061,55 @@ extension Api { } } - enum Document: TypeConstructorDescription { + public enum PeerLocated: TypeConstructorDescription { + case peerLocated(peer: Api.Peer, expires: Int32, distance: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .peerLocated(let peer, let expires, let distance): + if boxed { + buffer.appendInt32(-901375139) + } + peer.serialize(buffer, true) + serializeInt32(expires, buffer: buffer, boxed: false) + serializeInt32(distance, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .peerLocated(let peer, let expires, let distance): + return ("peerLocated", [("peer", peer), ("expires", expires), ("distance", distance)]) + } + } + + public static func parse_peerLocated(_ reader: BufferReader) -> PeerLocated? { + 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: Int32? + _3 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.PeerLocated.peerLocated(peer: _1!, expires: _2!, distance: _3!) + } + else { + return nil + } + } + + } + public enum Document: TypeConstructorDescription { case documentEmpty(id: Int64) 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 .documentEmpty(let id): if boxed { @@ -19125,7 +19143,7 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .documentEmpty(let id): return ("documentEmpty", [("id", id)]) @@ -19134,7 +19152,7 @@ extension Api { } } - static func parse_documentEmpty(_ reader: BufferReader) -> Document? { + public static func parse_documentEmpty(_ reader: BufferReader) -> Document? { var _1: Int64? _1 = reader.readInt64() let _c1 = _1 != nil @@ -19145,7 +19163,7 @@ extension Api { return nil } } - static func parse_document(_ reader: BufferReader) -> Document? { + public static func parse_document(_ reader: BufferReader) -> Document? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? @@ -19189,10 +19207,10 @@ extension Api { } } - enum WebAuthorization: TypeConstructorDescription { + public enum WebAuthorization: TypeConstructorDescription { case webAuthorization(hash: Int64, botId: Int32, domain: String, browser: String, platform: String, dateCreated: Int32, dateActive: Int32, ip: String, region: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .webAuthorization(let hash, let botId, let domain, let browser, let platform, let dateCreated, let dateActive, let ip, let region): if boxed { @@ -19211,14 +19229,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .webAuthorization(let hash, let botId, let domain, let browser, let platform, let dateCreated, let dateActive, let ip, let region): return ("webAuthorization", [("hash", hash), ("botId", botId), ("domain", domain), ("browser", browser), ("platform", platform), ("dateCreated", dateCreated), ("dateActive", dateActive), ("ip", ip), ("region", region)]) } } - static func parse_webAuthorization(_ reader: BufferReader) -> WebAuthorization? { + public static func parse_webAuthorization(_ reader: BufferReader) -> WebAuthorization? { var _1: Int64? _1 = reader.readInt64() var _2: Int32? @@ -19255,10 +19273,10 @@ extension Api { } } - enum ImportedContact: TypeConstructorDescription { + public enum ImportedContact: TypeConstructorDescription { case importedContact(userId: Int32, clientId: Int64) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .importedContact(let userId, let clientId): if boxed { @@ -19270,14 +19288,14 @@ extension Api { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .importedContact(let userId, let clientId): return ("importedContact", [("userId", userId), ("clientId", clientId)]) } } - static func parse_importedContact(_ reader: BufferReader) -> ImportedContact? { + public static func parse_importedContact(_ reader: BufferReader) -> ImportedContact? { var _1: Int32? _1 = reader.readInt32() var _2: Int64? diff --git a/submodules/TelegramCore/TelegramCore/Api2.swift b/submodules/TelegramApi/Sources/Api2.swift similarity index 81% rename from submodules/TelegramCore/TelegramCore/Api2.swift rename to submodules/TelegramApi/Sources/Api2.swift index 59661bace0..38caa256b2 100644 --- a/submodules/TelegramCore/TelegramCore/Api2.swift +++ b/submodules/TelegramApi/Sources/Api2.swift @@ -1,10 +1,10 @@ -extension Api { -struct channels { - enum ChannelParticipants: TypeConstructorDescription { +public extension Api { +public struct channels { + public enum ChannelParticipants: TypeConstructorDescription { case channelParticipants(count: Int32, participants: [Api.ChannelParticipant], users: [Api.User]) case channelParticipantsNotModified - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelParticipants(let count, let participants, let users): if boxed { @@ -31,7 +31,7 @@ struct channels { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelParticipants(let count, let participants, let users): return ("channelParticipants", [("count", count), ("participants", participants), ("users", users)]) @@ -40,7 +40,7 @@ struct channels { } } - static func parse_channelParticipants(_ reader: BufferReader) -> ChannelParticipants? { + public static func parse_channelParticipants(_ reader: BufferReader) -> ChannelParticipants? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.ChannelParticipant]? @@ -61,15 +61,15 @@ struct channels { return nil } } - static func parse_channelParticipantsNotModified(_ reader: BufferReader) -> ChannelParticipants? { + public static func parse_channelParticipantsNotModified(_ reader: BufferReader) -> ChannelParticipants? { return Api.channels.ChannelParticipants.channelParticipantsNotModified } } - enum ChannelParticipant: TypeConstructorDescription { + public enum ChannelParticipant: TypeConstructorDescription { case channelParticipant(participant: Api.ChannelParticipant, users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelParticipant(let participant, let users): if boxed { @@ -85,14 +85,14 @@ struct channels { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelParticipant(let participant, let users): return ("channelParticipant", [("participant", participant), ("users", users)]) } } - static func parse_channelParticipant(_ reader: BufferReader) -> ChannelParticipant? { + public static func parse_channelParticipant(_ reader: BufferReader) -> ChannelParticipant? { var _1: Api.ChannelParticipant? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant @@ -112,10 +112,10 @@ struct channels { } } - enum AdminLogResults: TypeConstructorDescription { + public enum AdminLogResults: TypeConstructorDescription { case adminLogResults(events: [Api.ChannelAdminLogEvent], chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .adminLogResults(let events, let chats, let users): if boxed { @@ -140,14 +140,14 @@ struct channels { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .adminLogResults(let events, let chats, let users): return ("adminLogResults", [("events", events), ("chats", chats), ("users", users)]) } } - static func parse_adminLogResults(_ reader: BufferReader) -> AdminLogResults? { + public static func parse_adminLogResults(_ reader: BufferReader) -> AdminLogResults? { var _1: [Api.ChannelAdminLogEvent]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ChannelAdminLogEvent.self) @@ -174,12 +174,12 @@ struct channels { } } } -extension Api { -struct payments { - enum ValidatedRequestedInfo: TypeConstructorDescription { +public extension Api { +public struct payments { + public enum ValidatedRequestedInfo: TypeConstructorDescription { case validatedRequestedInfo(flags: Int32, id: String?, shippingOptions: [Api.ShippingOption]?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .validatedRequestedInfo(let flags, let id, let shippingOptions): if boxed { @@ -196,14 +196,14 @@ struct payments { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .validatedRequestedInfo(let flags, let id, let shippingOptions): return ("validatedRequestedInfo", [("flags", flags), ("id", id), ("shippingOptions", shippingOptions)]) } } - static func parse_validatedRequestedInfo(_ reader: BufferReader) -> ValidatedRequestedInfo? { + public static func parse_validatedRequestedInfo(_ reader: BufferReader) -> ValidatedRequestedInfo? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -224,11 +224,11 @@ struct payments { } } - enum PaymentResult: TypeConstructorDescription { + public enum PaymentResult: TypeConstructorDescription { case paymentResult(updates: Api.Updates) case paymentVerficationNeeded(url: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .paymentResult(let updates): if boxed { @@ -245,7 +245,7 @@ struct payments { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .paymentResult(let updates): return ("paymentResult", [("updates", updates)]) @@ -254,7 +254,7 @@ struct payments { } } - static func parse_paymentResult(_ reader: BufferReader) -> PaymentResult? { + public static func parse_paymentResult(_ reader: BufferReader) -> PaymentResult? { var _1: Api.Updates? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Updates @@ -267,7 +267,7 @@ struct payments { return nil } } - static func parse_paymentVerficationNeeded(_ reader: BufferReader) -> PaymentResult? { + public static func parse_paymentVerficationNeeded(_ reader: BufferReader) -> PaymentResult? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -280,10 +280,10 @@ struct payments { } } - enum PaymentForm: TypeConstructorDescription { + public enum PaymentForm: TypeConstructorDescription { case paymentForm(flags: Int32, botId: Int32, invoice: Api.Invoice, providerId: Int32, url: String, nativeProvider: String?, nativeParams: Api.DataJSON?, savedInfo: Api.PaymentRequestedInfo?, savedCredentials: Api.PaymentSavedCredentials?, users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .paymentForm(let flags, let botId, let invoice, let providerId, let url, let nativeProvider, let nativeParams, let savedInfo, let savedCredentials, let users): if boxed { @@ -307,14 +307,14 @@ struct payments { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .paymentForm(let flags, let botId, let invoice, let providerId, let url, let nativeProvider, let nativeParams, let savedInfo, let savedCredentials, let users): return ("paymentForm", [("flags", flags), ("botId", botId), ("invoice", invoice), ("providerId", providerId), ("url", url), ("nativeProvider", nativeProvider), ("nativeParams", nativeParams), ("savedInfo", savedInfo), ("savedCredentials", savedCredentials), ("users", users)]) } } - static func parse_paymentForm(_ reader: BufferReader) -> PaymentForm? { + public static func parse_paymentForm(_ reader: BufferReader) -> PaymentForm? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -364,10 +364,10 @@ struct payments { } } - enum PaymentReceipt: TypeConstructorDescription { + public enum PaymentReceipt: TypeConstructorDescription { case paymentReceipt(flags: Int32, date: Int32, botId: Int32, invoice: Api.Invoice, providerId: Int32, info: Api.PaymentRequestedInfo?, shipping: Api.ShippingOption?, currency: String, totalAmount: Int64, credentialsTitle: String, users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .paymentReceipt(let flags, let date, let botId, let invoice, let providerId, let info, let shipping, let currency, let totalAmount, let credentialsTitle, let users): if boxed { @@ -392,14 +392,14 @@ struct payments { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .paymentReceipt(let flags, let date, let botId, let invoice, let providerId, let info, let shipping, let currency, let totalAmount, let credentialsTitle, let users): return ("paymentReceipt", [("flags", flags), ("date", date), ("botId", botId), ("invoice", invoice), ("providerId", providerId), ("info", info), ("shipping", shipping), ("currency", currency), ("totalAmount", totalAmount), ("credentialsTitle", credentialsTitle), ("users", users)]) } } - static func parse_paymentReceipt(_ reader: BufferReader) -> PaymentReceipt? { + public static func parse_paymentReceipt(_ reader: BufferReader) -> PaymentReceipt? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -450,10 +450,10 @@ struct payments { } } - enum SavedInfo: TypeConstructorDescription { + public enum SavedInfo: TypeConstructorDescription { case savedInfo(flags: Int32, savedInfo: Api.PaymentRequestedInfo?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .savedInfo(let flags, let savedInfo): if boxed { @@ -465,14 +465,14 @@ struct payments { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .savedInfo(let flags, let savedInfo): return ("savedInfo", [("flags", flags), ("savedInfo", savedInfo)]) } } - static func parse_savedInfo(_ reader: BufferReader) -> SavedInfo? { + public static func parse_savedInfo(_ reader: BufferReader) -> SavedInfo? { var _1: Int32? _1 = reader.readInt32() var _2: Api.PaymentRequestedInfo? @@ -492,12 +492,12 @@ struct payments { } } } -extension Api { -struct auth { - enum Authorization: TypeConstructorDescription { +public extension Api { +public struct auth { + public enum Authorization: TypeConstructorDescription { case authorization(flags: Int32, tmpSessions: Int32?, user: Api.User) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .authorization(let flags, let tmpSessions, let user): if boxed { @@ -510,14 +510,14 @@ struct auth { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .authorization(let flags, let tmpSessions, let user): return ("authorization", [("flags", flags), ("tmpSessions", tmpSessions), ("user", user)]) } } - static func parse_authorization(_ reader: BufferReader) -> Authorization? { + public static func parse_authorization(_ reader: BufferReader) -> Authorization? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -538,10 +538,10 @@ struct auth { } } - enum PasswordRecovery: TypeConstructorDescription { + public enum PasswordRecovery: TypeConstructorDescription { case passwordRecovery(emailPattern: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .passwordRecovery(let emailPattern): if boxed { @@ -552,14 +552,14 @@ struct auth { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .passwordRecovery(let emailPattern): return ("passwordRecovery", [("emailPattern", emailPattern)]) } } - static func parse_passwordRecovery(_ reader: BufferReader) -> PasswordRecovery? { + public static func parse_passwordRecovery(_ reader: BufferReader) -> PasswordRecovery? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -572,10 +572,10 @@ struct auth { } } - enum ExportedAuthorization: TypeConstructorDescription { + public enum ExportedAuthorization: TypeConstructorDescription { case exportedAuthorization(id: Int32, bytes: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .exportedAuthorization(let id, let bytes): if boxed { @@ -587,14 +587,14 @@ struct auth { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .exportedAuthorization(let id, let bytes): return ("exportedAuthorization", [("id", id), ("bytes", bytes)]) } } - static func parse_exportedAuthorization(_ reader: BufferReader) -> ExportedAuthorization? { + public static func parse_exportedAuthorization(_ reader: BufferReader) -> ExportedAuthorization? { var _1: Int32? _1 = reader.readInt32() var _2: Buffer? @@ -610,10 +610,10 @@ struct auth { } } - enum CheckedPhone: TypeConstructorDescription { + public enum CheckedPhone: TypeConstructorDescription { case checkedPhone(phoneRegistered: Api.Bool) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .checkedPhone(let phoneRegistered): if boxed { @@ -624,14 +624,14 @@ struct auth { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .checkedPhone(let phoneRegistered): return ("checkedPhone", [("phoneRegistered", phoneRegistered)]) } } - static func parse_checkedPhone(_ reader: BufferReader) -> CheckedPhone? { + public static func parse_checkedPhone(_ reader: BufferReader) -> CheckedPhone? { var _1: Api.Bool? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Bool @@ -646,10 +646,10 @@ struct auth { } } - enum SentCode: TypeConstructorDescription { + public enum SentCode: TypeConstructorDescription { case sentCode(flags: Int32, type: Api.auth.SentCodeType, phoneCodeHash: String, nextType: Api.auth.CodeType?, timeout: Int32?, termsOfService: Api.help.TermsOfService?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .sentCode(let flags, let type, let phoneCodeHash, let nextType, let timeout, let termsOfService): if boxed { @@ -665,14 +665,14 @@ struct auth { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .sentCode(let flags, let type, let phoneCodeHash, let nextType, let timeout, let termsOfService): return ("sentCode", [("flags", flags), ("type", type), ("phoneCodeHash", phoneCodeHash), ("nextType", nextType), ("timeout", timeout), ("termsOfService", termsOfService)]) } } - static func parse_sentCode(_ reader: BufferReader) -> SentCode? { + public static func parse_sentCode(_ reader: BufferReader) -> SentCode? { var _1: Int32? _1 = reader.readInt32() var _2: Api.auth.SentCodeType? @@ -706,12 +706,12 @@ struct auth { } } - enum CodeType: TypeConstructorDescription { + public enum CodeType: TypeConstructorDescription { case codeTypeSms case codeTypeCall case codeTypeFlashCall - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .codeTypeSms: if boxed { @@ -734,7 +734,7 @@ struct auth { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .codeTypeSms: return ("codeTypeSms", []) @@ -745,24 +745,24 @@ struct auth { } } - static func parse_codeTypeSms(_ reader: BufferReader) -> CodeType? { + public static func parse_codeTypeSms(_ reader: BufferReader) -> CodeType? { return Api.auth.CodeType.codeTypeSms } - static func parse_codeTypeCall(_ reader: BufferReader) -> CodeType? { + public static func parse_codeTypeCall(_ reader: BufferReader) -> CodeType? { return Api.auth.CodeType.codeTypeCall } - static func parse_codeTypeFlashCall(_ reader: BufferReader) -> CodeType? { + public static func parse_codeTypeFlashCall(_ reader: BufferReader) -> CodeType? { return Api.auth.CodeType.codeTypeFlashCall } } - enum SentCodeType: TypeConstructorDescription { + public enum SentCodeType: TypeConstructorDescription { case sentCodeTypeApp(length: Int32) case sentCodeTypeSms(length: Int32) case sentCodeTypeCall(length: Int32) case sentCodeTypeFlashCall(pattern: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .sentCodeTypeApp(let length): if boxed { @@ -791,7 +791,7 @@ struct auth { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .sentCodeTypeApp(let length): return ("sentCodeTypeApp", [("length", length)]) @@ -804,7 +804,7 @@ struct auth { } } - static func parse_sentCodeTypeApp(_ reader: BufferReader) -> SentCodeType? { + public static func parse_sentCodeTypeApp(_ reader: BufferReader) -> SentCodeType? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -815,7 +815,7 @@ struct auth { return nil } } - static func parse_sentCodeTypeSms(_ reader: BufferReader) -> SentCodeType? { + public static func parse_sentCodeTypeSms(_ reader: BufferReader) -> SentCodeType? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -826,7 +826,7 @@ struct auth { return nil } } - static func parse_sentCodeTypeCall(_ reader: BufferReader) -> SentCodeType? { + public static func parse_sentCodeTypeCall(_ reader: BufferReader) -> SentCodeType? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -837,7 +837,7 @@ struct auth { return nil } } - static func parse_sentCodeTypeFlashCall(_ reader: BufferReader) -> SentCodeType? { + public static func parse_sentCodeTypeFlashCall(_ reader: BufferReader) -> SentCodeType? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -852,13 +852,13 @@ struct auth { } } } -extension Api { -struct contacts { - enum Blocked: TypeConstructorDescription { +public extension Api { +public struct contacts { + public enum Blocked: TypeConstructorDescription { case blocked(blocked: [Api.ContactBlocked], users: [Api.User]) case blockedSlice(count: Int32, blocked: [Api.ContactBlocked], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .blocked(let blocked, let users): if boxed { @@ -894,7 +894,7 @@ struct contacts { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .blocked(let blocked, let users): return ("blocked", [("blocked", blocked), ("users", users)]) @@ -903,7 +903,7 @@ struct contacts { } } - static func parse_blocked(_ reader: BufferReader) -> Blocked? { + public static func parse_blocked(_ reader: BufferReader) -> Blocked? { var _1: [Api.ContactBlocked]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ContactBlocked.self) @@ -921,7 +921,7 @@ struct contacts { return nil } } - static func parse_blockedSlice(_ reader: BufferReader) -> Blocked? { + public static func parse_blockedSlice(_ reader: BufferReader) -> Blocked? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.ContactBlocked]? @@ -944,11 +944,11 @@ struct contacts { } } - enum Contacts: TypeConstructorDescription { + public enum Contacts: TypeConstructorDescription { case contactsNotModified case contacts(contacts: [Api.Contact], savedCount: Int32, users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .contactsNotModified: if boxed { @@ -975,7 +975,7 @@ struct contacts { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .contactsNotModified: return ("contactsNotModified", []) @@ -984,10 +984,10 @@ struct contacts { } } - static func parse_contactsNotModified(_ reader: BufferReader) -> Contacts? { + public static func parse_contactsNotModified(_ reader: BufferReader) -> Contacts? { return Api.contacts.Contacts.contactsNotModified } - static func parse_contacts(_ reader: BufferReader) -> Contacts? { + public static func parse_contacts(_ reader: BufferReader) -> Contacts? { var _1: [Api.Contact]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Contact.self) @@ -1010,10 +1010,10 @@ struct contacts { } } - enum ResolvedPeer: TypeConstructorDescription { + public enum ResolvedPeer: TypeConstructorDescription { case resolvedPeer(peer: Api.Peer, chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .resolvedPeer(let peer, let chats, let users): if boxed { @@ -1034,14 +1034,14 @@ struct contacts { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .resolvedPeer(let peer, let chats, let users): return ("resolvedPeer", [("peer", peer), ("chats", chats), ("users", users)]) } } - static func parse_resolvedPeer(_ reader: BufferReader) -> ResolvedPeer? { + public static func parse_resolvedPeer(_ reader: BufferReader) -> ResolvedPeer? { var _1: Api.Peer? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Peer @@ -1066,10 +1066,10 @@ struct contacts { } } - enum ImportedContacts: TypeConstructorDescription { + public enum ImportedContacts: TypeConstructorDescription { case importedContacts(imported: [Api.ImportedContact], popularInvites: [Api.PopularContact], retryContacts: [Int64], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .importedContacts(let imported, let popularInvites, let retryContacts, let users): if boxed { @@ -1099,14 +1099,14 @@ struct contacts { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .importedContacts(let imported, let popularInvites, let retryContacts, let users): return ("importedContacts", [("imported", imported), ("popularInvites", popularInvites), ("retryContacts", retryContacts), ("users", users)]) } } - static func parse_importedContacts(_ reader: BufferReader) -> ImportedContacts? { + public static func parse_importedContacts(_ reader: BufferReader) -> ImportedContacts? { var _1: [Api.ImportedContact]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ImportedContact.self) @@ -1136,10 +1136,10 @@ struct contacts { } } - enum Found: TypeConstructorDescription { + public enum Found: TypeConstructorDescription { case found(myResults: [Api.Peer], results: [Api.Peer], chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .found(let myResults, let results, let chats, let users): if boxed { @@ -1169,14 +1169,14 @@ struct contacts { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .found(let myResults, let results, let chats, let users): return ("found", [("myResults", myResults), ("results", results), ("chats", chats), ("users", users)]) } } - static func parse_found(_ reader: BufferReader) -> Found? { + public static func parse_found(_ reader: BufferReader) -> Found? { var _1: [Api.Peer]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Peer.self) @@ -1206,12 +1206,12 @@ struct contacts { } } - enum TopPeers: TypeConstructorDescription { + public enum TopPeers: TypeConstructorDescription { case topPeersNotModified case topPeers(categories: [Api.TopPeerCategoryPeers], chats: [Api.Chat], users: [Api.User]) case topPeersDisabled - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .topPeersNotModified: if boxed { @@ -1248,7 +1248,7 @@ struct contacts { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .topPeersNotModified: return ("topPeersNotModified", []) @@ -1259,10 +1259,10 @@ struct contacts { } } - static func parse_topPeersNotModified(_ reader: BufferReader) -> TopPeers? { + public static func parse_topPeersNotModified(_ reader: BufferReader) -> TopPeers? { return Api.contacts.TopPeers.topPeersNotModified } - static func parse_topPeers(_ reader: BufferReader) -> TopPeers? { + public static func parse_topPeers(_ reader: BufferReader) -> TopPeers? { var _1: [Api.TopPeerCategoryPeers]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.TopPeerCategoryPeers.self) @@ -1285,20 +1285,20 @@ struct contacts { return nil } } - static func parse_topPeersDisabled(_ reader: BufferReader) -> TopPeers? { + public static func parse_topPeersDisabled(_ reader: BufferReader) -> TopPeers? { return Api.contacts.TopPeers.topPeersDisabled } } } } -extension Api { -struct help { - enum AppUpdate: TypeConstructorDescription { +public extension Api { +public struct help { + public enum AppUpdate: TypeConstructorDescription { case appUpdate(id: Int32, critical: Api.Bool, url: String, text: String) case noAppUpdate - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .appUpdate(let id, let critical, let url, let text): if boxed { @@ -1318,7 +1318,7 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .appUpdate(let id, let critical, let url, let text): return ("appUpdate", [("id", id), ("critical", critical), ("url", url), ("text", text)]) @@ -1327,7 +1327,7 @@ struct help { } } - static func parse_appUpdate(_ reader: BufferReader) -> AppUpdate? { + public static func parse_appUpdate(_ reader: BufferReader) -> AppUpdate? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Bool? @@ -1349,16 +1349,16 @@ struct help { return nil } } - static func parse_noAppUpdate(_ reader: BufferReader) -> AppUpdate? { + public static func parse_noAppUpdate(_ reader: BufferReader) -> AppUpdate? { return Api.help.AppUpdate.noAppUpdate } } - enum PassportConfig: TypeConstructorDescription { + public enum PassportConfig: TypeConstructorDescription { case passportConfigNotModified case passportConfig(hash: Int32, countriesLangs: Api.DataJSON) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .passportConfigNotModified: if boxed { @@ -1376,7 +1376,7 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .passportConfigNotModified: return ("passportConfigNotModified", []) @@ -1385,10 +1385,10 @@ struct help { } } - static func parse_passportConfigNotModified(_ reader: BufferReader) -> PassportConfig? { + public static func parse_passportConfigNotModified(_ reader: BufferReader) -> PassportConfig? { return Api.help.PassportConfig.passportConfigNotModified } - static func parse_passportConfig(_ reader: BufferReader) -> PassportConfig? { + public static func parse_passportConfig(_ reader: BufferReader) -> PassportConfig? { var _1: Int32? _1 = reader.readInt32() var _2: Api.DataJSON? @@ -1406,11 +1406,11 @@ struct help { } } - enum ProxyData: TypeConstructorDescription { + public enum ProxyData: TypeConstructorDescription { case proxyDataEmpty(expires: Int32) case proxyDataPromo(expires: Int32, peer: Api.Peer, chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .proxyDataEmpty(let expires): if boxed { @@ -1438,7 +1438,7 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .proxyDataEmpty(let expires): return ("proxyDataEmpty", [("expires", expires)]) @@ -1447,7 +1447,7 @@ struct help { } } - static func parse_proxyDataEmpty(_ reader: BufferReader) -> ProxyData? { + public static func parse_proxyDataEmpty(_ reader: BufferReader) -> ProxyData? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -1458,7 +1458,7 @@ struct help { return nil } } - static func parse_proxyDataPromo(_ reader: BufferReader) -> ProxyData? { + public static func parse_proxyDataPromo(_ reader: BufferReader) -> ProxyData? { var _1: Int32? _1 = reader.readInt32() var _2: Api.Peer? @@ -1486,11 +1486,11 @@ struct help { } } - enum DeepLinkInfo: TypeConstructorDescription { + public enum DeepLinkInfo: TypeConstructorDescription { case deepLinkInfoEmpty case deepLinkInfo(flags: Int32, message: String, entities: [Api.MessageEntity]?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .deepLinkInfoEmpty: if boxed { @@ -1513,7 +1513,7 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .deepLinkInfoEmpty: return ("deepLinkInfoEmpty", []) @@ -1522,10 +1522,10 @@ struct help { } } - static func parse_deepLinkInfoEmpty(_ reader: BufferReader) -> DeepLinkInfo? { + public static func parse_deepLinkInfoEmpty(_ reader: BufferReader) -> DeepLinkInfo? { return Api.help.DeepLinkInfo.deepLinkInfoEmpty } - static func parse_deepLinkInfo(_ reader: BufferReader) -> DeepLinkInfo? { + public static func parse_deepLinkInfo(_ reader: BufferReader) -> DeepLinkInfo? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -1546,10 +1546,10 @@ struct help { } } - enum TermsOfService: TypeConstructorDescription { + public enum TermsOfService: TypeConstructorDescription { case termsOfService(flags: Int32, id: Api.DataJSON, text: String, entities: [Api.MessageEntity], minAgeConfirm: Int32?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .termsOfService(let flags, let id, let text, let entities, let minAgeConfirm): if boxed { @@ -1568,14 +1568,14 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .termsOfService(let flags, let id, let text, let entities, let minAgeConfirm): return ("termsOfService", [("flags", flags), ("id", id), ("text", text), ("entities", entities), ("minAgeConfirm", minAgeConfirm)]) } } - static func parse_termsOfService(_ reader: BufferReader) -> TermsOfService? { + public static func parse_termsOfService(_ reader: BufferReader) -> TermsOfService? { var _1: Int32? _1 = reader.readInt32() var _2: Api.DataJSON? @@ -1604,10 +1604,10 @@ struct help { } } - enum RecentMeUrls: TypeConstructorDescription { + public enum RecentMeUrls: TypeConstructorDescription { case recentMeUrls(urls: [Api.RecentMeUrl], chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .recentMeUrls(let urls, let chats, let users): if boxed { @@ -1632,14 +1632,14 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .recentMeUrls(let urls, let chats, let users): return ("recentMeUrls", [("urls", urls), ("chats", chats), ("users", users)]) } } - static func parse_recentMeUrls(_ reader: BufferReader) -> RecentMeUrls? { + public static func parse_recentMeUrls(_ reader: BufferReader) -> RecentMeUrls? { var _1: [Api.RecentMeUrl]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RecentMeUrl.self) @@ -1664,10 +1664,10 @@ struct help { } } - enum Support: TypeConstructorDescription { + public enum Support: TypeConstructorDescription { case support(phoneNumber: String, user: Api.User) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .support(let phoneNumber, let user): if boxed { @@ -1679,14 +1679,14 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .support(let phoneNumber, let user): return ("support", [("phoneNumber", phoneNumber), ("user", user)]) } } - static func parse_support(_ reader: BufferReader) -> Support? { + public static func parse_support(_ reader: BufferReader) -> Support? { var _1: String? _1 = parseString(reader) var _2: Api.User? @@ -1704,10 +1704,10 @@ struct help { } } - enum InviteText: TypeConstructorDescription { + public enum InviteText: TypeConstructorDescription { case inviteText(message: String) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .inviteText(let message): if boxed { @@ -1718,14 +1718,14 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .inviteText(let message): return ("inviteText", [("message", message)]) } } - static func parse_inviteText(_ reader: BufferReader) -> InviteText? { + public static func parse_inviteText(_ reader: BufferReader) -> InviteText? { var _1: String? _1 = parseString(reader) let _c1 = _1 != nil @@ -1738,11 +1738,11 @@ struct help { } } - enum TermsOfServiceUpdate: TypeConstructorDescription { + public enum TermsOfServiceUpdate: TypeConstructorDescription { case termsOfServiceUpdateEmpty(expires: Int32) case termsOfServiceUpdate(expires: Int32, termsOfService: Api.help.TermsOfService) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .termsOfServiceUpdateEmpty(let expires): if boxed { @@ -1760,7 +1760,7 @@ struct help { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .termsOfServiceUpdateEmpty(let expires): return ("termsOfServiceUpdateEmpty", [("expires", expires)]) @@ -1769,7 +1769,7 @@ struct help { } } - static func parse_termsOfServiceUpdateEmpty(_ reader: BufferReader) -> TermsOfServiceUpdate? { + public static func parse_termsOfServiceUpdateEmpty(_ reader: BufferReader) -> TermsOfServiceUpdate? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -1780,7 +1780,7 @@ struct help { return nil } } - static func parse_termsOfServiceUpdate(_ reader: BufferReader) -> TermsOfServiceUpdate? { + public static func parse_termsOfServiceUpdate(_ reader: BufferReader) -> TermsOfServiceUpdate? { var _1: Int32? _1 = reader.readInt32() var _2: Api.help.TermsOfService? @@ -1800,15 +1800,15 @@ struct help { } } } -extension Api { -struct updates { - enum Difference: TypeConstructorDescription { +public extension Api { +public struct updates { + public enum Difference: TypeConstructorDescription { case differenceEmpty(date: Int32, seq: Int32) case difference(newMessages: [Api.Message], newEncryptedMessages: [Api.EncryptedMessage], otherUpdates: [Api.Update], chats: [Api.Chat], users: [Api.User], state: Api.updates.State) case differenceSlice(newMessages: [Api.Message], newEncryptedMessages: [Api.EncryptedMessage], otherUpdates: [Api.Update], chats: [Api.Chat], users: [Api.User], intermediateState: Api.updates.State) case differenceTooLong(pts: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .differenceEmpty(let date, let seq): if boxed { @@ -1888,7 +1888,7 @@ struct updates { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .differenceEmpty(let date, let seq): return ("differenceEmpty", [("date", date), ("seq", seq)]) @@ -1901,7 +1901,7 @@ struct updates { } } - static func parse_differenceEmpty(_ reader: BufferReader) -> Difference? { + public static func parse_differenceEmpty(_ reader: BufferReader) -> Difference? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -1915,7 +1915,7 @@ struct updates { return nil } } - static func parse_difference(_ reader: BufferReader) -> Difference? { + public static func parse_difference(_ reader: BufferReader) -> Difference? { var _1: [Api.Message]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Message.self) @@ -1953,7 +1953,7 @@ struct updates { return nil } } - static func parse_differenceSlice(_ reader: BufferReader) -> Difference? { + public static func parse_differenceSlice(_ reader: BufferReader) -> Difference? { var _1: [Api.Message]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Message.self) @@ -1991,7 +1991,7 @@ struct updates { return nil } } - static func parse_differenceTooLong(_ reader: BufferReader) -> Difference? { + public static func parse_differenceTooLong(_ reader: BufferReader) -> Difference? { var _1: Int32? _1 = reader.readInt32() let _c1 = _1 != nil @@ -2004,10 +2004,10 @@ struct updates { } } - enum State: TypeConstructorDescription { + public enum State: TypeConstructorDescription { case state(pts: Int32, qts: Int32, date: Int32, seq: Int32, unreadCount: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .state(let pts, let qts, let date, let seq, let unreadCount): if boxed { @@ -2022,14 +2022,14 @@ struct updates { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .state(let pts, let qts, let date, let seq, let unreadCount): return ("state", [("pts", pts), ("qts", qts), ("date", date), ("seq", seq), ("unreadCount", unreadCount)]) } } - static func parse_state(_ reader: BufferReader) -> State? { + public static func parse_state(_ reader: BufferReader) -> State? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2054,12 +2054,12 @@ struct updates { } } - enum ChannelDifference: TypeConstructorDescription { + public enum ChannelDifference: TypeConstructorDescription { case channelDifferenceEmpty(flags: Int32, pts: Int32, timeout: Int32?) case channelDifference(flags: Int32, pts: Int32, timeout: Int32?, newMessages: [Api.Message], otherUpdates: [Api.Update], chats: [Api.Chat], users: [Api.User]) case channelDifferenceTooLong(flags: Int32, timeout: Int32?, dialog: Api.Dialog, messages: [Api.Message], chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .channelDifferenceEmpty(let flags, let pts, let timeout): if boxed { @@ -2123,7 +2123,7 @@ struct updates { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .channelDifferenceEmpty(let flags, let pts, let timeout): return ("channelDifferenceEmpty", [("flags", flags), ("pts", pts), ("timeout", timeout)]) @@ -2134,7 +2134,7 @@ struct updates { } } - static func parse_channelDifferenceEmpty(_ reader: BufferReader) -> ChannelDifference? { + public static func parse_channelDifferenceEmpty(_ reader: BufferReader) -> ChannelDifference? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2151,7 +2151,7 @@ struct updates { return nil } } - static func parse_channelDifference(_ reader: BufferReader) -> ChannelDifference? { + public static func parse_channelDifference(_ reader: BufferReader) -> ChannelDifference? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2188,7 +2188,7 @@ struct updates { return nil } } - static func parse_channelDifferenceTooLong(_ reader: BufferReader) -> ChannelDifference? { + public static func parse_channelDifferenceTooLong(_ reader: BufferReader) -> ChannelDifference? { var _1: Int32? _1 = reader.readInt32() var _2: Int32? @@ -2226,199 +2226,3 @@ struct updates { } } } -extension Api { -struct upload { - enum WebFile: TypeConstructorDescription { - case webFile(size: Int32, mimeType: String, fileType: Api.storage.FileType, mtime: Int32, bytes: Buffer) - - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .webFile(let size, let mimeType, let fileType, let mtime, let bytes): - if boxed { - buffer.appendInt32(568808380) - } - serializeInt32(size, buffer: buffer, boxed: false) - serializeString(mimeType, buffer: buffer, boxed: false) - fileType.serialize(buffer, true) - serializeInt32(mtime, buffer: buffer, boxed: false) - serializeBytes(bytes, buffer: buffer, boxed: false) - break - } - } - - func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .webFile(let size, let mimeType, let fileType, let mtime, let bytes): - return ("webFile", [("size", size), ("mimeType", mimeType), ("fileType", fileType), ("mtime", mtime), ("bytes", bytes)]) - } - } - - static func parse_webFile(_ reader: BufferReader) -> WebFile? { - var _1: Int32? - _1 = reader.readInt32() - var _2: String? - _2 = parseString(reader) - var _3: Api.storage.FileType? - if let signature = reader.readInt32() { - _3 = Api.parse(reader, signature: signature) as? Api.storage.FileType - } - 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.upload.WebFile.webFile(size: _1!, mimeType: _2!, fileType: _3!, mtime: _4!, bytes: _5!) - } - else { - return nil - } - } - - } - enum File: TypeConstructorDescription { - case file(type: Api.storage.FileType, mtime: Int32, bytes: Buffer) - case fileCdnRedirect(dcId: Int32, fileToken: Buffer, encryptionKey: Buffer, encryptionIv: Buffer, fileHashes: [Api.FileHash]) - - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .file(let type, let mtime, let bytes): - if boxed { - buffer.appendInt32(157948117) - } - type.serialize(buffer, true) - serializeInt32(mtime, buffer: buffer, boxed: false) - serializeBytes(bytes, buffer: buffer, boxed: false) - break - case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes): - if boxed { - buffer.appendInt32(-242427324) - } - serializeInt32(dcId, buffer: buffer, boxed: false) - serializeBytes(fileToken, buffer: buffer, boxed: false) - serializeBytes(encryptionKey, buffer: buffer, boxed: false) - serializeBytes(encryptionIv, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(fileHashes.count)) - for item in fileHashes { - item.serialize(buffer, true) - } - break - } - } - - func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .file(let type, let mtime, let bytes): - return ("file", [("type", type), ("mtime", mtime), ("bytes", bytes)]) - case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes): - return ("fileCdnRedirect", [("dcId", dcId), ("fileToken", fileToken), ("encryptionKey", encryptionKey), ("encryptionIv", encryptionIv), ("fileHashes", fileHashes)]) - } - } - - static func parse_file(_ reader: BufferReader) -> File? { - var _1: Api.storage.FileType? - if let signature = reader.readInt32() { - _1 = Api.parse(reader, signature: signature) as? Api.storage.FileType - } - var _2: Int32? - _2 = reader.readInt32() - var _3: Buffer? - _3 = parseBytes(reader) - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.upload.File.file(type: _1!, mtime: _2!, bytes: _3!) - } - else { - return nil - } - } - static func parse_fileCdnRedirect(_ reader: BufferReader) -> File? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Buffer? - _2 = parseBytes(reader) - var _3: Buffer? - _3 = parseBytes(reader) - var _4: Buffer? - _4 = parseBytes(reader) - var _5: [Api.FileHash]? - if let _ = reader.readInt32() { - _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.FileHash.self) - } - 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.upload.File.fileCdnRedirect(dcId: _1!, fileToken: _2!, encryptionKey: _3!, encryptionIv: _4!, fileHashes: _5!) - } - else { - return nil - } - } - - } - enum CdnFile: TypeConstructorDescription { - case cdnFileReuploadNeeded(requestToken: Buffer) - case cdnFile(bytes: Buffer) - - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .cdnFileReuploadNeeded(let requestToken): - if boxed { - buffer.appendInt32(-290921362) - } - serializeBytes(requestToken, buffer: buffer, boxed: false) - break - case .cdnFile(let bytes): - if boxed { - buffer.appendInt32(-1449145777) - } - serializeBytes(bytes, buffer: buffer, boxed: false) - break - } - } - - func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .cdnFileReuploadNeeded(let requestToken): - return ("cdnFileReuploadNeeded", [("requestToken", requestToken)]) - case .cdnFile(let bytes): - return ("cdnFile", [("bytes", bytes)]) - } - } - - static func parse_cdnFileReuploadNeeded(_ reader: BufferReader) -> CdnFile? { - var _1: Buffer? - _1 = parseBytes(reader) - let _c1 = _1 != nil - if _c1 { - return Api.upload.CdnFile.cdnFileReuploadNeeded(requestToken: _1!) - } - else { - return nil - } - } - static func parse_cdnFile(_ reader: BufferReader) -> CdnFile? { - var _1: Buffer? - _1 = parseBytes(reader) - let _c1 = _1 != nil - if _c1 { - return Api.upload.CdnFile.cdnFile(bytes: _1!) - } - else { - return nil - } - } - - } -} -} diff --git a/submodules/TelegramCore/TelegramCore/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift similarity index 82% rename from submodules/TelegramCore/TelegramCore/Api3.swift rename to submodules/TelegramApi/Sources/Api3.swift index efd1324bb8..3c6ea492d4 100644 --- a/submodules/TelegramCore/TelegramCore/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -1,6 +1,202 @@ -extension Api { -struct storage { - enum FileType: TypeConstructorDescription { +public extension Api { +public struct upload { + public enum WebFile: TypeConstructorDescription { + case webFile(size: Int32, mimeType: String, fileType: Api.storage.FileType, mtime: Int32, bytes: Buffer) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .webFile(let size, let mimeType, let fileType, let mtime, let bytes): + if boxed { + buffer.appendInt32(568808380) + } + serializeInt32(size, buffer: buffer, boxed: false) + serializeString(mimeType, buffer: buffer, boxed: false) + fileType.serialize(buffer, true) + serializeInt32(mtime, buffer: buffer, boxed: false) + serializeBytes(bytes, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .webFile(let size, let mimeType, let fileType, let mtime, let bytes): + return ("webFile", [("size", size), ("mimeType", mimeType), ("fileType", fileType), ("mtime", mtime), ("bytes", bytes)]) + } + } + + public static func parse_webFile(_ reader: BufferReader) -> WebFile? { + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + _2 = parseString(reader) + var _3: Api.storage.FileType? + if let signature = reader.readInt32() { + _3 = Api.parse(reader, signature: signature) as? Api.storage.FileType + } + 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.upload.WebFile.webFile(size: _1!, mimeType: _2!, fileType: _3!, mtime: _4!, bytes: _5!) + } + else { + return nil + } + } + + } + public enum File: TypeConstructorDescription { + case file(type: Api.storage.FileType, mtime: Int32, bytes: Buffer) + case fileCdnRedirect(dcId: Int32, fileToken: Buffer, encryptionKey: Buffer, encryptionIv: Buffer, fileHashes: [Api.FileHash]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .file(let type, let mtime, let bytes): + if boxed { + buffer.appendInt32(157948117) + } + type.serialize(buffer, true) + serializeInt32(mtime, buffer: buffer, boxed: false) + serializeBytes(bytes, buffer: buffer, boxed: false) + break + case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes): + if boxed { + buffer.appendInt32(-242427324) + } + serializeInt32(dcId, buffer: buffer, boxed: false) + serializeBytes(fileToken, buffer: buffer, boxed: false) + serializeBytes(encryptionKey, buffer: buffer, boxed: false) + serializeBytes(encryptionIv, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(fileHashes.count)) + for item in fileHashes { + item.serialize(buffer, true) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .file(let type, let mtime, let bytes): + return ("file", [("type", type), ("mtime", mtime), ("bytes", bytes)]) + case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes): + return ("fileCdnRedirect", [("dcId", dcId), ("fileToken", fileToken), ("encryptionKey", encryptionKey), ("encryptionIv", encryptionIv), ("fileHashes", fileHashes)]) + } + } + + public static func parse_file(_ reader: BufferReader) -> File? { + var _1: Api.storage.FileType? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.storage.FileType + } + var _2: Int32? + _2 = reader.readInt32() + var _3: Buffer? + _3 = parseBytes(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.upload.File.file(type: _1!, mtime: _2!, bytes: _3!) + } + else { + return nil + } + } + public static func parse_fileCdnRedirect(_ reader: BufferReader) -> File? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Buffer? + _2 = parseBytes(reader) + var _3: Buffer? + _3 = parseBytes(reader) + var _4: Buffer? + _4 = parseBytes(reader) + var _5: [Api.FileHash]? + if let _ = reader.readInt32() { + _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.FileHash.self) + } + 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.upload.File.fileCdnRedirect(dcId: _1!, fileToken: _2!, encryptionKey: _3!, encryptionIv: _4!, fileHashes: _5!) + } + else { + return nil + } + } + + } + public enum CdnFile: TypeConstructorDescription { + case cdnFileReuploadNeeded(requestToken: Buffer) + case cdnFile(bytes: Buffer) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .cdnFileReuploadNeeded(let requestToken): + if boxed { + buffer.appendInt32(-290921362) + } + serializeBytes(requestToken, buffer: buffer, boxed: false) + break + case .cdnFile(let bytes): + if boxed { + buffer.appendInt32(-1449145777) + } + serializeBytes(bytes, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .cdnFileReuploadNeeded(let requestToken): + return ("cdnFileReuploadNeeded", [("requestToken", requestToken)]) + case .cdnFile(let bytes): + return ("cdnFile", [("bytes", bytes)]) + } + } + + public static func parse_cdnFileReuploadNeeded(_ reader: BufferReader) -> CdnFile? { + var _1: Buffer? + _1 = parseBytes(reader) + let _c1 = _1 != nil + if _c1 { + return Api.upload.CdnFile.cdnFileReuploadNeeded(requestToken: _1!) + } + else { + return nil + } + } + public static func parse_cdnFile(_ reader: BufferReader) -> CdnFile? { + var _1: Buffer? + _1 = parseBytes(reader) + let _c1 = _1 != nil + if _c1 { + return Api.upload.CdnFile.cdnFile(bytes: _1!) + } + else { + return nil + } + } + + } +} +} +public extension Api { +public struct storage { + public enum FileType: TypeConstructorDescription { case fileUnknown case filePartial case fileJpeg @@ -12,7 +208,7 @@ struct storage { case fileMp4 case fileWebp - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .fileUnknown: if boxed { @@ -77,7 +273,7 @@ struct storage { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .fileUnknown: return ("fileUnknown", []) @@ -102,46 +298,46 @@ struct storage { } } - static func parse_fileUnknown(_ reader: BufferReader) -> FileType? { + public static func parse_fileUnknown(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.fileUnknown } - static func parse_filePartial(_ reader: BufferReader) -> FileType? { + public static func parse_filePartial(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.filePartial } - static func parse_fileJpeg(_ reader: BufferReader) -> FileType? { + public static func parse_fileJpeg(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.fileJpeg } - static func parse_fileGif(_ reader: BufferReader) -> FileType? { + public static func parse_fileGif(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.fileGif } - static func parse_filePng(_ reader: BufferReader) -> FileType? { + public static func parse_filePng(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.filePng } - static func parse_filePdf(_ reader: BufferReader) -> FileType? { + public static func parse_filePdf(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.filePdf } - static func parse_fileMp3(_ reader: BufferReader) -> FileType? { + public static func parse_fileMp3(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.fileMp3 } - static func parse_fileMov(_ reader: BufferReader) -> FileType? { + public static func parse_fileMov(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.fileMov } - static func parse_fileMp4(_ reader: BufferReader) -> FileType? { + public static func parse_fileMp4(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.fileMp4 } - static func parse_fileWebp(_ reader: BufferReader) -> FileType? { + public static func parse_fileWebp(_ reader: BufferReader) -> FileType? { return Api.storage.FileType.fileWebp } } } } -extension Api { -struct account { - enum TmpPassword: TypeConstructorDescription { +public extension Api { +public struct account { + public enum TmpPassword: TypeConstructorDescription { case tmpPassword(tmpPassword: Buffer, validUntil: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .tmpPassword(let tmpPassword, let validUntil): if boxed { @@ -153,14 +349,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .tmpPassword(let tmpPassword, let validUntil): return ("tmpPassword", [("tmpPassword", tmpPassword), ("validUntil", validUntil)]) } } - static func parse_tmpPassword(_ reader: BufferReader) -> TmpPassword? { + public static func parse_tmpPassword(_ reader: BufferReader) -> TmpPassword? { var _1: Buffer? _1 = parseBytes(reader) var _2: Int32? @@ -176,10 +372,10 @@ struct account { } } - enum PasswordSettings: TypeConstructorDescription { + public enum PasswordSettings: TypeConstructorDescription { case passwordSettings(flags: Int32, email: String?, secureSettings: Api.SecureSecretSettings?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .passwordSettings(let flags, let email, let secureSettings): if boxed { @@ -192,14 +388,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .passwordSettings(let flags, let email, let secureSettings): return ("passwordSettings", [("flags", flags), ("email", email), ("secureSettings", secureSettings)]) } } - static func parse_passwordSettings(_ reader: BufferReader) -> PasswordSettings? { + public static func parse_passwordSettings(_ reader: BufferReader) -> PasswordSettings? { var _1: Int32? _1 = reader.readInt32() var _2: String? @@ -220,11 +416,11 @@ struct account { } } - enum WallPapers: TypeConstructorDescription { + public enum WallPapers: TypeConstructorDescription { case wallPapersNotModified case wallPapers(hash: Int32, wallpapers: [Api.WallPaper]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .wallPapersNotModified: if boxed { @@ -246,7 +442,7 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .wallPapersNotModified: return ("wallPapersNotModified", []) @@ -255,10 +451,10 @@ struct account { } } - static func parse_wallPapersNotModified(_ reader: BufferReader) -> WallPapers? { + public static func parse_wallPapersNotModified(_ reader: BufferReader) -> WallPapers? { return Api.account.WallPapers.wallPapersNotModified } - static func parse_wallPapers(_ reader: BufferReader) -> WallPapers? { + public static func parse_wallPapers(_ reader: BufferReader) -> WallPapers? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.WallPaper]? @@ -276,10 +472,10 @@ struct account { } } - enum PasswordInputSettings: TypeConstructorDescription { + public enum PasswordInputSettings: TypeConstructorDescription { case passwordInputSettings(flags: Int32, newAlgo: Api.PasswordKdfAlgo?, newPasswordHash: Buffer?, hint: String?, email: String?, newSecureSettings: Api.SecureSecretSettings?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .passwordInputSettings(let flags, let newAlgo, let newPasswordHash, let hint, let email, let newSecureSettings): if boxed { @@ -295,14 +491,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .passwordInputSettings(let flags, let newAlgo, let newPasswordHash, let hint, let email, let newSecureSettings): return ("passwordInputSettings", [("flags", flags), ("newAlgo", newAlgo), ("newPasswordHash", newPasswordHash), ("hint", hint), ("email", email), ("newSecureSettings", newSecureSettings)]) } } - static func parse_passwordInputSettings(_ reader: BufferReader) -> PasswordInputSettings? { + public static func parse_passwordInputSettings(_ reader: BufferReader) -> PasswordInputSettings? { var _1: Int32? _1 = reader.readInt32() var _2: Api.PasswordKdfAlgo? @@ -334,10 +530,10 @@ struct account { } } - enum WebAuthorizations: TypeConstructorDescription { + public enum WebAuthorizations: TypeConstructorDescription { case webAuthorizations(authorizations: [Api.WebAuthorization], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .webAuthorizations(let authorizations, let users): if boxed { @@ -357,14 +553,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .webAuthorizations(let authorizations, let users): return ("webAuthorizations", [("authorizations", authorizations), ("users", users)]) } } - static func parse_webAuthorizations(_ reader: BufferReader) -> WebAuthorizations? { + public static func parse_webAuthorizations(_ reader: BufferReader) -> WebAuthorizations? { var _1: [Api.WebAuthorization]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.WebAuthorization.self) @@ -384,10 +580,10 @@ struct account { } } - enum SentEmailCode: TypeConstructorDescription { + public enum SentEmailCode: TypeConstructorDescription { case sentEmailCode(emailPattern: String, length: Int32) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .sentEmailCode(let emailPattern, let length): if boxed { @@ -399,14 +595,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .sentEmailCode(let emailPattern, let length): return ("sentEmailCode", [("emailPattern", emailPattern), ("length", length)]) } } - static func parse_sentEmailCode(_ reader: BufferReader) -> SentEmailCode? { + public static func parse_sentEmailCode(_ reader: BufferReader) -> SentEmailCode? { var _1: String? _1 = parseString(reader) var _2: Int32? @@ -422,10 +618,10 @@ struct account { } } - enum Authorizations: TypeConstructorDescription { + public enum Authorizations: TypeConstructorDescription { case authorizations(authorizations: [Api.Authorization]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .authorizations(let authorizations): if boxed { @@ -440,14 +636,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .authorizations(let authorizations): return ("authorizations", [("authorizations", authorizations)]) } } - static func parse_authorizations(_ reader: BufferReader) -> Authorizations? { + public static func parse_authorizations(_ reader: BufferReader) -> Authorizations? { var _1: [Api.Authorization]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Authorization.self) @@ -462,10 +658,10 @@ struct account { } } - enum AuthorizationForm: TypeConstructorDescription { + public enum AuthorizationForm: TypeConstructorDescription { case authorizationForm(flags: Int32, requiredTypes: [Api.SecureRequiredType], values: [Api.SecureValue], errors: [Api.SecureValueError], users: [Api.User], privacyPolicyUrl: String?) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .authorizationForm(let flags, let requiredTypes, let values, let errors, let users, let privacyPolicyUrl): if boxed { @@ -497,14 +693,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .authorizationForm(let flags, let requiredTypes, let values, let errors, let users, let privacyPolicyUrl): return ("authorizationForm", [("flags", flags), ("requiredTypes", requiredTypes), ("values", values), ("errors", errors), ("users", users), ("privacyPolicyUrl", privacyPolicyUrl)]) } } - static func parse_authorizationForm(_ reader: BufferReader) -> AuthorizationForm? { + public static func parse_authorizationForm(_ reader: BufferReader) -> AuthorizationForm? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.SecureRequiredType]? @@ -540,10 +736,10 @@ struct account { } } - enum Password: TypeConstructorDescription { + public enum Password: TypeConstructorDescription { case password(flags: Int32, currentAlgo: Api.PasswordKdfAlgo?, srpB: Buffer?, srpId: Int64?, hint: String?, emailUnconfirmedPattern: String?, newAlgo: Api.PasswordKdfAlgo, newSecureAlgo: Api.SecurePasswordKdfAlgo, secureRandom: Buffer) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .password(let flags, let currentAlgo, let srpB, let srpId, let hint, let emailUnconfirmedPattern, let newAlgo, let newSecureAlgo, let secureRandom): if boxed { @@ -562,14 +758,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .password(let flags, let currentAlgo, let srpB, let srpId, let hint, let emailUnconfirmedPattern, let newAlgo, let newSecureAlgo, let secureRandom): return ("password", [("flags", flags), ("currentAlgo", currentAlgo), ("srpB", srpB), ("srpId", srpId), ("hint", hint), ("emailUnconfirmedPattern", emailUnconfirmedPattern), ("newAlgo", newAlgo), ("newSecureAlgo", newSecureAlgo), ("secureRandom", secureRandom)]) } } - static func parse_password(_ reader: BufferReader) -> Password? { + public static func parse_password(_ reader: BufferReader) -> Password? { var _1: Int32? _1 = reader.readInt32() var _2: Api.PasswordKdfAlgo? @@ -612,10 +808,10 @@ struct account { } } - enum PrivacyRules: TypeConstructorDescription { + public enum PrivacyRules: TypeConstructorDescription { case privacyRules(rules: [Api.PrivacyRule], chats: [Api.Chat], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .privacyRules(let rules, let chats, let users): if boxed { @@ -640,14 +836,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .privacyRules(let rules, let chats, let users): return ("privacyRules", [("rules", rules), ("chats", chats), ("users", users)]) } } - static func parse_privacyRules(_ reader: BufferReader) -> PrivacyRules? { + public static func parse_privacyRules(_ reader: BufferReader) -> PrivacyRules? { var _1: [Api.PrivacyRule]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PrivacyRule.self) @@ -672,10 +868,10 @@ struct account { } } - enum AutoDownloadSettings: TypeConstructorDescription { + public enum AutoDownloadSettings: TypeConstructorDescription { case autoDownloadSettings(low: Api.AutoDownloadSettings, medium: Api.AutoDownloadSettings, high: Api.AutoDownloadSettings) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .autoDownloadSettings(let low, let medium, let high): if boxed { @@ -688,14 +884,14 @@ struct account { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .autoDownloadSettings(let low, let medium, let high): return ("autoDownloadSettings", [("low", low), ("medium", medium), ("high", high)]) } } - static func parse_autoDownloadSettings(_ reader: BufferReader) -> AutoDownloadSettings? { + public static func parse_autoDownloadSettings(_ reader: BufferReader) -> AutoDownloadSettings? { var _1: Api.AutoDownloadSettings? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.AutoDownloadSettings @@ -722,12 +918,12 @@ struct account { } } } -extension Api { -struct photos { - enum Photo: TypeConstructorDescription { +public extension Api { +public struct photos { + public enum Photo: TypeConstructorDescription { case photo(photo: Api.Photo, users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .photo(let photo, let users): if boxed { @@ -743,14 +939,14 @@ struct photos { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .photo(let photo, let users): return ("photo", [("photo", photo), ("users", users)]) } } - static func parse_photo(_ reader: BufferReader) -> Photo? { + public static func parse_photo(_ reader: BufferReader) -> Photo? { var _1: Api.Photo? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.Photo @@ -770,11 +966,11 @@ struct photos { } } - enum Photos: TypeConstructorDescription { + public enum Photos: TypeConstructorDescription { case photos(photos: [Api.Photo], users: [Api.User]) case photosSlice(count: Int32, photos: [Api.Photo], users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .photos(let photos, let users): if boxed { @@ -810,7 +1006,7 @@ struct photos { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .photos(let photos, let users): return ("photos", [("photos", photos), ("users", users)]) @@ -819,7 +1015,7 @@ struct photos { } } - static func parse_photos(_ reader: BufferReader) -> Photos? { + public static func parse_photos(_ reader: BufferReader) -> Photos? { var _1: [Api.Photo]? if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Photo.self) @@ -837,7 +1033,7 @@ struct photos { return nil } } - static func parse_photosSlice(_ reader: BufferReader) -> Photos? { + public static func parse_photosSlice(_ reader: BufferReader) -> Photos? { var _1: Int32? _1 = reader.readInt32() var _2: [Api.Photo]? @@ -862,12 +1058,12 @@ struct photos { } } } -extension Api { -struct phone { - enum PhoneCall: TypeConstructorDescription { +public extension Api { +public struct phone { + public enum PhoneCall: TypeConstructorDescription { case phoneCall(phoneCall: Api.PhoneCall, users: [Api.User]) - func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .phoneCall(let phoneCall, let users): if boxed { @@ -883,14 +1079,14 @@ struct phone { } } - func descriptionFields() -> (String, [(String, Any)]) { + public func descriptionFields() -> (String, [(String, Any)]) { switch self { case .phoneCall(let phoneCall, let users): return ("phoneCall", [("phoneCall", phoneCall), ("users", users)]) } } - static func parse_phoneCall(_ reader: BufferReader) -> PhoneCall? { + public static func parse_phoneCall(_ reader: BufferReader) -> PhoneCall? { var _1: Api.PhoneCall? if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.PhoneCall @@ -912,10 +1108,10 @@ struct phone { } } } -extension Api { - struct functions { - struct messages { - static func getHistory(peer: Api.InputPeer, offsetId: Int32, offsetDate: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { +public extension Api { + public struct functions { + public struct messages { + public static func getHistory(peer: Api.InputPeer, offsetId: Int32, offsetDate: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-591691168) peer.serialize(buffer, true) @@ -936,7 +1132,7 @@ extension Api { }) } - static func readHistory(peer: Api.InputPeer, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func readHistory(peer: Api.InputPeer, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(238054714) peer.serialize(buffer, true) @@ -951,7 +1147,7 @@ extension Api { }) } - static func deleteHistory(flags: Int32, peer: Api.InputPeer, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteHistory(flags: Int32, peer: Api.InputPeer, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(469850889) serializeInt32(flags, buffer: buffer, boxed: false) @@ -967,7 +1163,7 @@ extension Api { }) } - static func deleteMessages(flags: Int32, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteMessages(flags: Int32, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-443640366) serializeInt32(flags, buffer: buffer, boxed: false) @@ -986,7 +1182,7 @@ extension Api { }) } - static func receivedMessages(maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.ReceivedNotifyMessage]>) { + public static func receivedMessages(maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.ReceivedNotifyMessage]>) { let buffer = Buffer() buffer.appendInt32(94983360) serializeInt32(maxId, buffer: buffer, boxed: false) @@ -1000,7 +1196,7 @@ extension Api { }) } - static func setTyping(peer: Api.InputPeer, action: Api.SendMessageAction) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setTyping(peer: Api.InputPeer, action: Api.SendMessageAction) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1551737264) peer.serialize(buffer, true) @@ -1015,7 +1211,7 @@ extension Api { }) } - static func sendMessage(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, message: String, randomId: Int64, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendMessage(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, message: String, randomId: Int64, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-91733382) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1039,7 +1235,7 @@ extension Api { }) } - static func reportSpam(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func reportSpam(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-820669733) peer.serialize(buffer, true) @@ -1053,7 +1249,7 @@ extension Api { }) } - static func getPeerSettings(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPeerSettings(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(913498268) peer.serialize(buffer, true) @@ -1067,7 +1263,7 @@ extension Api { }) } - static func getChats(id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getChats(id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1013621127) buffer.appendInt32(481674261) @@ -1085,7 +1281,7 @@ extension Api { }) } - static func getFullChat(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getFullChat(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(998448230) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1099,7 +1295,7 @@ extension Api { }) } - static func editChatTitle(chatId: Int32, title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editChatTitle(chatId: Int32, title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-599447467) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1114,7 +1310,7 @@ extension Api { }) } - static func editChatPhoto(chatId: Int32, photo: Api.InputChatPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editChatPhoto(chatId: Int32, photo: Api.InputChatPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-900957736) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1129,7 +1325,7 @@ extension Api { }) } - static func addChatUser(chatId: Int32, userId: Api.InputUser, fwdLimit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func addChatUser(chatId: Int32, userId: Api.InputUser, fwdLimit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-106911223) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1145,7 +1341,7 @@ extension Api { }) } - static func deleteChatUser(chatId: Int32, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteChatUser(chatId: Int32, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-530505962) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1160,7 +1356,7 @@ extension Api { }) } - static func createChat(users: [Api.InputUser], title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func createChat(users: [Api.InputUser], title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(164303470) buffer.appendInt32(481674261) @@ -1179,7 +1375,7 @@ extension Api { }) } - static func forwardMessage(peer: Api.InputPeer, id: Int32, randomId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func forwardMessage(peer: Api.InputPeer, id: Int32, randomId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(865483769) peer.serialize(buffer, true) @@ -1195,7 +1391,7 @@ extension Api { }) } - static func getDhConfig(version: Int32, randomLength: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getDhConfig(version: Int32, randomLength: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(651135312) serializeInt32(version, buffer: buffer, boxed: false) @@ -1210,7 +1406,7 @@ extension Api { }) } - static func requestEncryption(userId: Api.InputUser, randomId: Int32, gA: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func requestEncryption(userId: Api.InputUser, randomId: Int32, gA: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-162681021) userId.serialize(buffer, true) @@ -1226,7 +1422,7 @@ extension Api { }) } - static func acceptEncryption(peer: Api.InputEncryptedChat, gB: Buffer, keyFingerprint: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func acceptEncryption(peer: Api.InputEncryptedChat, gB: Buffer, keyFingerprint: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1035731989) peer.serialize(buffer, true) @@ -1242,7 +1438,7 @@ extension Api { }) } - static func discardEncryption(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func discardEncryption(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-304536635) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1256,7 +1452,7 @@ extension Api { }) } - static func setEncryptedTyping(peer: Api.InputEncryptedChat, typing: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setEncryptedTyping(peer: Api.InputEncryptedChat, typing: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(2031374829) peer.serialize(buffer, true) @@ -1271,7 +1467,7 @@ extension Api { }) } - static func readEncryptedHistory(peer: Api.InputEncryptedChat, maxDate: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func readEncryptedHistory(peer: Api.InputEncryptedChat, maxDate: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(2135648522) peer.serialize(buffer, true) @@ -1286,7 +1482,7 @@ extension Api { }) } - static func sendEncrypted(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendEncrypted(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1451792525) peer.serialize(buffer, true) @@ -1302,7 +1498,7 @@ extension Api { }) } - static func sendEncryptedFile(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer, file: Api.InputEncryptedFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendEncryptedFile(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer, file: Api.InputEncryptedFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1701831834) peer.serialize(buffer, true) @@ -1319,7 +1515,7 @@ extension Api { }) } - static func sendEncryptedService(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendEncryptedService(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(852769188) peer.serialize(buffer, true) @@ -1335,7 +1531,7 @@ extension Api { }) } - static func receivedQueue(maxQts: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int64]>) { + public static func receivedQueue(maxQts: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int64]>) { let buffer = Buffer() buffer.appendInt32(1436924774) serializeInt32(maxQts, buffer: buffer, boxed: false) @@ -1349,7 +1545,7 @@ extension Api { }) } - static func reportEncryptedSpam(peer: Api.InputEncryptedChat) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func reportEncryptedSpam(peer: Api.InputEncryptedChat) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1259113487) peer.serialize(buffer, true) @@ -1363,7 +1559,7 @@ extension Api { }) } - static func readMessageContents(id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func readMessageContents(id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(916930423) buffer.appendInt32(481674261) @@ -1381,7 +1577,7 @@ extension Api { }) } - static func getAllStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAllStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(479598769) serializeInt32(hash, buffer: buffer, boxed: false) @@ -1395,7 +1591,7 @@ extension Api { }) } - static func checkChatInvite(hash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func checkChatInvite(hash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1051570619) serializeString(hash, buffer: buffer, boxed: false) @@ -1409,7 +1605,7 @@ extension Api { }) } - static func importChatInvite(hash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func importChatInvite(hash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1817183516) serializeString(hash, buffer: buffer, boxed: false) @@ -1423,7 +1619,7 @@ extension Api { }) } - static func getStickerSet(stickerset: Api.InputStickerSet) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getStickerSet(stickerset: Api.InputStickerSet) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(639215886) stickerset.serialize(buffer, true) @@ -1437,7 +1633,7 @@ extension Api { }) } - static func installStickerSet(stickerset: Api.InputStickerSet, archived: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func installStickerSet(stickerset: Api.InputStickerSet, archived: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-946871200) stickerset.serialize(buffer, true) @@ -1452,7 +1648,7 @@ extension Api { }) } - static func uninstallStickerSet(stickerset: Api.InputStickerSet) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func uninstallStickerSet(stickerset: Api.InputStickerSet) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-110209570) stickerset.serialize(buffer, true) @@ -1466,7 +1662,7 @@ extension Api { }) } - static func startBot(bot: Api.InputUser, peer: Api.InputPeer, randomId: Int64, startParam: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func startBot(bot: Api.InputUser, peer: Api.InputPeer, randomId: Int64, startParam: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-421563528) bot.serialize(buffer, true) @@ -1483,7 +1679,7 @@ extension Api { }) } - static func getMessagesViews(peer: Api.InputPeer, id: [Int32], increment: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { + public static func getMessagesViews(peer: Api.InputPeer, id: [Int32], increment: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { let buffer = Buffer() buffer.appendInt32(-993483427) peer.serialize(buffer, true) @@ -1503,7 +1699,7 @@ extension Api { }) } - static func editChatAdmin(chatId: Int32, userId: Api.InputUser, isAdmin: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editChatAdmin(chatId: Int32, userId: Api.InputUser, isAdmin: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1444503762) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1519,7 +1715,7 @@ extension Api { }) } - static func migrateChat(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func migrateChat(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(363051235) serializeInt32(chatId, buffer: buffer, boxed: false) @@ -1533,7 +1729,7 @@ extension Api { }) } - static func reorderStickerSets(flags: Int32, order: [Int64]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func reorderStickerSets(flags: Int32, order: [Int64]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(2016638777) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1552,7 +1748,7 @@ extension Api { }) } - static func getDocumentByHash(sha256: Buffer, size: Int32, mimeType: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getDocumentByHash(sha256: Buffer, size: Int32, mimeType: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(864953444) serializeBytes(sha256, buffer: buffer, boxed: false) @@ -1568,7 +1764,7 @@ extension Api { }) } - static func searchGifs(q: String, offset: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func searchGifs(q: String, offset: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1080395925) serializeString(q, buffer: buffer, boxed: false) @@ -1583,7 +1779,7 @@ extension Api { }) } - static func getSavedGifs(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getSavedGifs(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2084618926) serializeInt32(hash, buffer: buffer, boxed: false) @@ -1597,7 +1793,7 @@ extension Api { }) } - static func saveGif(id: Api.InputDocument, unsave: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveGif(id: Api.InputDocument, unsave: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(846868683) id.serialize(buffer, true) @@ -1612,7 +1808,7 @@ extension Api { }) } - static func getInlineBotResults(flags: Int32, bot: Api.InputUser, peer: Api.InputPeer, geoPoint: Api.InputGeoPoint?, query: String, offset: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getInlineBotResults(flags: Int32, bot: Api.InputUser, peer: Api.InputPeer, geoPoint: Api.InputGeoPoint?, query: String, offset: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1364105629) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1631,7 +1827,7 @@ extension Api { }) } - static func setInlineBotResults(flags: Int32, queryId: Int64, results: [Api.InputBotInlineResult], cacheTime: Int32, nextOffset: String?, switchPm: Api.InlineBotSwitchPM?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setInlineBotResults(flags: Int32, queryId: Int64, results: [Api.InputBotInlineResult], cacheTime: Int32, nextOffset: String?, switchPm: Api.InlineBotSwitchPM?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-346119674) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1654,7 +1850,7 @@ extension Api { }) } - static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendInlineBotResult(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, randomId: Int64, queryId: Int64, id: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1318189314) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1673,7 +1869,7 @@ extension Api { }) } - static func getMessageEditData(peer: Api.InputPeer, id: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getMessageEditData(peer: Api.InputPeer, id: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-39416522) peer.serialize(buffer, true) @@ -1688,7 +1884,7 @@ extension Api { }) } - static func getBotCallbackAnswer(flags: Int32, peer: Api.InputPeer, msgId: Int32, data: Buffer?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getBotCallbackAnswer(flags: Int32, peer: Api.InputPeer, msgId: Int32, data: Buffer?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2130010132) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1705,7 +1901,7 @@ extension Api { }) } - static func setBotCallbackAnswer(flags: Int32, queryId: Int64, message: String?, url: String?, cacheTime: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setBotCallbackAnswer(flags: Int32, queryId: Int64, message: String?, url: String?, cacheTime: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-712043766) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1723,7 +1919,7 @@ extension Api { }) } - static func saveDraft(flags: Int32, replyToMsgId: Int32?, peer: Api.InputPeer, message: String, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveDraft(flags: Int32, replyToMsgId: Int32?, peer: Api.InputPeer, message: String, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1137057461) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1745,7 +1941,7 @@ extension Api { }) } - static func getAllDrafts() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAllDrafts() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1782549861) @@ -1759,7 +1955,7 @@ extension Api { }) } - static func getFeaturedStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getFeaturedStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(766298703) serializeInt32(hash, buffer: buffer, boxed: false) @@ -1773,7 +1969,7 @@ extension Api { }) } - static func readFeaturedStickers(id: [Int64]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func readFeaturedStickers(id: [Int64]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1527873830) buffer.appendInt32(481674261) @@ -1791,7 +1987,7 @@ extension Api { }) } - static func getRecentStickers(flags: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getRecentStickers(flags: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1587647177) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1806,7 +2002,7 @@ extension Api { }) } - static func saveRecentSticker(flags: Int32, id: Api.InputDocument, unsave: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveRecentSticker(flags: Int32, id: Api.InputDocument, unsave: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(958863608) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1822,7 +2018,7 @@ extension Api { }) } - static func clearRecentStickers(flags: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func clearRecentStickers(flags: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1986437075) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1836,7 +2032,7 @@ extension Api { }) } - static func getArchivedStickers(flags: Int32, offsetId: Int64, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getArchivedStickers(flags: Int32, offsetId: Int64, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1475442322) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1852,7 +2048,7 @@ extension Api { }) } - static func getMaskStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getMaskStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1706608543) serializeInt32(hash, buffer: buffer, boxed: false) @@ -1866,7 +2062,7 @@ extension Api { }) } - static func getAttachedStickers(media: Api.InputStickeredMedia) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.StickerSetCovered]>) { + public static func getAttachedStickers(media: Api.InputStickeredMedia) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.StickerSetCovered]>) { let buffer = Buffer() buffer.appendInt32(-866424884) media.serialize(buffer, true) @@ -1880,7 +2076,7 @@ extension Api { }) } - static func setGameScore(flags: Int32, peer: Api.InputPeer, id: Int32, userId: Api.InputUser, score: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setGameScore(flags: Int32, peer: Api.InputPeer, id: Int32, userId: Api.InputUser, score: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1896289088) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1898,7 +2094,7 @@ extension Api { }) } - static func setInlineGameScore(flags: Int32, id: Api.InputBotInlineMessageID, userId: Api.InputUser, score: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setInlineGameScore(flags: Int32, id: Api.InputBotInlineMessageID, userId: Api.InputUser, score: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(363700068) serializeInt32(flags, buffer: buffer, boxed: false) @@ -1915,7 +2111,7 @@ extension Api { }) } - static func getGameHighScores(peer: Api.InputPeer, id: Int32, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getGameHighScores(peer: Api.InputPeer, id: Int32, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-400399203) peer.serialize(buffer, true) @@ -1931,7 +2127,7 @@ extension Api { }) } - static func getInlineGameHighScores(id: Api.InputBotInlineMessageID, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getInlineGameHighScores(id: Api.InputBotInlineMessageID, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(258170395) id.serialize(buffer, true) @@ -1946,7 +2142,7 @@ extension Api { }) } - static func getCommonChats(userId: Api.InputUser, maxId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getCommonChats(userId: Api.InputUser, maxId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(218777796) userId.serialize(buffer, true) @@ -1962,7 +2158,7 @@ extension Api { }) } - static func getAllChats(exceptIds: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAllChats(exceptIds: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-341307408) buffer.appendInt32(481674261) @@ -1980,7 +2176,7 @@ extension Api { }) } - static func getWebPage(url: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getWebPage(url: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(852135825) serializeString(url, buffer: buffer, boxed: false) @@ -1995,7 +2191,7 @@ extension Api { }) } - static func setBotShippingResults(flags: Int32, queryId: Int64, error: String?, shippingOptions: [Api.ShippingOption]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setBotShippingResults(flags: Int32, queryId: Int64, error: String?, shippingOptions: [Api.ShippingOption]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-436833542) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2016,7 +2212,7 @@ extension Api { }) } - static func setBotPrecheckoutResults(flags: Int32, queryId: Int64, error: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setBotPrecheckoutResults(flags: Int32, queryId: Int64, error: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(163765653) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2032,7 +2228,7 @@ extension Api { }) } - static func sendScreenshotNotification(peer: Api.InputPeer, replyToMsgId: Int32, randomId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendScreenshotNotification(peer: Api.InputPeer, replyToMsgId: Int32, randomId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-914493408) peer.serialize(buffer, true) @@ -2048,7 +2244,7 @@ extension Api { }) } - static func getFavedStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getFavedStickers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(567151374) serializeInt32(hash, buffer: buffer, boxed: false) @@ -2062,7 +2258,7 @@ extension Api { }) } - static func faveSticker(id: Api.InputDocument, unfave: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func faveSticker(id: Api.InputDocument, unfave: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1174420133) id.serialize(buffer, true) @@ -2077,7 +2273,7 @@ extension Api { }) } - static func getUnreadMentions(peer: Api.InputPeer, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getUnreadMentions(peer: Api.InputPeer, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1180140658) peer.serialize(buffer, true) @@ -2096,7 +2292,7 @@ extension Api { }) } - static func readMentions(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func readMentions(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(251759059) peer.serialize(buffer, true) @@ -2110,7 +2306,7 @@ extension Api { }) } - static func uploadMedia(peer: Api.InputPeer, media: Api.InputMedia) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func uploadMedia(peer: Api.InputPeer, media: Api.InputMedia) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1369162417) peer.serialize(buffer, true) @@ -2125,7 +2321,7 @@ extension Api { }) } - static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendMultiMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, multiMedia: [Api.InputSingleMedia]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(546656559) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2146,7 +2342,7 @@ extension Api { }) } - static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func forwardMessages(flags: Int32, fromPeer: Api.InputPeer, id: [Int32], randomId: [Int64], toPeer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1888354709) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2172,7 +2368,7 @@ extension Api { }) } - static func uploadEncryptedFile(peer: Api.InputEncryptedChat, file: Api.InputEncryptedFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func uploadEncryptedFile(peer: Api.InputEncryptedChat, file: Api.InputEncryptedFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1347929239) peer.serialize(buffer, true) @@ -2187,7 +2383,7 @@ extension Api { }) } - static func getWebPagePreview(flags: Int32, message: String, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getWebPagePreview(flags: Int32, message: String, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1956073268) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2207,7 +2403,7 @@ extension Api { }) } - static func sendMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, media: Api.InputMedia, message: String, randomId: Int64, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendMedia(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, media: Api.InputMedia, message: String, randomId: Int64, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1194252757) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2232,7 +2428,7 @@ extension Api { }) } - static func getMessages(id: [Api.InputMessage]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getMessages(id: [Api.InputMessage]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1673946374) buffer.appendInt32(481674261) @@ -2250,7 +2446,7 @@ extension Api { }) } - static func report(peer: Api.InputPeer, id: [Int32], reason: Api.ReportReason) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func report(peer: Api.InputPeer, id: [Int32], reason: Api.ReportReason) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1115507112) peer.serialize(buffer, true) @@ -2270,7 +2466,7 @@ extension Api { }) } - static func getRecentLocations(peer: Api.InputPeer, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getRecentLocations(peer: Api.InputPeer, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1144759543) peer.serialize(buffer, true) @@ -2286,7 +2482,7 @@ extension Api { }) } - static func search(flags: Int32, peer: Api.InputPeer, q: String, fromId: Api.InputUser?, filter: Api.MessagesFilter, minDate: Int32, maxDate: Int32, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func search(flags: Int32, peer: Api.InputPeer, q: String, fromId: Api.InputUser?, filter: Api.MessagesFilter, minDate: Int32, maxDate: Int32, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2045448344) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2312,7 +2508,7 @@ extension Api { }) } - static func toggleDialogPin(flags: Int32, peer: Api.InputDialogPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func toggleDialogPin(flags: Int32, peer: Api.InputDialogPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1489903017) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2327,7 +2523,7 @@ extension Api { }) } - static func getPeerDialogs(peers: [Api.InputDialogPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPeerDialogs(peers: [Api.InputDialogPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-462373635) buffer.appendInt32(481674261) @@ -2345,7 +2541,7 @@ extension Api { }) } - static func searchStickerSets(flags: Int32, q: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func searchStickerSets(flags: Int32, q: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1028140917) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2361,7 +2557,7 @@ extension Api { }) } - static func getStickers(emoticon: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getStickers(emoticon: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(71126828) serializeString(emoticon, buffer: buffer, boxed: false) @@ -2376,7 +2572,7 @@ extension Api { }) } - static func markDialogUnread(flags: Int32, peer: Api.InputDialogPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func markDialogUnread(flags: Int32, peer: Api.InputDialogPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1031349873) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2391,7 +2587,7 @@ extension Api { }) } - static func getDialogUnreadMarks() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.DialogPeer]>) { + public static func getDialogUnreadMarks() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.DialogPeer]>) { let buffer = Buffer() buffer.appendInt32(585256482) @@ -2405,7 +2601,7 @@ extension Api { }) } - static func updatePinnedMessage(flags: Int32, peer: Api.InputPeer, id: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updatePinnedMessage(flags: Int32, peer: Api.InputPeer, id: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-760547348) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2421,7 +2617,7 @@ extension Api { }) } - static func sendVote(peer: Api.InputPeer, msgId: Int32, options: [Buffer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendVote(peer: Api.InputPeer, msgId: Int32, options: [Buffer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(283795844) peer.serialize(buffer, true) @@ -2441,7 +2637,7 @@ extension Api { }) } - static func getPollResults(peer: Api.InputPeer, msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPollResults(peer: Api.InputPeer, msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1941660731) peer.serialize(buffer, true) @@ -2456,7 +2652,7 @@ extension Api { }) } - static func getOnlines(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getOnlines(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1848369232) peer.serialize(buffer, true) @@ -2470,7 +2666,7 @@ extension Api { }) } - static func getStatsURL(flags: Int32, peer: Api.InputPeer, params: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getStatsURL(flags: Int32, peer: Api.InputPeer, params: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2127811866) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2486,7 +2682,7 @@ extension Api { }) } - static func editMessage(flags: Int32, peer: Api.InputPeer, id: Int32, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?) -> (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]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-787025122) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2510,7 +2706,7 @@ extension Api { }) } - static func editInlineBotMessage(flags: Int32, id: Api.InputBotInlineMessageID, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editInlineBotMessage(flags: Int32, id: Api.InputBotInlineMessageID, message: String?, media: Api.InputMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2091549254) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2533,7 +2729,7 @@ extension Api { }) } - static func editChatAbout(peer: Api.InputPeer, about: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editChatAbout(peer: Api.InputPeer, about: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-554301545) peer.serialize(buffer, true) @@ -2548,7 +2744,7 @@ extension Api { }) } - static func editChatDefaultBannedRights(peer: Api.InputPeer, bannedRights: Api.ChatBannedRights) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editChatDefaultBannedRights(peer: Api.InputPeer, bannedRights: Api.ChatBannedRights) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1517917375) peer.serialize(buffer, true) @@ -2563,7 +2759,7 @@ extension Api { }) } - static func exportChatInvite(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func exportChatInvite(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(234312524) peer.serialize(buffer, true) @@ -2577,7 +2773,7 @@ extension Api { }) } - static func getEmojiKeywords(langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getEmojiKeywords(langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(899735650) serializeString(langCode, buffer: buffer, boxed: false) @@ -2591,7 +2787,7 @@ extension Api { }) } - static func getEmojiKeywordsDifference(langCode: String, fromVersion: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getEmojiKeywordsDifference(langCode: String, fromVersion: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(352892591) serializeString(langCode, buffer: buffer, boxed: false) @@ -2606,7 +2802,7 @@ extension Api { }) } - static func getEmojiURL(langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getEmojiURL(langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-709817306) serializeString(langCode, buffer: buffer, boxed: false) @@ -2620,7 +2816,7 @@ extension Api { }) } - static func reorderPinnedDialogs(flags: Int32, folderId: Int32, order: [Api.InputDialogPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func reorderPinnedDialogs(flags: Int32, folderId: Int32, order: [Api.InputDialogPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(991616823) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2640,7 +2836,7 @@ extension Api { }) } - static func getPinnedDialogs(folderId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPinnedDialogs(folderId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-692498958) serializeInt32(folderId, buffer: buffer, boxed: false) @@ -2654,7 +2850,7 @@ extension Api { }) } - static func getDialogs(flags: Int32, folderId: Int32?, offsetDate: Int32, offsetId: Int32, offsetPeer: Api.InputPeer, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getDialogs(flags: Int32, folderId: Int32?, offsetDate: Int32, offsetId: Int32, offsetPeer: Api.InputPeer, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1594999949) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2674,25 +2870,7 @@ extension Api { }) } - static func searchGlobal(q: String, offsetRate: Int32, offsetPeer: Api.InputPeer, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(259638801) - serializeString(q, buffer: buffer, boxed: false) - serializeInt32(offsetRate, buffer: buffer, boxed: false) - offsetPeer.serialize(buffer, true) - serializeInt32(offsetId, buffer: buffer, boxed: false) - serializeInt32(limit, buffer: buffer, boxed: false) - return (FunctionDescription(name: "messages.searchGlobal", parameters: [("q", q), ("offsetRate", offsetRate), ("offsetPeer", offsetPeer), ("offsetId", offsetId), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Messages? in - let reader = BufferReader(buffer) - var result: Api.messages.Messages? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.messages.Messages - } - return result - }) - } - - static func getSearchCounters(peer: Api.InputPeer, filters: [Api.MessagesFilter]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.messages.SearchCounter]>) { + public static func getSearchCounters(peer: Api.InputPeer, filters: [Api.MessagesFilter]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.messages.SearchCounter]>) { let buffer = Buffer() buffer.appendInt32(1932455680) peer.serialize(buffer, true) @@ -2711,7 +2889,7 @@ extension Api { }) } - static func requestUrlAuth(peer: Api.InputPeer, msgId: Int32, buttonId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func requestUrlAuth(peer: Api.InputPeer, msgId: Int32, buttonId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-482388461) peer.serialize(buffer, true) @@ -2727,7 +2905,7 @@ extension Api { }) } - static func acceptUrlAuth(flags: Int32, peer: Api.InputPeer, msgId: Int32, buttonId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func acceptUrlAuth(flags: Int32, peer: Api.InputPeer, msgId: Int32, buttonId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-148247912) serializeInt32(flags, buffer: buffer, boxed: false) @@ -2744,7 +2922,7 @@ extension Api { }) } - static func hidePeerSettingsBar(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func hidePeerSettingsBar(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1336717624) peer.serialize(buffer, true) @@ -2757,9 +2935,29 @@ extension Api { return result }) } + + public static func searchGlobal(flags: Int32, folderId: Int32?, q: String, offsetRate: Int32, offsetPeer: Api.InputPeer, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1083038300) + serializeInt32(flags, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} + serializeString(q, buffer: buffer, boxed: false) + serializeInt32(offsetRate, buffer: buffer, boxed: false) + offsetPeer.serialize(buffer, true) + serializeInt32(offsetId, buffer: buffer, boxed: false) + serializeInt32(limit, buffer: buffer, boxed: false) + return (FunctionDescription(name: "messages.searchGlobal", parameters: [("flags", flags), ("folderId", folderId), ("q", q), ("offsetRate", offsetRate), ("offsetPeer", offsetPeer), ("offsetId", offsetId), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Messages? in + let reader = BufferReader(buffer) + var result: Api.messages.Messages? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.Messages + } + return result + }) + } } - struct channels { - static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct channels { + public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-871347913) channel.serialize(buffer, true) @@ -2774,7 +2972,7 @@ extension Api { }) } - static func deleteMessages(channel: Api.InputChannel, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteMessages(channel: Api.InputChannel, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2067661490) channel.serialize(buffer, true) @@ -2793,7 +2991,7 @@ extension Api { }) } - static func deleteUserHistory(channel: Api.InputChannel, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteUserHistory(channel: Api.InputChannel, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-787622117) channel.serialize(buffer, true) @@ -2808,7 +3006,7 @@ extension Api { }) } - static func reportSpam(channel: Api.InputChannel, userId: Api.InputUser, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func reportSpam(channel: Api.InputChannel, userId: Api.InputUser, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-32999408) channel.serialize(buffer, true) @@ -2828,7 +3026,7 @@ extension Api { }) } - static func getParticipant(channel: Api.InputChannel, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getParticipant(channel: Api.InputChannel, userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1416484774) channel.serialize(buffer, true) @@ -2843,7 +3041,7 @@ extension Api { }) } - static func getChannels(id: [Api.InputChannel]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getChannels(id: [Api.InputChannel]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(176122811) buffer.appendInt32(481674261) @@ -2861,7 +3059,7 @@ extension Api { }) } - static func getFullChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getFullChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(141781513) channel.serialize(buffer, true) @@ -2875,23 +3073,7 @@ extension Api { }) } - static func createChannel(flags: Int32, title: String, about: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-192332417) - serializeInt32(flags, buffer: buffer, boxed: false) - serializeString(title, buffer: buffer, boxed: false) - serializeString(about, buffer: buffer, boxed: false) - return (FunctionDescription(name: "channels.createChannel", parameters: [("flags", flags), ("title", title), ("about", about)]), 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 - }) - } - - static func editTitle(channel: Api.InputChannel, title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editTitle(channel: Api.InputChannel, title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1450044624) channel.serialize(buffer, true) @@ -2906,7 +3088,7 @@ extension Api { }) } - static func editPhoto(channel: Api.InputChannel, photo: Api.InputChatPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editPhoto(channel: Api.InputChannel, photo: Api.InputChatPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-248621111) channel.serialize(buffer, true) @@ -2921,7 +3103,7 @@ extension Api { }) } - static func checkUsername(channel: Api.InputChannel, username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func checkUsername(channel: Api.InputChannel, username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(283557164) channel.serialize(buffer, true) @@ -2936,7 +3118,7 @@ extension Api { }) } - static func updateUsername(channel: Api.InputChannel, username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updateUsername(channel: Api.InputChannel, username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(890549214) channel.serialize(buffer, true) @@ -2951,7 +3133,7 @@ extension Api { }) } - static func joinChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func joinChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(615851205) channel.serialize(buffer, true) @@ -2965,7 +3147,7 @@ extension Api { }) } - static func leaveChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func leaveChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-130635115) channel.serialize(buffer, true) @@ -2979,7 +3161,7 @@ extension Api { }) } - static func inviteToChannel(channel: Api.InputChannel, users: [Api.InputUser]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func inviteToChannel(channel: Api.InputChannel, users: [Api.InputUser]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(429865580) channel.serialize(buffer, true) @@ -2998,7 +3180,7 @@ extension Api { }) } - static func kickFromChannel(channel: Api.InputChannel, userId: Api.InputUser, kicked: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func kickFromChannel(channel: Api.InputChannel, userId: Api.InputUser, kicked: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1502421484) channel.serialize(buffer, true) @@ -3014,7 +3196,7 @@ extension Api { }) } - static func deleteChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteChannel(channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1072619549) channel.serialize(buffer, true) @@ -3028,7 +3210,7 @@ extension Api { }) } - static func toggleSignatures(channel: Api.InputChannel, enabled: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func toggleSignatures(channel: Api.InputChannel, enabled: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(527021574) channel.serialize(buffer, true) @@ -3043,21 +3225,7 @@ extension Api { }) } - static func getAdminedPublicChannels() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-1920105769) - - return (FunctionDescription(name: "channels.getAdminedPublicChannels", parameters: []), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Chats? in - let reader = BufferReader(buffer) - var result: Api.messages.Chats? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.messages.Chats - } - return result - }) - } - - static func getAdminLog(flags: Int32, channel: Api.InputChannel, q: String, eventsFilter: Api.ChannelAdminLogEventsFilter?, admins: [Api.InputUser]?, maxId: Int64, minId: Int64, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAdminLog(flags: Int32, channel: Api.InputChannel, q: String, eventsFilter: Api.ChannelAdminLogEventsFilter?, admins: [Api.InputUser]?, maxId: Int64, minId: Int64, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(870184064) serializeInt32(flags, buffer: buffer, boxed: false) @@ -3082,7 +3250,7 @@ extension Api { }) } - static func setStickers(channel: Api.InputChannel, stickerset: Api.InputStickerSet) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setStickers(channel: Api.InputChannel, stickerset: Api.InputStickerSet) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-359881479) channel.serialize(buffer, true) @@ -3097,7 +3265,7 @@ extension Api { }) } - static func readMessageContents(channel: Api.InputChannel, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func readMessageContents(channel: Api.InputChannel, id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-357180360) channel.serialize(buffer, true) @@ -3116,7 +3284,7 @@ extension Api { }) } - static func deleteHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1355375294) channel.serialize(buffer, true) @@ -3131,7 +3299,7 @@ extension Api { }) } - static func togglePreHistoryHidden(channel: Api.InputChannel, enabled: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func togglePreHistoryHidden(channel: Api.InputChannel, enabled: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-356796084) channel.serialize(buffer, true) @@ -3146,7 +3314,7 @@ extension Api { }) } - static func getParticipants(channel: Api.InputChannel, filter: Api.ChannelParticipantsFilter, offset: Int32, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getParticipants(channel: Api.InputChannel, filter: Api.ChannelParticipantsFilter, offset: Int32, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(306054633) channel.serialize(buffer, true) @@ -3164,7 +3332,7 @@ extension Api { }) } - static func exportMessageLink(channel: Api.InputChannel, id: Int32, grouped: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func exportMessageLink(channel: Api.InputChannel, id: Int32, grouped: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-826838685) channel.serialize(buffer, true) @@ -3180,7 +3348,7 @@ extension Api { }) } - static func getMessages(channel: Api.InputChannel, id: [Api.InputMessage]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getMessages(channel: Api.InputChannel, id: [Api.InputMessage]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1383294429) channel.serialize(buffer, true) @@ -3199,7 +3367,7 @@ extension Api { }) } - static func editAdmin(channel: Api.InputChannel, userId: Api.InputUser, adminRights: Api.ChatAdminRights) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editAdmin(channel: Api.InputChannel, userId: Api.InputUser, adminRights: Api.ChatAdminRights) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1895338938) channel.serialize(buffer, true) @@ -3215,7 +3383,7 @@ extension Api { }) } - static func editBanned(channel: Api.InputChannel, userId: Api.InputUser, bannedRights: Api.ChatBannedRights) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editBanned(channel: Api.InputChannel, userId: Api.InputUser, bannedRights: Api.ChatBannedRights) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1920559378) channel.serialize(buffer, true) @@ -3231,7 +3399,7 @@ extension Api { }) } - static func getGroupsForDiscussion() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getGroupsForDiscussion() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-170208392) @@ -3245,7 +3413,7 @@ extension Api { }) } - static func getBroadcastsForDiscussion() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getBroadcastsForDiscussion() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(445117188) @@ -3259,7 +3427,7 @@ extension Api { }) } - static func setDiscussionGroup(broadcast: Api.InputChannel, group: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setDiscussionGroup(broadcast: Api.InputChannel, group: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1079520178) broadcast.serialize(buffer, true) @@ -3274,7 +3442,7 @@ extension Api { }) } - static func editCreator(channel: Api.InputChannel, userId: Api.InputUser, password: Api.InputCheckPasswordSRP) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editCreator(channel: Api.InputChannel, userId: Api.InputUser, password: Api.InputCheckPasswordSRP) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1892102881) channel.serialize(buffer, true) @@ -3289,9 +3457,57 @@ extension Api { return result }) } + + public static func editLocation(channel: Api.InputChannel, geoPoint: Api.InputGeoPoint, address: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1491484525) + channel.serialize(buffer, true) + geoPoint.serialize(buffer, true) + serializeString(address, buffer: buffer, boxed: false) + return (FunctionDescription(name: "channels.editLocation", parameters: [("channel", channel), ("geoPoint", geoPoint), ("address", address)]), 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 createChannel(flags: Int32, title: String, about: String, geoPoint: Api.InputGeoPoint?, address: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1029681423) + serializeInt32(flags, buffer: buffer, boxed: false) + serializeString(title, buffer: buffer, boxed: false) + serializeString(about, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 2) != 0 {geoPoint!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {serializeString(address!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "channels.createChannel", parameters: [("flags", flags), ("title", title), ("about", about), ("geoPoint", geoPoint), ("address", address)]), 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 getAdminedPublicChannels(flags: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-122669393) + serializeInt32(flags, buffer: buffer, boxed: false) + return (FunctionDescription(name: "channels.getAdminedPublicChannels", parameters: [("flags", flags)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Chats? in + let reader = BufferReader(buffer) + var result: Api.messages.Chats? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.Chats + } + return result + }) + } } - struct payments { - static func getPaymentForm(msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct payments { + public static func getPaymentForm(msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1712285883) serializeInt32(msgId, buffer: buffer, boxed: false) @@ -3305,7 +3521,7 @@ extension Api { }) } - static func getPaymentReceipt(msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPaymentReceipt(msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1601001088) serializeInt32(msgId, buffer: buffer, boxed: false) @@ -3319,7 +3535,7 @@ extension Api { }) } - static func validateRequestedInfo(flags: Int32, msgId: Int32, info: Api.PaymentRequestedInfo) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func validateRequestedInfo(flags: Int32, msgId: Int32, info: Api.PaymentRequestedInfo) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1997180532) serializeInt32(flags, buffer: buffer, boxed: false) @@ -3335,7 +3551,7 @@ extension Api { }) } - static func sendPaymentForm(flags: Int32, msgId: Int32, requestedInfoId: String?, shippingOptionId: String?, credentials: Api.InputPaymentCredentials) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendPaymentForm(flags: Int32, msgId: Int32, requestedInfoId: String?, shippingOptionId: String?, credentials: Api.InputPaymentCredentials) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(730364339) serializeInt32(flags, buffer: buffer, boxed: false) @@ -3353,7 +3569,7 @@ extension Api { }) } - static func getSavedInfo() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getSavedInfo() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(578650699) @@ -3367,7 +3583,7 @@ extension Api { }) } - static func clearSavedInfo(flags: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func clearSavedInfo(flags: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-667062079) serializeInt32(flags, buffer: buffer, boxed: false) @@ -3381,8 +3597,8 @@ extension Api { }) } } - struct auth { - static func checkPhone(phoneNumber: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct auth { + public static func checkPhone(phoneNumber: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1877286395) serializeString(phoneNumber, buffer: buffer, boxed: false) @@ -3396,7 +3612,7 @@ extension Api { }) } - static func sendCode(flags: Int32, phoneNumber: String, currentNumber: Api.Bool?, apiId: Int32, apiHash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendCode(flags: Int32, phoneNumber: String, currentNumber: Api.Bool?, apiId: Int32, apiHash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2035355412) serializeInt32(flags, buffer: buffer, boxed: false) @@ -3414,7 +3630,7 @@ extension Api { }) } - static func signUp(phoneNumber: String, phoneCodeHash: String, phoneCode: String, firstName: String, lastName: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func signUp(phoneNumber: String, phoneCodeHash: String, phoneCode: String, firstName: String, lastName: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(453408308) serializeString(phoneNumber, buffer: buffer, boxed: false) @@ -3432,7 +3648,7 @@ extension Api { }) } - static func signIn(phoneNumber: String, phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func signIn(phoneNumber: String, phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1126886015) serializeString(phoneNumber, buffer: buffer, boxed: false) @@ -3448,7 +3664,7 @@ extension Api { }) } - static func logOut() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func logOut() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1461180992) @@ -3462,7 +3678,7 @@ extension Api { }) } - static func resetAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1616179942) @@ -3476,7 +3692,7 @@ extension Api { }) } - static func sendInvites(phoneNumbers: [String], message: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendInvites(phoneNumbers: [String], message: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1998331287) buffer.appendInt32(481674261) @@ -3495,7 +3711,7 @@ extension Api { }) } - static func exportAuthorization(dcId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func exportAuthorization(dcId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-440401971) serializeInt32(dcId, buffer: buffer, boxed: false) @@ -3509,7 +3725,7 @@ extension Api { }) } - static func importAuthorization(id: Int32, bytes: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func importAuthorization(id: Int32, bytes: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-470837741) serializeInt32(id, buffer: buffer, boxed: false) @@ -3524,7 +3740,7 @@ extension Api { }) } - static func bindTempAuthKey(permAuthKeyId: Int64, nonce: Int64, expiresAt: Int32, encryptedMessage: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func bindTempAuthKey(permAuthKeyId: Int64, nonce: Int64, expiresAt: Int32, encryptedMessage: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-841733627) serializeInt64(permAuthKeyId, buffer: buffer, boxed: false) @@ -3541,7 +3757,7 @@ extension Api { }) } - static func importBotAuthorization(flags: Int32, apiId: Int32, apiHash: String, botAuthToken: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func importBotAuthorization(flags: Int32, apiId: Int32, apiHash: String, botAuthToken: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1738800940) serializeInt32(flags, buffer: buffer, boxed: false) @@ -3558,7 +3774,7 @@ extension Api { }) } - static func requestPasswordRecovery() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func requestPasswordRecovery() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-661144474) @@ -3572,7 +3788,7 @@ extension Api { }) } - static func recoverPassword(code: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func recoverPassword(code: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1319464594) serializeString(code, buffer: buffer, boxed: false) @@ -3586,7 +3802,7 @@ extension Api { }) } - static func resendCode(phoneNumber: String, phoneCodeHash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resendCode(phoneNumber: String, phoneCodeHash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1056025023) serializeString(phoneNumber, buffer: buffer, boxed: false) @@ -3601,7 +3817,7 @@ extension Api { }) } - static func cancelCode(phoneNumber: String, phoneCodeHash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func cancelCode(phoneNumber: String, phoneCodeHash: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(520357240) serializeString(phoneNumber, buffer: buffer, boxed: false) @@ -3616,7 +3832,7 @@ extension Api { }) } - static func dropTempAuthKeys(exceptAuthKeys: [Int64]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func dropTempAuthKeys(exceptAuthKeys: [Int64]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1907842680) buffer.appendInt32(481674261) @@ -3634,7 +3850,7 @@ extension Api { }) } - static func checkPassword(password: Api.InputCheckPasswordSRP) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func checkPassword(password: Api.InputCheckPasswordSRP) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-779399914) password.serialize(buffer, true) @@ -3648,8 +3864,8 @@ extension Api { }) } } - struct bots { - static func sendCustomRequest(customMethod: String, params: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct bots { + public static func sendCustomRequest(customMethod: String, params: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1440257555) serializeString(customMethod, buffer: buffer, boxed: false) @@ -3664,7 +3880,7 @@ extension Api { }) } - static func answerWebhookJSONQuery(queryId: Int64, data: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func answerWebhookJSONQuery(queryId: Int64, data: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-434028723) serializeInt64(queryId, buffer: buffer, boxed: false) @@ -3679,8 +3895,8 @@ extension Api { }) } } - struct users { - static func getUsers(id: [Api.InputUser]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.User]>) { + public struct users { + public static func getUsers(id: [Api.InputUser]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.User]>) { let buffer = Buffer() buffer.appendInt32(227648840) buffer.appendInt32(481674261) @@ -3698,7 +3914,7 @@ extension Api { }) } - static func setSecureValueErrors(id: Api.InputUser, errors: [Api.SecureValueError]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setSecureValueErrors(id: Api.InputUser, errors: [Api.SecureValueError]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1865902923) id.serialize(buffer, true) @@ -3717,7 +3933,7 @@ extension Api { }) } - static func getFullUser(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getFullUser(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-902781519) id.serialize(buffer, true) @@ -3731,8 +3947,8 @@ extension Api { }) } } - struct contacts { - static func getStatuses() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.ContactStatus]>) { + public struct contacts { + public static func getStatuses() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.ContactStatus]>) { let buffer = Buffer() buffer.appendInt32(-995929106) @@ -3746,7 +3962,7 @@ extension Api { }) } - static func block(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func block(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(858475004) id.serialize(buffer, true) @@ -3760,7 +3976,7 @@ extension Api { }) } - static func unblock(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func unblock(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-448724803) id.serialize(buffer, true) @@ -3774,7 +3990,7 @@ extension Api { }) } - static func getBlocked(offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getBlocked(offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-176409329) serializeInt32(offset, buffer: buffer, boxed: false) @@ -3789,7 +4005,7 @@ extension Api { }) } - static func exportCard() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { + public static func exportCard() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { let buffer = Buffer() buffer.appendInt32(-2065352905) @@ -3803,7 +4019,7 @@ extension Api { }) } - static func importCard(exportCard: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func importCard(exportCard: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1340184318) buffer.appendInt32(481674261) @@ -3821,7 +4037,7 @@ extension Api { }) } - static func search(q: String, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func search(q: String, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(301470424) serializeString(q, buffer: buffer, boxed: false) @@ -3836,7 +4052,7 @@ extension Api { }) } - static func resolveUsername(username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resolveUsername(username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-113456221) serializeString(username, buffer: buffer, boxed: false) @@ -3850,7 +4066,7 @@ extension Api { }) } - static func getTopPeers(flags: Int32, offset: Int32, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getTopPeers(flags: Int32, offset: Int32, limit: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-728224331) serializeInt32(flags, buffer: buffer, boxed: false) @@ -3867,7 +4083,7 @@ extension Api { }) } - static func resetTopPeerRating(category: Api.TopPeerCategory, peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetTopPeerRating(category: Api.TopPeerCategory, peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(451113900) category.serialize(buffer, true) @@ -3882,7 +4098,7 @@ extension Api { }) } - static func importContacts(contacts: [Api.InputContact]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func importContacts(contacts: [Api.InputContact]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(746589157) buffer.appendInt32(481674261) @@ -3900,7 +4116,7 @@ extension Api { }) } - static func resetSaved() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetSaved() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2020263951) @@ -3914,7 +4130,7 @@ extension Api { }) } - static func getContacts(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getContacts(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1071414113) serializeInt32(hash, buffer: buffer, boxed: false) @@ -3928,7 +4144,7 @@ extension Api { }) } - static func toggleTopPeers(enabled: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func toggleTopPeers(enabled: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2062238246) enabled.serialize(buffer, true) @@ -3942,7 +4158,7 @@ extension Api { }) } - static func getContactIDs(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { + public static func getContactIDs(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { let buffer = Buffer() buffer.appendInt32(749357634) serializeInt32(hash, buffer: buffer, boxed: false) @@ -3956,14 +4172,15 @@ extension Api { }) } - static func addContact(id: Api.InputUser, firstName: String, lastName: String, phone: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func addContact(flags: Int32, id: Api.InputUser, firstName: String, lastName: String, phone: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-2035792455) + buffer.appendInt32(-386636848) + serializeInt32(flags, buffer: buffer, boxed: false) id.serialize(buffer, true) serializeString(firstName, buffer: buffer, boxed: false) serializeString(lastName, buffer: buffer, boxed: false) serializeString(phone, buffer: buffer, boxed: false) - return (FunctionDescription(name: "contacts.addContact", parameters: [("id", id), ("firstName", firstName), ("lastName", lastName), ("phone", phone)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + return (FunctionDescription(name: "contacts.addContact", parameters: [("flags", flags), ("id", id), ("firstName", firstName), ("lastName", lastName), ("phone", phone)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) var result: Api.Updates? if let signature = reader.readInt32() { @@ -3973,7 +4190,7 @@ extension Api { }) } - static func acceptContact(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func acceptContact(id: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-130964977) id.serialize(buffer, true) @@ -3987,7 +4204,7 @@ extension Api { }) } - static func deleteContacts(id: [Api.InputUser]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteContacts(id: [Api.InputUser]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(157945344) buffer.appendInt32(481674261) @@ -4005,12 +4222,11 @@ extension Api { }) } - static func getLocated(geoPoint: Api.InputGeoPoint, radius: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getLocated(geoPoint: Api.InputGeoPoint) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-261936023) + buffer.appendInt32(171270230) geoPoint.serialize(buffer, true) - serializeInt32(radius, buffer: buffer, boxed: false) - return (FunctionDescription(name: "contacts.getLocated", parameters: [("geoPoint", geoPoint), ("radius", radius)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + return (FunctionDescription(name: "contacts.getLocated", parameters: [("geoPoint", geoPoint)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) var result: Api.Updates? if let signature = reader.readInt32() { @@ -4020,8 +4236,8 @@ extension Api { }) } } - struct help { - static func getConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct help { + public static func getConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-990308245) @@ -4035,7 +4251,7 @@ extension Api { }) } - static func getNearestDc() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getNearestDc() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(531836966) @@ -4049,7 +4265,7 @@ extension Api { }) } - static func getAppUpdate() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAppUpdate() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1372724842) @@ -4063,7 +4279,7 @@ extension Api { }) } - static func getInviteText() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getInviteText() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1295590211) @@ -4077,7 +4293,7 @@ extension Api { }) } - static func getSupport() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getSupport() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1663104819) @@ -4091,7 +4307,7 @@ extension Api { }) } - static func getAppChangelog(prevAppVersion: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAppChangelog(prevAppVersion: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1877938321) serializeString(prevAppVersion, buffer: buffer, boxed: false) @@ -4105,7 +4321,7 @@ extension Api { }) } - static func setBotUpdatesStatus(pendingUpdatesCount: Int32, message: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setBotUpdatesStatus(pendingUpdatesCount: Int32, message: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-333262899) serializeInt32(pendingUpdatesCount, buffer: buffer, boxed: false) @@ -4120,7 +4336,7 @@ extension Api { }) } - static func getCdnConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getCdnConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1375900482) @@ -4134,7 +4350,7 @@ extension Api { }) } - static func test() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func test() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1058929929) @@ -4148,7 +4364,7 @@ extension Api { }) } - static func getRecentMeUrls(referer: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getRecentMeUrls(referer: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1036054804) serializeString(referer, buffer: buffer, boxed: false) @@ -4162,7 +4378,7 @@ extension Api { }) } - static func getProxyData() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getProxyData() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1031231713) @@ -4176,7 +4392,7 @@ extension Api { }) } - static func getTermsOfServiceUpdate() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getTermsOfServiceUpdate() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(749019089) @@ -4190,7 +4406,7 @@ extension Api { }) } - static func acceptTermsOfService(id: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func acceptTermsOfService(id: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-294455398) id.serialize(buffer, true) @@ -4204,7 +4420,7 @@ extension Api { }) } - static func getDeepLinkInfo(path: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getDeepLinkInfo(path: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1072547679) serializeString(path, buffer: buffer, boxed: false) @@ -4218,7 +4434,7 @@ extension Api { }) } - static func getPassportConfig(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPassportConfig(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-966677240) serializeInt32(hash, buffer: buffer, boxed: false) @@ -4232,7 +4448,7 @@ extension Api { }) } - static func getAppConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAppConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1735311088) @@ -4246,7 +4462,7 @@ extension Api { }) } - static func saveAppLog(events: [Api.InputAppEvent]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveAppLog(events: [Api.InputAppEvent]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1862465352) buffer.appendInt32(481674261) @@ -4264,8 +4480,8 @@ extension Api { }) } } - struct updates { - static func getState() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct updates { + public static func getState() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-304838614) @@ -4279,7 +4495,7 @@ extension Api { }) } - static func getDifference(flags: Int32, pts: Int32, ptsTotalLimit: Int32?, date: Int32, qts: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getDifference(flags: Int32, pts: Int32, ptsTotalLimit: Int32?, date: Int32, qts: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(630429265) serializeInt32(flags, buffer: buffer, boxed: false) @@ -4297,7 +4513,7 @@ extension Api { }) } - static func getChannelDifference(flags: Int32, channel: Api.InputChannel, filter: Api.ChannelMessagesFilter, pts: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getChannelDifference(flags: Int32, channel: Api.InputChannel, filter: Api.ChannelMessagesFilter, pts: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(51854712) serializeInt32(flags, buffer: buffer, boxed: false) @@ -4315,8 +4531,8 @@ extension Api { }) } } - struct folders { - static func editPeerFolders(folderPeers: [Api.InputFolderPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct folders { + public static func editPeerFolders(folderPeers: [Api.InputFolderPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1749536939) buffer.appendInt32(481674261) @@ -4334,7 +4550,7 @@ extension Api { }) } - static func deleteFolder(folderId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteFolder(folderId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(472471681) serializeInt32(folderId, buffer: buffer, boxed: false) @@ -4348,8 +4564,8 @@ extension Api { }) } } - struct upload { - static func saveFilePart(fileId: Int64, filePart: Int32, bytes: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct upload { + public static func saveFilePart(fileId: Int64, filePart: Int32, bytes: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1291540959) serializeInt64(fileId, buffer: buffer, boxed: false) @@ -4365,7 +4581,7 @@ extension Api { }) } - static func getFile(location: Api.InputFileLocation, offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getFile(location: Api.InputFileLocation, offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-475607115) location.serialize(buffer, true) @@ -4381,7 +4597,7 @@ extension Api { }) } - static func saveBigFilePart(fileId: Int64, filePart: Int32, fileTotalParts: Int32, bytes: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveBigFilePart(fileId: Int64, filePart: Int32, fileTotalParts: Int32, bytes: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-562337987) serializeInt64(fileId, buffer: buffer, boxed: false) @@ -4398,7 +4614,7 @@ extension Api { }) } - static func getWebFile(location: Api.InputWebFileLocation, offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getWebFile(location: Api.InputWebFileLocation, offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(619086221) location.serialize(buffer, true) @@ -4414,7 +4630,7 @@ extension Api { }) } - static func getCdnFile(fileToken: Buffer, offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getCdnFile(fileToken: Buffer, offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(536919235) serializeBytes(fileToken, buffer: buffer, boxed: false) @@ -4430,7 +4646,7 @@ extension Api { }) } - static func reuploadCdnFile(fileToken: Buffer, requestToken: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.FileHash]>) { + public static func reuploadCdnFile(fileToken: Buffer, requestToken: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.FileHash]>) { let buffer = Buffer() buffer.appendInt32(-1691921240) serializeBytes(fileToken, buffer: buffer, boxed: false) @@ -4445,7 +4661,7 @@ extension Api { }) } - static func getCdnFileHashes(fileToken: Buffer, offset: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.FileHash]>) { + public static func getCdnFileHashes(fileToken: Buffer, offset: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.FileHash]>) { let buffer = Buffer() buffer.appendInt32(1302676017) serializeBytes(fileToken, buffer: buffer, boxed: false) @@ -4460,7 +4676,7 @@ extension Api { }) } - static func getFileHashes(location: Api.InputFileLocation, offset: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.FileHash]>) { + public static func getFileHashes(location: Api.InputFileLocation, offset: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.FileHash]>) { let buffer = Buffer() buffer.appendInt32(-956147407) location.serialize(buffer, true) @@ -4475,8 +4691,8 @@ extension Api { }) } } - struct account { - static func updateNotifySettings(peer: Api.InputNotifyPeer, settings: Api.InputPeerNotifySettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct account { + public static func updateNotifySettings(peer: Api.InputNotifyPeer, settings: Api.InputPeerNotifySettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2067899501) peer.serialize(buffer, true) @@ -4491,7 +4707,7 @@ extension Api { }) } - static func getNotifySettings(peer: Api.InputNotifyPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getNotifySettings(peer: Api.InputNotifyPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(313765169) peer.serialize(buffer, true) @@ -4505,7 +4721,7 @@ extension Api { }) } - static func resetNotifySettings() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetNotifySettings() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-612493497) @@ -4519,7 +4735,7 @@ extension Api { }) } - static func updateProfile(flags: Int32, firstName: String?, lastName: String?, about: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updateProfile(flags: Int32, firstName: String?, lastName: String?, about: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(2018596725) serializeInt32(flags, buffer: buffer, boxed: false) @@ -4536,7 +4752,7 @@ extension Api { }) } - static func updateStatus(offline: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updateStatus(offline: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1713919532) offline.serialize(buffer, true) @@ -4550,7 +4766,7 @@ extension Api { }) } - static func reportPeer(peer: Api.InputPeer, reason: Api.ReportReason) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func reportPeer(peer: Api.InputPeer, reason: Api.ReportReason) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1374118561) peer.serialize(buffer, true) @@ -4565,7 +4781,7 @@ extension Api { }) } - static func checkUsername(username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func checkUsername(username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(655677548) serializeString(username, buffer: buffer, boxed: false) @@ -4579,7 +4795,7 @@ extension Api { }) } - static func updateUsername(username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updateUsername(username: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1040964988) serializeString(username, buffer: buffer, boxed: false) @@ -4593,7 +4809,7 @@ extension Api { }) } - static func getPrivacy(key: Api.InputPrivacyKey) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPrivacy(key: Api.InputPrivacyKey) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-623130288) key.serialize(buffer, true) @@ -4607,7 +4823,7 @@ extension Api { }) } - static func setPrivacy(key: Api.InputPrivacyKey, rules: [Api.InputPrivacyRule]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setPrivacy(key: Api.InputPrivacyKey, rules: [Api.InputPrivacyRule]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-906486552) key.serialize(buffer, true) @@ -4626,7 +4842,7 @@ extension Api { }) } - static func deleteAccount(reason: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteAccount(reason: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1099779595) serializeString(reason, buffer: buffer, boxed: false) @@ -4640,7 +4856,7 @@ extension Api { }) } - static func getAccountTTL() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAccountTTL() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(150761757) @@ -4654,7 +4870,7 @@ extension Api { }) } - static func setAccountTTL(ttl: Api.AccountDaysTTL) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setAccountTTL(ttl: Api.AccountDaysTTL) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(608323678) ttl.serialize(buffer, true) @@ -4668,7 +4884,7 @@ extension Api { }) } - static func sendChangePhoneCode(flags: Int32, phoneNumber: String, currentNumber: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendChangePhoneCode(flags: Int32, phoneNumber: String, currentNumber: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(149257707) serializeInt32(flags, buffer: buffer, boxed: false) @@ -4684,7 +4900,7 @@ extension Api { }) } - static func changePhone(phoneNumber: String, phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func changePhone(phoneNumber: String, phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1891839707) serializeString(phoneNumber, buffer: buffer, boxed: false) @@ -4700,7 +4916,7 @@ extension Api { }) } - static func updateDeviceLocked(period: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updateDeviceLocked(period: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(954152242) serializeInt32(period, buffer: buffer, boxed: false) @@ -4714,7 +4930,7 @@ extension Api { }) } - static func getAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-484392616) @@ -4728,7 +4944,7 @@ extension Api { }) } - static func resetAuthorization(hash: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetAuthorization(hash: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-545786948) serializeInt64(hash, buffer: buffer, boxed: false) @@ -4742,7 +4958,7 @@ extension Api { }) } - static func getPassword() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPassword() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1418342645) @@ -4756,7 +4972,7 @@ extension Api { }) } - static func sendConfirmPhoneCode(flags: Int32, hash: String, currentNumber: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendConfirmPhoneCode(flags: Int32, hash: String, currentNumber: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(353818557) serializeInt32(flags, buffer: buffer, boxed: false) @@ -4772,7 +4988,7 @@ extension Api { }) } - static func confirmPhone(phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func confirmPhone(phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1596029123) serializeString(phoneCodeHash, buffer: buffer, boxed: false) @@ -4787,7 +5003,7 @@ extension Api { }) } - static func unregisterDevice(tokenType: Int32, token: String, otherUids: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func unregisterDevice(tokenType: Int32, token: String, otherUids: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(813089983) serializeInt32(tokenType, buffer: buffer, boxed: false) @@ -4807,7 +5023,7 @@ extension Api { }) } - static func getWebAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getWebAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(405695855) @@ -4821,7 +5037,7 @@ extension Api { }) } - static func resetWebAuthorization(hash: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetWebAuthorization(hash: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(755087855) serializeInt64(hash, buffer: buffer, boxed: false) @@ -4835,7 +5051,7 @@ extension Api { }) } - static func resetWebAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetWebAuthorizations() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1747789204) @@ -4849,7 +5065,7 @@ extension Api { }) } - static func registerDevice(tokenType: Int32, token: String, appSandbox: Api.Bool, secret: Buffer, otherUids: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func registerDevice(tokenType: Int32, token: String, appSandbox: Api.Bool, secret: Buffer, otherUids: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1555998096) serializeInt32(tokenType, buffer: buffer, boxed: false) @@ -4871,7 +5087,7 @@ extension Api { }) } - static func getAllSecureValues() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.SecureValue]>) { + public static func getAllSecureValues() -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.SecureValue]>) { let buffer = Buffer() buffer.appendInt32(-1299661699) @@ -4885,7 +5101,7 @@ extension Api { }) } - static func getSecureValue(types: [Api.SecureValueType]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.SecureValue]>) { + public static func getSecureValue(types: [Api.SecureValueType]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.SecureValue]>) { let buffer = Buffer() buffer.appendInt32(1936088002) buffer.appendInt32(481674261) @@ -4903,7 +5119,7 @@ extension Api { }) } - static func saveSecureValue(value: Api.InputSecureValue, secureSecretId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveSecureValue(value: Api.InputSecureValue, secureSecretId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1986010339) value.serialize(buffer, true) @@ -4918,7 +5134,7 @@ extension Api { }) } - static func deleteSecureValue(types: [Api.SecureValueType]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func deleteSecureValue(types: [Api.SecureValueType]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1199522741) buffer.appendInt32(481674261) @@ -4936,7 +5152,7 @@ extension Api { }) } - static func getAuthorizationForm(botId: Int32, scope: String, publicKey: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAuthorizationForm(botId: Int32, scope: String, publicKey: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1200903967) serializeInt32(botId, buffer: buffer, boxed: false) @@ -4952,7 +5168,7 @@ extension Api { }) } - static func acceptAuthorization(botId: Int32, scope: String, publicKey: String, valueHashes: [Api.SecureValueHash], credentials: Api.SecureCredentialsEncrypted) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func acceptAuthorization(botId: Int32, scope: String, publicKey: String, valueHashes: [Api.SecureValueHash], credentials: Api.SecureCredentialsEncrypted) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-419267436) serializeInt32(botId, buffer: buffer, boxed: false) @@ -4974,7 +5190,7 @@ extension Api { }) } - static func sendVerifyPhoneCode(flags: Int32, phoneNumber: String, currentNumber: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendVerifyPhoneCode(flags: Int32, phoneNumber: String, currentNumber: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-2110553932) serializeInt32(flags, buffer: buffer, boxed: false) @@ -4990,7 +5206,7 @@ extension Api { }) } - static func verifyPhone(phoneNumber: String, phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func verifyPhone(phoneNumber: String, phoneCodeHash: String, phoneCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1305716726) serializeString(phoneNumber, buffer: buffer, boxed: false) @@ -5006,7 +5222,7 @@ extension Api { }) } - static func sendVerifyEmailCode(email: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func sendVerifyEmailCode(email: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1880182943) serializeString(email, buffer: buffer, boxed: false) @@ -5020,7 +5236,7 @@ extension Api { }) } - static func verifyEmail(email: String, code: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func verifyEmail(email: String, code: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-323339813) serializeString(email, buffer: buffer, boxed: false) @@ -5035,7 +5251,7 @@ extension Api { }) } - static func getTmpPassword(password: Api.InputCheckPasswordSRP, period: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getTmpPassword(password: Api.InputCheckPasswordSRP, period: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1151208273) password.serialize(buffer, true) @@ -5050,7 +5266,7 @@ extension Api { }) } - static func updatePasswordSettings(password: Api.InputCheckPasswordSRP, newSettings: Api.account.PasswordInputSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updatePasswordSettings(password: Api.InputCheckPasswordSRP, newSettings: Api.account.PasswordInputSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1516564433) password.serialize(buffer, true) @@ -5065,7 +5281,7 @@ extension Api { }) } - static func getPasswordSettings(password: Api.InputCheckPasswordSRP) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getPasswordSettings(password: Api.InputCheckPasswordSRP) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1663767815) password.serialize(buffer, true) @@ -5079,7 +5295,7 @@ extension Api { }) } - static func confirmPasswordEmail(code: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func confirmPasswordEmail(code: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1881204448) serializeString(code, buffer: buffer, boxed: false) @@ -5093,7 +5309,7 @@ extension Api { }) } - static func resendPasswordEmail() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resendPasswordEmail() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(2055154197) @@ -5107,7 +5323,7 @@ extension Api { }) } - static func cancelPasswordEmail() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func cancelPasswordEmail() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1043606090) @@ -5121,7 +5337,7 @@ extension Api { }) } - static func getContactSignUpNotification() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getContactSignUpNotification() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1626880216) @@ -5135,7 +5351,7 @@ extension Api { }) } - static func setContactSignUpNotification(silent: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setContactSignUpNotification(silent: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-806076575) silent.serialize(buffer, true) @@ -5149,7 +5365,7 @@ extension Api { }) } - static func getNotifyExceptions(flags: Int32, peer: Api.InputNotifyPeer?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getNotifyExceptions(flags: Int32, peer: Api.InputNotifyPeer?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1398240377) serializeInt32(flags, buffer: buffer, boxed: false) @@ -5164,7 +5380,7 @@ extension Api { }) } - static func getWallPapers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getWallPapers(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1430579357) serializeInt32(hash, buffer: buffer, boxed: false) @@ -5178,7 +5394,7 @@ extension Api { }) } - static func uploadWallPaper(file: Api.InputFile, mimeType: String, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func uploadWallPaper(file: Api.InputFile, mimeType: String, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-578472351) file.serialize(buffer, true) @@ -5194,7 +5410,7 @@ extension Api { }) } - static func getWallPaper(wallpaper: Api.InputWallPaper) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getWallPaper(wallpaper: Api.InputWallPaper) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-57811990) wallpaper.serialize(buffer, true) @@ -5208,7 +5424,7 @@ extension Api { }) } - static func saveWallPaper(wallpaper: Api.InputWallPaper, unsave: Api.Bool, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveWallPaper(wallpaper: Api.InputWallPaper, unsave: Api.Bool, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1817860919) wallpaper.serialize(buffer, true) @@ -5224,7 +5440,7 @@ extension Api { }) } - static func installWallPaper(wallpaper: Api.InputWallPaper, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func installWallPaper(wallpaper: Api.InputWallPaper, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-18000023) wallpaper.serialize(buffer, true) @@ -5239,7 +5455,7 @@ extension Api { }) } - static func resetWallPapers() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func resetWallPapers() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1153722364) @@ -5253,7 +5469,7 @@ extension Api { }) } - static func getAutoDownloadSettings() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getAutoDownloadSettings() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1457130303) @@ -5267,7 +5483,7 @@ extension Api { }) } - static func saveAutoDownloadSettings(flags: Int32, settings: Api.AutoDownloadSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveAutoDownloadSettings(flags: Int32, settings: Api.AutoDownloadSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1995661875) serializeInt32(flags, buffer: buffer, boxed: false) @@ -5282,8 +5498,8 @@ extension Api { }) } } - struct langpack { - static func getLangPack(langPack: String, langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct langpack { + public static func getLangPack(langPack: String, langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-219008246) serializeString(langPack, buffer: buffer, boxed: false) @@ -5298,7 +5514,7 @@ extension Api { }) } - static func getStrings(langPack: String, langCode: String, keys: [String]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.LangPackString]>) { + public static func getStrings(langPack: String, langCode: String, keys: [String]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.LangPackString]>) { let buffer = Buffer() buffer.appendInt32(-269862909) serializeString(langPack, buffer: buffer, boxed: false) @@ -5318,7 +5534,7 @@ extension Api { }) } - static func getLanguages(langPack: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.LangPackLanguage]>) { + public static func getLanguages(langPack: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.LangPackLanguage]>) { let buffer = Buffer() buffer.appendInt32(1120311183) serializeString(langPack, buffer: buffer, boxed: false) @@ -5332,7 +5548,7 @@ extension Api { }) } - static func getDifference(langCode: String, fromVersion: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getDifference(langCode: String, fromVersion: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1655576556) serializeString(langCode, buffer: buffer, boxed: false) @@ -5347,7 +5563,7 @@ extension Api { }) } - static func getLanguage(langPack: String, langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getLanguage(langPack: String, langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1784243458) serializeString(langPack, buffer: buffer, boxed: false) @@ -5362,8 +5578,8 @@ extension Api { }) } } - struct photos { - static func updateProfilePhoto(id: Api.InputPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct photos { + public static func updateProfilePhoto(id: Api.InputPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-256159406) id.serialize(buffer, true) @@ -5377,7 +5593,7 @@ extension Api { }) } - static func uploadProfilePhoto(file: Api.InputFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func uploadProfilePhoto(file: Api.InputFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1328726168) file.serialize(buffer, true) @@ -5391,7 +5607,7 @@ extension Api { }) } - static func deletePhotos(id: [Api.InputPhoto]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int64]>) { + public static func deletePhotos(id: [Api.InputPhoto]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int64]>) { let buffer = Buffer() buffer.appendInt32(-2016444625) buffer.appendInt32(481674261) @@ -5409,7 +5625,7 @@ extension Api { }) } - static func getUserPhotos(userId: Api.InputUser, offset: Int32, maxId: Int64, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getUserPhotos(userId: Api.InputUser, offset: Int32, maxId: Int64, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1848823128) userId.serialize(buffer, true) @@ -5426,8 +5642,8 @@ extension Api { }) } } - struct phone { - static func getCallConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public struct phone { + public static func getCallConfig() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1430593449) @@ -5441,7 +5657,7 @@ extension Api { }) } - static func acceptCall(peer: Api.InputPhoneCall, gB: Buffer, `protocol`: Api.PhoneCallProtocol) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func acceptCall(peer: Api.InputPhoneCall, gB: Buffer, `protocol`: Api.PhoneCallProtocol) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1003664544) peer.serialize(buffer, true) @@ -5457,7 +5673,7 @@ extension Api { }) } - static func confirmCall(peer: Api.InputPhoneCall, gA: Buffer, keyFingerprint: Int64, `protocol`: Api.PhoneCallProtocol) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func confirmCall(peer: Api.InputPhoneCall, gA: Buffer, keyFingerprint: Int64, `protocol`: Api.PhoneCallProtocol) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(788404002) peer.serialize(buffer, true) @@ -5474,7 +5690,7 @@ extension Api { }) } - static func receivedCall(peer: Api.InputPhoneCall) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func receivedCall(peer: Api.InputPhoneCall) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(399855457) peer.serialize(buffer, true) @@ -5488,7 +5704,7 @@ extension Api { }) } - static func saveCallDebug(peer: Api.InputPhoneCall, debug: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func saveCallDebug(peer: Api.InputPhoneCall, debug: Api.DataJSON) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(662363518) peer.serialize(buffer, true) @@ -5503,7 +5719,7 @@ extension Api { }) } - static func setCallRating(flags: Int32, peer: Api.InputPhoneCall, rating: Int32, comment: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setCallRating(flags: Int32, peer: Api.InputPhoneCall, rating: Int32, comment: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1508562471) serializeInt32(flags, buffer: buffer, boxed: false) @@ -5520,7 +5736,7 @@ extension Api { }) } - static func requestCall(flags: Int32, userId: Api.InputUser, randomId: Int32, gAHash: Buffer, `protocol`: Api.PhoneCallProtocol) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func requestCall(flags: Int32, userId: Api.InputUser, randomId: Int32, gAHash: Buffer, `protocol`: Api.PhoneCallProtocol) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1124046573) serializeInt32(flags, buffer: buffer, boxed: false) @@ -5538,7 +5754,7 @@ extension Api { }) } - static func discardCall(flags: Int32, peer: Api.InputPhoneCall, duration: Int32, reason: Api.PhoneCallDiscardReason, connectionId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func discardCall(flags: Int32, peer: Api.InputPhoneCall, duration: Int32, reason: Api.PhoneCallDiscardReason, connectionId: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1295269440) serializeInt32(flags, buffer: buffer, boxed: false) diff --git a/submodules/TelegramApi/Sources/Api4.swift b/submodules/TelegramApi/Sources/Api4.swift new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submodules/TelegramCore/TelegramCore/Buffer.swift b/submodules/TelegramApi/Sources/Buffer.swift similarity index 97% rename from submodules/TelegramCore/TelegramCore/Buffer.swift rename to submodules/TelegramApi/Sources/Buffer.swift index 6c0b384819..2c099b124c 100644 --- a/submodules/TelegramCore/TelegramCore/Buffer.swift +++ b/submodules/TelegramApi/Sources/Buffer.swift @@ -42,7 +42,7 @@ func serializeString(_ value: String, buffer: Buffer, boxed: Bool) { serializeBytes(stringBuffer, buffer: buffer, boxed: boxed) } -func serializeBytes(_ value: Buffer, buffer: Buffer, boxed: Bool) { +public func serializeBytes(_ value: Buffer, buffer: Buffer, boxed: Bool) { if boxed { buffer.appendInt32(-1255641564) } @@ -130,7 +130,7 @@ private func roundUp(_ numToRound: Int, multiple: Int) -> Int return numToRound + multiple - remainder } -func parseBytes(_ reader: BufferReader) -> Buffer? { +public func parseBytes(_ reader: BufferReader) -> Buffer? { if let tmp = reader.readBytesAsInt32(1) { var paddingBytes: Int = 0 var length: Int = 0 @@ -163,8 +163,8 @@ func parseString(_ reader: BufferReader) -> String? { } public class Buffer: CustomStringConvertible { - var data: UnsafeMutableRawPointer? - var _size: UInt = 0 + public var data: UnsafeMutableRawPointer? + public var _size: UInt = 0 private var capacity: UInt = 0 private let freeWhenDone: Bool @@ -202,8 +202,6 @@ public class Buffer: CustomStringConvertible { } } - - public func makeData() -> Data { return self.withUnsafeMutablePointer { pointer, size -> Data in if let pointer = pointer { diff --git a/submodules/TelegramCore/TelegramCore/DeserializeFunctionResponse.swift b/submodules/TelegramApi/Sources/DeserializeFunctionResponse.swift similarity index 81% rename from submodules/TelegramCore/TelegramCore/DeserializeFunctionResponse.swift rename to submodules/TelegramApi/Sources/DeserializeFunctionResponse.swift index deec67021c..e4831be62f 100644 --- a/submodules/TelegramCore/TelegramCore/DeserializeFunctionResponse.swift +++ b/submodules/TelegramApi/Sources/DeserializeFunctionResponse.swift @@ -1,8 +1,8 @@ import Foundation public final class FunctionDescription { - let name: String - let parameters: [(String, Any)] + public let name: String + public let parameters: [(String, Any)] init(name: String, parameters: [(String, Any)]) { self.name = name @@ -22,6 +22,6 @@ public final class DeserializeFunctionResponse { } } -protocol TypeConstructorDescription { +public protocol TypeConstructorDescription { func descriptionFields() -> (String, [(String, Any)]) } diff --git a/submodules/TelegramCore/TelegramCore/SecretApiLayer46.swift b/submodules/TelegramApi/Sources/SecretApiLayer46.swift similarity index 99% rename from submodules/TelegramCore/TelegramCore/SecretApiLayer46.swift rename to submodules/TelegramApi/Sources/SecretApiLayer46.swift index f9d68ce39c..2b0bca2502 100644 --- a/submodules/TelegramCore/TelegramCore/SecretApiLayer46.swift +++ b/submodules/TelegramApi/Sources/SecretApiLayer46.swift @@ -1,5 +1,4 @@ - fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { var dict: [Int32 : (BufferReader) -> Any?] = [:] dict[-1471112230] = { return $0.readInt32() } @@ -72,7 +71,7 @@ public struct SecretApi46 { 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 } } diff --git a/submodules/TelegramCore/TelegramCore/SecretApiLayer73.swift b/submodules/TelegramApi/Sources/SecretApiLayer73.swift similarity index 99% rename from submodules/TelegramCore/TelegramCore/SecretApiLayer73.swift rename to submodules/TelegramApi/Sources/SecretApiLayer73.swift index 07a80ed2b5..9aec5f6b73 100644 --- a/submodules/TelegramCore/TelegramCore/SecretApiLayer73.swift +++ b/submodules/TelegramApi/Sources/SecretApiLayer73.swift @@ -71,7 +71,7 @@ public struct SecretApi73 { 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 } } diff --git a/submodules/TelegramCore/TelegramCore/SecretApiLayer8.swift b/submodules/TelegramApi/Sources/SecretApiLayer8.swift similarity index 99% rename from submodules/TelegramCore/TelegramCore/SecretApiLayer8.swift rename to submodules/TelegramApi/Sources/SecretApiLayer8.swift index a3ef3bf64c..9d070f35df 100644 --- a/submodules/TelegramCore/TelegramCore/SecretApiLayer8.swift +++ b/submodules/TelegramApi/Sources/SecretApiLayer8.swift @@ -1,5 +1,4 @@ - fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { var dict: [Int32 : (BufferReader) -> Any?] = [:] dict[-1471112230] = { return $0.readInt32() } @@ -38,7 +37,7 @@ public struct SecretApi8 { 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 } } diff --git a/submodules/TelegramApi/Sources/TelegramApi.h b/submodules/TelegramApi/Sources/TelegramApi.h new file mode 100644 index 0000000000..55341d3319 --- /dev/null +++ b/submodules/TelegramApi/Sources/TelegramApi.h @@ -0,0 +1,19 @@ +// +// TelegramApi.h +// TelegramApi +// +// Created by Peter on 6/16/19. +// Copyright © 2019 Telegram LLP. All rights reserved. +// + +#import + +//! Project version number for TelegramApi. +FOUNDATION_EXPORT double TelegramApiVersionNumber; + +//! Project version string for TelegramApi. +FOUNDATION_EXPORT const unsigned char TelegramApiVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/TelegramApi/Sources/TelegramApiLogger.swift b/submodules/TelegramApi/Sources/TelegramApiLogger.swift new file mode 100644 index 0000000000..c023e2eea2 --- /dev/null +++ b/submodules/TelegramApi/Sources/TelegramApiLogger.swift @@ -0,0 +1,11 @@ +import Foundation + +private var telegramApiLogger: (String) -> Void = { _ in } + +public func setTelegramApiLogger(_ f: @escaping (String) -> Void) { + telegramApiLogger = f +} + +func telegramApiLog(_ what: @autoclosure () -> String) { + telegramApiLogger(what()) +} diff --git a/submodules/TelegramApi/TelegramApi copy-Info.plist b/submodules/TelegramApi/TelegramApi copy-Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramApi/TelegramApi copy-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/TelegramApi/TelegramApi copy2-Info.plist b/submodules/TelegramApi/TelegramApi copy2-Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramApi/TelegramApi copy2-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/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..1f399c776d --- /dev/null +++ b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,1041 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D035732422B5C1FC00F0920D /* TelegramApi.h in Headers */ = {isa = PBXBuildFile; fileRef = D035732222B5C1FC00F0920D /* TelegramApi.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D035733422B5C29900F0920D /* Api0.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733022B5C29900F0920D /* Api0.swift */; }; + D035733522B5C29900F0920D /* Api2.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733122B5C29900F0920D /* Api2.swift */; }; + D035733622B5C29900F0920D /* Api1.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733222B5C29900F0920D /* Api1.swift */; }; + D035733722B5C29900F0920D /* Api3.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733322B5C29900F0920D /* Api3.swift */; }; + D035733922B5C2E200F0920D /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733822B5C2E200F0920D /* Buffer.swift */; }; + D035733B22B5C31400F0920D /* TelegramApiLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733A22B5C31400F0920D /* TelegramApiLogger.swift */; }; + D035733D22B5C39100F0920D /* DeserializeFunctionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733C22B5C39100F0920D /* DeserializeFunctionResponse.swift */; }; + D035734722B5C9BF00F0920D /* SecretApiLayer46.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734422B5C9BF00F0920D /* SecretApiLayer46.swift */; }; + D035734822B5C9BF00F0920D /* SecretApiLayer8.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734522B5C9BF00F0920D /* SecretApiLayer8.swift */; }; + D035734922B5C9BF00F0920D /* SecretApiLayer73.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734622B5C9BF00F0920D /* SecretApiLayer73.swift */; }; + D0CC4AC422BA46F30088F36D /* TelegramApi.h in Headers */ = {isa = PBXBuildFile; fileRef = D035732222B5C1FC00F0920D /* TelegramApi.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0CC4AC622BA46F30088F36D /* SecretApiLayer46.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734422B5C9BF00F0920D /* SecretApiLayer46.swift */; }; + D0CC4AC722BA46F30088F36D /* Api1.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733222B5C29900F0920D /* Api1.swift */; }; + D0CC4AC822BA46F30088F36D /* Api0.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733022B5C29900F0920D /* Api0.swift */; }; + D0CC4AC922BA46F30088F36D /* Api3.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733322B5C29900F0920D /* Api3.swift */; }; + D0CC4ACA22BA46F30088F36D /* SecretApiLayer73.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734622B5C9BF00F0920D /* SecretApiLayer73.swift */; }; + D0CC4ACB22BA46F30088F36D /* TelegramApiLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733A22B5C31400F0920D /* TelegramApiLogger.swift */; }; + D0CC4ACC22BA46F30088F36D /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733822B5C2E200F0920D /* Buffer.swift */; }; + D0CC4ACD22BA46F30088F36D /* DeserializeFunctionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733C22B5C39100F0920D /* DeserializeFunctionResponse.swift */; }; + D0CC4ACE22BA46F30088F36D /* SecretApiLayer8.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734522B5C9BF00F0920D /* SecretApiLayer8.swift */; }; + D0CC4ACF22BA46F30088F36D /* Api2.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733122B5C29900F0920D /* Api2.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D035731F22B5C1FC00F0920D /* TelegramApi.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramApi.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D035732222B5C1FC00F0920D /* TelegramApi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramApi.h; sourceTree = ""; }; + D035732322B5C1FC00F0920D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D035733022B5C29900F0920D /* Api0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api0.swift; sourceTree = ""; }; + D035733122B5C29900F0920D /* Api2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api2.swift; sourceTree = ""; }; + D035733222B5C29900F0920D /* Api1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api1.swift; sourceTree = ""; }; + D035733322B5C29900F0920D /* Api3.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api3.swift; sourceTree = ""; }; + D035733822B5C2E200F0920D /* Buffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Buffer.swift; sourceTree = ""; }; + D035733A22B5C31400F0920D /* TelegramApiLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TelegramApiLogger.swift; sourceTree = ""; }; + D035733C22B5C39100F0920D /* DeserializeFunctionResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeserializeFunctionResponse.swift; sourceTree = ""; }; + D035734422B5C9BF00F0920D /* SecretApiLayer46.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer46.swift; sourceTree = ""; }; + D035734522B5C9BF00F0920D /* SecretApiLayer8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer8.swift; sourceTree = ""; }; + D035734622B5C9BF00F0920D /* SecretApiLayer73.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer73.swift; sourceTree = ""; }; + D0CC4AC122BA468D0088F36D /* TelegramApi copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "TelegramApi copy-Info.plist"; path = "/Users/keepcoder/Dropbox/Telegram-multi-acc/submodules/telegram-ios/submodules/TelegramApi/TelegramApi copy-Info.plist"; sourceTree = ""; }; + D0CC4AD922BA46F30088F36D /* TelegramApiMac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramApiMac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0CC4ADA22BA46F40088F36D /* TelegramApi copy2-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "TelegramApi copy2-Info.plist"; path = "/Users/keepcoder/Dropbox/Telegram-multi-acc/submodules/telegram-ios/submodules/TelegramApi/TelegramApi copy2-Info.plist"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D035731C22B5C1FC00F0920D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D0CC4AD022BA46F30088F36D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D035731522B5C1FC00F0920D = { + isa = PBXGroup; + children = ( + D035732322B5C1FC00F0920D /* Info.plist */, + D035732122B5C1FC00F0920D /* Sources */, + D035732022B5C1FC00F0920D /* Products */, + D0CC4AC122BA468D0088F36D /* TelegramApi copy-Info.plist */, + D0CC4ADA22BA46F40088F36D /* TelegramApi copy2-Info.plist */, + ); + sourceTree = ""; + }; + D035732022B5C1FC00F0920D /* Products */ = { + isa = PBXGroup; + children = ( + D035731F22B5C1FC00F0920D /* TelegramApi.framework */, + D0CC4AD922BA46F30088F36D /* TelegramApiMac.framework */, + ); + name = Products; + sourceTree = ""; + }; + D035732122B5C1FC00F0920D /* Sources */ = { + isa = PBXGroup; + children = ( + D035734522B5C9BF00F0920D /* SecretApiLayer8.swift */, + D035734422B5C9BF00F0920D /* SecretApiLayer46.swift */, + D035734622B5C9BF00F0920D /* SecretApiLayer73.swift */, + D035733C22B5C39100F0920D /* DeserializeFunctionResponse.swift */, + D035733A22B5C31400F0920D /* TelegramApiLogger.swift */, + D035733822B5C2E200F0920D /* Buffer.swift */, + D035733022B5C29900F0920D /* Api0.swift */, + D035733222B5C29900F0920D /* Api1.swift */, + D035733122B5C29900F0920D /* Api2.swift */, + D035733322B5C29900F0920D /* Api3.swift */, + D035732222B5C1FC00F0920D /* TelegramApi.h */, + ); + path = Sources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D035731A22B5C1FC00F0920D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D035732422B5C1FC00F0920D /* TelegramApi.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D0CC4AC322BA46F30088F36D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0CC4AC422BA46F30088F36D /* TelegramApi.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D035731E22B5C1FC00F0920D /* TelegramApi */ = { + isa = PBXNativeTarget; + buildConfigurationList = D035732722B5C1FC00F0920D /* Build configuration list for PBXNativeTarget "TelegramApi" */; + buildPhases = ( + D035731A22B5C1FC00F0920D /* Headers */, + D035731B22B5C1FC00F0920D /* Sources */, + D035731C22B5C1FC00F0920D /* Frameworks */, + D035731D22B5C1FC00F0920D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelegramApi; + productName = TelegramApi; + productReference = D035731F22B5C1FC00F0920D /* TelegramApi.framework */; + productType = "com.apple.product-type.framework"; + }; + D0CC4AC222BA46F30088F36D /* TelegramApiMac */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0CC4AD222BA46F30088F36D /* Build configuration list for PBXNativeTarget "TelegramApiMac" */; + buildPhases = ( + D0CC4AC322BA46F30088F36D /* Headers */, + D0CC4AC522BA46F30088F36D /* Sources */, + D0CC4AD022BA46F30088F36D /* Frameworks */, + D0CC4AD122BA46F30088F36D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelegramApiMac; + productName = TelegramApi; + productReference = D0CC4AD922BA46F30088F36D /* TelegramApiMac.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D035731622B5C1FC00F0920D /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D035731E22B5C1FC00F0920D = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D035731922B5C1FC00F0920D /* Build configuration list for PBXProject "TelegramApi_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D035731522B5C1FC00F0920D; + productRefGroup = D035732022B5C1FC00F0920D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D035731E22B5C1FC00F0920D /* TelegramApi */, + D0CC4AC222BA46F30088F36D /* TelegramApiMac */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D035731D22B5C1FC00F0920D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D0CC4AD122BA46F30088F36D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D035731B22B5C1FC00F0920D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D035734722B5C9BF00F0920D /* SecretApiLayer46.swift in Sources */, + D035733622B5C29900F0920D /* Api1.swift in Sources */, + D035733422B5C29900F0920D /* Api0.swift in Sources */, + D035733722B5C29900F0920D /* Api3.swift in Sources */, + D035734922B5C9BF00F0920D /* SecretApiLayer73.swift in Sources */, + D035733B22B5C31400F0920D /* TelegramApiLogger.swift in Sources */, + D035733922B5C2E200F0920D /* Buffer.swift in Sources */, + D035733D22B5C39100F0920D /* DeserializeFunctionResponse.swift in Sources */, + D035734822B5C9BF00F0920D /* SecretApiLayer8.swift in Sources */, + D035733522B5C29900F0920D /* Api2.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D0CC4AC522BA46F30088F36D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0CC4AC622BA46F30088F36D /* SecretApiLayer46.swift in Sources */, + D0CC4AC722BA46F30088F36D /* Api1.swift in Sources */, + D0CC4AC822BA46F30088F36D /* Api0.swift in Sources */, + D0CC4AC922BA46F30088F36D /* Api3.swift in Sources */, + D0CC4ACA22BA46F30088F36D /* SecretApiLayer73.swift in Sources */, + D0CC4ACB22BA46F30088F36D /* TelegramApiLogger.swift in Sources */, + D0CC4ACC22BA46F30088F36D /* Buffer.swift in Sources */, + D0CC4ACD22BA46F30088F36D /* DeserializeFunctionResponse.swift in Sources */, + D0CC4ACE22BA46F30088F36D /* SecretApiLayer8.swift in Sources */, + D0CC4ACF22BA46F30088F36D /* Api2.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D035732522B5C1FC00F0920D /* 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; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugHockeyapp; + }; + D035732622B5C1FC00F0920D /* 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; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyappInternal; + }; + D035732822B5C1FC00F0920D /* 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.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D035732922B5C1FC00F0920D /* 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.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D035732A22B5C23200F0920D /* 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; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStoreLLC; + }; + D035732B22B5C23200F0920D /* 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.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D035732C22B5C24100F0920D /* 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; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStoreLLC; + }; + D035732D22B5C24100F0920D /* 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.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D0CC4AA522BA44AD0088F36D /* 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; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStore; + }; + D0CC4AA622BA44AD0088F36D /* DebugAppStore */ = { + 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.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0CC4AA722BA44B70088F36D /* HockeyappMacAlpha */ = { + 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; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappMacAlpha; + }; + D0CC4AA822BA44B70088F36D /* HockeyappMacAlpha */ = { + 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.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappMacAlpha; + }; + D0CC4AD322BA46F30088F36D /* 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 = "TelegramApi copy2-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0CC4AD422BA46F30088F36D /* HockeyappMacAlpha */ = { + 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 = "TelegramApi copy2-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = HockeyappMacAlpha; + }; + D0CC4AD522BA46F30088F36D /* DebugAppStore */ = { + 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 = "TelegramApi copy2-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStore; + }; + D0CC4AD622BA46F30088F36D /* 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 = "TelegramApi copy2-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0CC4AD722BA46F30088F36D /* 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 = "TelegramApi copy2-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0CC4AD822BA46F30088F36D /* 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 = "TelegramApi copy2-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D035731922B5C1FC00F0920D /* Build configuration list for PBXProject "TelegramApi_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D035732522B5C1FC00F0920D /* DebugHockeyapp */, + D0CC4AA722BA44B70088F36D /* HockeyappMacAlpha */, + D0CC4AA522BA44AD0088F36D /* DebugAppStore */, + D035732A22B5C23200F0920D /* DebugAppStoreLLC */, + D035732622B5C1FC00F0920D /* ReleaseHockeyappInternal */, + D035732C22B5C24100F0920D /* ReleaseAppStoreLLC */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseHockeyappInternal; + }; + D035732722B5C1FC00F0920D /* Build configuration list for PBXNativeTarget "TelegramApi" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D035732822B5C1FC00F0920D /* DebugHockeyapp */, + D0CC4AA822BA44B70088F36D /* HockeyappMacAlpha */, + D0CC4AA622BA44AD0088F36D /* DebugAppStore */, + D035732B22B5C23200F0920D /* DebugAppStoreLLC */, + D035732922B5C1FC00F0920D /* ReleaseHockeyappInternal */, + D035732D22B5C24100F0920D /* ReleaseAppStoreLLC */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseHockeyappInternal; + }; + D0CC4AD222BA46F30088F36D /* Build configuration list for PBXNativeTarget "TelegramApiMac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0CC4AD322BA46F30088F36D /* DebugHockeyapp */, + D0CC4AD422BA46F30088F36D /* HockeyappMacAlpha */, + D0CC4AD522BA46F30088F36D /* DebugAppStore */, + D0CC4AD622BA46F30088F36D /* DebugAppStoreLLC */, + D0CC4AD722BA46F30088F36D /* ReleaseHockeyappInternal */, + D0CC4AD822BA46F30088F36D /* ReleaseAppStoreLLC */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseHockeyappInternal; + }; +/* End XCConfigurationList section */ + }; + rootObject = D035731622B5C1FC00F0920D /* Project object */; +} diff --git a/submodules/TelegramAudio/Info.plist b/submodules/TelegramAudio/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramAudio/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/TelegramUI/TelegramUI/ManagedAudioSession.swift b/submodules/TelegramAudio/Sources/ManagedAudioSession.swift similarity index 91% rename from submodules/TelegramUI/TelegramUI/ManagedAudioSession.swift rename to submodules/TelegramAudio/Sources/ManagedAudioSession.swift index 322333b6e1..88b7ce10ae 100644 --- a/submodules/TelegramUI/TelegramUI/ManagedAudioSession.swift +++ b/submodules/TelegramAudio/Sources/ManagedAudioSession.swift @@ -3,7 +3,7 @@ import SwiftSignalKit import AVFoundation import UIKit -enum ManagedAudioSessionType: Equatable { +public enum ManagedAudioSessionType: Equatable { case play case playWithPossiblePortOverride case record(speaker: Bool) @@ -19,17 +19,17 @@ enum ManagedAudioSessionType: Equatable { } } -private func nativeCategoryForType(_ type: ManagedAudioSessionType, headphones: Bool) -> String { +private func nativeCategoryForType(_ type: ManagedAudioSessionType, headphones: Bool) -> AVAudioSession.Category { switch type { case .play: - return AVAudioSessionCategoryPlayback + return .playback case .record, .voiceCall: - return AVAudioSessionCategoryPlayAndRecord + return .playAndRecord case .playWithPossiblePortOverride: if headphones { - return AVAudioSessionCategoryPlayback + return .playback } else { - return AVAudioSessionCategoryPlayAndRecord + return .playAndRecord } } } @@ -52,7 +52,7 @@ public enum AudioSessionOutput: Equatable { case port(AudioSessionPort) } -private let bluetoothPortTypes = Set([AVAudioSessionPortBluetoothA2DP, AVAudioSessionPortBluetoothLE, AVAudioSessionPortBluetoothHFP]) +private let bluetoothPortTypes = Set([.bluetoothA2DP, .bluetoothLE, .bluetoothHFP]) private extension AudioSessionOutput { init(description: AVAudioSessionPortDescription) { @@ -174,20 +174,20 @@ public final class ManagedAudioSession { private let isActiveSubscribers = Bag<(Bool) -> Void>() private let isPlaybackActiveSubscribers = Bag<(Bool) -> Void>() - init() { + public init() { self.hasLoudspeaker = UIDevice.current.model == "iPhone" let queue = self.queue - NotificationCenter.default.addObserver(forName: .AVAudioSessionRouteChange, object: AVAudioSession.sharedInstance(), queue: nil, using: { [weak self] _ in + NotificationCenter.default.addObserver(forName: AVAudioSession.routeChangeNotification, object: AVAudioSession.sharedInstance(), queue: nil, using: { [weak self] _ in queue.async { self?.updateCurrentAudioRouteInfo() } }) - NotificationCenter.default.addObserver(forName: .AVAudioSessionInterruption, object: AVAudioSession.sharedInstance(), queue: nil, using: { [weak self] notification in + NotificationCenter.default.addObserver(forName: AVAudioSession.interruptionNotification, object: AVAudioSession.sharedInstance(), queue: nil, using: { [weak self] notification in guard let info = notification.userInfo, let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt, - let type = AVAudioSessionInterruptionType(rawValue: typeValue) else { + let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return } @@ -245,11 +245,11 @@ public final class ManagedAudioSession { } } - if input.portType == AVAudioSessionPortBuiltInMic { + if input.portType == .builtInMic { if isActive { activeOutput = .builtin inner: for currentOutput in audioSession.currentRoute.outputs { - if currentOutput.portType == AVAudioSessionPortBuiltInSpeaker { + if currentOutput.portType == .builtInSpeaker { activeOutput = .speaker break inner } @@ -257,7 +257,7 @@ public final class ManagedAudioSession { } continue } - if input.portType == AVAudioSessionPortHeadphones { + if input.portType == .headphones { if isActive { activeOutput = .headphones } @@ -293,7 +293,7 @@ public final class ManagedAudioSession { } } - func headsetConnected() -> Signal { + public func headsetConnected() -> Signal { let queue = self.queue return Signal { [weak self] subscriber in if let strongSelf = self { @@ -362,7 +362,7 @@ public final class ManagedAudioSession { } |> runOn(queue) } - func push(audioSessionType: ManagedAudioSessionType, outputMode: AudioSessionOutputMode = .system, once: Bool = false, activate: @escaping (AudioSessionActivationState) -> Void, deactivate: @escaping () -> Signal) -> Disposable { + public func push(audioSessionType: ManagedAudioSessionType, outputMode: AudioSessionOutputMode = .system, once: Bool = false, activate: @escaping (AudioSessionActivationState) -> Void, deactivate: @escaping () -> Signal) -> Disposable { return self.push(audioSessionType: audioSessionType, once: once, manualActivate: { control in control.setupAndActivate(synchronous: false, { state in activate(state) @@ -370,7 +370,7 @@ public final class ManagedAudioSession { }, deactivate: deactivate) } - func push(audioSessionType: ManagedAudioSessionType, outputMode: AudioSessionOutputMode = .system, once: Bool = false, manualActivate: @escaping (ManagedAudioSessionControl) -> Void, deactivate: @escaping () -> Signal, headsetConnectionStatusChanged: @escaping (Bool) -> Void = { _ in }, availableOutputsChanged: @escaping ([AudioSessionOutput], AudioSessionOutput?) -> Void = { _, _ in }) -> Disposable { + public func push(audioSessionType: ManagedAudioSessionType, outputMode: AudioSessionOutputMode = .system, once: Bool = false, manualActivate: @escaping (ManagedAudioSessionControl) -> Void, deactivate: @escaping () -> Signal, headsetConnectionStatusChanged: @escaping (Bool) -> Void = { _ in }, availableOutputsChanged: @escaping ([AudioSessionOutput], AudioSessionOutput?) -> Void = { _, _ in }) -> Disposable { let id = OSAtomicIncrement32(&self.nextId) let queue = self.queue queue.async { @@ -459,7 +459,7 @@ public final class ManagedAudioSession { } } - func dropAll() { + public func dropAll() { self.queue.async { self.updateHolders(interruption: true) } @@ -582,7 +582,7 @@ public final class ManagedAudioSession { let route = AVAudioSession.sharedInstance().currentRoute //print("\(route)") for desc in route.outputs { - if desc.portType == AVAudioSessionPortHeadphones || desc.portType == AVAudioSessionPortBluetoothA2DP || desc.portType == AVAudioSessionPortBluetoothHFP { + if desc.portType == .headphones || desc.portType == .bluetoothA2DP || desc.portType == .bluetoothHFP { return true } } @@ -600,7 +600,7 @@ public final class ManagedAudioSession { print("ManagedAudioSession setting active false") do { - try AVAudioSession.sharedInstance().setActive(false, with: [.notifyOthersOnDeactivation]) + try AVAudioSession.sharedInstance().setActive(false, options: [.notifyOthersOnDeactivation]) try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none) try AVAudioSession.sharedInstance().setPreferredInput(nil) } catch let error { @@ -631,7 +631,7 @@ public final class ManagedAudioSession { do { print("ManagedAudioSession setting category for \(type)") - var options: AVAudioSessionCategoryOptions = [] + var options: AVAudioSession.CategoryOptions = [] switch type { case .play: break @@ -646,10 +646,10 @@ public final class ManagedAudioSession { } print("ManagedAudioSession setting active true") if #available(iOSApplicationExtension 11.0, iOS 11.0, *) { - try AVAudioSession.sharedInstance().setCategory(nativeCategoryForType(type, headphones: self.isHeadsetPluggedInValue), mode: type == .voiceCall ? AVAudioSessionModeVoiceChat : AVAudioSessionModeDefault, routeSharingPolicy: .default, options: options) + try AVAudioSession.sharedInstance().setCategory(nativeCategoryForType(type, headphones: self.isHeadsetPluggedInValue), mode: type == .voiceCall ? .voiceChat : .default, policy: .default, options: options) } else { - try AVAudioSession.sharedInstance().setCategory(nativeCategoryForType(type, headphones: self.isHeadsetPluggedInValue), with: options) - try AVAudioSession.sharedInstance().setMode(type == .voiceCall ? AVAudioSessionModeVoiceChat : AVAudioSessionModeDefault) + AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: nativeCategoryForType(type, headphones: self.isHeadsetPluggedInValue)) + try AVAudioSession.sharedInstance().setMode(type == .voiceCall ? .voiceChat : .default) } } catch let error { print("ManagedAudioSession setup error \(error)") @@ -686,7 +686,7 @@ public final class ManagedAudioSession { if type == .voiceCall { if let routes = AVAudioSession.sharedInstance().availableInputs { for route in routes { - if route.portType == AVAudioSessionPortBuiltInMic { + if route.portType == .builtInMic { let _ = try? AVAudioSession.sharedInstance().setPreferredInput(route) break } @@ -722,7 +722,7 @@ public final class ManagedAudioSession { try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none) if let routes = AVAudioSession.sharedInstance().availableInputs { for route in routes { - if route.portType == AVAudioSessionPortBuiltInMic { + if route.portType == .builtInMic { if case .record = type, self.isHeadsetPluggedInValue { } else { let _ = try? AVAudioSession.sharedInstance().setPreferredInput(route) @@ -740,7 +740,7 @@ public final class ManagedAudioSession { private func activate() { if let (type, outputMode) = self.currentTypeAndOutputMode { do { - try AVAudioSession.sharedInstance().setActive(true, with: [.notifyOthersOnDeactivation]) + try AVAudioSession.sharedInstance().setActive(true, options: [.notifyOthersOnDeactivation]) self.updateCurrentAudioRouteInfo() @@ -766,7 +766,7 @@ public final class ManagedAudioSession { } } - func callKitActivatedAudioSession() { + public func callKitActivatedAudioSession() { /*self.queue.async { print("ManagedAudioSession callKitDeactivatedAudioSession") self.callKitAudioSessionIsActive = true @@ -774,7 +774,7 @@ public final class ManagedAudioSession { }*/ } - func callKitDeactivatedAudioSession() { + public func callKitDeactivatedAudioSession() { /*self.queue.async { print("ManagedAudioSession callKitDeactivatedAudioSession") self.callKitAudioSessionIsActive = false diff --git a/submodules/TelegramAudio/Sources/TelegramAudio.h b/submodules/TelegramAudio/Sources/TelegramAudio.h new file mode 100644 index 0000000000..3a4f973417 --- /dev/null +++ b/submodules/TelegramAudio/Sources/TelegramAudio.h @@ -0,0 +1,8 @@ +#import + +//! Project version number for TelegramAudio. +FOUNDATION_EXPORT double TelegramAudioVersionNumber; + +//! Project version string for TelegramAudio. +FOUNDATION_EXPORT const unsigned char TelegramAudioVersionString[]; + diff --git a/submodules/TelegramAudio/TelegramAudio_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramAudio/TelegramAudio_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..73d52a9f5a --- /dev/null +++ b/submodules/TelegramAudio/TelegramAudio_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,547 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D0AE318F22B2702E0058D3BC /* TelegramAudio.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE318D22B2702E0058D3BC /* TelegramAudio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE319622B270A80058D3BC /* ManagedAudioSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE319522B270A70058D3BC /* ManagedAudioSession.swift */; }; + D0AE319922B270B40058D3BC /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE319822B270B40058D3BC /* SwiftSignalKit.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D0AE318A22B2702E0058D3BC /* TelegramAudio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramAudio.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE318D22B2702E0058D3BC /* TelegramAudio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramAudio.h; sourceTree = ""; }; + D0AE318E22B2702E0058D3BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE319522B270A70058D3BC /* ManagedAudioSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedAudioSession.swift; sourceTree = ""; }; + D0AE319822B270B40058D3BC /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE318722B2702E0058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE319922B270B40058D3BC /* SwiftSignalKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0AE318022B2702E0058D3BC = { + isa = PBXGroup; + children = ( + D0AE318E22B2702E0058D3BC /* Info.plist */, + D0AE318C22B2702E0058D3BC /* Sources */, + D0AE318B22B2702E0058D3BC /* Products */, + D0AE319722B270B40058D3BC /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE318B22B2702E0058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE318A22B2702E0058D3BC /* TelegramAudio.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE318C22B2702E0058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE319522B270A70058D3BC /* ManagedAudioSession.swift */, + D0AE318D22B2702E0058D3BC /* TelegramAudio.h */, + ); + path = Sources; + sourceTree = ""; + }; + D0AE319722B270B40058D3BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0AE319822B270B40058D3BC /* SwiftSignalKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE318522B2702E0058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE318F22B2702E0058D3BC /* TelegramAudio.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE318922B2702E0058D3BC /* TelegramAudio */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE319222B2702E0058D3BC /* Build configuration list for PBXNativeTarget "TelegramAudio" */; + buildPhases = ( + D0AE318522B2702E0058D3BC /* Headers */, + D0AE318622B2702E0058D3BC /* Sources */, + D0AE318722B2702E0058D3BC /* Frameworks */, + D0AE318822B2702E0058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelegramAudio; + productName = TelegramAudio; + productReference = D0AE318A22B2702E0058D3BC /* TelegramAudio.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE318122B2702E0058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE318922B2702E0058D3BC = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D0AE318422B2702E0058D3BC /* Build configuration list for PBXProject "TelegramAudio_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE318022B2702E0058D3BC; + productRefGroup = D0AE318B22B2702E0058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE318922B2702E0058D3BC /* TelegramAudio */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE318822B2702E0058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE318622B2702E0058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE319622B270A80058D3BC /* ManagedAudioSession.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B6222B5BEF900AD4DE8 /* 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; + }; + D0A25B6322B5BEF900AD4DE8 /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramAudio; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B7B22B5BF4700AD4DE8 /* 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; + }; + D0A25B7C22B5BF4700AD4DE8 /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramAudio; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE319022B2702E0058D3BC /* 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; + }; + D0AE319122B2702E0058D3BC /* 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; + }; + D0AE319322B2702E0058D3BC /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramAudio; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE319422B2702E0058D3BC /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramAudio; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE318422B2702E0058D3BC /* Build configuration list for PBXProject "TelegramAudio_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE319022B2702E0058D3BC /* DebugAppStoreLLC */, + D0A25B6222B5BEF900AD4DE8 /* DebugHockeyapp */, + D0AE319122B2702E0058D3BC /* ReleaseAppStoreLLC */, + D0A25B7B22B5BF4700AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE319222B2702E0058D3BC /* Build configuration list for PBXNativeTarget "TelegramAudio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE319322B2702E0058D3BC /* DebugAppStoreLLC */, + D0A25B6322B5BEF900AD4DE8 /* DebugHockeyapp */, + D0AE319422B2702E0058D3BC /* ReleaseAppStoreLLC */, + D0A25B7C22B5BF4700AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE318122B2702E0058D3BC /* Project object */; +} diff --git a/submodules/TelegramCallsUI/Info.plist b/submodules/TelegramCallsUI/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramCallsUI/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/TelegramUI/TelegramUI/CallKitIntergation.swift b/submodules/TelegramCallsUI/Sources/CallKitIntegration.swift similarity index 98% rename from submodules/TelegramUI/TelegramUI/CallKitIntergation.swift rename to submodules/TelegramCallsUI/Sources/CallKitIntegration.swift index 535c3145a5..1ade559300 100644 --- a/submodules/TelegramUI/TelegramUI/CallKitIntergation.swift +++ b/submodules/TelegramCallsUI/Sources/CallKitIntegration.swift @@ -118,8 +118,8 @@ class CallKitProviderDelegate: NSObject, CXProviderDelegate { providerConfiguration.maximumCallsPerCallGroup = 1 providerConfiguration.maximumCallGroups = 1 providerConfiguration.supportedHandleTypes = [.phoneNumber, .generic] - if let image = UIImage(bundleImageName: "Call/CallKitLogo") { - providerConfiguration.iconTemplateImageData = UIImagePNGRepresentation(image) + if let image = UIImage(named: "Call/CallKitLogo", in: Bundle(for: CallKitIntegration.self), compatibleWith: nil) { + providerConfiguration.iconTemplateImageData = image.pngData() } return providerConfiguration diff --git a/submodules/TelegramUI/TelegramUI/PresentationCall.swift b/submodules/TelegramCallsUI/Sources/PresentationCall.swift similarity index 96% rename from submodules/TelegramUI/TelegramUI/PresentationCall.swift rename to submodules/TelegramCallsUI/Sources/PresentationCall.swift index 80126973e5..d2da2030b7 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCall.swift @@ -4,6 +4,12 @@ import TelegramCore import SwiftSignalKit import Display import AVFoundation +import TelegramVoip +import TelegramAudio +import TelegramUIPreferences +import TelegramPresentationData +import DeviceAccess +import UniversalMediaPlayer public enum PresentationCallState: Equatable { case waiting @@ -104,7 +110,7 @@ private final class PresentationCallToneRenderer { memset(bytes.advanced(by: validCount), 0, frameSize - validCount) } - let status = CMBlockBufferCreateWithMemoryBlock(nil, bytes, frameSize, nil, nil, 0, frameSize, 0, &blockBuffer) + let status = CMBlockBufferCreateWithMemoryBlock(allocator: nil, memoryBlock: bytes, blockLength: frameSize, blockAllocator: nil, customBlockSource: nil, offsetToData: 0, dataLength: frameSize, flags: 0, blockBufferOut: &blockBuffer) if status != noErr { return .finished } @@ -115,7 +121,7 @@ private final class PresentationCallToneRenderer { var timingInfo = CMSampleTimingInfo(duration: CMTime(value: Int64(sampleCount), timescale: 44100), presentationTimeStamp: pts, decodeTimeStamp: pts) var sampleBuffer: CMSampleBuffer? var sampleSize = frameSize - guard CMSampleBufferCreate(nil, blockBuffer, true, nil, nil, nil, 1, 1, &timingInfo, 1, &sampleSize, &sampleBuffer) == noErr else { + guard CMSampleBufferCreate(allocator: nil, dataBuffer: blockBuffer, dataReady: true, makeDataReadyCallback: nil, refcon: nil, formatDescription: nil, sampleCount: 1, sampleTimingEntryCount: 1, sampleTimingArray: &timingInfo, sampleSizeEntryCount: 1, sampleSizeArray: &sampleSize, sampleBufferOut: &sampleBuffer) == noErr else { return .finished } @@ -570,7 +576,7 @@ public final class PresentationCall { } } - func answer() { + public func answer() { let (presentationData, present, openSettings) = self.getDeviceAccessData() DeviceAccess.authorizeAccess(to: .microphone(.voiceCall), presentationData: presentationData, present: { c, a in @@ -590,29 +596,29 @@ public final class PresentationCall { }) } - func hangUp() -> Signal { + public func hangUp() -> Signal { self.callSessionManager.drop(internalId: self.internalId, reason: .hangUp) self.ongoingContext.stop() return self.hungUpPromise.get() } - func rejectBusy() { + public func rejectBusy() { self.callSessionManager.drop(internalId: self.internalId, reason: .busy) self.ongoingContext.stop() } - func toggleIsMuted() { + public func toggleIsMuted() { self.setIsMuted(!self.isMutedValue) } - func setIsMuted(_ value: Bool) { + public func setIsMuted(_ value: Bool) { self.isMutedValue = value self.isMutedPromise.set(self.isMutedValue) self.ongoingContext.setIsMuted(self.isMutedValue) } - func setCurrentAudioOutput(_ output: AudioSessionOutput) { + public func setCurrentAudioOutput(_ output: AudioSessionOutput) { guard self.currentAudioOutputValue != output else { return } @@ -629,7 +635,7 @@ public final class PresentationCall { } } - func debugInfo() -> Signal<(String, String), NoError> { + public func debugInfo() -> Signal<(String, String), NoError> { return self.ongoingContext.debugInfo() } } diff --git a/submodules/TelegramUI/TelegramUI/PresentationCallManager.swift b/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift similarity index 99% rename from submodules/TelegramUI/TelegramUI/PresentationCallManager.swift rename to submodules/TelegramCallsUI/Sources/PresentationCallManager.swift index 726ccd17cc..e9e19294e1 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationCallManager.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift @@ -4,6 +4,12 @@ import TelegramCore import SwiftSignalKit import Display +import DeviceAccess +import TelegramPresentationData +import TelegramAudio +import TelegramVoip +import TelegramUIPreferences + private func callKitIntegrationIfEnabled(_ integration: CallKitIntegration?, settings: VoiceCallSettings?) -> CallKitIntegration? { let enabled = settings?.enableSystemIntegration ?? true return enabled ? integration : nil diff --git a/submodules/TelegramUI/TelegramUI/PresentationCallToneData.swift b/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift similarity index 91% rename from submodules/TelegramUI/TelegramUI/PresentationCallToneData.swift rename to submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift index 4be4fb3651..b24173dce7 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationCallToneData.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift @@ -52,7 +52,7 @@ private func loadToneData(name: String) -> Data? { if let nextBuffer = readerOutput.copyNextSampleBuffer() { var abl = AudioBufferList() var blockBuffer: CMBlockBuffer? = nil - CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(nextBuffer, nil, &abl, MemoryLayout.size, nil, nil, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer) + CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(nextBuffer, bufferListSizeNeededOut: nil, bufferListOut: &abl, bufferListSize: MemoryLayout.size, blockBufferAllocator: nil, blockBufferMemoryAllocator: nil, flags: kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, blockBufferOut: &blockBuffer) let size = Int(CMSampleBufferGetTotalSampleSize(nextBuffer)) if size != 0, let mData = abl.mBuffers.mData { data.append(Data(bytes: mData, count: size)) diff --git a/submodules/TelegramCallsUI/Sources/TelegramCallsUI.h b/submodules/TelegramCallsUI/Sources/TelegramCallsUI.h new file mode 100644 index 0000000000..a87d7596b8 --- /dev/null +++ b/submodules/TelegramCallsUI/Sources/TelegramCallsUI.h @@ -0,0 +1,19 @@ +// +// TelegramCallsUI.h +// TelegramCallsUI +// +// Created by Peter on 6/13/19. +// Copyright © 2019 Telegram LLP. All rights reserved. +// + +#import + +//! Project version number for TelegramCallsUI. +FOUNDATION_EXPORT double TelegramCallsUIVersionNumber; + +//! Project version string for TelegramCallsUI. +FOUNDATION_EXPORT const unsigned char TelegramCallsUIVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/TelegramCallsUI/TelegramCallsUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCallsUI/TelegramCallsUI_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..a808761bd5 --- /dev/null +++ b/submodules/TelegramCallsUI/TelegramCallsUI_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,575 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 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 */; }; + D0AE310E22B1DD160058D3BC /* PresentationCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE310A22B1DD160058D3BC /* PresentationCall.swift */; }; + D0AE310F22B1DD160058D3BC /* PresentationCallToneData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE310B22B1DD160058D3BC /* PresentationCallToneData.swift */; }; + D0AE311022B1DD160058D3BC /* CallKitIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE310C22B1DD160058D3BC /* CallKitIntegration.swift */; }; + D0AE315722B1DEF10058D3BC /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE315622B1DEF10058D3BC /* TelegramUIPreferences.framework */; }; + D0AE317422B26A270058D3BC /* TelegramVoip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE317322B26A270058D3BC /* TelegramVoip.framework */; }; + D0AE319B22B270D60058D3BC /* TelegramAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE319A22B270D60058D3BC /* TelegramAudio.framework */; }; + D0AE31C122B274BA0058D3BC /* TelegramPresentationData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE31C022B274BA0058D3BC /* TelegramPresentationData.framework */; }; + D0AE320722B281AE0058D3BC /* DeviceAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE320622B281AE0058D3BC /* DeviceAccess.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 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 = ""; }; + D0AE310922B1DD160058D3BC /* PresentationCallManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationCallManager.swift; sourceTree = ""; }; + D0AE310A22B1DD160058D3BC /* PresentationCall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationCall.swift; sourceTree = ""; }; + D0AE310B22B1DD160058D3BC /* PresentationCallToneData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationCallToneData.swift; sourceTree = ""; }; + D0AE310C22B1DD160058D3BC /* CallKitIntegration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallKitIntegration.swift; sourceTree = ""; }; + D0AE311422B1DDB30058D3BC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE315622B1DEF10058D3BC /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE317322B26A270058D3BC /* TelegramVoip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramVoip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE319A22B270D60058D3BC /* TelegramAudio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramAudio.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31C022B274BA0058D3BC /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE320622B281AE0058D3BC /* DeviceAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeviceAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE30F322B1DC3F0058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0750C6A22B28A8000BE5F6E /* UniversalMediaPlayer.framework in Frameworks */, + D0AE320722B281AE0058D3BC /* DeviceAccess.framework in Frameworks */, + D0AE31C122B274BA0058D3BC /* TelegramPresentationData.framework in Frameworks */, + D0AE319B22B270D60058D3BC /* TelegramAudio.framework in Frameworks */, + D0AE317422B26A270058D3BC /* TelegramVoip.framework in Frameworks */, + D0AE315722B1DEF10058D3BC /* TelegramUIPreferences.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0AE30EC22B1DC3F0058D3BC = { + isa = PBXGroup; + children = ( + D0AE311422B1DDB30058D3BC /* Info.plist */, + D0AE30F822B1DC3F0058D3BC /* Sources */, + D0AE30F722B1DC3F0058D3BC /* Products */, + D0AE315522B1DEF10058D3BC /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE30F722B1DC3F0058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE30F622B1DC3F0058D3BC /* TelegramCallsUI.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE30F822B1DC3F0058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE310C22B1DD160058D3BC /* CallKitIntegration.swift */, + D0AE310A22B1DD160058D3BC /* PresentationCall.swift */, + D0AE310922B1DD160058D3BC /* PresentationCallManager.swift */, + D0AE310B22B1DD160058D3BC /* PresentationCallToneData.swift */, + D0AE30F922B1DC3F0058D3BC /* TelegramCallsUI.h */, + ); + path = Sources; + sourceTree = ""; + }; + D0AE315522B1DEF10058D3BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0750C6922B28A8000BE5F6E /* UniversalMediaPlayer.framework */, + D0AE320622B281AE0058D3BC /* DeviceAccess.framework */, + D0AE31C022B274BA0058D3BC /* TelegramPresentationData.framework */, + D0AE319A22B270D60058D3BC /* TelegramAudio.framework */, + D0AE317322B26A270058D3BC /* TelegramVoip.framework */, + D0AE315622B1DEF10058D3BC /* TelegramUIPreferences.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE30F122B1DC3F0058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE30FB22B1DC3F0058D3BC /* TelegramCallsUI.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE30F522B1DC3F0058D3BC /* TelegramCallsUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE30FE22B1DC3F0058D3BC /* Build configuration list for PBXNativeTarget "TelegramCallsUI" */; + buildPhases = ( + D0AE30F122B1DC3F0058D3BC /* Headers */, + D0AE30F222B1DC3F0058D3BC /* Sources */, + D0AE30F322B1DC3F0058D3BC /* Frameworks */, + D0AE30F422B1DC3F0058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelegramCallsUI; + productName = TelegramCallsUI; + productReference = D0AE30F622B1DC3F0058D3BC /* TelegramCallsUI.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE30ED22B1DC3F0058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE30F522B1DC3F0058D3BC = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D0AE30F022B1DC3F0058D3BC /* Build configuration list for PBXProject "TelegramCallsUI_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE30EC22B1DC3F0058D3BC; + productRefGroup = D0AE30F722B1DC3F0058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE30F522B1DC3F0058D3BC /* TelegramCallsUI */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE30F422B1DC3F0058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE30F222B1DC3F0058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE310D22B1DD160058D3BC /* PresentationCallManager.swift in Sources */, + D0AE310E22B1DD160058D3BC /* PresentationCall.swift in Sources */, + D0AE310F22B1DD160058D3BC /* PresentationCallToneData.swift in Sources */, + D0AE311022B1DD160058D3BC /* CallKitIntegration.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B6C22B5BF1200AD4DE8 /* 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; + }; + D0A25B6D22B5BF1200AD4DE8 /* 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.TelegramCallsUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B8522B5BF5A00AD4DE8 /* 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; + }; + D0A25B8622B5BF5A00AD4DE8 /* 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.TelegramCallsUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE30FC22B1DC3F0058D3BC /* 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; + }; + D0AE30FD22B1DC3F0058D3BC /* 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; + }; + D0AE30FF22B1DC3F0058D3BC /* 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.TelegramCallsUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE310022B1DC3F0058D3BC /* 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.TelegramCallsUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE30F022B1DC3F0058D3BC /* Build configuration list for PBXProject "TelegramCallsUI_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE30FC22B1DC3F0058D3BC /* DebugAppStoreLLC */, + D0A25B6C22B5BF1200AD4DE8 /* DebugHockeyapp */, + D0AE30FD22B1DC3F0058D3BC /* ReleaseAppStoreLLC */, + D0A25B8522B5BF5A00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE30FE22B1DC3F0058D3BC /* Build configuration list for PBXNativeTarget "TelegramCallsUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE30FF22B1DC3F0058D3BC /* DebugAppStoreLLC */, + D0A25B6D22B5BF1200AD4DE8 /* DebugHockeyapp */, + D0AE310022B1DC3F0058D3BC /* ReleaseAppStoreLLC */, + D0A25B8622B5BF5A00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE30ED22B1DC3F0058D3BC /* Project object */; +} diff --git a/submodules/TelegramCore/TelegramCore/Account.swift b/submodules/TelegramCore/TelegramCore/Account.swift index 15cd2e8bcb..9236492597 100644 --- a/submodules/TelegramCore/TelegramCore/Account.swift +++ b/submodules/TelegramCore/TelegramCore/Account.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -15,6 +17,7 @@ import Foundation #endif import TelegramCorePrivateModule + public protocol AccountState: PostboxCoding { func equalsTo(_ other: AccountState) -> Bool } diff --git a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift index b3763b19cb..3464682d33 100644 --- a/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift +++ b/submodules/TelegramCore/TelegramCore/AccountIntermediateState.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -277,6 +279,25 @@ struct AccountMutableState { mutating func mergeChats(_ chats: [Api.Chat]) { self.addOperation(.MergeApiChats(chats)) + + for chat in chats { + switch chat { + case let .channel(_, _, _, _, _, _, _, _, _, _, _, _, participantsCount): + if let participantsCount = participantsCount { + self.addOperation(.UpdateCachedPeerData(chat.peerId, { current in + var previous: CachedChannelData + if let current = current as? CachedChannelData { + previous = current + } else { + previous = CachedChannelData() + } + return previous.withUpdatedParticipantsSummary(previous.participantsSummary.withUpdatedMemberCount(participantsCount)) + })) + } + default: + break + } + } } mutating func updatePeer(_ id: PeerId, _ f: @escaping (Peer?) -> Peer?) { diff --git a/submodules/TelegramCore/TelegramCore/AccountManager.swift b/submodules/TelegramCore/TelegramCore/AccountManager.swift index 4a7cc189d5..2bd1d676a7 100644 --- a/submodules/TelegramCore/TelegramCore/AccountManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountManager.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -168,16 +170,6 @@ public func performAppGroupUpgrades(appGroupPath: String, rootPath: String) { } catch let e { print("\(e)") } - - if let files = try? FileManager.default.contentsOfDirectory(at: URL(fileURLWithPath: appGroupPath), includingPropertiesForKeys: [], options: []) { - for url in files { - if url.lastPathComponent == "accounts-metadata" || - url.lastPathComponent.hasSuffix("logs") || - url.lastPathComponent.hasPrefix("account-") { - let _ = try? FileManager.default.moveItem(at: url, to: URL(fileURLWithPath: rootPath + "/" + url.lastPathComponent)) - } - } - } } public final class TemporaryAccount { diff --git a/submodules/TelegramCore/TelegramCore/AccountState.swift b/submodules/TelegramCore/TelegramCore/AccountState.swift index 897905941c..337c5a7a6c 100644 --- a/submodules/TelegramCore/TelegramCore/AccountState.swift +++ b/submodules/TelegramCore/TelegramCore/AccountState.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif private enum SentAuthorizationCodeTypeValue: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index d6e9890cf8..11a193fa6d 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -1291,10 +1293,10 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo updatedState.updatePeerChatInclusion(peerId: peer.peerId, groupId: PeerGroupId(rawValue: folderId), changedGroup: true) } } - case let .updateContactLocated(contacts): + case let .updatePeerLocated(peers): var peersNearby: [PeerNearby] = [] - for case let .contactLocated(userId, expires, distance) in contacts { - peersNearby.append(PeerNearby(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), expires: expires, distance: distance)) + for case let .peerLocated(peer, expires, distance) in peers { + peersNearby.append(PeerNearby(id: peer.peerId, expires: expires, distance: distance)) } updatedState.updatePeersNearby(peersNearby) default: @@ -2423,6 +2425,7 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP updatePeers(transaction: transaction, peers: peers, update: { _, updated in return updated }) + updateContacts(transaction: transaction, apiUsers: users) case let .UpdatePeer(id, f): if let peer = f(transaction.getPeer(id)) { updatePeers(transaction: transaction, peers: [peer], update: { _, updated in diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManager.swift b/submodules/TelegramCore/TelegramCore/AccountStateManager.swift index 95e885b754..5cfeb74ba9 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManager.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/AccountStateReset.swift b/submodules/TelegramCore/TelegramCore/AccountStateReset.swift index a44ba42543..dfaf2d39cd 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateReset.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateReset.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift b/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift index b1153c0a04..b4b5536482 100644 --- a/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift +++ b/submodules/TelegramCore/TelegramCore/AccountViewTracker.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -202,7 +204,7 @@ private func wrappedHistoryViewAdditionalData(chatLocation: ChatLocation, additi private final class PeerCachedDataContext { var viewIds = Set() var timestamp: Double? - var referenceData: CachedPeerData? + var hasCachedData: Bool = false let disposable = MetaDisposable() deinit { @@ -780,22 +782,22 @@ public final class AccountViewTracker { } } - private func updateCachedPeerData(peerId: PeerId, viewId: Int32, referenceData: CachedPeerData?) { + private func updateCachedPeerData(peerId: PeerId, viewId: Int32, hasCachedData: Bool) { self.queue.async { let context: PeerCachedDataContext var dataUpdated = false if let existingContext = self.cachedDataContexts[peerId] { context = existingContext - context.referenceData = referenceData + context.hasCachedData = hasCachedData if context.timestamp == nil || abs(CFAbsoluteTimeGetCurrent() - context.timestamp!) > 60.0 * 5 { context.timestamp = CFAbsoluteTimeGetCurrent() dataUpdated = true } } else { context = PeerCachedDataContext() - context.referenceData = referenceData + context.hasCachedData = hasCachedData self.cachedDataContexts[peerId] = context - if context.referenceData == nil || context.timestamp == nil || abs(CFAbsoluteTimeGetCurrent() - context.timestamp!) > 60.0 * 5 { + if !context.hasCachedData || context.timestamp == nil || abs(CFAbsoluteTimeGetCurrent() - context.timestamp!) > 60.0 * 5 { context.timestamp = CFAbsoluteTimeGetCurrent() dataUpdated = true } @@ -816,7 +818,7 @@ public final class AccountViewTracker { context.viewIds.remove(id) if context.viewIds.isEmpty { context.disposable.set(nil) - context.referenceData = nil + context.hasCachedData = false } } } @@ -968,7 +970,7 @@ public final class AccountViewTracker { } }, next: { [weak self] next, viewId in if let strongSelf = self { - strongSelf.updateCachedPeerData(peerId: peerId, viewId: viewId, referenceData: next.cachedData) + strongSelf.updateCachedPeerData(peerId: peerId, viewId: viewId, hasCachedData: next.cachedData != nil) } }, disposed: { [weak self] viewId in if let strongSelf = self { diff --git a/submodules/TelegramCore/TelegramCore/AddPeerMember.swift b/submodules/TelegramCore/TelegramCore/AddPeerMember.swift index af1aaa3b0f..ec85e49a13 100644 --- a/submodules/TelegramCore/TelegramCore/AddPeerMember.swift +++ b/submodules/TelegramCore/TelegramCore/AddPeerMember.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/AddressNames.swift b/submodules/TelegramCore/TelegramCore/AddressNames.swift index 5f7931ac91..62c808f82d 100644 --- a/submodules/TelegramCore/TelegramCore/AddressNames.swift +++ b/submodules/TelegramCore/TelegramCore/AddressNames.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -156,8 +158,28 @@ public func updateAddressName(account: Account, domain: AddressNameDomain, name: } |> mapError { _ -> UpdateAddressNameError in return .generic } |> switchToLatest } -public func adminedPublicChannels(account: Account) -> Signal<[Peer], NoError> { - return account.network.request(Api.functions.channels.getAdminedPublicChannels()) +public func checkPublicChannelCreationAvailability(account: Account, location: Bool = false) -> Signal { + var flags: Int32 = (1 << 1) + if location { + flags |= (1 << 0) + } + + return account.network.request(Api.functions.channels.getAdminedPublicChannels(flags: flags)) + |> map { _ -> Bool in + return true + } + |> `catch` { error -> Signal in + return .single(false) + } +} + +public func adminedPublicChannels(account: Account, location: Bool = false) -> Signal<[Peer], NoError> { + var flags: Int32 = 0 + if location { + flags |= (1 << 0) + } + + return account.network.request(Api.functions.channels.getAdminedPublicChannels(flags: flags)) |> retryRequest |> mapToSignal { result -> Signal<[Peer], NoError> in var peers: [Peer] = [] diff --git a/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift b/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift index 32572b8d4a..0999f89c2f 100644 --- a/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift +++ b/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif func imageRepresentationsForApiChatPhoto(_ photo: Api.ChatPhoto) -> [TelegramMediaImageRepresentation] { @@ -31,85 +33,95 @@ func imageRepresentationsForApiChatPhoto(_ photo: Api.ChatPhoto) -> [TelegramMed func parseTelegramGroupOrChannel(chat: Api.Chat) -> Peer? { switch chat { - case let .chat(flags, id, title, photo, participantsCount, date, version, migratedTo, adminRights, defaultBannedRights): - let left = (flags & ((1 << 1) | (1 << 2))) != 0 - var migrationReference: TelegramGroupToChannelMigrationReference? - if let migratedTo = migratedTo { - switch migratedTo { - case let .inputChannel(channelId, accessHash): - migrationReference = TelegramGroupToChannelMigrationReference(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId), accessHash: accessHash) - case .inputChannelEmpty: - break - } + case let .chat(flags, id, title, photo, participantsCount, date, version, migratedTo, adminRights, defaultBannedRights): + let left = (flags & ((1 << 1) | (1 << 2))) != 0 + var migrationReference: TelegramGroupToChannelMigrationReference? + if let migratedTo = migratedTo { + switch migratedTo { + case let .inputChannel(channelId, accessHash): + migrationReference = TelegramGroupToChannelMigrationReference(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId), accessHash: accessHash) + case .inputChannelEmpty: + break } - var groupFlags = TelegramGroupFlags() - var role: TelegramGroupRole = .member - if (flags & (1 << 0)) != 0 { - role = .creator - } else if let adminRights = adminRights { - role = .admin(TelegramChatAdminRights(apiAdminRights: adminRights)) + } + var groupFlags = TelegramGroupFlags() + var role: TelegramGroupRole = .member + if (flags & (1 << 0)) != 0 { + role = .creator + } else if let adminRights = adminRights { + role = .admin(TelegramChatAdminRights(apiAdminRights: adminRights)) + } + if (flags & (1 << 5)) != 0 { + groupFlags.insert(.deactivated) + } + return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: title, photo: imageRepresentationsForApiChatPhoto(photo), participantCount: Int(participantsCount), role: role, membership: left ? .Left : .Member, flags: groupFlags, defaultBannedRights: defaultBannedRights.flatMap(TelegramChatBannedRights.init(apiBannedRights:)), migrationReference: migrationReference, creationDate: date, version: Int(version)) + case let .chatEmpty(id): + return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: "", photo: [], participantCount: 0, role: .member, membership: .Removed, flags: [], defaultBannedRights: nil, migrationReference: nil, creationDate: 0, version: 0) + case let .chatForbidden(id, title): + return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: title, photo: [], participantCount: 0, role: .member, membership: .Removed, flags: [], defaultBannedRights: nil, migrationReference: nil, creationDate: 0, version: 0) + case let .channel(flags, id, accessHash, title, username, photo, date, version, restrictionReason, adminRights, bannedRights, defaultBannedRights, _): + let isMin = (flags & (1 << 20)) != 0 + + let participationStatus: TelegramChannelParticipationStatus + if (flags & Int32(1 << 1)) != 0 { + participationStatus = .kicked + } else if (flags & Int32(1 << 2)) != 0 { + participationStatus = .left + } else { + participationStatus = .member + } + + let info: TelegramChannelInfo + if (flags & Int32(1 << 8)) != 0 { + let infoFlags = TelegramChannelGroupFlags() + info = .group(TelegramChannelGroupInfo(flags: infoFlags)) + } else { + var infoFlags = TelegramChannelBroadcastFlags() + if (flags & Int32(1 << 11)) != 0 { + infoFlags.insert(.messagesShouldHaveSignatures) } - if (flags & (1 << 5)) != 0 { - groupFlags.insert(.deactivated) + if (flags & Int32(1 << 20)) != 0 { + infoFlags.insert(.hasDiscussionGroup) } - return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: title, photo: imageRepresentationsForApiChatPhoto(photo), participantCount: Int(participantsCount), role: role, membership: left ? .Left : .Member, flags: groupFlags, defaultBannedRights: defaultBannedRights.flatMap(TelegramChatBannedRights.init(apiBannedRights:)), migrationReference: migrationReference, creationDate: date, version: Int(version)) - case let .chatEmpty(id): - return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: "", photo: [], participantCount: 0, role: .member, membership: .Removed, flags: [], defaultBannedRights: nil, migrationReference: nil, creationDate: 0, version: 0) - case let .chatForbidden(id, title): - return TelegramGroup(id: PeerId(namespace: Namespaces.Peer.CloudGroup, id: id), title: title, photo: [], participantCount: 0, role: .member, membership: .Removed, flags: [], defaultBannedRights: nil, migrationReference: nil, creationDate: 0, version: 0) - case let .channel(flags, id, accessHash, title, username, photo, date, version, restrictionReason, adminRights, bannedRights, defaultBannedRights, _/*feed*//*, feedId*/): - let participationStatus: TelegramChannelParticipationStatus - if (flags & Int32(1 << 1)) != 0 { - participationStatus = .kicked - } else if (flags & Int32(1 << 2)) != 0 { - participationStatus = .left + info = .broadcast(TelegramChannelBroadcastInfo(flags: infoFlags)) + } + + var channelFlags = TelegramChannelFlags() + if (flags & Int32(1 << 0)) != 0 { + channelFlags.insert(.isCreator) + } + if (flags & Int32(1 << 7)) != 0 { + channelFlags.insert(.isVerified) + } + if (flags & Int32(1 << 19)) != 0 { + channelFlags.insert(.isScam) + } + + let restrictionInfo: PeerAccessRestrictionInfo? + if let restrictionReason = restrictionReason { + restrictionInfo = PeerAccessRestrictionInfo(reason: restrictionReason) + } else { + restrictionInfo = nil + } + + let accessHashValue = accessHash.flatMap { value -> TelegramPeerAccessHash in + if isMin { + return .genericPublic(value) } else { - participationStatus = .member + return .personal(value) } - - let info: TelegramChannelInfo - if (flags & Int32(1 << 8)) != 0 { - let infoFlags = TelegramChannelGroupFlags() - info = .group(TelegramChannelGroupInfo(flags: infoFlags)) - } else { - var infoFlags = TelegramChannelBroadcastFlags() - if (flags & Int32(1 << 11)) != 0 { - infoFlags.insert(.messagesShouldHaveSignatures) - } - if (flags & Int32(1 << 20)) != 0 { - infoFlags.insert(.hasDiscussionGroup) - } - info = .broadcast(TelegramChannelBroadcastInfo(flags: infoFlags)) - } - - var channelFlags = TelegramChannelFlags() - if (flags & Int32(1 << 0)) != 0 { - channelFlags.insert(.isCreator) - } - if (flags & Int32(1 << 7)) != 0 { - channelFlags.insert(.isVerified) - } - if (flags & Int32(1 << 19)) != 0 { - channelFlags.insert(.isScam) - } - - let restrictionInfo: PeerAccessRestrictionInfo? - if let restrictionReason = restrictionReason { - restrictionInfo = PeerAccessRestrictionInfo(reason: restrictionReason) - } else { - restrictionInfo = nil - } - - return TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: id), accessHash: accessHash, title: title, username: username, photo: imageRepresentationsForApiChatPhoto(photo), creationDate: date, version: version, participationStatus: participationStatus, info: info, flags: channelFlags, restrictionInfo: restrictionInfo, adminRights: adminRights.flatMap(TelegramChatAdminRights.init), bannedRights: bannedRights.flatMap(TelegramChatBannedRights.init), defaultBannedRights: defaultBannedRights.flatMap(TelegramChatBannedRights.init)) - case let .channelForbidden(flags, id, accessHash, title, untilDate): - let info: TelegramChannelInfo - if (flags & Int32(1 << 8)) != 0 { - info = .group(TelegramChannelGroupInfo(flags: [])) - } else { - info = .broadcast(TelegramChannelBroadcastInfo(flags: [])) - } - - return TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: id), accessHash: accessHash, title: title, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .kicked, info: info, flags: TelegramChannelFlags(), restrictionInfo: nil, adminRights: nil, bannedRights: TelegramChatBannedRights(flags: [.banReadMessages], untilDate: untilDate ?? Int32.max), defaultBannedRights: nil) + } + + return TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: id), accessHash: accessHashValue, title: title, username: username, photo: imageRepresentationsForApiChatPhoto(photo), creationDate: date, version: version, participationStatus: participationStatus, info: info, flags: channelFlags, restrictionInfo: restrictionInfo, adminRights: adminRights.flatMap(TelegramChatAdminRights.init), bannedRights: bannedRights.flatMap(TelegramChatBannedRights.init), defaultBannedRights: defaultBannedRights.flatMap(TelegramChatBannedRights.init)) + case let .channelForbidden(flags, id, accessHash, title, untilDate): + let info: TelegramChannelInfo + if (flags & Int32(1 << 8)) != 0 { + info = .group(TelegramChannelGroupInfo(flags: [])) + } else { + info = .broadcast(TelegramChannelBroadcastInfo(flags: [])) + } + + return TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: id), accessHash: .personal(accessHash), title: title, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .kicked, info: info, flags: TelegramChannelFlags(), restrictionInfo: nil, adminRights: nil, bannedRights: TelegramChatBannedRights(flags: [.banReadMessages], untilDate: untilDate ?? Int32.max), defaultBannedRights: nil) } } @@ -118,7 +130,8 @@ func mergeGroupOrChannel(lhs: Peer?, rhs: Api.Chat) -> Peer? { case .chat, .chatEmpty, .chatForbidden, .channelForbidden: return parseTelegramGroupOrChannel(chat: rhs) case let .channel(flags, _, accessHash, title, username, photo, _, _, _, _, _, defaultBannedRights, _/*feed*//*, feedId*/): - if accessHash != nil && (flags & (1 << 12)) == 0 { + let isMin = (flags & (1 << 12)) != 0 + if accessHash != nil && !isMin { return parseTelegramGroupOrChannel(chat: rhs) } else if let lhs = lhs as? TelegramChannel { var channelFlags = lhs.flags @@ -129,11 +142,11 @@ func mergeGroupOrChannel(lhs: Peer?, rhs: Api.Chat) -> Peer? { } var info = lhs.info switch info { - case .broadcast: - break - case .group: - let infoFlags = TelegramChannelGroupFlags() - info = .group(TelegramChannelGroupInfo(flags: infoFlags)) + case .broadcast: + break + case .group: + let infoFlags = TelegramChannelGroupFlags() + info = .group(TelegramChannelGroupInfo(flags: infoFlags)) } return TelegramChannel(id: lhs.id, accessHash: lhs.accessHash, title: title, username: username, photo: imageRepresentationsForApiChatPhoto(photo), creationDate: lhs.creationDate, version: lhs.version, participationStatus: lhs.participationStatus, info: info, flags: channelFlags, restrictionInfo: lhs.restrictionInfo, adminRights: lhs.adminRights, bannedRights: lhs.bannedRights, defaultBannedRights: defaultBannedRights.flatMap(TelegramChatBannedRights.init)) } else { diff --git a/submodules/TelegramCore/TelegramCore/ApiUtils.swift b/submodules/TelegramCore/TelegramCore/ApiUtils.swift index ccd67db4d0..846130ac95 100644 --- a/submodules/TelegramCore/TelegramCore/ApiUtils.swift +++ b/submodules/TelegramCore/TelegramCore/ApiUtils.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public enum PeerReference: PostboxCoding, Hashable, Equatable { @@ -55,7 +57,7 @@ public enum PeerReference: PostboxCoding, Hashable, Equatable { switch peer { case let user as TelegramUser: if let accessHash = user.accessHash { - self = .user(id: user.id.id, accessHash: accessHash) + self = .user(id: user.id.id, accessHash: accessHash.value) } else { return nil } @@ -63,7 +65,7 @@ public enum PeerReference: PostboxCoding, Hashable, Equatable { self = .group(id: group.id.id) case let channel as TelegramChannel: if let accessHash = channel.accessHash { - self = .channel(id: channel.id.id, accessHash: accessHash) + self = .channel(id: channel.id.id, accessHash: accessHash.value) } else { return nil } @@ -103,12 +105,12 @@ public enum PeerReference: PostboxCoding, Hashable, Equatable { func forceApiInputPeer(_ peer: Peer) -> Api.InputPeer? { switch peer { case let user as TelegramUser: - return Api.InputPeer.inputPeerUser(userId: user.id.id, accessHash: user.accessHash ?? 0) + return Api.InputPeer.inputPeerUser(userId: user.id.id, accessHash: user.accessHash?.value ?? 0) case let group as TelegramGroup: return Api.InputPeer.inputPeerChat(chatId: group.id.id) case let channel as TelegramChannel: if let accessHash = channel.accessHash { - return Api.InputPeer.inputPeerChannel(channelId: channel.id.id, accessHash: accessHash) + return Api.InputPeer.inputPeerChannel(channelId: channel.id.id, accessHash: accessHash.value) } else { return nil } @@ -120,12 +122,12 @@ func forceApiInputPeer(_ peer: Peer) -> Api.InputPeer? { func apiInputPeer(_ peer: Peer) -> Api.InputPeer? { switch peer { case let user as TelegramUser where user.accessHash != nil: - return Api.InputPeer.inputPeerUser(userId: user.id.id, accessHash: user.accessHash!) + return Api.InputPeer.inputPeerUser(userId: user.id.id, accessHash: user.accessHash!.value) case let group as TelegramGroup: return Api.InputPeer.inputPeerChat(chatId: group.id.id) case let channel as TelegramChannel: if let accessHash = channel.accessHash { - return Api.InputPeer.inputPeerChannel(channelId: channel.id.id, accessHash: accessHash) + return Api.InputPeer.inputPeerChannel(channelId: channel.id.id, accessHash: accessHash.value) } else { return nil } @@ -136,7 +138,7 @@ func apiInputPeer(_ peer: Peer) -> Api.InputPeer? { func apiInputChannel(_ peer: Peer) -> Api.InputChannel? { if let channel = peer as? TelegramChannel, let accessHash = channel.accessHash { - return Api.InputChannel.inputChannel(channelId: channel.id.id, accessHash: accessHash) + return Api.InputChannel.inputChannel(channelId: channel.id.id, accessHash: accessHash.value) } else { return nil } @@ -144,7 +146,7 @@ func apiInputChannel(_ peer: Peer) -> Api.InputChannel? { func apiInputUser(_ peer: Peer) -> Api.InputUser? { if let user = peer as? TelegramUser, let accessHash = user.accessHash { - return Api.InputUser.inputUser(userId: user.id.id, accessHash: accessHash) + return Api.InputUser.inputUser(userId: user.id.id, accessHash: accessHash.value) } else { return nil } diff --git a/submodules/TelegramCore/TelegramCore/AppChangelog.swift b/submodules/TelegramCore/TelegramCore/AppChangelog.swift index 434d83c1e4..0b5ca59dee 100644 --- a/submodules/TelegramCore/TelegramCore/AppChangelog.swift +++ b/submodules/TelegramCore/TelegramCore/AppChangelog.swift @@ -3,10 +3,12 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else import Postbox +import TelegramApi import SwiftSignalKit -#if BUCK + #if BUCK import MtProtoKit #else import MtProtoKitDynamic diff --git a/submodules/TelegramCore/TelegramCore/ApplyMaxReadIndexInteractively.swift b/submodules/TelegramCore/TelegramCore/ApplyMaxReadIndexInteractively.swift index c1adcea2d1..3a13aace67 100644 --- a/submodules/TelegramCore/TelegramCore/ApplyMaxReadIndexInteractively.swift +++ b/submodules/TelegramCore/TelegramCore/ApplyMaxReadIndexInteractively.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift index ff9ca5dcc7..48bb0cb376 100644 --- a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift @@ -2,7 +2,9 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else + import TelegramApi import Postbox import SwiftSignalKit import UIKit diff --git a/submodules/TelegramCore/TelegramCore/ArchivedStickerPacks.swift b/submodules/TelegramCore/TelegramCore/ArchivedStickerPacks.swift index 499f7d9a16..5fa6ab3e84 100644 --- a/submodules/TelegramCore/TelegramCore/ArchivedStickerPacks.swift +++ b/submodules/TelegramCore/TelegramCore/ArchivedStickerPacks.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/Authorization.swift b/submodules/TelegramCore/TelegramCore/Authorization.swift index 6da3fbfcae..8f7b39bd21 100644 --- a/submodules/TelegramCore/TelegramCore/Authorization.swift +++ b/submodules/TelegramCore/TelegramCore/Authorization.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/AutodownloadSettings.swift b/submodules/TelegramCore/TelegramCore/AutodownloadSettings.swift index 82ad5a98eb..3dc0ae54ff 100644 --- a/submodules/TelegramCore/TelegramCore/AutodownloadSettings.swift +++ b/submodules/TelegramCore/TelegramCore/AutodownloadSettings.swift @@ -2,11 +2,14 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif + public enum AutodownloadPreset { case low case medium diff --git a/submodules/TelegramCore/TelegramCore/BlockedPeers.swift b/submodules/TelegramCore/TelegramCore/BlockedPeers.swift index 1b5f352f98..86e1c89945 100644 --- a/submodules/TelegramCore/TelegramCore/BlockedPeers.swift +++ b/submodules/TelegramCore/TelegramCore/BlockedPeers.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift b/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift index e5027dd32d..30b417b530 100644 --- a/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift +++ b/submodules/TelegramCore/TelegramCore/BlockedPeersContext.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/BotInfo.swift b/submodules/TelegramCore/TelegramCore/BotInfo.swift index 549de05bdd..76e78942bf 100644 --- a/submodules/TelegramCore/TelegramCore/BotInfo.swift +++ b/submodules/TelegramCore/TelegramCore/BotInfo.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct BotCommand: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/BotPaymentForm.swift b/submodules/TelegramCore/TelegramCore/BotPaymentForm.swift index 152a316285..c8bb497d45 100644 --- a/submodules/TelegramCore/TelegramCore/BotPaymentForm.swift +++ b/submodules/TelegramCore/TelegramCore/BotPaymentForm.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/CachedChannelData.swift b/submodules/TelegramCore/TelegramCore/CachedChannelData.swift index 9f6b9a4be2..90f775e22d 100644 --- a/submodules/TelegramCore/TelegramCore/CachedChannelData.swift +++ b/submodules/TelegramCore/TelegramCore/CachedChannelData.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct CachedChannelFlags: OptionSet { @@ -21,6 +23,7 @@ public struct CachedChannelFlags: OptionSet { public static let canSetStickerSet = CachedChannelFlags(rawValue: 1 << 2) public static let preHistoryEnabled = CachedChannelFlags(rawValue: 1 << 3) public static let canViewStats = CachedChannelFlags(rawValue: 1 << 4) + public static let canChangePeerGeoLocation = CachedChannelFlags(rawValue: 1 << 5) } public struct CachedChannelParticipantsSummary: PostboxCoding, Equatable { @@ -125,6 +128,34 @@ public struct ChannelMigrationReference: PostboxCoding, Equatable { } } +public struct PeerGeoLocation: PostboxCoding, Equatable { + public let latitude: Double + public let longitude: Double + public let address: String + + public init(latitude: Double, longitude: Double, address: String) { + self.latitude = latitude + self.longitude = longitude + self.address = address + } + + public init(decoder: PostboxDecoder) { + self.latitude = decoder.decodeDoubleForKey("la", orElse: 0.0) + self.longitude = decoder.decodeDoubleForKey("lo", orElse: 0.0) + self.address = decoder.decodeStringForKey("a", orElse: "") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeDouble(self.latitude, forKey: "la") + encoder.encodeDouble(self.longitude, forKey: "lo") + encoder.encodeString(self.address, forKey: "a") + } + + public static func ==(lhs: PeerGeoLocation, rhs: PeerGeoLocation) -> Bool { + return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude && lhs.address == rhs.address + } +} + public final class CachedChannelData: CachedPeerData { public let isNotAccessible: Bool public let flags: CachedChannelFlags @@ -137,8 +168,8 @@ public final class CachedChannelData: CachedPeerData { public let stickerPack: StickerPackCollectionInfo? public let minAvailableMessageId: MessageId? public let migrationReference: ChannelMigrationReference? - public let linkedDiscussionPeerId: PeerId? + public let peerGeoLocation: PeerGeoLocation? public let peerIds: Set public let messageIds: Set @@ -161,9 +192,10 @@ public final class CachedChannelData: CachedPeerData { self.minAvailableMessageId = nil self.migrationReference = nil self.linkedDiscussionPeerId = nil + self.peerGeoLocation = nil } - init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: PeerId?) { + init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: PeerId?, peerGeoLocation: PeerGeoLocation?) { self.isNotAccessible = isNotAccessible self.flags = flags self.about = about @@ -176,6 +208,7 @@ public final class CachedChannelData: CachedPeerData { self.minAvailableMessageId = minAvailableMessageId self.migrationReference = migrationReference self.linkedDiscussionPeerId = linkedDiscussionPeerId + self.peerGeoLocation = peerGeoLocation var peerIds = Set() for botInfo in botInfos { @@ -196,51 +229,55 @@ public final class CachedChannelData: CachedPeerData { } func withUpdatedIsNotAccessible(_ isNotAccessible: Bool) -> CachedChannelData { - return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedFlags(_ flags: CachedChannelFlags) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedAbout(_ about: String?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedParticipantsSummary(_ participantsSummary: CachedChannelParticipantsSummary) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedExportedInvitation(_ exportedInvitation: ExportedInvitation?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedBotInfos(_ botInfos: [CachedPeerBotInfo]) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedPeerStatusSettings(_ peerStatusSettings: PeerStatusSettings?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedStickerPack(_ stickerPack: StickerPackCollectionInfo?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedMinAvailableMessageId(_ minAvailableMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedMigrationReference(_ migrationReference: ChannelMigrationReference?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) } func withUpdatedLinkedDiscussionPeerId(_ linkedDiscussionPeerId: PeerId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + } + + func withUpdatedPeerGeoLocation(peerGeoLocation: PeerGeoLocation?) -> CachedChannelData { + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: peerGeoLocation) } public init(decoder: PostboxDecoder) { @@ -286,6 +323,12 @@ public final class CachedChannelData: CachedPeerData { self.linkedDiscussionPeerId = nil } + if let peerGeoLocation = decoder.decodeObjectForKey("pgl", decoder: { PeerGeoLocation(decoder: $0) }) as? PeerGeoLocation { + self.peerGeoLocation = peerGeoLocation + } else { + self.peerGeoLocation = nil + } + if let linkedDiscussionPeerId = self.linkedDiscussionPeerId { peerIds.insert(linkedDiscussionPeerId) } @@ -352,6 +395,11 @@ public final class CachedChannelData: CachedPeerData { } else { encoder.encodeNil(forKey: "dgi") } + if let peerGeoLocation = self.peerGeoLocation { + encoder.encodeObject(peerGeoLocation, forKey: "pgl") + } else { + encoder.encodeNil(forKey: "pgl") + } } public func isEqual(to: CachedPeerData) -> Bool { @@ -407,6 +455,25 @@ public final class CachedChannelData: CachedPeerData { return false } + if other.peerGeoLocation != self.peerGeoLocation { + return false + } + return true } } + +extension PeerGeoLocation { + init?(apiLocation: Api.ChannelLocation) { + switch apiLocation { + case let .channelLocation(geopoint, address): + if case let .geoPoint(longitude, latitude, _) = geopoint { + self.init(latitude: latitude, longitude: longitude, address: address) + } else { + return nil + } + default: + return nil + } + } +} diff --git a/submodules/TelegramCore/TelegramCore/CachedChannelParticipants.swift b/submodules/TelegramCore/TelegramCore/CachedChannelParticipants.swift index 72e8634771..1a1d855829 100644 --- a/submodules/TelegramCore/TelegramCore/CachedChannelParticipants.swift +++ b/submodules/TelegramCore/TelegramCore/CachedChannelParticipants.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif private enum ChannelParticipantValue: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/CachedGroupParticipants.swift b/submodules/TelegramCore/TelegramCore/CachedGroupParticipants.swift index c8ed1cdb73..deef543c4d 100644 --- a/submodules/TelegramCore/TelegramCore/CachedGroupParticipants.swift +++ b/submodules/TelegramCore/TelegramCore/CachedGroupParticipants.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public enum GroupParticipant: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/CallSessionManager.swift b/submodules/TelegramCore/TelegramCore/CallSessionManager.swift index 9c99777ab1..a0e429a821 100644 --- a/submodules/TelegramCore/TelegramCore/CallSessionManager.swift +++ b/submodules/TelegramCore/TelegramCore/CallSessionManager.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox +import TelegramApi #if BUCK import MtProtoKit #else @@ -13,6 +15,7 @@ import Postbox import SwiftSignalKit #endif + private let minLayer: Int32 = 65 public enum CallSessionError: Equatable { diff --git a/submodules/TelegramCore/TelegramCore/CancelAccountReset.swift b/submodules/TelegramCore/TelegramCore/CancelAccountReset.swift index 15ee33526c..b467f434e1 100644 --- a/submodules/TelegramCore/TelegramCore/CancelAccountReset.swift +++ b/submodules/TelegramCore/TelegramCore/CancelAccountReset.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/ChangeAccountPhoneNumber.swift b/submodules/TelegramCore/TelegramCore/ChangeAccountPhoneNumber.swift index e613286390..87ae6c73e1 100644 --- a/submodules/TelegramCore/TelegramCore/ChangeAccountPhoneNumber.swift +++ b/submodules/TelegramCore/TelegramCore/ChangeAccountPhoneNumber.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift b/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift index 1efe8f3cee..82886b9bc2 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift @@ -2,9 +2,11 @@ import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -56,10 +58,10 @@ public enum AdminLogEventAction { case participantToggleAdmin(prev: RenderedChannelParticipant, new: RenderedChannelParticipant) case changeStickerPack(prev: StickerPackReference?, new: StickerPackReference?) case togglePreHistoryHidden(Bool) - case updateDefaultBannedRights(prev: TelegramChatBannedRights, new: TelegramChatBannedRights - ) + case updateDefaultBannedRights(prev: TelegramChatBannedRights, new: TelegramChatBannedRights) case pollStopped(Message) case linkedPeerUpdated(previous: Peer?, updated: Peer?) + case changeGeoLocation(previous: PeerGeoLocation?, updated: PeerGeoLocation?) } public enum ChannelAdminLogEventError { @@ -214,6 +216,8 @@ public func channelAdminLogEvents(postbox: Postbox, network: Network, peerId: Pe } case let .channelAdminLogEventActionChangeLinkedChat(prevValue, newValue): action = .linkedPeerUpdated(previous: prevValue == 0 ? nil : peers[PeerId(namespace: Namespaces.Peer.CloudChannel, id: prevValue)], updated: newValue == 0 ? nil : peers[PeerId(namespace: Namespaces.Peer.CloudChannel, id: newValue)]) + case let .channelAdminLogEventActionChangeLocation(prevValue, newValue): + action = .changeGeoLocation(previous: PeerGeoLocation(apiLocation: prevValue), updated: PeerGeoLocation(apiLocation: newValue)) } let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId) if let action = action { diff --git a/submodules/TelegramCore/TelegramCore/ChannelAdmins.swift b/submodules/TelegramCore/TelegramCore/ChannelAdmins.swift index a3de627b7d..016ad4d7ca 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelAdmins.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelAdmins.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ChannelBlacklist.swift b/submodules/TelegramCore/TelegramCore/ChannelBlacklist.swift index 3ff892ebfe..9a7ec28554 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelBlacklist.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelBlacklist.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ChannelCreation.swift b/submodules/TelegramCore/TelegramCore/ChannelCreation.swift index 84aaedbb76..567a7f1b4b 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelCreation.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelCreation.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -13,11 +15,34 @@ import Foundation #endif #endif -private func createChannel(account: Account, title: String, description: String?, isSupergroup:Bool) -> Signal { +public enum CreateChannelError { + case generic + case restricted + case tooMuchLocationBasedGroups +} + +private func createChannel(account: Account, title: String, description: String?, isSupergroup:Bool, location: (latitude: Double, longitude: Double, address: String)? = nil) -> Signal { return account.postbox.transaction { transaction -> Signal in - return account.network.request(Api.functions.channels.createChannel(flags: isSupergroup ? 1 << 1 : 1 << 0, title: title, about: description ?? ""), automaticFloodWait: false) + var flags: Int32 = 0 + if isSupergroup { + flags |= (1 << 1) + } else { + flags |= (1 << 0) + } + + var geoPoint: Api.InputGeoPoint? + var address: String? + if let location = location { + flags |= (1 << 2) + geoPoint = .inputGeoPoint(lat: location.latitude, long: location.longitude) + address = location.address + } + + return account.network.request(Api.functions.channels.createChannel(flags: flags, title: title, about: description ?? "", geoPoint: geoPoint, address: address), automaticFloodWait: false) |> mapError { error -> CreateChannelError in - if error.errorDescription == "USER_RESTRICTED" { + if error.errorDescription == "CHANNELS_ADMIN_LOCATED_TOO_MUCH" { + return .tooMuchLocationBasedGroups + } else if error.errorDescription == "USER_RESTRICTED" { return .restricted } else { return .generic @@ -45,17 +70,12 @@ private func createChannel(account: Account, title: String, description: String? |> switchToLatest } -public enum CreateChannelError { - case generic - case restricted -} - public func createChannel(account: Account, title: String, description: String?) -> Signal { return createChannel(account: account, title: title, description: description, isSupergroup: false) } -public func createSupergroup(account: Account, title: String, description: String?) -> Signal { - return createChannel(account: account, title: title, description: description, isSupergroup: true) +public func createSupergroup(account: Account, title: String, description: String?, location: (latitude: Double, longitude: Double, address: String)? = nil) -> Signal { + return createChannel(account: account, title: title, description: description, isSupergroup: true, location: location) } public enum DeleteChannelError { diff --git a/submodules/TelegramCore/TelegramCore/ChannelHistoryAvailabilitySettings.swift b/submodules/TelegramCore/TelegramCore/ChannelHistoryAvailabilitySettings.swift index 24f77297ba..c57bf215f3 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelHistoryAvailabilitySettings.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelHistoryAvailabilitySettings.swift @@ -1,8 +1,10 @@ #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/ChannelMembers.swift b/submodules/TelegramCore/TelegramCore/ChannelMembers.swift index 3dc0783a3d..858abfb1ba 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelMembers.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelMembers.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift b/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift index 079826663b..26ebaf4c7a 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelOwnershipTransfer.swift @@ -2,95 +2,200 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif + public enum ChannelOwnershipTransferError { case generic case twoStepAuthMissing case twoStepAuthTooFresh(Int32) case authSessionTooFresh(Int32) + case limitExceeded case requestPassword case invalidPassword case adminsTooMuch case userPublicChannelsTooMuch + case userLocatedGroupsTooMuch case restricted case userBlocked } -public func updateChannelOwnership(postbox: Postbox, network: Network, accountStateManager: AccountStateManager, channelId: PeerId, memberId: PeerId, password: String?) -> Signal { - return postbox.transaction { transaction -> (channel: Peer?, user: Peer?) in - return (channel: transaction.getPeer(channelId), user: transaction.getPeer(memberId)) - } - |> introduceError(ChannelOwnershipTransferError.self) - |> mapToSignal { channel, user -> Signal in - guard let channel = channel, let user = user else { - return .fail(.generic) +public func checkOwnershipTranfserAvailability(postbox: Postbox, network: Network, accountStateManager: AccountStateManager, memberId: PeerId) -> Signal { + return postbox.transaction { transaction -> Peer? in + return transaction.getPeer(memberId) } - guard let apiChannel = apiInputChannel(channel) else { + |> introduceError(ChannelOwnershipTransferError.self) + |> mapToSignal { user -> Signal in + guard let user = user else { return .fail(.generic) } guard let apiUser = apiInputUser(user) else { return .fail(.generic) } - let checkPassword: Signal - if let password = password, !password.isEmpty { - checkPassword = twoStepAuthData(network) - |> mapError { _ in ChannelOwnershipTransferError.generic } - |> mapToSignal { authData -> Signal in - if let currentPasswordDerivation = authData.currentPasswordDerivation, let srpSessionData = authData.srpSessionData { - guard let kdfResult = passwordKDF(password: password, derivation: currentPasswordDerivation, srpSessionData: srpSessionData) else { - return .fail(.generic) - } - return .single(.inputCheckPasswordSRP(srpId: kdfResult.id, A: Buffer(data: kdfResult.A), M1: Buffer(data: kdfResult.M1))) - } else { - return .fail(.twoStepAuthMissing) + return network.request(Api.functions.channels.editCreator(channel: .inputChannelEmpty, userId: apiUser, password: .inputCheckPasswordEmpty)) + |> mapError { error -> ChannelOwnershipTransferError in + if error.errorDescription == "PASSWORD_HASH_INVALID" { + return .requestPassword + } else if error.errorDescription == "PASSWORD_MISSING" { + return .twoStepAuthMissing + } else if error.errorDescription.hasPrefix("PASSWORD_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "PASSWORD_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .twoStepAuthTooFresh(value) } + } else if error.errorDescription.hasPrefix("SESSION_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "SESSION_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .authSessionTooFresh(value) + } + } else if error.errorDescription == "CHANNELS_ADMIN_PUBLIC_TOO_MUCH" { + return .userPublicChannelsTooMuch + } else if error.errorDescription == "CHANNELS_ADMIN_LOCATED_TOO_MUCH" { + return .userLocatedGroupsTooMuch + } else if error.errorDescription == "ADMINS_TOO_MUCH" { + return .adminsTooMuch + } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { + return .restricted + } else if error.errorDescription == "USER_BLOCKED" { + return .userBlocked } - } else { - checkPassword = .single(.inputCheckPasswordEmpty) + return .generic } - - return checkPassword - |> mapToSignal { password -> Signal in - return network.request(Api.functions.channels.editCreator(channel: apiChannel, userId: apiUser, password: password)) - |> mapError { error -> ChannelOwnershipTransferError in - if error.errorDescription == "PASSWORD_HASH_INVALID" { - if case .inputCheckPasswordEmpty = password { - return .requestPassword - } else { - return .invalidPassword - } - } else if error.errorDescription == "PASSWORD_MISSING" { - return .twoStepAuthMissing - } else if error.errorDescription.hasPrefix("PASSWORD_TOO_FRESH_") { - let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "PASSWORD_TOO_FRESH_".count)...]) - if let value = Int32(timeout) { - return .twoStepAuthTooFresh(value) - } - } else if error.errorDescription.hasPrefix("SESSION_TOO_FRESH_") { - let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "SESSION_TOO_FRESH_".count)...]) - if let value = Int32(timeout) { - return .authSessionTooFresh(value) - } - } else if error.errorDescription == "CHANNELS_ADMIN_PUBLIC_TOO_MUCH" { - return .userPublicChannelsTooMuch - } else if error.errorDescription == "ADMINS_TOO_MUCH" { - return .adminsTooMuch - } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { - return .restricted - } else if error.errorDescription == "USER_BLOCKED" { - return .userBlocked - } - return .generic - } - |> mapToSignal { updates -> Signal in - accountStateManager.addUpdates(updates) - return.complete() - } + |> mapToSignal { updates -> Signal in + accountStateManager.addUpdates(updates) + return.complete() } } } + +public func updateChannelOwnership(account: Account, accountStateManager: AccountStateManager, channelId: PeerId, memberId: PeerId, password: String) -> Signal<[(ChannelParticipant?, RenderedChannelParticipant)], ChannelOwnershipTransferError> { + guard !password.isEmpty else { + return .fail(.invalidPassword) + } + + return combineLatest(fetchChannelParticipant(account: account, peerId: channelId, participantId: account.peerId), fetchChannelParticipant(account: account, peerId: channelId, participantId: memberId)) + |> mapError { error -> ChannelOwnershipTransferError in + return .generic + } + |> mapToSignal { currentCreator, currentParticipant -> Signal<[(ChannelParticipant?, RenderedChannelParticipant)], ChannelOwnershipTransferError> in + return account.postbox.transaction { transaction -> Signal<[(ChannelParticipant?, RenderedChannelParticipant)], ChannelOwnershipTransferError> in + if let channel = transaction.getPeer(channelId) as? TelegramChannel, let inputChannel = apiInputChannel(channel), let accountUser = transaction.getPeer(account.peerId), let user = transaction.getPeer(memberId), let inputUser = apiInputUser(user) { + + var flags: TelegramChatAdminRightsFlags + if case .broadcast = channel.info { + flags = TelegramChatAdminRightsFlags.broadcastSpecific + } else { + flags = TelegramChatAdminRightsFlags.groupSpecific + } + + let updatedParticipant = ChannelParticipant.creator(id: user.id) + let updatedPreviousCreator = ChannelParticipant.member(id: accountUser.id, invitedAt: Int32(Date().timeIntervalSince1970), adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: flags), promotedBy: accountUser.id, canBeEditedByAccountPeer: false), banInfo: nil) + + let checkPassword = twoStepAuthData(account.network) + |> mapError { error -> ChannelOwnershipTransferError in + if error.errorDescription.hasPrefix("FLOOD_WAIT") { + return .limitExceeded + } else { + return .generic + } + } + |> mapToSignal { authData -> Signal in + if let currentPasswordDerivation = authData.currentPasswordDerivation, let srpSessionData = authData.srpSessionData { + guard let kdfResult = passwordKDF(password: password, derivation: currentPasswordDerivation, srpSessionData: srpSessionData) else { + return .fail(.generic) + } + return .single(.inputCheckPasswordSRP(srpId: kdfResult.id, A: Buffer(data: kdfResult.A), M1: Buffer(data: kdfResult.M1))) + } else { + return .fail(.twoStepAuthMissing) + } + } + + return checkPassword + |> mapToSignal { password -> Signal<[(ChannelParticipant?, RenderedChannelParticipant)], ChannelOwnershipTransferError> in + return account.network.request(Api.functions.channels.editCreator(channel: inputChannel, userId: inputUser, password: password), automaticFloodWait: false) + |> mapError { error -> ChannelOwnershipTransferError in + if error.errorDescription.hasPrefix("FLOOD_WAIT") { + return .limitExceeded + } else if error.errorDescription == "PASSWORD_HASH_INVALID" { + return .invalidPassword + } else if error.errorDescription == "PASSWORD_MISSING" { + return .twoStepAuthMissing + } else if error.errorDescription.hasPrefix("PASSWORD_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "PASSWORD_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .twoStepAuthTooFresh(value) + } + } else if error.errorDescription.hasPrefix("SESSION_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "SESSION_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .authSessionTooFresh(value) + } + } else if error.errorDescription == "CHANNELS_ADMIN_PUBLIC_TOO_MUCH" { + return .userPublicChannelsTooMuch + } else if error.errorDescription == "CHANNELS_ADMIN_LOCATED_TOO_MUCH" { + return .userLocatedGroupsTooMuch + } else if error.errorDescription == "ADMINS_TOO_MUCH" { + return .adminsTooMuch + } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { + return .restricted + } else if error.errorDescription == "USER_BLOCKED" { + return .userBlocked + } + return .generic + } + |> mapToSignal { updates -> Signal<[(ChannelParticipant?, RenderedChannelParticipant)], ChannelOwnershipTransferError> in + accountStateManager.addUpdates(updates) + + return account.postbox.transaction { transaction -> [(ChannelParticipant?, RenderedChannelParticipant)] in + transaction.updatePeerCachedData(peerIds: Set([channelId]), update: { _, cachedData -> CachedPeerData? in + if let cachedData = cachedData as? CachedChannelData, let adminCount = cachedData.participantsSummary.adminCount { + var updatedAdminCount = adminCount + var wasAdmin = false + if let currentParticipant = currentParticipant { + switch currentParticipant { + case .creator: + wasAdmin = true + case let .member(_, _, adminInfo, _): + if let adminInfo = adminInfo, !adminInfo.rights.isEmpty { + wasAdmin = true + } + } + } + if !wasAdmin { + updatedAdminCount = adminCount + 1 + } + + return cachedData.withUpdatedParticipantsSummary(cachedData.participantsSummary.withUpdatedAdminCount(updatedAdminCount)) + } else { + return cachedData + } + }) + var peers: [PeerId: Peer] = [:] + var presences: [PeerId: PeerPresence] = [:] + peers[accountUser.id] = accountUser + if let presence = transaction.getPeerPresence(peerId: accountUser.id) { + presences[accountUser.id] = presence + } + peers[user.id] = user + if let presence = transaction.getPeerPresence(peerId: user.id) { + presences[user.id] = presence + } + return [(currentCreator, RenderedChannelParticipant(participant: updatedPreviousCreator, peer: accountUser, peers: peers, presences: presences)), (currentParticipant, RenderedChannelParticipant(participant: updatedParticipant, peer: user, peers: peers, presences: presences))] + } + |> mapError { _ -> ChannelOwnershipTransferError in return .generic } + } + } + } else { + return .fail(.generic) + } + } + |> mapError { _ -> ChannelOwnershipTransferError in return .generic } + |> switchToLatest + } +} diff --git a/submodules/TelegramCore/TelegramCore/ChannelParticipants.swift b/submodules/TelegramCore/TelegramCore/ChannelParticipants.swift index 76e4c9bae6..f82a167beb 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelParticipants.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelParticipants.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ChannelState.swift b/submodules/TelegramCore/TelegramCore/ChannelState.swift index 56694abad0..1bcbc39a2d 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelState.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelState.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif final class ChannelState: PeerChatState, Equatable, CustomStringConvertible { diff --git a/submodules/TelegramCore/TelegramCore/ChannelStats.swift b/submodules/TelegramCore/TelegramCore/ChannelStats.swift index 4e1b8a9f63..8b04dc2051 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelStats.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelStats.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif public enum ChannelStatsUrlError { diff --git a/submodules/TelegramCore/TelegramCore/ChatContextResult.swift b/submodules/TelegramCore/TelegramCore/ChatContextResult.swift index 8a507cf753..a97cae03b7 100644 --- a/submodules/TelegramCore/TelegramCore/ChatContextResult.swift +++ b/submodules/TelegramCore/TelegramCore/ChatContextResult.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ChatHistoryPreloadManager.swift b/submodules/TelegramCore/TelegramCore/ChatHistoryPreloadManager.swift index 9d9f27f5f6..c04d7f31d3 100644 --- a/submodules/TelegramCore/TelegramCore/ChatHistoryPreloadManager.swift +++ b/submodules/TelegramCore/TelegramCore/ChatHistoryPreloadManager.swift @@ -143,7 +143,6 @@ private final class HistoryPreloadViewContext { private enum ChatHistoryPreloadEntity: Hashable { case peer(PeerId) - //case group(PeerGroupId) } private struct ChatHistoryPreloadIndex { @@ -317,7 +316,9 @@ final class ChatHistoryPreloadManager { return } #if DEBUG - //return; + if true { + //return + } #endif var indices: [(ChatHistoryPreloadIndex, Bool, Bool)] = [] for entry in view.0.entries { diff --git a/submodules/TelegramCore/TelegramCore/ChatOnlineMembers.swift b/submodules/TelegramCore/TelegramCore/ChatOnlineMembers.swift index bd174f6a3d..1689e5d350 100644 --- a/submodules/TelegramCore/TelegramCore/ChatOnlineMembers.swift +++ b/submodules/TelegramCore/TelegramCore/ChatOnlineMembers.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif public func chatOnlineMembers(postbox: Postbox, network: Network, peerId: PeerId) -> Signal { diff --git a/submodules/TelegramCore/TelegramCore/ClearCloudDrafts.swift b/submodules/TelegramCore/TelegramCore/ClearCloudDrafts.swift index 84fc54d390..39f37487fd 100644 --- a/submodules/TelegramCore/TelegramCore/ClearCloudDrafts.swift +++ b/submodules/TelegramCore/TelegramCore/ClearCloudDrafts.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox import SwiftSignalKit +import TelegramApi #endif public func clearCloudDraftsInteractively(postbox: Postbox, network: Network, accountPeerId: PeerId) -> Signal { diff --git a/submodules/TelegramCore/TelegramCore/CloudFileMediaResource.swift b/submodules/TelegramCore/TelegramCore/CloudFileMediaResource.swift index 612b332703..36883a5a57 100644 --- a/submodules/TelegramCore/TelegramCore/CloudFileMediaResource.swift +++ b/submodules/TelegramCore/TelegramCore/CloudFileMediaResource.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif protocol TelegramCloudMediaResource: TelegramMediaResource { diff --git a/submodules/TelegramCore/TelegramCore/ConfirmTwoStepRecoveryEmail.swift b/submodules/TelegramCore/TelegramCore/ConfirmTwoStepRecoveryEmail.swift index 3f0fa37428..b41c81ed52 100644 --- a/submodules/TelegramCore/TelegramCore/ConfirmTwoStepRecoveryEmail.swift +++ b/submodules/TelegramCore/TelegramCore/ConfirmTwoStepRecoveryEmail.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else import SwiftSignalKit +import TelegramApi #if BUCK import MtProtoKit #else @@ -11,6 +13,7 @@ import SwiftSignalKit #endif #endif + public enum ConfirmTwoStepRecoveryEmailError { case invalidEmail case invalidCode diff --git a/submodules/TelegramCore/TelegramCore/ContactManagement.swift b/submodules/TelegramCore/TelegramCore/ContactManagement.swift index a8c7b2d4bb..8c3b084046 100644 --- a/submodules/TelegramCore/TelegramCore/ContactManagement.swift +++ b/submodules/TelegramCore/TelegramCore/ContactManagement.swift @@ -2,7 +2,9 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else + import TelegramApi import Postbox import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift b/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift index c6ccd94841..c6375e3b8f 100644 --- a/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift +++ b/submodules/TelegramCore/TelegramCore/ContactSyncManager.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox import SwiftSignalKit +import TelegramApi #endif private final class ContactSyncOperation { diff --git a/submodules/TelegramCore/TelegramCore/ConvertGroupToSupergroup.swift b/submodules/TelegramCore/TelegramCore/ConvertGroupToSupergroup.swift index f94892bced..3368c652c1 100644 --- a/submodules/TelegramCore/TelegramCore/ConvertGroupToSupergroup.swift +++ b/submodules/TelegramCore/TelegramCore/ConvertGroupToSupergroup.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -19,7 +21,7 @@ public enum ConvertGroupToSupergroupError { public func convertGroupToSupergroup(account: Account, peerId: PeerId) -> Signal { return account.network.request(Api.functions.messages.migrateChat(chatId: peerId.id)) - |> mapError { _ -> ConvertGroupToSupergroupError in + |> mapError { error -> ConvertGroupToSupergroupError in return .generic } |> timeout(5.0, queue: Queue.concurrentDefaultQueue(), alternate: .fail(.generic)) diff --git a/submodules/TelegramCore/TelegramCore/CreateGroup.swift b/submodules/TelegramCore/TelegramCore/CreateGroup.swift index cf1fc64d9d..6a2bc5d015 100644 --- a/submodules/TelegramCore/TelegramCore/CreateGroup.swift +++ b/submodules/TelegramCore/TelegramCore/CreateGroup.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -17,6 +19,7 @@ public enum CreateGroupError { case generic case privacy case restricted + case tooMuchLocationBasedGroups } public func createGroup(account: Account, title: String, peerIds: [PeerId]) -> Signal { diff --git a/submodules/TelegramCore/TelegramCore/CreateSecretChat.swift b/submodules/TelegramCore/TelegramCore/CreateSecretChat.swift index c3bcacb0a1..4bfbcf34f6 100644 --- a/submodules/TelegramCore/TelegramCore/CreateSecretChat.swift +++ b/submodules/TelegramCore/TelegramCore/CreateSecretChat.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/DeepLinkInfo.swift b/submodules/TelegramCore/TelegramCore/DeepLinkInfo.swift index c473c19ffd..dcf8c4d829 100644 --- a/submodules/TelegramCore/TelegramCore/DeepLinkInfo.swift +++ b/submodules/TelegramCore/TelegramCore/DeepLinkInfo.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import SwiftSignalKitMac +import TelegramApiMac #else import SwiftSignalKit +import TelegramApi #endif public struct DeepLinkInfo { diff --git a/submodules/TelegramCore/TelegramCore/DeleteAccount.swift b/submodules/TelegramCore/TelegramCore/DeleteAccount.swift new file mode 100644 index 0000000000..336862467f --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/DeleteAccount.swift @@ -0,0 +1,22 @@ +import Foundation +#if os(macOS) +import SwiftSignalKitMac +import PostboxMac +import TelegramApiMac +#else +import SwiftSignalKit +import Postbox +import TelegramApi +#endif + +public enum DeleteAccountError { + case generic +} + +public func deleteAccount(account: Account) -> Signal { + return account.network.request(Api.functions.account.deleteAccount(reason: "GDPR")) + |> mapError { _ -> DeleteAccountError in + return .generic + } + |> ignoreValues +} diff --git a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift index 10214a7dfa..656e883e7c 100644 --- a/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift +++ b/submodules/TelegramCore/TelegramCore/DeleteMessagesInteractively.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/Download.swift b/submodules/TelegramCore/TelegramCore/Download.swift index 6d20992cc6..9b1f814f11 100644 --- a/submodules/TelegramCore/TelegramCore/Download.swift +++ b/submodules/TelegramCore/TelegramCore/Download.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift index 23619413e2..f1725a95b1 100644 --- a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift +++ b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/ExportMessageLink.swift b/submodules/TelegramCore/TelegramCore/ExportMessageLink.swift index 1f80968584..ce3d309dec 100644 --- a/submodules/TelegramCore/TelegramCore/ExportMessageLink.swift +++ b/submodules/TelegramCore/TelegramCore/ExportMessageLink.swift @@ -2,12 +2,13 @@ #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif - public func exportMessageLink(account: Account, peerId: PeerId, messageId: MessageId) -> Signal { return account.postbox.transaction { transaction -> Peer? in return transaction.getPeer(peerId) diff --git a/submodules/TelegramCore/TelegramCore/ExportedInvitation.swift b/submodules/TelegramCore/TelegramCore/ExportedInvitation.swift index 1e60aa6243..972ce71639 100644 --- a/submodules/TelegramCore/TelegramCore/ExportedInvitation.swift +++ b/submodules/TelegramCore/TelegramCore/ExportedInvitation.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct ExportedInvitation: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/FetchChatList.swift b/submodules/TelegramCore/TelegramCore/FetchChatList.swift index ce48d62079..303e6bc334 100644 --- a/submodules/TelegramCore/TelegramCore/FetchChatList.swift +++ b/submodules/TelegramCore/TelegramCore/FetchChatList.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/FindChannelById.swift b/submodules/TelegramCore/TelegramCore/FindChannelById.swift index 0d9b8bd20e..e0b7d0fadf 100644 --- a/submodules/TelegramCore/TelegramCore/FindChannelById.swift +++ b/submodules/TelegramCore/TelegramCore/FindChannelById.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif public func findChannelById(postbox: Postbox, network: Network, channelId: Int32) -> Signal { diff --git a/submodules/TelegramCore/TelegramCore/ForwardGame.swift b/submodules/TelegramCore/TelegramCore/ForwardGame.swift index b4d09b4e95..d782cc890e 100644 --- a/submodules/TelegramCore/TelegramCore/ForwardGame.swift +++ b/submodules/TelegramCore/TelegramCore/ForwardGame.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/GlobalNotificationSettings.swift b/submodules/TelegramCore/TelegramCore/GlobalNotificationSettings.swift index b0f35b538b..06320fcb29 100644 --- a/submodules/TelegramCore/TelegramCore/GlobalNotificationSettings.swift +++ b/submodules/TelegramCore/TelegramCore/GlobalNotificationSettings.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct MessageNotificationSettings: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/GrantSecureIdAccess.swift b/submodules/TelegramCore/TelegramCore/GrantSecureIdAccess.swift index a04eb8f92b..6058e3e96a 100644 --- a/submodules/TelegramCore/TelegramCore/GrantSecureIdAccess.swift +++ b/submodules/TelegramCore/TelegramCore/GrantSecureIdAccess.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/GroupFeedPeers.swift b/submodules/TelegramCore/TelegramCore/GroupFeedPeers.swift deleted file mode 100644 index b8bc9f4212..0000000000 --- a/submodules/TelegramCore/TelegramCore/GroupFeedPeers.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -#if os(macOS) - import PostboxMac - import SwiftSignalKitMac -#else - import Postbox - import SwiftSignalKit -#endif - -public func availableGroupFeedPeers(postbox: Postbox, network: Network, groupId: PeerGroupId) -> Signal<[(Peer, Bool)], NoError> { - /*feed*/ - return .single([]) - /*return network.request(Api.functions.channels.getFeedSources(flags: 0, feedId: groupId.rawValue, hash: 0)) - |> retryRequest - |> mapToSignal { result -> Signal<[(Peer, Bool)], NoError> in - return postbox.transaction { transaction -> [(Peer, Bool)] in - switch result { - case .feedSourcesNotModified: - return [] - case let .feedSources(_, newlyJoinedFeed, feeds, chats, users): - var includedPeerIds = Set() - var excludedPeerIds = Set() - for feedsInfo in feeds { - switch feedsInfo { - case let .feedBroadcasts(feedId, channels): - if feedId == groupId.rawValue { - for id in channels { - includedPeerIds.insert(PeerId(namespace: Namespaces.Peer.CloudChannel, id: id)) - } - } - case let .feedBroadcastsUngrouped(channels): - for id in channels { - excludedPeerIds.insert(PeerId(namespace: Namespaces.Peer.CloudChannel, id: id)) - } - } - } - var peers: [(Peer, Bool)] = [] - for peerId in includedPeerIds { - if let peer = transaction.getPeer(peerId) { - peers.append((peer, true)) - } - } - for peerId in excludedPeerIds { - if let peer = transaction.getPeer(peerId) { - peers.append((peer, false)) - } - } - return peers - } - } - }*/ -} diff --git a/submodules/TelegramCore/TelegramCore/GroupReturnAndLeft.swift b/submodules/TelegramCore/TelegramCore/GroupReturnAndLeft.swift index 3a7bd2d1f4..6606d85d5a 100644 --- a/submodules/TelegramCore/TelegramCore/GroupReturnAndLeft.swift +++ b/submodules/TelegramCore/TelegramCore/GroupReturnAndLeft.swift @@ -3,9 +3,11 @@ import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -13,7 +15,6 @@ #endif #endif - public func returnGroup(account: Account, peerId: PeerId) -> Signal { return account.postbox.loadedPeerWithId(account.peerId) |> take(1) diff --git a/submodules/TelegramCore/TelegramCore/GroupsInCommon.swift b/submodules/TelegramCore/TelegramCore/GroupsInCommon.swift index 3e18dfedb1..64a91fe6dc 100644 --- a/submodules/TelegramCore/TelegramCore/GroupsInCommon.swift +++ b/submodules/TelegramCore/TelegramCore/GroupsInCommon.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/HistoryViewChannelStateValidation.swift b/submodules/TelegramCore/TelegramCore/HistoryViewChannelStateValidation.swift index 847fb10b3a..02ac52a32e 100644 --- a/submodules/TelegramCore/TelegramCore/HistoryViewChannelStateValidation.swift +++ b/submodules/TelegramCore/TelegramCore/HistoryViewChannelStateValidation.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/Holes.swift b/submodules/TelegramCore/TelegramCore/Holes.swift index 5ffc3d3f3e..1b7511e425 100644 --- a/submodules/TelegramCore/TelegramCore/Holes.swift +++ b/submodules/TelegramCore/TelegramCore/Holes.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ImageRepresentationsUtils.swift b/submodules/TelegramCore/TelegramCore/ImageRepresentationsUtils.swift index a649f38d95..15729290e9 100644 --- a/submodules/TelegramCore/TelegramCore/ImageRepresentationsUtils.swift +++ b/submodules/TelegramCore/TelegramCore/ImageRepresentationsUtils.swift @@ -1,8 +1,10 @@ #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif public func smallestImageRepresentation(_ representations: [TelegramMediaImageRepresentation]) -> TelegramMediaImageRepresentation? { diff --git a/submodules/TelegramCore/TelegramCore/ImportContact.swift b/submodules/TelegramCore/TelegramCore/ImportContact.swift index 37e0f5eb40..8c948bb78a 100644 --- a/submodules/TelegramCore/TelegramCore/ImportContact.swift +++ b/submodules/TelegramCore/TelegramCore/ImportContact.swift @@ -1,8 +1,10 @@ #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif @@ -44,7 +46,7 @@ public enum AddContactError { case generic } -public func addContactInteractively(account: Account, peerId: PeerId, firstName: String, lastName: String, phoneNumber: String) -> Signal { +public func addContactInteractively(account: Account, peerId: PeerId, firstName: String, lastName: String, phoneNumber: String, addToPrivacyExceptions: Bool) -> Signal { return account.postbox.transaction { transaction -> (Api.InputUser, String)? in if let user = transaction.getPeer(peerId) as? TelegramUser, let inputUser = apiInputUser(user) { return (inputUser, user.phone == nil ? phoneNumber : "") @@ -57,7 +59,11 @@ public func addContactInteractively(account: Account, peerId: PeerId, firstName: guard let (inputUser, phone) = inputUserAndPhone else { return .fail(.generic) } - return account.network.request(Api.functions.contacts.addContact(id: inputUser, firstName: firstName, lastName: lastName, phone: phone)) + var flags: Int32 = 0 + if addToPrivacyExceptions { + flags |= (1 << 0) + } + return account.network.request(Api.functions.contacts.addContact(flags: flags, id: inputUser, firstName: firstName, lastName: lastName, phone: phone)) |> mapError { _ -> AddContactError in return .generic } diff --git a/submodules/TelegramCore/TelegramCore/InstallInteractiveReadMessagesAction.swift b/submodules/TelegramCore/TelegramCore/InstallInteractiveReadMessagesAction.swift index 5ad59d37cd..564aad69bb 100644 --- a/submodules/TelegramCore/TelegramCore/InstallInteractiveReadMessagesAction.swift +++ b/submodules/TelegramCore/TelegramCore/InstallInteractiveReadMessagesAction.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/InstantPage.swift b/submodules/TelegramCore/TelegramCore/InstantPage.swift index 677240c944..360a7962d3 100644 --- a/submodules/TelegramCore/TelegramCore/InstantPage.swift +++ b/submodules/TelegramCore/TelegramCore/InstantPage.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif private enum InstantPageBlockType: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/InvitationLinks.swift b/submodules/TelegramCore/TelegramCore/InvitationLinks.swift index 95b72efe06..8f35202636 100644 --- a/submodules/TelegramCore/TelegramCore/InvitationLinks.swift +++ b/submodules/TelegramCore/TelegramCore/InvitationLinks.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/JSON.swift b/submodules/TelegramCore/TelegramCore/JSON.swift index d9a365242c..07f8ba6638 100644 --- a/submodules/TelegramCore/TelegramCore/JSON.swift +++ b/submodules/TelegramCore/TelegramCore/JSON.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac +import TelegramApiMac #else import Postbox +import TelegramApi #endif public indirect enum JSON: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/JoinChannel.swift b/submodules/TelegramCore/TelegramCore/JoinChannel.swift index 253165666c..00c7d3770b 100644 --- a/submodules/TelegramCore/TelegramCore/JoinChannel.swift +++ b/submodules/TelegramCore/TelegramCore/JoinChannel.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/JoinLink.swift b/submodules/TelegramCore/TelegramCore/JoinLink.swift index aec3b91426..b204bb6da5 100644 --- a/submodules/TelegramCore/TelegramCore/JoinLink.swift +++ b/submodules/TelegramCore/TelegramCore/JoinLink.swift @@ -2,9 +2,11 @@ import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift b/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift index 4b9cf9d510..1d545a67e8 100644 --- a/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift +++ b/submodules/TelegramCore/TelegramCore/LoadMessagesIfNecessary.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/LoadedPeer.swift b/submodules/TelegramCore/TelegramCore/LoadedPeer.swift index 96bfba6734..81eda2ea5c 100644 --- a/submodules/TelegramCore/TelegramCore/LoadedPeer.swift +++ b/submodules/TelegramCore/TelegramCore/LoadedPeer.swift @@ -1,8 +1,10 @@ #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/LoadedPeerFromMessage.swift b/submodules/TelegramCore/TelegramCore/LoadedPeerFromMessage.swift index 169f4f702c..a15637b8ce 100644 --- a/submodules/TelegramCore/TelegramCore/LoadedPeerFromMessage.swift +++ b/submodules/TelegramCore/TelegramCore/LoadedPeerFromMessage.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif @@ -11,7 +13,7 @@ public func loadedPeerFromMessage(account: Account, peerId: PeerId, messageId: M return account.postbox.transaction { transaction -> Signal in if let peer = transaction.getPeer(peerId) { if let user = peer as? TelegramUser { - if user.accessHash != 0 { + if let accessHash = user.accessHash, accessHash.value != 0 { return .single(user) } else { let messageSignal: Signal? @@ -49,7 +51,7 @@ public func loadedPeerFromMessage(account: Account, peerId: PeerId, messageId: M for user in apiUsers { let telegramUser = TelegramUser(user: user) - if telegramUser.id == peerId && telegramUser.accessHash != 0 { + if telegramUser.id == peerId, let accessHash = telegramUser.accessHash, accessHash.value != 0 { if let presence = TelegramUserPresence(apiUser: user) { updatePeerPresences(transaction: transaction, accountPeerId: account.peerId, peerPresences: [telegramUser.id: presence]) } diff --git a/submodules/TelegramCore/TelegramCore/LoadedStickerPack.swift b/submodules/TelegramCore/TelegramCore/LoadedStickerPack.swift index 32035393d2..a2c7843238 100644 --- a/submodules/TelegramCore/TelegramCore/LoadedStickerPack.swift +++ b/submodules/TelegramCore/TelegramCore/LoadedStickerPack.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/LocalizationInfo.swift b/submodules/TelegramCore/TelegramCore/LocalizationInfo.swift index 7f40c85ea0..a364fae4bb 100644 --- a/submodules/TelegramCore/TelegramCore/LocalizationInfo.swift +++ b/submodules/TelegramCore/TelegramCore/LocalizationInfo.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct LocalizationInfo: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/LocalizationListState.swift b/submodules/TelegramCore/TelegramCore/LocalizationListState.swift index bfbb48c39f..8bc1e1df18 100644 --- a/submodules/TelegramCore/TelegramCore/LocalizationListState.swift +++ b/submodules/TelegramCore/TelegramCore/LocalizationListState.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox import SwiftSignalKit +import TelegramApi #endif public struct LocalizationListState: PreferencesEntry, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/LocalizationPreview.swift b/submodules/TelegramCore/TelegramCore/LocalizationPreview.swift index 0c72cf5096..530abe7cea 100644 --- a/submodules/TelegramCore/TelegramCore/LocalizationPreview.swift +++ b/submodules/TelegramCore/TelegramCore/LocalizationPreview.swift @@ -2,7 +2,9 @@ import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK @@ -12,6 +14,7 @@ import SwiftSignalKit #endif #endif + public enum RequestLocalizationPreviewError { case generic } diff --git a/submodules/TelegramCore/TelegramCore/Localizations.swift b/submodules/TelegramCore/TelegramCore/Localizations.swift index 36565b81b1..b103075aab 100644 --- a/submodules/TelegramCore/TelegramCore/Localizations.swift +++ b/submodules/TelegramCore/TelegramCore/Localizations.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/ManageChannelDiscussionGroup.swift b/submodules/TelegramCore/TelegramCore/ManageChannelDiscussionGroup.swift index 41a3bf19c9..495405972f 100644 --- a/submodules/TelegramCore/TelegramCore/ManageChannelDiscussionGroup.swift +++ b/submodules/TelegramCore/TelegramCore/ManageChannelDiscussionGroup.swift @@ -2,11 +2,14 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif + public enum AvailableChannelDiscussionGroupError { case generic } @@ -41,7 +44,6 @@ public enum ChannelDiscussionGroupError { } public func updateGroupDiscussionForChannel(network: Network, postbox: Postbox, channelId: PeerId, groupId: PeerId?) -> Signal { - return postbox.transaction { transaction -> (channel: Peer?, group: Peer?) in return (channel: transaction.getPeer(channelId), group: groupId != nil ? transaction.getPeer(groupId!) : nil) } @@ -101,5 +103,4 @@ public func updateGroupDiscussionForChannel(network: Network, postbox: Postbox, return .single(result) } } - } diff --git a/submodules/TelegramCore/TelegramCore/ManagedAccountPresence.swift b/submodules/TelegramCore/TelegramCore/ManagedAccountPresence.swift index 9e11f5d70f..c81fe98124 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedAccountPresence.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedAccountPresence.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/ManagedAppConfigurationUpdates.swift b/submodules/TelegramCore/TelegramCore/ManagedAppConfigurationUpdates.swift index 7f99224b2a..4b364abcf7 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedAppConfigurationUpdates.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedAppConfigurationUpdates.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedAutodownloadSettingsUpdates.swift b/submodules/TelegramCore/TelegramCore/ManagedAutodownloadSettingsUpdates.swift index ae0623707a..8bfdb7ea78 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedAutodownloadSettingsUpdates.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedAutodownloadSettingsUpdates.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedAutoremoveMessageOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedAutoremoveMessageOperations.swift index 4a4c1c7f4e..2f4532fc1d 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedAutoremoveMessageOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedAutoremoveMessageOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift index 8475bf1439..1ea8492b16 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedConfigurationUpdates.swift b/submodules/TelegramCore/TelegramCore/ManagedConfigurationUpdates.swift index 244d22fb1f..3b24e17550 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedConfigurationUpdates.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedConfigurationUpdates.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedConsumePersonalMessagesActions.swift b/submodules/TelegramCore/TelegramCore/ManagedConsumePersonalMessagesActions.swift index 1b05b931ef..ffff3c965e 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedConsumePersonalMessagesActions.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedConsumePersonalMessagesActions.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedGlobalNotificationSettings.swift b/submodules/TelegramCore/TelegramCore/ManagedGlobalNotificationSettings.swift index 036e9518c7..0557fc2705 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedGlobalNotificationSettings.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedGlobalNotificationSettings.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedLocalInputActivities.swift b/submodules/TelegramCore/TelegramCore/ManagedLocalInputActivities.swift index 61b719b382..17518968b6 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedLocalInputActivities.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedLocalInputActivities.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedLocalizationUpdatesOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedLocalizationUpdatesOperations.swift index cc5e2378c8..3aa1779f4d 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedLocalizationUpdatesOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedLocalizationUpdatesOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedPendingPeerNotificationSettings.swift b/submodules/TelegramCore/TelegramCore/ManagedPendingPeerNotificationSettings.swift index b85452c543..b9d9149333 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedPendingPeerNotificationSettings.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedPendingPeerNotificationSettings.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedProxyInfoUpdates.swift b/submodules/TelegramCore/TelegramCore/ManagedProxyInfoUpdates.swift index 6a1735bedc..34a57147e1 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedProxyInfoUpdates.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedProxyInfoUpdates.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/ManagedRecentStickers.swift b/submodules/TelegramCore/TelegramCore/ManagedRecentStickers.swift index a676e9e5be..ad984252ce 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedRecentStickers.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedRecentStickers.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/ManagedSecretChatOutgoingOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSecretChatOutgoingOperations.swift index 1b4945c3d0..d716a24340 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSecretChatOutgoingOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSecretChatOutgoingOperations.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #if BUCK import MtProtoKit @@ -14,6 +16,7 @@ import Foundation import UIKit #endif + func addSecretChatOutgoingOperation(transaction: Transaction, peerId: PeerId, operation: SecretChatOutgoingOperationContents, state: SecretChatState) -> SecretChatState { var updatedState = state switch updatedState.embeddedState { diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeAppLogEventsOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeAppLogEventsOperations.swift index 94011ec2a6..24c939ee30 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeAppLogEventsOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeAppLogEventsOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeChatInputStateOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeChatInputStateOperations.swift index fa98283cc4..d534b46a48 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeChatInputStateOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeChatInputStateOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeConsumeMessageContentsOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeConsumeMessageContentsOperations.swift index f41961288c..c8ace296c4 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeConsumeMessageContentsOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeConsumeMessageContentsOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeEmojiKeywordsOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeEmojiKeywordsOperations.swift index 9eed6d065a..4773e2d9c7 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeEmojiKeywordsOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeEmojiKeywordsOperations.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupMessageStats.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupMessageStats.swift index 0edd84fa94..ea8f584d71 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupMessageStats.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupMessageStats.swift @@ -2,11 +2,12 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox import SwiftSignalKit +import TelegramApi #endif - private final class ManagedSynchronizeGroupMessageStatsState { private var synchronizeDisposables: [PeerGroupAndNamespace: Disposable] = [:] diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupedPeersOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupedPeersOperations.swift index 66e5620a80..872d537fb3 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupedPeersOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeGroupedPeersOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeInstalledStickerPacksOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeInstalledStickerPacksOperations.swift index d51cf62640..977a558c14 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeInstalledStickerPacksOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeInstalledStickerPacksOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift index c6b65ba12f..239f132567 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkFeaturedStickerPacksAsSeenOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkFeaturedStickerPacksAsSeenOperations.swift index 588b42d49e..35f3e823de 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkFeaturedStickerPacksAsSeenOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeMarkFeaturedStickerPacksAsSeenOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift index 2bf09e2285..50edb4ccf5 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeRecentlyUsedMediaOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeRecentlyUsedMediaOperations.swift index ad6ddc68b5..e932a72cb1 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeRecentlyUsedMediaOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeRecentlyUsedMediaOperations.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedGifsOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedGifsOperations.swift index 02d77d2686..6ea80a781b 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedGifsOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedGifsOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedStickersOperations.swift b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedStickersOperations.swift index e4c206538e..034801dda7 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedStickersOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedSynchronizeSavedStickersOperations.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ManagedVoipConfigurationUpdates.swift b/submodules/TelegramCore/TelegramCore/ManagedVoipConfigurationUpdates.swift index b3be41ac0e..0852dd7544 100644 --- a/submodules/TelegramCore/TelegramCore/ManagedVoipConfigurationUpdates.swift +++ b/submodules/TelegramCore/TelegramCore/ManagedVoipConfigurationUpdates.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/MarkAllChatsAsRead.swift b/submodules/TelegramCore/TelegramCore/MarkAllChatsAsRead.swift index c2d0d9ad1b..6607d16c28 100644 --- a/submodules/TelegramCore/TelegramCore/MarkAllChatsAsRead.swift +++ b/submodules/TelegramCore/TelegramCore/MarkAllChatsAsRead.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/MarkMessageContentAsConsumedInteractively.swift b/submodules/TelegramCore/TelegramCore/MarkMessageContentAsConsumedInteractively.swift index e878335882..51c91c09a4 100644 --- a/submodules/TelegramCore/TelegramCore/MarkMessageContentAsConsumedInteractively.swift +++ b/submodules/TelegramCore/TelegramCore/MarkMessageContentAsConsumedInteractively.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/MemoryBufferExtensions.swift b/submodules/TelegramCore/TelegramCore/MemoryBufferExtensions.swift index 6dc8dbc7c9..4ca56f7bd2 100644 --- a/submodules/TelegramCore/TelegramCore/MemoryBufferExtensions.swift +++ b/submodules/TelegramCore/TelegramCore/MemoryBufferExtensions.swift @@ -1,10 +1,13 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif + public extension MemoryBuffer { public convenience init(_ buffer: Buffer) { let memory = malloc(Int(buffer.size))! diff --git a/submodules/TelegramCore/TelegramCore/MessageUtils.swift b/submodules/TelegramCore/TelegramCore/MessageUtils.swift index d5dcdb7cec..818a117f92 100644 --- a/submodules/TelegramCore/TelegramCore/MessageUtils.swift +++ b/submodules/TelegramCore/TelegramCore/MessageUtils.swift @@ -143,6 +143,12 @@ func locallyRenderedMessage(message: StoreMessage, peers: [PeerId: Peer]) -> Mes if let peer = peers[id.peerId] { messagePeers[peer.id] = peer + + if let group = peer as? TelegramGroup, let migrationReference = group.migrationReference { + if let channelPeer = peers[migrationReference.peerId] { + messagePeers[channelPeer.id] = channelPeer + } + } } for media in message.media { diff --git a/submodules/TelegramCore/TelegramCore/MultipartFetch.swift b/submodules/TelegramCore/TelegramCore/MultipartFetch.swift index 87ce3294b6..b09ae7d48b 100644 --- a/submodules/TelegramCore/TelegramCore/MultipartFetch.swift +++ b/submodules/TelegramCore/TelegramCore/MultipartFetch.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/MultipartUpload.swift b/submodules/TelegramCore/TelegramCore/MultipartUpload.swift index 56690081a3..d402a559ff 100644 --- a/submodules/TelegramCore/TelegramCore/MultipartUpload.swift +++ b/submodules/TelegramCore/TelegramCore/MultipartUpload.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #if BUCK import MtProtoKit diff --git a/submodules/TelegramCore/TelegramCore/MultiplexedRequestManager.swift b/submodules/TelegramCore/TelegramCore/MultiplexedRequestManager.swift index cf73d0df7c..8917d87150 100644 --- a/submodules/TelegramCore/TelegramCore/MultiplexedRequestManager.swift +++ b/submodules/TelegramCore/TelegramCore/MultiplexedRequestManager.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/Network.swift b/submodules/TelegramCore/TelegramCore/Network.swift index 384aa03b7c..8a4add6033 100644 --- a/submodules/TelegramCore/TelegramCore/Network.swift +++ b/submodules/TelegramCore/TelegramCore/Network.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #if BUCK import MtProtoKit diff --git a/submodules/TelegramCore/TelegramCore/NotificationAutolockReportManager.swift b/submodules/TelegramCore/TelegramCore/NotificationAutolockReportManager.swift index fe73be5004..13dd8da607 100644 --- a/submodules/TelegramCore/TelegramCore/NotificationAutolockReportManager.swift +++ b/submodules/TelegramCore/TelegramCore/NotificationAutolockReportManager.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/NotificationExceptionsList.swift b/submodules/TelegramCore/TelegramCore/NotificationExceptionsList.swift index c9ceff6734..bbb301cc3c 100644 --- a/submodules/TelegramCore/TelegramCore/NotificationExceptionsList.swift +++ b/submodules/TelegramCore/TelegramCore/NotificationExceptionsList.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif public final class NotificationExceptionsList: Equatable { @@ -21,12 +23,15 @@ public final class NotificationExceptionsList: Equatable { } } -public func notificationExceptionsList(network: Network) -> Signal { - return network.request(Api.functions.account.getNotifyExceptions(flags: 1 << 1, peer: nil)) |> retryRequest |> map { result in - switch result { +public func notificationExceptionsList(postbox: Postbox, network: Network) -> Signal { + return network.request(Api.functions.account.getNotifyExceptions(flags: 1 << 1, peer: nil)) + |> retryRequest + |> mapToSignal { result -> Signal in + return postbox.transaction { transaction -> NotificationExceptionsList in + switch result { case let .updates(updates, users, chats, _, _): - var peers:[PeerId: Peer] = [:] - var settings:[PeerId : TelegramPeerNotificationSettings] = [:] + var peers: [PeerId: Peer] = [:] + var settings: [PeerId: TelegramPeerNotificationSettings] = [:] for user in users { let peer = TelegramUser(user: user) @@ -38,32 +43,35 @@ public func notificationExceptionsList(network: Network) -> Signal if let peer = transaction.getPeer(peerId), let adminPeer = transaction.getPeer(adminId), let inputUser = apiInputUser(adminPeer) { if let group = peer as? TelegramGroup { return account.network.request(Api.functions.messages.editChatAdmin(chatId: group.id.id, userId: inputUser, isAdmin: .boolTrue)) - |> mapError { _ -> AddGroupAdminError in return .generic } + |> `catch` { error -> Signal in + if error.errorDescription == "USER_NOT_PARTICIPANT" { + return addGroupMember(account: account, peerId: peerId, memberId: adminId) + |> mapError { error -> AddGroupAdminError in + return .addMemberError(error) + } + |> mapToSignal { _ -> Signal in + return .complete() + } + |> then( + account.network.request(Api.functions.messages.editChatAdmin(chatId: group.id.id, userId: inputUser, isAdmin: .boolTrue)) + |> mapError { error -> AddGroupAdminError in + return .generic + } + ) + } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { + return .fail(.addMemberError(.privacy)) + } + return .fail(.generic) + } |> mapToSignal { result -> Signal in return account.postbox.transaction { transaction -> Void in transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in @@ -204,67 +225,69 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId: updatedParticipant = ChannelParticipant.member(id: adminId, invitedAt: Int32(Date().timeIntervalSince1970), adminInfo: adminInfo, banInfo: nil) } return account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, adminRights: rights.apiAdminRights)) - |> map { [$0] } - |> `catch` { error -> Signal<[Api.Updates], UpdateChannelAdminRightsError> in - if error.errorDescription == "USER_NOT_PARTICIPANT" { - return addChannelMember(account: account, peerId: peerId, memberId: adminId) - |> map { _ -> [Api.Updates] in - return [] - } + |> map { [$0] } + |> `catch` { error -> Signal<[Api.Updates], UpdateChannelAdminRightsError> in + if error.errorDescription == "USER_NOT_PARTICIPANT" { + return addChannelMember(account: account, peerId: peerId, memberId: adminId) + |> map { _ -> [Api.Updates] in + return [] + } + |> mapError { error -> UpdateChannelAdminRightsError in + return .addMemberError(error) + } + |> then(account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, adminRights: rights.apiAdminRights)) |> mapError { error -> UpdateChannelAdminRightsError in - return .addMemberError(error) + return .generic } - |> then(account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, adminRights: rights.apiAdminRights)) - |> mapError { error -> UpdateChannelAdminRightsError in - return .generic - } - |> map { [$0] }) - } - return .fail(.generic) + |> map { [$0] }) + } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { + return .fail(.addMemberError(.restricted)) } - |> mapToSignal { result -> Signal<(ChannelParticipant?, RenderedChannelParticipant), UpdateChannelAdminRightsError> in - for updates in result { - account.stateManager.addUpdates(updates) - } - return account.postbox.transaction { transaction -> (ChannelParticipant?, RenderedChannelParticipant) in - transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, cachedData -> CachedPeerData? in - if let cachedData = cachedData as? CachedChannelData, let adminCount = cachedData.participantsSummary.adminCount { - var updatedAdminCount = adminCount - var wasAdmin = false - if let currentParticipant = currentParticipant { - switch currentParticipant { - case .creator: + return .fail(.generic) + } + |> mapToSignal { result -> Signal<(ChannelParticipant?, RenderedChannelParticipant), UpdateChannelAdminRightsError> in + for updates in result { + account.stateManager.addUpdates(updates) + } + return account.postbox.transaction { transaction -> (ChannelParticipant?, RenderedChannelParticipant) in + transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, cachedData -> CachedPeerData? in + if let cachedData = cachedData as? CachedChannelData, let adminCount = cachedData.participantsSummary.adminCount { + var updatedAdminCount = adminCount + var wasAdmin = false + if let currentParticipant = currentParticipant { + switch currentParticipant { + case .creator: + wasAdmin = true + case let .member(_, _, adminInfo, _): + if let adminInfo = adminInfo, !adminInfo.rights.isEmpty { wasAdmin = true - case let .member(_, _, adminInfo, _): - if let adminInfo = adminInfo, !adminInfo.rights.isEmpty { - wasAdmin = true - } - } + } } - if wasAdmin && rights.isEmpty { - updatedAdminCount = max(1, adminCount - 1) - } else if !wasAdmin && !rights.isEmpty { - updatedAdminCount = adminCount + 1 - } - - return cachedData.withUpdatedParticipantsSummary(cachedData.participantsSummary.withUpdatedAdminCount(updatedAdminCount)) - } else { - return cachedData } - }) - var peers: [PeerId: Peer] = [:] - var presences: [PeerId: PeerPresence] = [:] - peers[adminPeer.id] = adminPeer - if let presence = transaction.getPeerPresence(peerId: adminPeer.id) { - presences[adminPeer.id] = presence - } - if case let .member(_, _, maybeAdminInfo, _) = updatedParticipant, let adminInfo = maybeAdminInfo { - if let peer = transaction.getPeer(adminInfo.promotedBy) { - peers[peer.id] = peer + if wasAdmin && rights.isEmpty { + updatedAdminCount = max(1, adminCount - 1) + } else if !wasAdmin && !rights.isEmpty { + updatedAdminCount = adminCount + 1 } + + return cachedData.withUpdatedParticipantsSummary(cachedData.participantsSummary.withUpdatedAdminCount(updatedAdminCount)) + } else { + return cachedData } - return (currentParticipant, RenderedChannelParticipant(participant: updatedParticipant, peer: adminPeer, peers: peers, presences: presences)) - } |> mapError { _ -> UpdateChannelAdminRightsError in return .generic } + }) + var peers: [PeerId: Peer] = [:] + var presences: [PeerId: PeerPresence] = [:] + peers[adminPeer.id] = adminPeer + if let presence = transaction.getPeerPresence(peerId: adminPeer.id) { + presences[adminPeer.id] = presence + } + if case let .member(_, _, maybeAdminInfo, _) = updatedParticipant, let adminInfo = maybeAdminInfo { + if let peer = transaction.getPeer(adminInfo.promotedBy) { + peers[peer.id] = peer + } + } + return (currentParticipant, RenderedChannelParticipant(participant: updatedParticipant, peer: adminPeer, peers: peers, presences: presences)) + } |> mapError { _ -> UpdateChannelAdminRightsError in return .generic } } } else { return .fail(.generic) diff --git a/submodules/TelegramCore/TelegramCore/PeerContactSettings.swift b/submodules/TelegramCore/TelegramCore/PeerContactSettings.swift index e890899267..b19c391f17 100644 --- a/submodules/TelegramCore/TelegramCore/PeerContactSettings.swift +++ b/submodules/TelegramCore/TelegramCore/PeerContactSettings.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct PeerStatusSettings: OptionSet { @@ -16,6 +18,8 @@ public struct PeerStatusSettings: OptionSet { public static let canShareContact = PeerStatusSettings(rawValue: 1 << 2) public static let canBlock = PeerStatusSettings(rawValue: 1 << 3) public static let canAddContact = PeerStatusSettings(rawValue: 1 << 4) + public static let addExceptionWhenAddingContact = PeerStatusSettings(rawValue: 1 << 5) + public static let canReportIrrelevantGeoLocation = PeerStatusSettings(rawValue: 1 << 6) } extension PeerStatusSettings { @@ -35,6 +39,12 @@ extension PeerStatusSettings { if (flags & (1 << 3)) != 0 { result.insert(.canShareContact) } + if (flags & (1 << 4)) != 0 { + result.insert(.addExceptionWhenAddingContact) + } + if (flags & (1 << 5)) != 0 { + result.insert(.canReportIrrelevantGeoLocation) + } self = result } } diff --git a/submodules/TelegramCore/TelegramCore/PeerInputActivity.swift b/submodules/TelegramCore/TelegramCore/PeerInputActivity.swift index d5b9adedc9..350d2c4f93 100644 --- a/submodules/TelegramCore/TelegramCore/PeerInputActivity.swift +++ b/submodules/TelegramCore/TelegramCore/PeerInputActivity.swift @@ -1,4 +1,9 @@ import Foundation +#if os(macOS) +import TelegramApiMac +#else +import TelegramApi +#endif public enum PeerInputActivity: Comparable { case typingText diff --git a/submodules/TelegramCore/TelegramCore/PeerPhotoUpdater.swift b/submodules/TelegramCore/TelegramCore/PeerPhotoUpdater.swift index 6340f347de..9c1ebed5e7 100644 --- a/submodules/TelegramCore/TelegramCore/PeerPhotoUpdater.swift +++ b/submodules/TelegramCore/TelegramCore/PeerPhotoUpdater.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/PeersNearby.swift b/submodules/TelegramCore/TelegramCore/PeersNearby.swift index 86e6639658..d965544582 100644 --- a/submodules/TelegramCore/TelegramCore/PeersNearby.swift +++ b/submodules/TelegramCore/TelegramCore/PeersNearby.swift @@ -2,45 +2,197 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif +#if os(macOS) +private typealias SignalKitTimer = SwiftSignalKitMac.Timer +#else +private typealias SignalKitTimer = SwiftSignalKit.Timer +#endif + + public struct PeerNearby { public let id: PeerId public let expires: Int32 public let distance: Int32 } -public func peersNearby(network: Network, accountStateManager: AccountStateManager, coordinate: (latitude: Double, longitude: Double), radius: Int32) -> Signal<[PeerNearby], NoError> { - let inputGeoPoint = Api.InputGeoPoint.inputGeoPoint(lat: coordinate.latitude, long: coordinate.longitude) +public final class PeersNearbyContext { + private let queue: Queue = Queue.mainQueue() + private var subscribers = Bag<([PeerNearby]?) -> Void>() + private let disposable = MetaDisposable() + private var timer: SignalKitTimer? - return network.request(Api.functions.contacts.getLocated(geoPoint: inputGeoPoint, radius: radius)) - |> map(Optional.init) - |> `catch` { _ -> Signal in - return .single(nil) - } - |> mapToSignal { updates in - var peersNearby: [PeerNearby] = [] - if let updates = updates { - switch updates { + private var entries: [PeerNearby]? + + public init(network: Network, accountStateManager: AccountStateManager, coordinate: (latitude: Double, longitude: Double)) { + let expiryExtension: Double = 10.0 + + let poll = network.request(Api.functions.contacts.getLocated(geoPoint: .inputGeoPoint(lat: coordinate.latitude, long: coordinate.longitude))) + |> map(Optional.init) + |> `catch` { _ -> Signal in + return .single(nil) + } + |> introduceError(Void.self) + |> mapToSignal { updates -> Signal<[PeerNearby], Void> in + var peersNearby: [PeerNearby] = [] + if let updates = updates { + switch updates { case let .updates(updates, _, _, _, _): for update in updates { - if case let .updateContactLocated(contacts) = update { - for case let .contactLocated(userId, expires, distance) in contacts { - peersNearby.append(PeerNearby(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), expires: expires, distance: distance)) + if case let .updatePeerLocated(peers) = update { + for case let .peerLocated(peer, expires, distance) in peers { + peersNearby.append(PeerNearby(id: peer.peerId, expires: expires, distance: distance)) } } } default: break + } + accountStateManager.addUpdates(updates) } - - accountStateManager.addUpdates(updates) + return .single(peersNearby) + |> then( + accountStateManager.updatedPeersNearby() + |> introduceError(Void.self) + ) } - return .single(peersNearby) - |> then(accountStateManager.updatedPeersNearby()) + let error: Signal = .single(Void()) |> then(Signal.fail(Void()) |> suspendAwareDelay(25.0, queue: self.queue)) + let combined = combineLatest(poll, error) + |> map { data, _ -> [PeerNearby] in + return data + } + |> restartIfError + |> `catch` { _ -> Signal<[PeerNearby], NoError> in + return .single([]) + } + + self.disposable.set((combined + |> deliverOn(self.queue)).start(next: { [weak self] updatedEntries in + guard let strongSelf = self else { + return + } + + let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 + var entries = strongSelf.entries?.filter { Double($0.expires) + expiryExtension > timestamp } ?? [] + let updatedEntries = updatedEntries.filter { Double($0.expires) + expiryExtension > timestamp } + + var existingPeerIds: [PeerId: Int] = [:] + for i in 0 ..< entries.count { + existingPeerIds[entries[i].id] = i + } + + for entry in updatedEntries { + if let index = existingPeerIds[entry.id] { + entries[index] = entry + } else { + entries.append(entry) + } + } + + strongSelf.entries = entries + for subscriber in strongSelf.subscribers.copyItems() { + subscriber(strongSelf.entries) + } + })) + + self.timer = SignalKitTimer(timeout: 2.0, repeat: true, completion: { [weak self] in + guard let strongSelf = self else { + return + } + + let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 + strongSelf.entries = strongSelf.entries?.filter { Double($0.expires) + expiryExtension > timestamp } + for subscriber in strongSelf.subscribers.copyItems() { + subscriber(strongSelf.entries) + } + }, queue: self.queue) + self.timer?.start() + } + + deinit { + self.disposable.dispose() + self.timer?.invalidate() + } + + public func get() -> Signal<[PeerNearby]?, NoError> { + let queue = self.queue + return Signal { [weak self] subscriber in + if let strongSelf = self { + subscriber.putNext(strongSelf.entries) + + let index = strongSelf.subscribers.add({ entries in + subscriber.putNext(entries) + }) + + return ActionDisposable { + queue.async { + if let strongSelf = self { + strongSelf.subscribers.remove(index) + } + } + } + } else { + return EmptyDisposable + } + } |> runOn(queue) + } +} + +public func updateChannelGeoLocation(postbox: Postbox, network: Network, channelId: PeerId, coordinate: (latitude: Double, longitude: Double)?, address: String?) -> Signal { + return postbox.transaction { transaction -> Peer? in + return transaction.getPeer(channelId) + } + |> mapToSignal { channel -> Signal in + guard let channel = channel, let apiChannel = apiInputChannel(channel) else { + return .single(false) + } + + let geoPoint: Api.InputGeoPoint + if let (latitude, longitude) = coordinate, let _ = address { + geoPoint = .inputGeoPoint(lat: latitude, long: longitude) + } else { + geoPoint = .inputGeoPointEmpty + } + + return network.request(Api.functions.channels.editLocation(channel: apiChannel, geoPoint: geoPoint, address: address ?? "")) + |> map { result -> Bool in + switch result { + case .boolTrue: + return true + case .boolFalse: + return false + } + } + |> `catch` { error -> Signal in + return .single(false) + } + |> mapToSignal { result in + if result { + return postbox.transaction { transaction in + transaction.updatePeerCachedData(peerIds: Set([channelId]), update: { (_, current) -> CachedPeerData? in + let current: CachedChannelData = current as? CachedChannelData ?? CachedChannelData() + let peerGeoLocation: PeerGeoLocation? + if let (latitude, longitude) = coordinate, let address = address { + peerGeoLocation = PeerGeoLocation(latitude: latitude, longitude: longitude, address: address) + } else { + peerGeoLocation = nil + } + return current.withUpdatedPeerGeoLocation(peerGeoLocation: peerGeoLocation) + }) + } + |> map { _ in + return result + } + } else { + return .single(result) + } + } } } diff --git a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift index aae25dd82c..c6ab6f9d85 100644 --- a/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift +++ b/submodules/TelegramCore/TelegramCore/PendingMessageManager.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift b/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift index efbd5fa8ce..bfbe5a6924 100644 --- a/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift +++ b/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/Polls.swift b/submodules/TelegramCore/TelegramCore/Polls.swift index 4f3525b3f3..c6223c533d 100644 --- a/submodules/TelegramCore/TelegramCore/Polls.swift +++ b/submodules/TelegramCore/TelegramCore/Polls.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/PrivacySettings.swift b/submodules/TelegramCore/TelegramCore/PrivacySettings.swift index 13b373cc6c..00651e8dad 100644 --- a/submodules/TelegramCore/TelegramCore/PrivacySettings.swift +++ b/submodules/TelegramCore/TelegramCore/PrivacySettings.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public final class SelectivePrivacyPeer: Equatable { diff --git a/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift b/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift index 99011ea068..0b950bf85c 100644 --- a/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingDecryptedOperations.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif private enum MessageParsingError: Error { diff --git a/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingEncryptedOperations.swift b/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingEncryptedOperations.swift index 562cf0b7e2..729ee6f098 100644 --- a/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingEncryptedOperations.swift +++ b/submodules/TelegramCore/TelegramCore/ProcessSecretChatIncomingEncryptedOperations.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif private enum MessagePreParsingError: Error { diff --git a/submodules/TelegramCore/TelegramCore/RateCall.swift b/submodules/TelegramCore/TelegramCore/RateCall.swift index 0c10328fec..d1727dfd8c 100644 --- a/submodules/TelegramCore/TelegramCore/RateCall.swift +++ b/submodules/TelegramCore/TelegramCore/RateCall.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/RecentAccountSession.swift b/submodules/TelegramCore/TelegramCore/RecentAccountSession.swift index 5e2e299be0..d148cd0340 100644 --- a/submodules/TelegramCore/TelegramCore/RecentAccountSession.swift +++ b/submodules/TelegramCore/TelegramCore/RecentAccountSession.swift @@ -1,4 +1,9 @@ import Foundation +#if os(macOS) +import TelegramApiMac +#else +import TelegramApi +#endif public struct AccountSessionFlags: OptionSet { public var rawValue: Int32 diff --git a/submodules/TelegramCore/TelegramCore/RecentAccountSessions.swift b/submodules/TelegramCore/TelegramCore/RecentAccountSessions.swift index bb9e74acf8..4758e7a378 100644 --- a/submodules/TelegramCore/TelegramCore/RecentAccountSessions.swift +++ b/submodules/TelegramCore/TelegramCore/RecentAccountSessions.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/RecentPeers.swift b/submodules/TelegramCore/TelegramCore/RecentPeers.swift index 5f4af9ae72..f215ea98fc 100644 --- a/submodules/TelegramCore/TelegramCore/RecentPeers.swift +++ b/submodules/TelegramCore/TelegramCore/RecentPeers.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/RecentWebSessions.swift b/submodules/TelegramCore/TelegramCore/RecentWebSessions.swift index dda450af43..25298d4bab 100644 --- a/submodules/TelegramCore/TelegramCore/RecentWebSessions.swift +++ b/submodules/TelegramCore/TelegramCore/RecentWebSessions.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/RegisterNotificationToken.swift b/submodules/TelegramCore/TelegramCore/RegisterNotificationToken.swift index 7b7fe56306..a0e9e22569 100644 --- a/submodules/TelegramCore/TelegramCore/RegisterNotificationToken.swift +++ b/submodules/TelegramCore/TelegramCore/RegisterNotificationToken.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import SwiftSignalKitMac import PostboxMac +import TelegramApiMac #else import SwiftSignalKit import Postbox +import TelegramApi #endif public enum NotificationTokenType { diff --git a/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift b/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift index b91778ae2f..fcfd0c524c 100644 --- a/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift +++ b/submodules/TelegramCore/TelegramCore/RemovePeerChat.swift @@ -13,6 +13,20 @@ public func removePeerChat(account: Account, peerId: PeerId, reportChatSpam: Boo } } +public func terminateSecretChat(transaction: Transaction, peerId: PeerId) { + if let state = transaction.getPeerChatState(peerId) as? SecretChatState, state.embeddedState != .terminated { + let updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: peerId, operation: SecretChatOutgoingOperationContents.terminate(reportSpam: false), state: state).withUpdatedEmbeddedState(.terminated) + if updatedState != state { + transaction.setPeerChatState(peerId, state: updatedState) + if let peer = transaction.getPeer(peerId) as? TelegramSecretChat { + updatePeers(transaction: transaction, peers: [peer.withUpdatedEmbeddedState(updatedState.embeddedState.peerState)], update: { _, updated in + return updated + }) + } + } + } +} + public func removePeerChat(account: Account, transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, reportChatSpam: Bool, deleteGloballyIfPossible: Bool) { if let _ = transaction.getPeerChatInterfaceState(peerId) { transaction.updatePeerChatInterfaceState(peerId, update: { current in @@ -24,8 +38,7 @@ public func removePeerChat(account: Account, transaction: Transaction, mediaBox: }) } if peerId.namespace == Namespaces.Peer.SecretChat { - if let state = transaction.getPeerChatState(peerId) as? SecretChatState { - + if let state = transaction.getPeerChatState(peerId) as? SecretChatState, state.embeddedState != .terminated { let updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: peerId, operation: SecretChatOutgoingOperationContents.terminate(reportSpam: reportChatSpam), state: state).withUpdatedEmbeddedState(.terminated) if updatedState != state { transaction.setPeerChatState(peerId, state: updatedState) diff --git a/submodules/TelegramCore/TelegramCore/RemovePeerMember.swift b/submodules/TelegramCore/TelegramCore/RemovePeerMember.swift index e8eeb7793f..f084a7e1af 100644 --- a/submodules/TelegramCore/TelegramCore/RemovePeerMember.swift +++ b/submodules/TelegramCore/TelegramCore/RemovePeerMember.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift index fef8e814e3..7ffbf0f5dc 100644 --- a/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift +++ b/submodules/TelegramCore/TelegramCore/ReplyMarkupMessageAttribute.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public enum ReplyMarkupButtonAction: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/ReportPeer.swift b/submodules/TelegramCore/TelegramCore/ReportPeer.swift index 2f318b8f0d..42585d0420 100644 --- a/submodules/TelegramCore/TelegramCore/ReportPeer.swift +++ b/submodules/TelegramCore/TelegramCore/ReportPeer.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -89,6 +91,7 @@ public enum ReportReason: Equatable { case porno case childAbuse case copyright + case irrelevantLocation case custom(String) } @@ -105,6 +108,8 @@ private extension ReportReason { return .inputReportReasonChildAbuse case .copyright: return .inputReportReasonCopyright + case .irrelevantLocation: + return .inputReportReasonGeoIrrelevant case let .custom(text): return .inputReportReasonOther(text: text) } diff --git a/submodules/TelegramCore/TelegramCore/RequestChatContextResults.swift b/submodules/TelegramCore/TelegramCore/RequestChatContextResults.swift index 185fb6bfa9..9932eae547 100644 --- a/submodules/TelegramCore/TelegramCore/RequestChatContextResults.swift +++ b/submodules/TelegramCore/TelegramCore/RequestChatContextResults.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift b/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift index e8e816d3be..3cb90b9ed0 100644 --- a/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift +++ b/submodules/TelegramCore/TelegramCore/RequestEditMessage.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/RequestMessageActionCallback.swift b/submodules/TelegramCore/TelegramCore/RequestMessageActionCallback.swift index cf67c661b0..0586179174 100644 --- a/submodules/TelegramCore/TelegramCore/RequestMessageActionCallback.swift +++ b/submodules/TelegramCore/TelegramCore/RequestMessageActionCallback.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/RequestPhoneNumber.swift b/submodules/TelegramCore/TelegramCore/RequestPhoneNumber.swift index 91c2958519..3668acad1d 100644 --- a/submodules/TelegramCore/TelegramCore/RequestPhoneNumber.swift +++ b/submodules/TelegramCore/TelegramCore/RequestPhoneNumber.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox import SwiftSignalKit +import TelegramApi #endif public func requestPhoneNumber(account: Account, peerId: PeerId) -> Signal { diff --git a/submodules/TelegramCore/TelegramCore/RequestSecureIdForm.swift b/submodules/TelegramCore/TelegramCore/RequestSecureIdForm.swift index 77945ac9d1..a2e0e5c7f7 100644 --- a/submodules/TelegramCore/TelegramCore/RequestSecureIdForm.swift +++ b/submodules/TelegramCore/TelegramCore/RequestSecureIdForm.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/RequestStartBot.swift b/submodules/TelegramCore/TelegramCore/RequestStartBot.swift index 03d47282df..f81ef86bca 100644 --- a/submodules/TelegramCore/TelegramCore/RequestStartBot.swift +++ b/submodules/TelegramCore/TelegramCore/RequestStartBot.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/RequestUserPhotos.swift b/submodules/TelegramCore/TelegramCore/RequestUserPhotos.swift index e4255b051d..1d7b9f3b3f 100644 --- a/submodules/TelegramCore/TelegramCore/RequestUserPhotos.swift +++ b/submodules/TelegramCore/TelegramCore/RequestUserPhotos.swift @@ -4,9 +4,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -14,13 +16,13 @@ import Foundation #endif #endif - public struct TelegramPeerPhoto { public let image: TelegramMediaImage public let date: Int32 public let reference: TelegramMediaImageReference? - public let index:Int - public let totalCount:Int + public let index: Int + public let totalCount: Int + public let messageId: MessageId? } public func requestPeerPhotos(account:Account, peerId: PeerId) -> Signal<[TelegramPeerPhoto], NoError> { @@ -38,7 +40,7 @@ public func requestPeerPhotos(account:Account, peerId: PeerId) -> Signal<[Telegr |> map { result -> [TelegramPeerPhoto] in if let result = result { let totalCount:Int - let photos:[Api.Photo] + let photos: [Api.Photo] switch result { case let .photos(data): photos = data.photos @@ -58,7 +60,7 @@ public func requestPeerPhotos(account:Account, peerId: PeerId) -> Signal<[Telegr case .photoEmpty: break } - images.append(TelegramPeerPhoto(image: image, date: date, reference: reference, index: i, totalCount: totalCount)) + images.append(TelegramPeerPhoto(image: image, date: date, reference: reference, index: i, totalCount: totalCount, messageId: nil)) } } @@ -128,7 +130,7 @@ public func requestPeerPhotos(account:Account, peerId: PeerId) -> Signal<[Telegr switch media.action { case let .photoUpdated(image): if let image = image { - photos.append(TelegramPeerPhoto(image: image, date: message.timestamp, reference: nil, index: index, totalCount: messages.count)) + photos.append(TelegramPeerPhoto(image: image, date: message.timestamp, reference: nil, index: index, totalCount: messages.count, messageId: message.id)) } default: break diff --git a/submodules/TelegramCore/TelegramCore/ResolvePeerByName.swift b/submodules/TelegramCore/TelegramCore/ResolvePeerByName.swift index b990fe8b62..d59ad484d2 100644 --- a/submodules/TelegramCore/TelegramCore/ResolvePeerByName.swift +++ b/submodules/TelegramCore/TelegramCore/ResolvePeerByName.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/RichText.swift b/submodules/TelegramCore/TelegramCore/RichText.swift index 45f1366038..a56ced19a9 100644 --- a/submodules/TelegramCore/TelegramCore/RichText.swift +++ b/submodules/TelegramCore/TelegramCore/RichText.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif private enum RichTextTypes: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/SaveSecureIdValue.swift b/submodules/TelegramCore/TelegramCore/SaveSecureIdValue.swift index 8cb091f1c6..a8e19306a9 100644 --- a/submodules/TelegramCore/TelegramCore/SaveSecureIdValue.swift +++ b/submodules/TelegramCore/TelegramCore/SaveSecureIdValue.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/SearchMessages.swift b/submodules/TelegramCore/TelegramCore/SearchMessages.swift index 004020cd3c..5fb26815b1 100644 --- a/submodules/TelegramCore/TelegramCore/SearchMessages.swift +++ b/submodules/TelegramCore/TelegramCore/SearchMessages.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -274,10 +276,8 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } return combineLatest(peerMessages, additionalPeerMessages) } - case let .group(groupId): + case .group: remoteSearchResult = .single((nil, nil)) - /*remoteSearchResult = account.network.request(Api.functions.channels.searchFeed(feedId: groupId.rawValue, q: query, offsetDate: 0, offsetPeer: Api.InputPeer.inputPeerEmpty, offsetId: 0, limit: 64), automaticFloodWait: false) - |> mapError { _ in } |> map(Optional.init)*/ case .general: remoteSearchResult = account.postbox.transaction { transaction -> (Int32, MessageIndex?, Api.InputPeer) in var lowerBound: MessageIndex? @@ -291,7 +291,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } } |> mapToSignal { (nextRate, lowerBound, inputPeer) in - account.network.request(Api.functions.messages.searchGlobal(q: query, offsetRate: nextRate, offsetPeer: inputPeer, offsetId: lowerBound?.id.id ?? 0, limit: limit), automaticFloodWait: false) + account.network.request(Api.functions.messages.searchGlobal(flags: 0, folderId: nil, q: query, offsetRate: nextRate, offsetPeer: inputPeer, offsetId: lowerBound?.id.id ?? 0, limit: limit), automaticFloodWait: false) |> map { result -> (Api.messages.Messages?, Api.messages.Messages?) in return (result, nil) } diff --git a/submodules/TelegramCore/TelegramCore/SearchPeers.swift b/submodules/TelegramCore/TelegramCore/SearchPeers.swift index 5a80711c65..f80ae494da 100644 --- a/submodules/TelegramCore/TelegramCore/SearchPeers.swift +++ b/submodules/TelegramCore/TelegramCore/SearchPeers.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/SearchStickers.swift b/submodules/TelegramCore/TelegramCore/SearchStickers.swift index 08ed9c9528..60b866388f 100644 --- a/submodules/TelegramCore/TelegramCore/SearchStickers.swift +++ b/submodules/TelegramCore/TelegramCore/SearchStickers.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/SecretChatEncryptionConfig.swift b/submodules/TelegramCore/TelegramCore/SecretChatEncryptionConfig.swift index fce06f6105..0274690b2b 100644 --- a/submodules/TelegramCore/TelegramCore/SecretChatEncryptionConfig.swift +++ b/submodules/TelegramCore/TelegramCore/SecretChatEncryptionConfig.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/SecretChatFileReference.swift b/submodules/TelegramCore/TelegramCore/SecretChatFileReference.swift index 2dd9b618da..7005c6456e 100644 --- a/submodules/TelegramCore/TelegramCore/SecretChatFileReference.swift +++ b/submodules/TelegramCore/TelegramCore/SecretChatFileReference.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif final class SecretChatFileReference: PostboxCoding { diff --git a/submodules/TelegramCore/TelegramCore/SecretChatIncomingEncryptedOperation.swift b/submodules/TelegramCore/TelegramCore/SecretChatIncomingEncryptedOperation.swift index d6176a3aed..3050554beb 100644 --- a/submodules/TelegramCore/TelegramCore/SecretChatIncomingEncryptedOperation.swift +++ b/submodules/TelegramCore/TelegramCore/SecretChatIncomingEncryptedOperation.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif enum SecretChatIncomingEncryptedOperationType: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/SecretChatOutgoingOperation.swift b/submodules/TelegramCore/TelegramCore/SecretChatOutgoingOperation.swift index 9077e8be15..1c91ef2d9c 100644 --- a/submodules/TelegramCore/TelegramCore/SecretChatOutgoingOperation.swift +++ b/submodules/TelegramCore/TelegramCore/SecretChatOutgoingOperation.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif private enum SecretChatOutgoingFileValue: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/SecureFileMediaResource.swift b/submodules/TelegramCore/TelegramCore/SecureFileMediaResource.swift index 8e11506721..e776e98bf1 100644 --- a/submodules/TelegramCore/TelegramCore/SecureFileMediaResource.swift +++ b/submodules/TelegramCore/TelegramCore/SecureFileMediaResource.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct SecureFileMediaResourceId: MediaResourceId { diff --git a/submodules/TelegramCore/TelegramCore/SecureIdConfiguration.swift b/submodules/TelegramCore/TelegramCore/SecureIdConfiguration.swift index 7782a24598..7568e1f2de 100644 --- a/submodules/TelegramCore/TelegramCore/SecureIdConfiguration.swift +++ b/submodules/TelegramCore/TelegramCore/SecureIdConfiguration.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox +import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/SecureIdDataTypes.swift b/submodules/TelegramCore/TelegramCore/SecureIdDataTypes.swift index 344e5db28b..10bb59090c 100644 --- a/submodules/TelegramCore/TelegramCore/SecureIdDataTypes.swift +++ b/submodules/TelegramCore/TelegramCore/SecureIdDataTypes.swift @@ -1,4 +1,9 @@ import Foundation +#if os(macOS) +import TelegramApiMac +#else +import TelegramApi +#endif public struct SecureIdPersonName: Equatable { public let firstName: String diff --git a/submodules/TelegramCore/TelegramCore/SecureIdValueContentError.swift b/submodules/TelegramCore/TelegramCore/SecureIdValueContentError.swift index 74b255d41f..cab7c59106 100644 --- a/submodules/TelegramCore/TelegramCore/SecureIdValueContentError.swift +++ b/submodules/TelegramCore/TelegramCore/SecureIdValueContentError.swift @@ -1,4 +1,10 @@ import Foundation +#if os(macOS) +import TelegramApiMac +#else +import TelegramApi +#endif + public enum SecureIdValueContentErrorKey: Hashable { case value(SecureIdValueKey) diff --git a/submodules/TelegramCore/TelegramCore/Serialization.swift b/submodules/TelegramCore/TelegramCore/Serialization.swift index 2f39867c53..81e2594098 100644 --- a/submodules/TelegramCore/TelegramCore/Serialization.swift +++ b/submodules/TelegramCore/TelegramCore/Serialization.swift @@ -1,7 +1,9 @@ import Foundation #if os(macOS) import MtProtoKitMac + import TelegramApiMac #else + import TelegramApi #if BUCK import MtProtoKit #else @@ -9,6 +11,7 @@ import Foundation #endif #endif + #if os(macOS) private let apiPrefix = "TelegramCoreMac.Api." #else diff --git a/submodules/TelegramCore/TelegramCore/SingleMessageView.swift b/submodules/TelegramCore/TelegramCore/SingleMessageView.swift index 45c3c96d4c..c265c00adf 100644 --- a/submodules/TelegramCore/TelegramCore/SingleMessageView.swift +++ b/submodules/TelegramCore/TelegramCore/SingleMessageView.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -13,6 +15,7 @@ import Foundation #endif #endif + public func singleMessageView(account: Account, messageId: MessageId, loadIfNotExists: Bool) -> Signal { return Signal { subscriber in let loadedMessage = account.postbox.transaction { transaction -> Signal in diff --git a/submodules/TelegramCore/TelegramCore/StandaloneSendMessage.swift b/submodules/TelegramCore/TelegramCore/StandaloneSendMessage.swift index 32da881585..692a5f5916 100644 --- a/submodules/TelegramCore/TelegramCore/StandaloneSendMessage.swift +++ b/submodules/TelegramCore/TelegramCore/StandaloneSendMessage.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift b/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift index fdaefcad2d..5b593a5645 100644 --- a/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift +++ b/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift @@ -2,12 +2,15 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else + import TelegramApi import Postbox import SwiftSignalKit import UIKit #endif + public enum StandaloneUploadMediaError { case generic } diff --git a/submodules/TelegramCore/TelegramCore/StickerManagement.swift b/submodules/TelegramCore/TelegramCore/StickerManagement.swift index 964bf0dbc5..b4e594340d 100644 --- a/submodules/TelegramCore/TelegramCore/StickerManagement.swift +++ b/submodules/TelegramCore/TelegramCore/StickerManagement.swift @@ -2,7 +2,9 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else + import TelegramApi import Postbox import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/StickerPack.swift b/submodules/TelegramCore/TelegramCore/StickerPack.swift index 470f4090c7..734f9e3cc1 100644 --- a/submodules/TelegramCore/TelegramCore/StickerPack.swift +++ b/submodules/TelegramCore/TelegramCore/StickerPack.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif public struct StickerPackCollectionInfoFlags: OptionSet { diff --git a/submodules/TelegramCore/TelegramCore/StickerSetInstallation.swift b/submodules/TelegramCore/TelegramCore/StickerSetInstallation.swift index 53d14c86f9..a22a100c4c 100644 --- a/submodules/TelegramCore/TelegramCore/StickerSetInstallation.swift +++ b/submodules/TelegramCore/TelegramCore/StickerSetInstallation.swift @@ -2,12 +2,13 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif - public enum RequestStickerSetError { case generic case invalid diff --git a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift index 27b9d9cbc6..48ad3d69ad 100644 --- a/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/TelegramCore/StoreMessage_Telegram.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute], media: [Media], textEntities: [MessageTextEntity]?) -> (MessageTags, GlobalMessageTags) { diff --git a/submodules/TelegramCore/TelegramCore/SupportPeerId.swift b/submodules/TelegramCore/TelegramCore/SupportPeerId.swift index bfc1abddc7..4932997687 100644 --- a/submodules/TelegramCore/TelegramCore/SupportPeerId.swift +++ b/submodules/TelegramCore/TelegramCore/SupportPeerId.swift @@ -2,9 +2,11 @@ import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -12,7 +14,6 @@ #endif #endif - public func supportPeerId(account:Account) -> Signal { return account.network.request(Api.functions.help.getSupport()) |> map(Optional.init) diff --git a/submodules/TelegramCore/TelegramCore/SynchronizePeerReadState.swift b/submodules/TelegramCore/TelegramCore/SynchronizePeerReadState.swift index 0484613a59..2dc8384a5f 100644 --- a/submodules/TelegramCore/TelegramCore/SynchronizePeerReadState.swift +++ b/submodules/TelegramCore/TelegramCore/SynchronizePeerReadState.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/SynchronizeSavedStickersOperation.swift b/submodules/TelegramCore/TelegramCore/SynchronizeSavedStickersOperation.swift index b6386038bc..7e985d73da 100644 --- a/submodules/TelegramCore/TelegramCore/SynchronizeSavedStickersOperation.swift +++ b/submodules/TelegramCore/TelegramCore/SynchronizeSavedStickersOperation.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/TelegramChannel.swift b/submodules/TelegramCore/TelegramCore/TelegramChannel.swift index 2b2326c650..0ccf6f3f62 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramChannel.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramChannel.swift @@ -148,7 +148,7 @@ public struct TelegramChannelFlags: OptionSet { public final class TelegramChannel: Peer { public let id: PeerId - public let accessHash: Int64? + public let accessHash: TelegramPeerAccessHash? public let title: String public let username: String? public let photo: [TelegramMediaImageRepresentation] @@ -169,7 +169,7 @@ public final class TelegramChannel: Peer { public let associatedPeerId: PeerId? = nil public let notificationSettingsPeerId: PeerId? = nil - public init(id: PeerId, accessHash: Int64?, title: String, username: String?, photo: [TelegramMediaImageRepresentation], creationDate: Int32, version: Int32, participationStatus: TelegramChannelParticipationStatus, info: TelegramChannelInfo, flags: TelegramChannelFlags, restrictionInfo: PeerAccessRestrictionInfo?, adminRights: TelegramChatAdminRights?, bannedRights: TelegramChatBannedRights?, defaultBannedRights: TelegramChatBannedRights?) { + public init(id: PeerId, accessHash: TelegramPeerAccessHash?, title: String, username: String?, photo: [TelegramMediaImageRepresentation], creationDate: Int32, version: Int32, participationStatus: TelegramChannelParticipationStatus, info: TelegramChannelInfo, flags: TelegramChannelFlags, restrictionInfo: PeerAccessRestrictionInfo?, adminRights: TelegramChatAdminRights?, bannedRights: TelegramChatBannedRights?, defaultBannedRights: TelegramChatBannedRights?) { self.id = id self.accessHash = accessHash self.title = title @@ -188,7 +188,17 @@ public final class TelegramChannel: Peer { public init(decoder: PostboxDecoder) { self.id = PeerId(decoder.decodeInt64ForKey("i", orElse: 0)) - self.accessHash = decoder.decodeOptionalInt64ForKey("ah") + let accessHash = decoder.decodeOptionalInt64ForKey("ah") + let accessHashType: Int32 = decoder.decodeInt32ForKey("aht", orElse: 0) + if let accessHash = accessHash { + if accessHashType == 0 { + self.accessHash = .personal(accessHash) + } else { + self.accessHash = .genericPublic(accessHash) + } + } else { + self.accessHash = nil + } self.title = decoder.decodeStringForKey("t", orElse: "") self.username = decoder.decodeOptionalStringForKey("un") self.photo = decoder.decodeObjectArrayForKey("ph") @@ -206,7 +216,14 @@ public final class TelegramChannel: Peer { public func encode(_ encoder: PostboxEncoder) { encoder.encodeInt64(self.id.toInt64(), forKey: "i") if let accessHash = self.accessHash { - encoder.encodeInt64(accessHash, forKey: "ah") + switch accessHash { + case let .personal(value): + encoder.encodeInt64(value, forKey: "ah") + encoder.encodeInt32(0, forKey: "aht") + case let .genericPublic(value): + encoder.encodeInt64(value, forKey: "ah") + encoder.encodeInt32(1, forKey: "aht") + } } else { encoder.encodeNil(forKey: "ah") } diff --git a/submodules/TelegramCore/TelegramCore/TelegramChannelAdminRights.swift b/submodules/TelegramCore/TelegramCore/TelegramChannelAdminRights.swift index a10db19a95..f6b879abd5 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramChannelAdminRights.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramChannelAdminRights.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct TelegramChatAdminRightsFlags: OptionSet { diff --git a/submodules/TelegramCore/TelegramCore/TelegramChannelBannedRights.swift b/submodules/TelegramCore/TelegramCore/TelegramChannelBannedRights.swift index 3d8a11b329..87c0965365 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramChannelBannedRights.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramChannelBannedRights.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public struct TelegramChatBannedRightsFlags: OptionSet { diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaAction.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaAction.swift index a2b6e07029..43085a1b5c 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaAction.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaAction.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public enum PhoneCallDiscardReason: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift index 0cd49735ad..d7170bd462 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift @@ -1,11 +1,14 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif + private let typeFileName: Int32 = 0 private let typeSticker: Int32 = 1 private let typeImageSize: Int32 = 2 diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaGame.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaGame.swift index 3ccabcacd0..bbf2b1a1ee 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaGame.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaGame.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public final class TelegramMediaGame: Media { diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaImage.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaImage.swift index 3efa00e2fc..310f7249d8 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaImage.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaImage.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif public enum TelegramMediaImageReference: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaMap.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaMap.swift index de78e0a4ae..c06b658f11 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaMap.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaMap.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public final class NamedGeoPlace: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaPoll.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaPoll.swift index 5af04acc90..348a91a29a 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaPoll.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaPoll.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac +import TelegramApiMac #else import Postbox +import TelegramApi #endif public struct TelegramMediaPollOption: Equatable, PostboxCoding { diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaWebDocument.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaWebDocument.swift index 33ac09d3e1..a49a6dec59 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaWebDocument.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaWebDocument.swift @@ -1,11 +1,14 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif + public class TelegramMediaWebFile: Media { public let resource: TelegramMediaResource public let mimeType: String diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift index c1652527b4..949d822c87 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaWebpage.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift b/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift index 26785c1b2e..154d1b922b 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramPeerNotificationSettings.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public enum PeerMuteState: Equatable { diff --git a/submodules/TelegramCore/TelegramCore/TelegramUser.swift b/submodules/TelegramCore/TelegramCore/TelegramUser.swift index 9182029c21..b91ddc7a27 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramUser.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramUser.swift @@ -1,9 +1,11 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox import UIKit + import TelegramApi #endif public struct UserInfoFlags: OptionSet { @@ -60,15 +62,11 @@ public struct BotUserInfo: PostboxCoding, Equatable { encoder.encodeNil(forKey: "ip") } } - - public static func ==(lhs: BotUserInfo, rhs: BotUserInfo) -> Bool { - return lhs.flags == rhs.flags && lhs.inlinePlaceholder == rhs.inlinePlaceholder - } } public final class TelegramUser: Peer { public let id: PeerId - public let accessHash: Int64? + public let accessHash: TelegramPeerAccessHash? public let firstName: String? public let lastName: String? public let username: String? @@ -99,7 +97,7 @@ public final class TelegramUser: Peer { public let associatedPeerId: PeerId? = nil public let notificationSettingsPeerId: PeerId? = nil - public init(id: PeerId, accessHash: Int64?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: [TelegramMediaImageRepresentation], botInfo: BotUserInfo?, restrictionInfo: PeerAccessRestrictionInfo?, flags: UserInfoFlags) { + public init(id: PeerId, accessHash: TelegramPeerAccessHash?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: [TelegramMediaImageRepresentation], botInfo: BotUserInfo?, restrictionInfo: PeerAccessRestrictionInfo?, flags: UserInfoFlags) { self.id = id self.accessHash = accessHash self.firstName = firstName @@ -116,8 +114,13 @@ public final class TelegramUser: Peer { self.id = PeerId(decoder.decodeInt64ForKey("i", orElse: 0)) let accessHash: Int64 = decoder.decodeInt64ForKey("ah", orElse: 0) + let accessHashType: Int32 = decoder.decodeInt32ForKey("aht", orElse: 0) if accessHash != 0 { - self.accessHash = accessHash + if accessHashType == 0 { + self.accessHash = .personal(accessHash) + } else { + self.accessHash = .genericPublic(accessHash) + } } else { self.accessHash = nil } @@ -145,7 +148,14 @@ public final class TelegramUser: Peer { encoder.encodeInt64(self.id.toInt64(), forKey: "i") if let accessHash = self.accessHash { - encoder.encodeInt64(accessHash, forKey: "ah") + switch accessHash { + case let .personal(value): + encoder.encodeInt64(value, forKey: "ah") + encoder.encodeInt32(0, forKey: "aht") + case let .genericPublic(value): + encoder.encodeInt64(value, forKey: "ah") + encoder.encodeInt32(1, forKey: "aht") + } } if let firstName = self.firstName { @@ -241,7 +251,7 @@ public final class TelegramUser: Peer { func parsedTelegramProfilePhoto(_ photo: Api.UserProfilePhoto) -> [TelegramMediaImageRepresentation] { var representations: [TelegramMediaImageRepresentation] = [] switch photo { - case let .userProfilePhoto(photoId, photoSmall, photoBig, dcId): + case let .userProfilePhoto(_, photoSmall, photoBig, dcId): let smallResource: TelegramMediaResource let fullSizeResource: TelegramMediaResource switch photoSmall { @@ -266,6 +276,15 @@ extension TelegramUser { case let .user(flags, id, accessHash, firstName, lastName, username, phone, photo, _, _, restrictionReason, botInlinePlaceholder, _): let representations: [TelegramMediaImageRepresentation] = photo.flatMap(parsedTelegramProfilePhoto) ?? [] + let isMin = (flags & (1 << 20)) != 0 + let accessHashValue = accessHash.flatMap { value -> TelegramPeerAccessHash in + if isMin { + return .genericPublic(value) + } else { + return .personal(value) + } + } + var userFlags: UserInfoFlags = [] if (flags & (1 << 17)) != 0 { userFlags.insert(.isVerified) @@ -294,7 +313,7 @@ extension TelegramUser { let restrictionInfo: PeerAccessRestrictionInfo? = restrictionReason.flatMap(PeerAccessRestrictionInfo.init) - self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: accessHash, firstName: firstName, lastName: lastName, username: username, phone: phone, photo: representations, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags) + 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): self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) } @@ -302,8 +321,9 @@ extension TelegramUser { static func merge(_ lhs: TelegramUser?, rhs: Api.User) -> TelegramUser? { switch rhs { - case let .user(flags, _, accessHash, _, _, username, _, photo, _, _, restrictionReason, botInlinePlaceholder, _): - if let _ = accessHash { + case let .user(flags, _, rhsAccessHash, _, _, username, _, photo, _, _, restrictionReason, botInlinePlaceholder, _): + let isMin = (flags & (1 << 20)) != 0 + if !isMin { return TelegramUser(user: rhs) } else { let telegramPhoto = photo.flatMap(parsedTelegramProfilePhoto) ?? [] @@ -336,7 +356,22 @@ extension TelegramUser { let restrictionInfo: PeerAccessRestrictionInfo? = restrictionReason.flatMap(PeerAccessRestrictionInfo.init) - return TelegramUser(id: lhs.id, accessHash: lhs.accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: username, phone: lhs.phone, photo: telegramPhoto, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags) + let rhsAccessHashValue = rhsAccessHash.flatMap { value -> TelegramPeerAccessHash in + if isMin { + return .genericPublic(value) + } else { + return .personal(value) + } + } + + let accessHash: TelegramPeerAccessHash? + if let rhsAccessHashValue = rhsAccessHashValue, case .personal = rhsAccessHashValue { + accessHash = rhsAccessHashValue + } else { + accessHash = lhs.accessHash ?? rhsAccessHashValue + } + + return TelegramUser(id: lhs.id, accessHash: accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: username, phone: lhs.phone, photo: telegramPhoto, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags) } else { return TelegramUser(user: rhs) } diff --git a/submodules/TelegramCore/TelegramCore/TelegramUserPresence.swift b/submodules/TelegramCore/TelegramCore/TelegramUserPresence.swift index cc7e494924..937f102c01 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramUserPresence.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramUserPresence.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public enum UserPresenceStatus: Comparable, PostboxCoding { diff --git a/submodules/TelegramCore/TelegramCore/TermsOfService.swift b/submodules/TelegramCore/TelegramCore/TermsOfService.swift index bc49519de4..f375589b24 100644 --- a/submodules/TelegramCore/TelegramCore/TermsOfService.swift +++ b/submodules/TelegramCore/TelegramCore/TermsOfService.swift @@ -3,7 +3,9 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac +import TelegramApiMac #else +import TelegramApi import Postbox import SwiftSignalKit #if BUCK diff --git a/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift b/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift index 16f27b8917..e6c04ed113 100644 --- a/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift +++ b/submodules/TelegramCore/TelegramCore/TextEntitiesMessageAttribute.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif public enum MessageTextEntityType: Equatable { @@ -303,13 +305,10 @@ func apiEntitiesFromMessageTextEntities(_ entities: [MessageTextEntity], associa break case .Strikethrough: apiEntities.append(.messageEntityStrike(offset: offset, length: length)) - break case .BlockQuote: apiEntities.append(.messageEntityBlockquote(offset: offset, length: length)) - break case .Underline: apiEntities.append(.messageEntityUnderline(offset: offset, length: length)) - break case .Custom: break } diff --git a/submodules/TelegramCore/TelegramCore/ToggleChannelSignatures.swift b/submodules/TelegramCore/TelegramCore/ToggleChannelSignatures.swift index 8b5e1dc2d9..74c1bba7dd 100644 --- a/submodules/TelegramCore/TelegramCore/ToggleChannelSignatures.swift +++ b/submodules/TelegramCore/TelegramCore/ToggleChannelSignatures.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/TwoStepVerification.swift b/submodules/TelegramCore/TelegramCore/TwoStepVerification.swift index 4c253cd81c..a69a79f203 100644 --- a/submodules/TelegramCore/TelegramCore/TwoStepVerification.swift +++ b/submodules/TelegramCore/TelegramCore/TwoStepVerification.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/UpdateAccountPeerName.swift b/submodules/TelegramCore/TelegramCore/UpdateAccountPeerName.swift index 1451038f40..83513b3018 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateAccountPeerName.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateAccountPeerName.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift index f21684ad0b..6d13805ae1 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift @@ -2,117 +2,147 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif -func fetchAndUpdateSupplementalCachedPeerData(peerId: PeerId, network: Network, postbox: Postbox) -> Signal { +func fetchAndUpdateSupplementalCachedPeerData(peerId rawPeerId: PeerId, network: Network, postbox: Postbox) -> Signal { return postbox.transaction { transaction -> Signal in - if let peer = transaction.getPeer(peerId) { - let cachedData = transaction.getPeerCachedData(peerId: peerId) - - if let cachedData = cachedData as? CachedUserData { - if cachedData.peerStatusSettings != nil { - return .complete() - } - } else if let cachedData = cachedData as? CachedGroupData { - if cachedData.peerStatusSettings != nil { - return .complete() - } - } else if let cachedData = cachedData as? CachedChannelData { - if cachedData.peerStatusSettings != nil { - return .complete() - } - } else if let cachedData = cachedData as? CachedSecretChatData { - if cachedData.peerStatusSettings != nil { - return .complete() - } + guard let rawPeer = transaction.getPeer(rawPeerId) else { + return .complete() + } + + let peer: Peer + if let secretChat = rawPeer as? TelegramSecretChat { + guard let user = transaction.getPeer(secretChat.regularPeerId) else { + return .complete() } + peer = user + } else { + peer = rawPeer + } - if peerId.namespace == Namespaces.Peer.SecretChat { - return postbox.transaction { transaction -> Void in - var peerStatusSettings: PeerStatusSettings - if let peer = transaction.getPeer(peerId), let associatedPeerId = peer.associatedPeerId, !transaction.isPeerContact(peerId: associatedPeerId) { - if let peer = peer as? TelegramSecretChat, case .creator = peer.role { - peerStatusSettings = PeerStatusSettings() - peerStatusSettings = [] - } else { - peerStatusSettings = PeerStatusSettings() - peerStatusSettings.insert(.canReport) - } - } else { + let cachedData = transaction.getPeerCachedData(peerId: peer.id) + + if let cachedData = cachedData as? CachedUserData { + if cachedData.peerStatusSettings != nil { + return .complete() + } + } else if let cachedData = cachedData as? CachedGroupData { + if cachedData.peerStatusSettings != nil { + return .complete() + } + } else if let cachedData = cachedData as? CachedChannelData { + if cachedData.peerStatusSettings != nil { + return .complete() + } + } else if let cachedData = cachedData as? CachedSecretChatData { + if cachedData.peerStatusSettings != nil { + return .complete() + } + } + + if peer.id.namespace == Namespaces.Peer.SecretChat { + return postbox.transaction { transaction -> Void in + var peerStatusSettings: PeerStatusSettings + if let peer = transaction.getPeer(peer.id), let associatedPeerId = peer.associatedPeerId, !transaction.isPeerContact(peerId: associatedPeerId) { + if let peer = peer as? TelegramSecretChat, case .creator = peer.role { peerStatusSettings = PeerStatusSettings() peerStatusSettings = [] + } else { + peerStatusSettings = PeerStatusSettings() + peerStatusSettings.insert(.canReport) } - - transaction.updatePeerCachedData(peerIds: [peerId], update: { peerId, current in - if let current = current as? CachedSecretChatData { - return current.withUpdatedPeerStatusSettings(peerStatusSettings) - } else { - return CachedSecretChatData(peerStatusSettings: peerStatusSettings) + } else { + peerStatusSettings = PeerStatusSettings() + peerStatusSettings = [] + } + + transaction.updatePeerCachedData(peerIds: [peer.id], update: { peerId, current in + if let current = current as? CachedSecretChatData { + return current.withUpdatedPeerStatusSettings(peerStatusSettings) + } else { + return CachedSecretChatData(peerStatusSettings: peerStatusSettings) + } + }) + } + } else if let inputPeer = apiInputPeer(peer) { + return network.request(Api.functions.messages.getPeerSettings(peer: inputPeer)) + |> retryRequest + |> mapToSignal { peerSettings -> Signal in + let peerStatusSettings = PeerStatusSettings(apiSettings: peerSettings) + + return postbox.transaction { transaction -> Void in + transaction.updatePeerCachedData(peerIds: Set([peer.id]), update: { _, current in + switch peer.id.namespace { + case Namespaces.Peer.CloudUser: + let previous: CachedUserData + if let current = current as? CachedUserData { + previous = current + } else { + previous = CachedUserData() + } + return previous.withUpdatedPeerStatusSettings(peerStatusSettings) + case Namespaces.Peer.CloudGroup: + let previous: CachedGroupData + if let current = current as? CachedGroupData { + previous = current + } else { + previous = CachedGroupData() + } + return previous.withUpdatedPeerStatusSettings(peerStatusSettings) + case Namespaces.Peer.CloudChannel: + let previous: CachedChannelData + if let current = current as? CachedChannelData { + previous = current + } else { + previous = CachedChannelData() + } + return previous.withUpdatedPeerStatusSettings(peerStatusSettings) + default: + break } + return current }) } - } else if let inputPeer = apiInputPeer(peer) { - return network.request(Api.functions.messages.getPeerSettings(peer: inputPeer)) - |> retryRequest - |> mapToSignal { peerSettings -> Signal in - let peerStatusSettings = PeerStatusSettings(apiSettings: peerSettings) - - return postbox.transaction { transaction -> Void in - transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in - switch peerId.namespace { - case Namespaces.Peer.CloudUser: - let previous: CachedUserData - if let current = current as? CachedUserData { - previous = current - } else { - previous = CachedUserData() - } - return previous.withUpdatedPeerStatusSettings(peerStatusSettings) - case Namespaces.Peer.CloudGroup: - let previous: CachedGroupData - if let current = current as? CachedGroupData { - previous = current - } else { - previous = CachedGroupData() - } - return previous.withUpdatedPeerStatusSettings(peerStatusSettings) - case Namespaces.Peer.CloudChannel: - let previous: CachedChannelData - if let current = current as? CachedChannelData { - previous = current - } else { - previous = CachedChannelData() - } - return previous.withUpdatedPeerStatusSettings(peerStatusSettings) - default: - break - } - return current - }) - } - } - } else { - return .complete() } } else { return .complete() } - } |> switchToLatest + } + |> switchToLatest } -func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId: PeerId, network: Network, postbox: Postbox) -> Signal { - return postbox.transaction { transaction -> (Api.InputUser?, Peer?) in - if peerId == accountPeerId { - return (.inputUserSelf, transaction.getPeer(peerId)) +func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerId, network: Network, postbox: Postbox) -> Signal { + return postbox.transaction { transaction -> (Api.InputUser?, Peer?, PeerId) in + guard let rawPeer = transaction.getPeer(rawPeerId) else { + if rawPeerId == accountPeerId { + return (.inputUserSelf, transaction.getPeer(rawPeerId), rawPeerId) + } else { + return (nil, nil, rawPeerId) + } + } + + let peer: Peer + if let secretChat = rawPeer as? TelegramSecretChat { + guard let user = transaction.getPeer(secretChat.regularPeerId) else { + return (nil, nil, rawPeerId) + } + peer = user } else { - let peer = transaction.getPeer(peerId) - return (peer.flatMap(apiInputUser), peer) + peer = rawPeer + } + + if rawPeerId == accountPeerId { + return (.inputUserSelf, transaction.getPeer(rawPeerId), rawPeerId) + } else { + return (apiInputUser(peer), peer, peer.id) } } - |> mapToSignal { inputUser, maybePeer -> Signal in + |> mapToSignal { inputUser, maybePeer, peerId -> Signal in if let inputUser = inputUser { return network.request(Api.functions.users.getFullUser(id: inputUser)) |> retryRequest @@ -250,7 +280,7 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId: PeerId, network } switch fullChat { - case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, pts): + case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, location, pts): var channelFlags = CachedChannelFlags() if (flags & (1 << 3)) != 0 { channelFlags.insert(.canDisplayParticipants) @@ -267,15 +297,24 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId: PeerId, network if (flags & (1 << 7)) != 0 { channelFlags.insert(.canSetStickerSet) } + if (flags & (1 << 16)) != 0 { + channelFlags.insert(.canChangePeerGeoLocation) + } let linkedDiscussionPeerId: PeerId? - if let linkedChatId = linkedChatId, linkedChatId != 0 { linkedDiscussionPeerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: linkedChatId) } else { linkedDiscussionPeerId = nil } + let peerGeoLocation: PeerGeoLocation? + if let location = location { + peerGeoLocation = PeerGeoLocation(apiLocation: location) + } else { + peerGeoLocation = nil + } + var botInfos: [CachedPeerBotInfo] = [] for botInfo in apiBotInfos { switch botInfo { @@ -363,6 +402,7 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId: PeerId, network .withUpdatedMinAvailableMessageId(minAvailableMessageId) .withUpdatedMigrationReference(migrationReference) .withUpdatedLinkedDiscussionPeerId(linkedDiscussionPeerId) + .withUpdatedPeerGeoLocation(peerGeoLocation: peerGeoLocation) }) if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { diff --git a/submodules/TelegramCore/TelegramCore/UpdateContactName.swift b/submodules/TelegramCore/TelegramCore/UpdateContactName.swift index c6a4ad67d5..c917657f3b 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateContactName.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateContactName.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else @@ -19,26 +21,19 @@ public enum UpdateContactNameError { public func updateContactName(account: Account, peerId: PeerId, firstName: String, lastName: String) -> Signal { return account.postbox.transaction { transaction -> Signal in - if let peer = transaction.getPeer(peerId) as? TelegramUser, let phone = peer.phone, !phone.isEmpty { - return account.network.request(Api.functions.contacts.importContacts(contacts: [Api.InputContact.inputPhoneContact(clientId: 1, phone: phone, firstName: firstName, lastName: lastName)])) - |> mapError { _ -> UpdateContactNameError in - return .generic - } - |> mapToSignal { result -> Signal in - return account.postbox.transaction { transaction -> Void in - switch result { - case let .importedContacts(_, _, _, users): - if let first = users.first { - let user = TelegramUser(user: first) - updatePeers(transaction: transaction, peers: [user], update: { _, updated in - return updated - }) - } - } - } |> mapError { _ -> UpdateContactNameError in return .generic } - } + if let peer = transaction.getPeer(peerId) as? TelegramUser, let inputUser = apiInputUser(peer) { + return account.network.request(Api.functions.contacts.addContact(flags: 0, id: inputUser, firstName: firstName, lastName: lastName, phone: "")) + |> mapError { _ -> UpdateContactNameError in + return .generic + } + |> mapToSignal { result -> Signal in + account.stateManager.addUpdates(result) + return .complete() + } } else { return .fail(.generic) } - } |> mapError { _ -> UpdateContactNameError in return .generic } |> switchToLatest + } + |> mapError { _ -> UpdateContactNameError in return .generic } + |> switchToLatest } diff --git a/submodules/TelegramCore/TelegramCore/UpdateGroup.swift b/submodules/TelegramCore/TelegramCore/UpdateGroup.swift index e2f829ac05..2504739e31 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateGroup.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateGroup.swift @@ -1,4 +1,9 @@ import Foundation +#if os(macOS) +import TelegramApiMac +#else +import TelegramApi +#endif enum UpdateGroup { case withPts(updates: [Api.Update], users: [Api.User], chats: [Api.Chat]) diff --git a/submodules/TelegramCore/TelegramCore/UpdateGroupSpecificStickerset.swift b/submodules/TelegramCore/TelegramCore/UpdateGroupSpecificStickerset.swift index 4ed49e5737..804f3096b2 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateGroupSpecificStickerset.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateGroupSpecificStickerset.swift @@ -2,12 +2,13 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif - public enum UpdateGroupSpecificStickersetError { case generic } diff --git a/submodules/TelegramCore/TelegramCore/UpdateMessageMedia.swift b/submodules/TelegramCore/TelegramCore/UpdateMessageMedia.swift index 7ec82bfdb0..acc02d00cf 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateMessageMedia.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateMessageMedia.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac +import TelegramApiMac #else import Postbox +import TelegramApi #endif func updateMessageMedia(transaction: Transaction, id: MediaId, media: Media?) { diff --git a/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift b/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift index 25dfadded5..0f1676ecd2 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateMessageService.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/UpdatePeerInfo.swift b/submodules/TelegramCore/TelegramCore/UpdatePeerInfo.swift index 6753589d01..aa395f18af 100644 --- a/submodules/TelegramCore/TelegramCore/UpdatePeerInfo.swift +++ b/submodules/TelegramCore/TelegramCore/UpdatePeerInfo.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/UpdatePeers.swift b/submodules/TelegramCore/TelegramCore/UpdatePeers.swift index 49b41a7529..3b94506f7b 100644 --- a/submodules/TelegramCore/TelegramCore/UpdatePeers.swift +++ b/submodules/TelegramCore/TelegramCore/UpdatePeers.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif func updatePeerChatInclusionWithMinTimestamp(transaction: Transaction, id: PeerId, minTimestamp: Int32, forceRootGroupIfNotExists: Bool) { @@ -136,3 +138,34 @@ func updatePeerPresenceLastActivities(transaction: Transaction, accountPeerId: P }) } } + +func updateContacts(transaction: Transaction, apiUsers: [Api.User]) { + if apiUsers.isEmpty { + return + } + var contactIds = transaction.getContactPeerIds() + var updated = false + for user in apiUsers { + let isContact: Bool + switch user { + case let .user(user): + isContact = (user.flags & (1 << 11)) != 0 + case .userEmpty: + isContact = false + } + if isContact { + if !contactIds.contains(user.peerId) { + contactIds.insert(user.peerId) + updated = true + } + } else { + if contactIds.contains(user.peerId) { + contactIds.remove(user.peerId) + updated = true + } + } + } + if updated { + transaction.replaceContactPeerIds(contactIds) + } +} diff --git a/submodules/TelegramCore/TelegramCore/UpdatePinnedMessage.swift b/submodules/TelegramCore/TelegramCore/UpdatePinnedMessage.swift index a042a6b80c..b48242cfc2 100644 --- a/submodules/TelegramCore/TelegramCore/UpdatePinnedMessage.swift +++ b/submodules/TelegramCore/TelegramCore/UpdatePinnedMessage.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift b/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift index a36485ebd0..feb89aa59f 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift b/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift index e489e3a9f0..f335b6d504 100644 --- a/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift +++ b/submodules/TelegramCore/TelegramCore/UpdatedAccountPrivacySettings.swift @@ -2,8 +2,10 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi import SwiftSignalKit #endif diff --git a/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift b/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift index 557472cedf..a44ed98572 100644 --- a/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift +++ b/submodules/TelegramCore/TelegramCore/UpdatesApiUtils.swift @@ -1,8 +1,10 @@ import Foundation #if os(macOS) import PostboxMac + import TelegramApiMac #else import Postbox + import TelegramApi #endif private func collectPreCachedResources(for photo: Api.Photo) -> [(MediaResource, Data)]? { diff --git a/submodules/TelegramCore/TelegramCore/VerifySecureIdValue.swift b/submodules/TelegramCore/TelegramCore/VerifySecureIdValue.swift index d66550476b..f7d9a98ddb 100644 --- a/submodules/TelegramCore/TelegramCore/VerifySecureIdValue.swift +++ b/submodules/TelegramCore/TelegramCore/VerifySecureIdValue.swift @@ -3,8 +3,10 @@ import Foundation import PostboxMac import MtProtoKitMac import SwiftSignalKitMac + import TelegramApiMac #else import Postbox + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore/Wallpaper.swift b/submodules/TelegramCore/TelegramCore/Wallpaper.swift index 6bb2d88366..7a56e2bcf8 100644 --- a/submodules/TelegramCore/TelegramCore/Wallpaper.swift +++ b/submodules/TelegramCore/TelegramCore/Wallpaper.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox import SwiftSignalKit +import TelegramApi #endif public struct WallpaperSettings: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/TelegramCore/Wallpapers.swift b/submodules/TelegramCore/TelegramCore/Wallpapers.swift index 81fc0179c1..a84b61d740 100644 --- a/submodules/TelegramCore/TelegramCore/Wallpapers.swift +++ b/submodules/TelegramCore/TelegramCore/Wallpapers.swift @@ -2,9 +2,11 @@ import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac +import TelegramApiMac #else import Postbox import SwiftSignalKit +import TelegramApi #endif final class CachedWallpapersConfiguration: PostboxCoding { diff --git a/submodules/TelegramCore/TelegramCore/WebpagePreview.swift b/submodules/TelegramCore/TelegramCore/WebpagePreview.swift index c644609f16..8a52f77688 100644 --- a/submodules/TelegramCore/TelegramCore/WebpagePreview.swift +++ b/submodules/TelegramCore/TelegramCore/WebpagePreview.swift @@ -3,9 +3,11 @@ import Foundation import PostboxMac import SwiftSignalKitMac import MtProtoKitMac + import TelegramApiMac #else import Postbox import SwiftSignalKit + import TelegramApi #if BUCK import MtProtoKit #else diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index c35cf28d1a..e78181aaa8 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -25,7 +25,6 @@ 09EDAD3A22131D010012A50B /* ManagedAutodownloadSettingsUpdates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EDAD3922131D010012A50B /* ManagedAutodownloadSettingsUpdates.swift */; }; 9F06831021A40DEC001D8EDB /* NotificationExceptionsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F06830F21A40DEC001D8EDB /* NotificationExceptionsList.swift */; }; 9F06831121A40DEC001D8EDB /* NotificationExceptionsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F06830F21A40DEC001D8EDB /* NotificationExceptionsList.swift */; }; - 9F10CE8B20613C78002DD61A /* SecretApiLayer73.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018EDFF2044939F00CBB130 /* SecretApiLayer73.swift */; }; 9F10CE8C20613CDB002DD61A /* TelegramDeviceContactImportInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B2F7732052DEF700D3BFB9 /* TelegramDeviceContactImportInfo.swift */; }; 9F153D1021E8E0A200B95D82 /* Wallpaper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0900555521E4A96D0030924C /* Wallpaper.swift */; }; 9F1BC1AB2244CFED00F21815 /* EmojiKeywords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 093857AA2243D88C00EB6A54 /* EmojiKeywords.swift */; }; @@ -151,7 +150,6 @@ D01843A92190C28100278AFF /* ConfirmTwoStepRecoveryEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01843A72190C28100278AFF /* ConfirmTwoStepRecoveryEmail.swift */; }; D018D3371E648ACF00C5E089 /* ChannelCreation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018D3361E648ACF00C5E089 /* ChannelCreation.swift */; }; D018D3381E648ACF00C5E089 /* ChannelCreation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018D3361E648ACF00C5E089 /* ChannelCreation.swift */; }; - D018EE002044939F00CBB130 /* SecretApiLayer73.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018EDFF2044939F00CBB130 /* SecretApiLayer73.swift */; }; D018EE0220458E1E00CBB130 /* SecretChatLayerNegotiation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018EE0120458E1E00CBB130 /* SecretChatLayerNegotiation.swift */; }; D018EE0320458E1E00CBB130 /* SecretChatLayerNegotiation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018EE0120458E1E00CBB130 /* SecretChatLayerNegotiation.swift */; }; D018EE052045E95000CBB130 /* CheckPeerChatServiceActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D018EE042045E95000CBB130 /* CheckPeerChatServiceActions.swift */; }; @@ -218,6 +216,7 @@ 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 */; }; + 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 */; }; D03B0CB91D62233400955575 /* Either.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0CB81D62233400955575 /* Either.swift */; }; @@ -251,7 +250,6 @@ D03B0D101D62255C00955575 /* UpdatesApiUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D071D62255C00955575 /* UpdatesApiUtils.swift */; }; D03B0D3D1D6319E200955575 /* Fetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D391D6319E200955575 /* Fetch.swift */; }; D03B0D441D6319F900955575 /* CloudFileMediaResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D431D6319F900955575 /* CloudFileMediaResource.swift */; }; - D03B0D5B1D631A6900955575 /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D551D631A6900955575 /* Buffer.swift */; }; D03B0D5C1D631A6900955575 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D561D631A6900955575 /* Download.swift */; }; D03B0D5D1D631A6900955575 /* MultipartFetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D571D631A6900955575 /* MultipartFetch.swift */; }; D03B0D5E1D631A6900955575 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D581D631A6900955575 /* Network.swift */; }; @@ -300,8 +298,6 @@ D0448C8F1E22993C005A61A7 /* ProcessSecretChatIncomingDecryptedOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448C8D1E22993C005A61A7 /* ProcessSecretChatIncomingDecryptedOperations.swift */; }; D0448C911E251F96005A61A7 /* SecretChatEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448C901E251F96005A61A7 /* SecretChatEncryption.swift */; }; D0448C921E251F96005A61A7 /* SecretChatEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448C901E251F96005A61A7 /* SecretChatEncryption.swift */; }; - D0448C991E268F9A005A61A7 /* SecretApiLayer46.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448C981E268F9A005A61A7 /* SecretApiLayer46.swift */; }; - D0448C9A1E268F9A005A61A7 /* SecretApiLayer46.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448C981E268F9A005A61A7 /* SecretApiLayer46.swift */; }; D0448C9F1E27F5EB005A61A7 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448C9E1E27F5EB005A61A7 /* Random.swift */; }; D0448CA01E27F5EB005A61A7 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448C9E1E27F5EB005A61A7 /* Random.swift */; }; D0448CA21E291B14005A61A7 /* FetchSecretFileResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0448CA11E291B14005A61A7 /* FetchSecretFileResource.swift */; }; @@ -404,6 +400,8 @@ D0575AF21E9FFA5D006F2541 /* SynchronizeSavedGifsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0575AF01E9FFA5D006F2541 /* SynchronizeSavedGifsOperation.swift */; }; D0575AF41E9FFDDE006F2541 /* ManagedSynchronizeSavedGifsOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0575AF31E9FFDDD006F2541 /* ManagedSynchronizeSavedGifsOperations.swift */; }; D0575AF51E9FFDDE006F2541 /* ManagedSynchronizeSavedGifsOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0575AF31E9FFDDD006F2541 /* ManagedSynchronizeSavedGifsOperations.swift */; }; + D0575C2D22B922DF00A71A0E /* DeleteAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0575C2C22B922DF00A71A0E /* DeleteAccount.swift */; }; + D0575C2E22B922DF00A71A0E /* DeleteAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0575C2C22B922DF00A71A0E /* DeleteAccount.swift */; }; D058E0D11E8AD65C00A442DE /* StandaloneSendMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D058E0D01E8AD65C00A442DE /* StandaloneSendMessage.swift */; }; D058E0D21E8AD65C00A442DE /* StandaloneSendMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D058E0D01E8AD65C00A442DE /* StandaloneSendMessage.swift */; }; D05A32E11E6F0982002760B4 /* UpdatedAccountPrivacySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05A32E01E6F0982002760B4 /* UpdatedAccountPrivacySettings.swift */; }; @@ -428,8 +426,6 @@ D0642EFA1F3E05D700792790 /* EarliestUnseenPersonalMentionMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0642EF81F3E05D700792790 /* EarliestUnseenPersonalMentionMessage.swift */; }; D067066C1D512ADB00DED3E3 /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06706671D512ADB00DED3E3 /* Postbox.framework */; }; D067066D1D512ADB00DED3E3 /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06706681D512ADB00DED3E3 /* SwiftSignalKit.framework */; }; - D06AFE8920BF66BF00EA5124 /* DeserializeFunctionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06AFE8820BF66BF00EA5124 /* DeserializeFunctionResponse.swift */; }; - D06AFE8A20BF66BF00EA5124 /* DeserializeFunctionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06AFE8820BF66BF00EA5124 /* DeserializeFunctionResponse.swift */; }; D06CA13522772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06CA13422772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift */; }; D06CA13622772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06CA13422772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift */; }; D06ECFC820B810D300C576C2 /* TermsOfService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06ECFC720B810D300C576C2 /* TermsOfService.swift */; }; @@ -451,6 +447,8 @@ D073CEA11DCBF3D3007511FD /* StickerPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0DE1DB539FC00C6B04F /* StickerPack.swift */; }; D073CEA41DCBF3EA007511FD /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03C53761DAFF20F004C17B3 /* MultipartUpload.swift */; }; D073CEA51DCBF3F5007511FD /* StickerManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0E11DB5401A00C6B04F /* StickerManagement.swift */; }; + D0750C9022B2FD8300BE5F6E /* PeerAccessHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C8F22B2FD8300BE5F6E /* PeerAccessHash.swift */; }; + D0750C9122B2FD8300BE5F6E /* PeerAccessHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C8F22B2FD8300BE5F6E /* PeerAccessHash.swift */; }; D0754D2A1EEE10FC00884F6E /* BotPaymentForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0754D291EEE10FC00884F6E /* BotPaymentForm.swift */; }; D0754D2B1EEE10FC00884F6E /* BotPaymentForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0754D291EEE10FC00884F6E /* BotPaymentForm.swift */; }; D076F8892296D8E9004F895A /* ManageChannelDiscussionGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = D076F8882296D8E9004F895A /* ManageChannelDiscussionGroup.swift */; }; @@ -509,12 +507,6 @@ D09D8C0B1D4FAB1D0081DBEC /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09D8C011D4FAB1D0081DBEC /* TelegramCore.framework */; }; D09D8C101D4FAB1D0081DBEC /* TelegramCoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D09D8C0F1D4FAB1D0081DBEC /* TelegramCoreTests.m */; }; D09D8C121D4FAB1D0081DBEC /* TelegramCore.h in Headers */ = {isa = PBXBuildFile; fileRef = D09D8C041D4FAB1D0081DBEC /* TelegramCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D09F9DC820767D2C00DB4DE1 /* Api3.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09F9DC520767D2C00DB4DE1 /* Api3.swift */; }; - D09F9DC920767D2C00DB4DE1 /* Api3.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09F9DC520767D2C00DB4DE1 /* Api3.swift */; }; - D09F9DCA20767D2C00DB4DE1 /* Api1.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09F9DC620767D2C00DB4DE1 /* Api1.swift */; }; - D09F9DCB20767D2C00DB4DE1 /* Api1.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09F9DC620767D2C00DB4DE1 /* Api1.swift */; }; - D09F9DCC20767D2C00DB4DE1 /* Api2.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09F9DC720767D2C00DB4DE1 /* Api2.swift */; }; - D09F9DCD20767D2C00DB4DE1 /* Api2.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09F9DC720767D2C00DB4DE1 /* Api2.swift */; }; D0A3E447214802C7008ACEF6 /* VoipConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A3E446214802C7008ACEF6 /* VoipConfiguration.swift */; }; D0A3E448214802C7008ACEF6 /* VoipConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A3E446214802C7008ACEF6 /* VoipConfiguration.swift */; }; D0A472B61F4CBE8B00E0EEDA /* LoadedPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A472B51F4CBE8B00E0EEDA /* LoadedPeer.swift */; }; @@ -563,7 +555,6 @@ D0B4189B1D7E0580004562A4 /* TelegramMediaWebpage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0CF31D62250800955575 /* TelegramMediaWebpage.swift */; }; D0B418A61D7E0592004562A4 /* CloudFileMediaResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D431D6319F900955575 /* CloudFileMediaResource.swift */; }; D0B418A71D7E0592004562A4 /* Fetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D391D6319E200955575 /* Fetch.swift */; }; - D0B418A91D7E0597004562A4 /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D551D631A6900955575 /* Buffer.swift */; }; D0B418AA1D7E0597004562A4 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D561D631A6900955575 /* Download.swift */; }; D0B418AB1D7E0597004562A4 /* MultipartFetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D571D631A6900955575 /* MultipartFetch.swift */; }; D0B418AC1D7E0597004562A4 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0D581D631A6900955575 /* Network.swift */; }; @@ -682,6 +673,7 @@ D0CA8E4B227209C4008A74C3 /* ManagedSynchronizeGroupMessageStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CA8E4A227209C4008A74C3 /* ManagedSynchronizeGroupMessageStats.swift */; }; D0CA8E4C227209C4008A74C3 /* ManagedSynchronizeGroupMessageStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CA8E4A227209C4008A74C3 /* ManagedSynchronizeGroupMessageStats.swift */; }; D0CAF2EA1D75EC600011F558 /* MtProtoKitDynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CAF2E91D75EC600011F558 /* MtProtoKitDynamic.framework */; }; + D0CC4ADC22BA47280088F36D /* TelegramApiMac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CC4ADB22BA47280088F36D /* TelegramApiMac.framework */; }; D0D1026C2212FE52003ADA5E /* AccountSortOrderAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D1026B2212FE52003ADA5E /* AccountSortOrderAttribute.swift */; }; D0D1026D2212FE52003ADA5E /* AccountSortOrderAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D1026B2212FE52003ADA5E /* AccountSortOrderAttribute.swift */; }; D0D748021E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D748011E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift */; }; @@ -736,8 +728,6 @@ D0E41302206B9E6E00BEE4A2 /* SecureIdAddressValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E41300206B9E6E00BEE4A2 /* SecureIdAddressValue.swift */; }; D0E6521F1E3A364A004EEA91 /* UpdateAccountPeerName.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E6521E1E3A364A004EEA91 /* UpdateAccountPeerName.swift */; }; D0E652201E3A364A004EEA91 /* UpdateAccountPeerName.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E6521E1E3A364A004EEA91 /* UpdateAccountPeerName.swift */; }; - D0E68775207534CA0064BDB2 /* Api0.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E68768207534C90064BDB2 /* Api0.swift */; }; - D0E68776207534CA0064BDB2 /* Api0.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E68768207534C90064BDB2 /* Api0.swift */; }; D0E817492010E7E300B82BBB /* ChannelAdminEventLogContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E817482010E7E300B82BBB /* ChannelAdminEventLogContext.swift */; }; D0E8174A2010E7E300B82BBB /* ChannelAdminEventLogContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E817482010E7E300B82BBB /* ChannelAdminEventLogContext.swift */; }; D0E8B8B32044706300605593 /* ForwardGame.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8B8B22044706300605593 /* ForwardGame.swift */; }; @@ -783,8 +773,6 @@ D0F7B1EA1E045C87007EB8A5 /* ChangePeerNotificationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B843961DA7FBBC005F29E1 /* ChangePeerNotificationSettings.swift */; }; D0F7B1EB1E045C87007EB8A5 /* ResolvePeerByName.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F3CC7C1DDE289E008148FA /* ResolvePeerByName.swift */; }; D0F7B1EC1E045C87007EB8A5 /* SearchPeers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07827BA1E00451F00071108 /* SearchPeers.swift */; }; - D0F8C39D20178B9B00236FC5 /* GroupFeedPeers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F8C39C20178B9B00236FC5 /* GroupFeedPeers.swift */; }; - D0F8C39E20178B9B00236FC5 /* GroupFeedPeers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F8C39C20178B9B00236FC5 /* GroupFeedPeers.swift */; }; D0F8C3A02017AF2700236FC5 /* GlobalTelegramCoreConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F8C39F2017AF2700236FC5 /* GlobalTelegramCoreConfiguration.swift */; }; D0F8C3A12017AF2700236FC5 /* GlobalTelegramCoreConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F8C39F2017AF2700236FC5 /* GlobalTelegramCoreConfiguration.swift */; }; D0FA08BB2046B37900DD23FC /* ContentPrivacySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA08BA2046B37900DD23FC /* ContentPrivacySettings.swift */; }; @@ -812,8 +800,6 @@ D0FA8BB11E1FEC7E001E855B /* SecretChatEncryptionConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA8BAF1E1FEC7E001E855B /* SecretChatEncryptionConfig.swift */; }; D0FA8BB31E201B02001E855B /* ProcessSecretChatIncomingEncryptedOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA8BB21E201B02001E855B /* ProcessSecretChatIncomingEncryptedOperations.swift */; }; D0FA8BB41E201B02001E855B /* ProcessSecretChatIncomingEncryptedOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA8BB21E201B02001E855B /* ProcessSecretChatIncomingEncryptedOperations.swift */; }; - D0FA8BB61E223C16001E855B /* SecretApiLayer8.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA8BB51E223C16001E855B /* SecretApiLayer8.swift */; }; - D0FA8BB71E223C16001E855B /* SecretApiLayer8.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA8BB51E223C16001E855B /* SecretApiLayer8.swift */; }; D0FA8BB91E2240B4001E855B /* SecretChatIncomingDecryptedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA8BB81E2240B4001E855B /* SecretChatIncomingDecryptedOperation.swift */; }; D0FA8BBA1E2240B4001E855B /* SecretChatIncomingDecryptedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA8BB81E2240B4001E855B /* SecretChatIncomingDecryptedOperation.swift */; }; D0FC195B2020D1CA00FEDBB2 /* PeerGroupMessageStateVersionAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FC195A2020D1CA00FEDBB2 /* PeerGroupMessageStateVersionAttribute.swift */; }; @@ -895,7 +881,6 @@ D0177B7A1DF8A16C00A5083A /* SecretChatState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatState.swift; sourceTree = ""; }; D01843A72190C28100278AFF /* ConfirmTwoStepRecoveryEmail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmTwoStepRecoveryEmail.swift; sourceTree = ""; }; D018D3361E648ACF00C5E089 /* ChannelCreation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelCreation.swift; sourceTree = ""; }; - D018EDFF2044939F00CBB130 /* SecretApiLayer73.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer73.swift; sourceTree = ""; }; D018EE0120458E1E00CBB130 /* SecretChatLayerNegotiation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretChatLayerNegotiation.swift; sourceTree = ""; }; D018EE042045E95000CBB130 /* CheckPeerChatServiceActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckPeerChatServiceActions.swift; sourceTree = ""; }; D019B1CB1E2E3B6A00F80DB3 /* SecretChatRekeySession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatRekeySession.swift; sourceTree = ""; }; @@ -934,6 +919,7 @@ D033FEAF1E61EB0200644997 /* PeerContactSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerContactSettings.swift; sourceTree = ""; }; D033FEB21E61F3C000644997 /* ReportPeer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReportPeer.swift; sourceTree = ""; }; D033FEB51E61F3F900644997 /* BlockedPeers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockedPeers.swift; sourceTree = ""; }; + D035732E22B5C24F00F0920D /* TelegramApi.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramApi.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0380DB9204EF306000414AB /* MessageMediaPreuploadManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageMediaPreuploadManager.swift; sourceTree = ""; }; D03B0CB81D62233400955575 /* Either.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Either.swift; sourceTree = ""; }; D03B0CBC1D62234300955575 /* Regex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Regex.swift; sourceTree = ""; }; @@ -966,7 +952,6 @@ D03B0D071D62255C00955575 /* UpdatesApiUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatesApiUtils.swift; sourceTree = ""; }; D03B0D391D6319E200955575 /* Fetch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fetch.swift; sourceTree = ""; }; D03B0D431D6319F900955575 /* CloudFileMediaResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CloudFileMediaResource.swift; sourceTree = ""; }; - D03B0D551D631A6900955575 /* Buffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Buffer.swift; sourceTree = ""; }; D03B0D561D631A6900955575 /* Download.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Download.swift; sourceTree = ""; }; D03B0D571D631A6900955575 /* MultipartFetch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipartFetch.swift; sourceTree = ""; }; D03B0D581D631A6900955575 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; @@ -1000,7 +985,6 @@ D0439B5F228EDE430067E026 /* ContentRequiresValidationMessageAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentRequiresValidationMessageAttribute.swift; sourceTree = ""; }; D0448C8D1E22993C005A61A7 /* ProcessSecretChatIncomingDecryptedOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProcessSecretChatIncomingDecryptedOperations.swift; sourceTree = ""; }; D0448C901E251F96005A61A7 /* SecretChatEncryption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatEncryption.swift; sourceTree = ""; }; - D0448C981E268F9A005A61A7 /* SecretApiLayer46.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer46.swift; sourceTree = ""; }; D0448C9E1E27F5EB005A61A7 /* Random.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Random.swift; sourceTree = ""; }; D0448CA11E291B14005A61A7 /* FetchSecretFileResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchSecretFileResource.swift; sourceTree = ""; }; D0448CA41E29215A005A61A7 /* MediaResourceApiUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaResourceApiUtils.swift; sourceTree = ""; }; @@ -1042,6 +1026,7 @@ D0561DE91E5754FA00E6B9E9 /* ChannelAdmins.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelAdmins.swift; sourceTree = ""; }; D0575AF01E9FFA5D006F2541 /* SynchronizeSavedGifsOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronizeSavedGifsOperation.swift; sourceTree = ""; }; D0575AF31E9FFDDD006F2541 /* ManagedSynchronizeSavedGifsOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedSynchronizeSavedGifsOperations.swift; sourceTree = ""; }; + D0575C2C22B922DF00A71A0E /* DeleteAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteAccount.swift; sourceTree = ""; }; D058E0D01E8AD65C00A442DE /* StandaloneSendMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StandaloneSendMessage.swift; sourceTree = ""; }; D05A32E01E6F0982002760B4 /* UpdatedAccountPrivacySettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatedAccountPrivacySettings.swift; sourceTree = ""; }; D05A32E31E6F0B2E002760B4 /* RecentAccountSessions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentAccountSessions.swift; sourceTree = ""; }; @@ -1058,7 +1043,6 @@ D06706671D512ADB00DED3E3 /* Postbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D06706681D512ADB00DED3E3 /* SwiftSignalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D067066E1D512AEB00DED3E3 /* MtProtoKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MtProtoKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D06AFE8820BF66BF00EA5124 /* DeserializeFunctionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeserializeFunctionResponse.swift; sourceTree = ""; }; D06CA13422772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedNotificationSettingsBehaviors.swift; sourceTree = ""; }; D06ECFC720B810D300C576C2 /* TermsOfService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfService.swift; sourceTree = ""; }; D07047B31F3DF1FE00F6A8D4 /* ConsumablePersonalMentionMessageAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConsumablePersonalMentionMessageAttribute.swift; sourceTree = ""; }; @@ -1066,6 +1050,7 @@ D07047B91F3DF75500F6A8D4 /* ConsumePersonalMessageAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConsumePersonalMessageAction.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 = ""; }; D0754D291EEE10FC00884F6E /* BotPaymentForm.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BotPaymentForm.swift; sourceTree = ""; }; D076F8882296D8E9004F895A /* ManageChannelDiscussionGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManageChannelDiscussionGroup.swift; sourceTree = ""; }; D07827BA1E00451F00071108 /* SearchPeers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchPeers.swift; sourceTree = ""; }; @@ -1105,9 +1090,6 @@ D09D8C0A1D4FAB1D0081DBEC /* TelegramCoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TelegramCoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D09D8C0F1D4FAB1D0081DBEC /* TelegramCoreTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TelegramCoreTests.m; sourceTree = ""; }; D09D8C111D4FAB1D0081DBEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D09F9DC520767D2C00DB4DE1 /* Api3.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api3.swift; sourceTree = ""; }; - D09F9DC620767D2C00DB4DE1 /* Api1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api1.swift; sourceTree = ""; }; - D09F9DC720767D2C00DB4DE1 /* Api2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api2.swift; sourceTree = ""; }; D0A3E446214802C7008ACEF6 /* VoipConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoipConfiguration.swift; sourceTree = ""; }; D0A472B51F4CBE8B00E0EEDA /* LoadedPeer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadedPeer.swift; sourceTree = ""; }; D0A8998E217A37A000759EE6 /* NotificationAutolockReportManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAutolockReportManager.swift; sourceTree = ""; }; @@ -1199,6 +1181,8 @@ D0CA3F83207391560042D2B6 /* SecureIdPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdPadding.swift; sourceTree = ""; }; D0CA8E4A227209C4008A74C3 /* ManagedSynchronizeGroupMessageStats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedSynchronizeGroupMessageStats.swift; sourceTree = ""; }; D0CAF2E91D75EC600011F558 /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MtProtoKitDynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0CC4AA322BA44960088F36D /* TelegramApi.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramApi.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0CC4ADB22BA47280088F36D /* TelegramApiMac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramApiMac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0D1026B2212FE52003ADA5E /* AccountSortOrderAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSortOrderAttribute.swift; sourceTree = ""; }; D0D748011E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerPackInteractiveOperations.swift; sourceTree = ""; }; D0DA1D311F7043D50034E892 /* ManagedPendingPeerNotificationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedPendingPeerNotificationSettings.swift; sourceTree = ""; }; @@ -1228,7 +1212,6 @@ D0E412F3206B9BDC00BEE4A2 /* SecureIdVerificationDocumentReference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdVerificationDocumentReference.swift; sourceTree = ""; }; D0E41300206B9E6E00BEE4A2 /* SecureIdAddressValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdAddressValue.swift; sourceTree = ""; }; D0E6521E1E3A364A004EEA91 /* UpdateAccountPeerName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateAccountPeerName.swift; sourceTree = ""; }; - D0E68768207534C90064BDB2 /* Api0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Api0.swift; sourceTree = ""; }; D0E817482010E7E300B82BBB /* ChannelAdminEventLogContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelAdminEventLogContext.swift; sourceTree = ""; }; D0E8B8B22044706300605593 /* ForwardGame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardGame.swift; sourceTree = ""; }; D0EA188120D3D2B1001AEE19 /* RemoteStorageConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteStorageConfiguration.swift; sourceTree = ""; }; @@ -1247,7 +1230,6 @@ D0F760D722202FE20074F7E5 /* ChannelStats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelStats.swift; sourceTree = ""; }; D0F7AB2B1DCE889D009AD9A1 /* EditedMessageAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditedMessageAttribute.swift; sourceTree = ""; }; D0F7AB2E1DCF507E009AD9A1 /* ReplyMarkupMessageAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReplyMarkupMessageAttribute.swift; sourceTree = ""; }; - D0F8C39C20178B9B00236FC5 /* GroupFeedPeers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupFeedPeers.swift; sourceTree = ""; }; D0F8C39F2017AF2700236FC5 /* GlobalTelegramCoreConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalTelegramCoreConfiguration.swift; sourceTree = ""; }; D0FA08BA2046B37900DD23FC /* ContentPrivacySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentPrivacySettings.swift; sourceTree = ""; }; D0FA0ABC1E76C908005BB9B7 /* TwoStepVerification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoStepVerification.swift; sourceTree = ""; }; @@ -1262,7 +1244,6 @@ D0FA8BAC1E1FD6E2001E855B /* MemoryBufferExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryBufferExtensions.swift; sourceTree = ""; }; D0FA8BAF1E1FEC7E001E855B /* SecretChatEncryptionConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatEncryptionConfig.swift; sourceTree = ""; }; D0FA8BB21E201B02001E855B /* ProcessSecretChatIncomingEncryptedOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProcessSecretChatIncomingEncryptedOperations.swift; sourceTree = ""; }; - D0FA8BB51E223C16001E855B /* SecretApiLayer8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer8.swift; sourceTree = ""; }; D0FA8BB81E2240B4001E855B /* SecretChatIncomingDecryptedOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatIncomingDecryptedOperation.swift; sourceTree = ""; }; D0FC195A2020D1CA00FEDBB2 /* PeerGroupMessageStateVersionAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerGroupMessageStateVersionAttribute.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1272,6 +1253,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D035732F22B5C24F00F0920D /* TelegramApi.framework in Frameworks */, D0AF32381FAE8C920097362B /* MultipeerConnectivity.framework in Frameworks */, D0CAF2EA1D75EC600011F558 /* MtProtoKitDynamic.framework in Frameworks */, D067066C1D512ADB00DED3E3 /* Postbox.framework in Frameworks */, @@ -1291,6 +1273,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D0CC4ADC22BA47280088F36D /* TelegramApiMac.framework in Frameworks */, D0B4187F1D7E054E004562A4 /* MtProtoKitMac.framework in Frameworks */, D0B418721D7E0409004562A4 /* PostboxMac.framework in Frameworks */, D0B418731D7E0409004562A4 /* SwiftSignalKitMac.framework in Frameworks */, @@ -1445,6 +1428,7 @@ D03B0CDA1D62245F00955575 /* ApiUtils.swift */, D03B0CD81D62245B00955575 /* PeerUtils.swift */, D09A2FEA1D7CDC320018FB72 /* PeerAccessRestrictionInfo.swift */, + D0750C8F22B2FD8300BE5F6E /* PeerAccessHash.swift */, D03B0CD41D62245300955575 /* TelegramUser.swift */, D03B0CD51D62245300955575 /* TelegramGroup.swift */, D09A2FE51D7CD4940018FB72 /* TelegramChannel.swift */, @@ -1623,20 +1607,11 @@ D03B0D531D631A4400955575 /* Network */ = { isa = PBXGroup; children = ( - D09F9DC620767D2C00DB4DE1 /* Api1.swift */, - D09F9DC720767D2C00DB4DE1 /* Api2.swift */, - D09F9DC520767D2C00DB4DE1 /* Api3.swift */, - D0E68768207534C90064BDB2 /* Api0.swift */, - D0FA8BB51E223C16001E855B /* SecretApiLayer8.swift */, - D0448C981E268F9A005A61A7 /* SecretApiLayer46.swift */, - D018EDFF2044939F00CBB130 /* SecretApiLayer73.swift */, - D03B0D551D631A6900955575 /* Buffer.swift */, D03B0D561D631A6900955575 /* Download.swift */, D03B0D571D631A6900955575 /* MultipartFetch.swift */, D03C53761DAFF20F004C17B3 /* MultipartUpload.swift */, D03B0D581D631A6900955575 /* Network.swift */, D03B0D591D631A6900955575 /* Serialization.swift */, - D06AFE8820BF66BF00EA5124 /* DeserializeFunctionResponse.swift */, D0F19F6520E6620D00EEC860 /* MultiplexedRequestManager.swift */, D08984F421187ECA00918162 /* NetworkType.swift */, ); @@ -1666,6 +1641,7 @@ D01843A72190C28100278AFF /* ConfirmTwoStepRecoveryEmail.swift */, D02B198F21FB1D520094A764 /* RegisterNotificationToken.swift */, D0338742223BD532007A2CE4 /* InitializeAccountAfterLogin.swift */, + D0575C2C22B922DF00A71A0E /* DeleteAccount.swift */, ); name = Account; sourceTree = ""; @@ -1758,6 +1734,9 @@ D06706631D512ADA00DED3E3 /* Frameworks */ = { isa = PBXGroup; children = ( + D0CC4ADB22BA47280088F36D /* TelegramApiMac.framework */, + D0CC4AA322BA44960088F36D /* TelegramApi.framework */, + D035732E22B5C24F00F0920D /* TelegramApi.framework */, D0AF32371FAE8C910097362B /* MultipeerConnectivity.framework */, D0B4187E1D7E054E004562A4 /* MtProtoKitMac.framework */, D0B418701D7E0409004562A4 /* PostboxMac.framework */, @@ -2003,7 +1982,6 @@ D0DA1D311F7043D50034E892 /* ManagedPendingPeerNotificationSettings.swift */, D02395D51F8D09A50070F5C2 /* ChannelHistoryAvailabilitySettings.swift */, D0C44B601FC616E200227BE0 /* SearchGroupMembers.swift */, - D0F8C39C20178B9B00236FC5 /* GroupFeedPeers.swift */, D018EE042045E95000CBB130 /* CheckPeerChatServiceActions.swift */, 9F06830F21A40DEC001D8EDB /* NotificationExceptionsList.swift */, D0F760D722202FE20074F7E5 /* ChannelStats.swift */, @@ -2257,7 +2235,6 @@ D0B843B91DA7FF30005F29E1 /* NBMetadataCoreTest.m in Sources */, 09EDAD3A22131D010012A50B /* ManagedAutodownloadSettingsUpdates.swift in Sources */, D0EA188220D3D2B1001AEE19 /* RemoteStorageConfiguration.swift in Sources */, - D018EE002044939F00CBB130 /* SecretApiLayer73.swift in Sources */, D09A2FE61D7CD4940018FB72 /* TelegramChannel.swift in Sources */, D03B0D0E1D62255C00955575 /* UpdateGroup.swift in Sources */, D053B4181F18DE4F00E2D58A /* AuthorSignatureMessageAttribute.swift in Sources */, @@ -2278,7 +2255,6 @@ D098907F22942E3B0053F151 /* ActiveSessionsContext.swift in Sources */, D026099E20C695AF006C34AC /* Wallpapers.swift in Sources */, C205FEA81EB3B75900455808 /* ExportMessageLink.swift in Sources */, - D06AFE8920BF66BF00EA5124 /* DeserializeFunctionResponse.swift in Sources */, D0E305AA1E5BA02D00D7A3A2 /* ChannelBlacklist.swift in Sources */, D0EE7FC72098853100981319 /* SecureIdTemporaryRegistrationValue.swift in Sources */, C22EE61B1E67418000334C38 /* ToggleChannelSignatures.swift in Sources */, @@ -2357,7 +2333,6 @@ C2E0646D1ECF171D00387BB8 /* TelegramMediaWebDocument.swift in Sources */, D0B843811DA6EDAE005F29E1 /* CachedUserData.swift in Sources */, D049EAD51E43D98500A2CD3A /* RecentMediaItem.swift in Sources */, - D09F9DCA20767D2C00DB4DE1 /* Api1.swift in Sources */, D053B3FE1F16534400E2D58A /* MonotonicTime.swift in Sources */, D0C50E341E93A86600F62E39 /* CallSessionManager.swift in Sources */, D00D34421E6EDD2E0057B307 /* ManagedSynchronizeConsumeMessageContentsOperations.swift in Sources */, @@ -2382,7 +2357,6 @@ D0E23DDA1E806F7700B9B6D2 /* ManagedSynchronizeMarkFeaturedStickerPacksAsSeenOperations.swift in Sources */, D049EAD81E43DAD200A2CD3A /* ManagedRecentStickers.swift in Sources */, D0BE303A20619EE800FBE6D8 /* SecureIdForm.swift in Sources */, - D0448C991E268F9A005A61A7 /* SecretApiLayer46.swift in Sources */, D03DC9131F82F89D001D584C /* RegularChatState.swift in Sources */, 0962E66721B59BAA00245FD9 /* ManagedAppConfigurationUpdates.swift in Sources */, D0613FCF1E60520700202CDB /* ChannelMembers.swift in Sources */, @@ -2398,6 +2372,7 @@ D0E412E7206ABC7500BEE4A2 /* EncryptedMediaResource.swift in Sources */, D0AB262621C2F991008F6685 /* TelegramMediaPoll.swift in Sources */, D0BC38791E40BAF20044D6FE /* SynchronizePinnedChatsOperation.swift in Sources */, + D0750C9022B2FD8300BE5F6E /* PeerAccessHash.swift in Sources */, D0FC195B2020D1CA00FEDBB2 /* PeerGroupMessageStateVersionAttribute.swift in Sources */, D0B1671D1F9EA2C300976B40 /* ChatHistoryPreloadManager.swift in Sources */, D02B199021FB1D520094A764 /* RegisterNotificationToken.swift in Sources */, @@ -2457,7 +2432,6 @@ D0448CA21E291B14005A61A7 /* FetchSecretFileResource.swift in Sources */, D08CAA871ED81DD40000FDA8 /* LocalizationInfo.swift in Sources */, D033FEB61E61F3F900644997 /* BlockedPeers.swift in Sources */, - D09F9DCC20767D2C00DB4DE1 /* Api2.swift in Sources */, D00C7CCC1E3620C30080C3D5 /* CachedChannelParticipants.swift in Sources */, D09BB6B41DB02C2B00A905C0 /* PendingMessageManager.swift in Sources */, D093D7F520641A4900BC3599 /* SecureIdPhoneValue.swift in Sources */, @@ -2518,7 +2492,6 @@ C2FD33E11E680E9E008D13D4 /* RequestUserPhotos.swift in Sources */, D0177B7B1DF8A16C00A5083A /* SecretChatState.swift in Sources */, D0AAD1AA1E32638500D5B9DE /* ApplyMaxReadIndexInteractively.swift in Sources */, - D0E68775207534CA0064BDB2 /* Api0.swift in Sources */, D03B0D5C1D631A6900955575 /* Download.swift in Sources */, D0C27B421F4B58C000A4E170 /* PeerSpecificStickerPack.swift in Sources */, D054648B2073854A002ECC1E /* SecureIdPersonalDetailsValue.swift in Sources */, @@ -2530,7 +2503,6 @@ D048B4AC20A5DA4300C79D31 /* ManagedProxyInfoUpdates.swift in Sources */, D017495E1E118F790057C89A /* AccountStateManager.swift in Sources */, D0CA3F84207391560042D2B6 /* SecureIdPadding.swift in Sources */, - D0FA8BB61E223C16001E855B /* SecretApiLayer8.swift in Sources */, D0B843C71DA7FF30005F29E1 /* NBPhoneNumberDefines.m in Sources */, D0F760D822202FE20074F7E5 /* ChannelStats.swift in Sources */, 0962E66921B5A11100245FD9 /* SynchronizeAppLogEventsOperation.swift in Sources */, @@ -2540,7 +2512,6 @@ D058E0D11E8AD65C00A442DE /* StandaloneSendMessage.swift in Sources */, D0BC38751E40A7F70044D6FE /* RemovePeerChat.swift in Sources */, 093857A82243D87900EB6A54 /* ManagedSynchronizeEmojiKeywordsOperations.swift in Sources */, - D09F9DC820767D2C00DB4DE1 /* Api3.swift in Sources */, D0529D2721A4141800D7C3C4 /* ManagedSynchronizeRecentlyUsedMediaOperations.swift in Sources */, D0AB0B961D662F0B002C78E7 /* ManagedChatListHoles.swift in Sources */, D05A32E41E6F0B2E002760B4 /* RecentAccountSessions.swift in Sources */, @@ -2562,7 +2533,6 @@ D0F3A8A81E82CD7D00B4C64C /* UpdatePeerChatInterfaceState.swift in Sources */, D03B0CE21D62249B00955575 /* InlineBotMessageAttribute.swift in Sources */, D0AB0B9A1D666520002C78E7 /* ManagedSynchronizePeerReadStates.swift in Sources */, - D03B0D5B1D631A6900955575 /* Buffer.swift in Sources */, D0B843891DA7AB96005F29E1 /* ExportedInvitation.swift in Sources */, D0380DBA204EF306000414AB /* MessageMediaPreuploadManager.swift in Sources */, D03B0E441D631E6600955575 /* NetworkLogging.m in Sources */, @@ -2579,7 +2549,6 @@ C2366C861E4F403C0097CCFF /* AddressNames.swift in Sources */, D0529D2421A4123400D7C3C4 /* SynchronizeRecentlyUsedMediaOperations.swift in Sources */, D0FA08BB2046B37900DD23FC /* ContentPrivacySettings.swift in Sources */, - D0F8C39D20178B9B00236FC5 /* GroupFeedPeers.swift in Sources */, D0B843C11DA7FF30005F29E1 /* NBPhoneMetaData.m in Sources */, D0528E601E65B94E00E2FEF5 /* SingleMessageView.swift in Sources */, D08CAA841ED8164B0000FDA8 /* Localization.swift in Sources */, @@ -2600,6 +2569,7 @@ D054649A20738760002ECC1E /* SecureIdRentalAgreementValue.swift in Sources */, D0B843BF1DA7FF30005F29E1 /* NBNumberFormat.m in Sources */, D0E305A71E5B5CBE00D7A3A2 /* PeerAdmins.swift in Sources */, + D0575C2D22B922DF00A71A0E /* DeleteAccount.swift in Sources */, D0B843C51DA7FF30005F29E1 /* NBPhoneNumber.m in Sources */, D03B0D0D1D62255C00955575 /* SynchronizePeerReadState.swift in Sources */, D03B0D081D62255C00955575 /* ChannelState.swift in Sources */, @@ -2645,7 +2615,6 @@ 9FC8ADAC206BC00A0094F7B4 /* RecentWebSessions.swift in Sources */, 9FC8ADA9206BBD000094F7B4 /* SaveSecureIdValue.swift in Sources */, 9F10CE8C20613CDB002DD61A /* TelegramDeviceContactImportInfo.swift in Sources */, - 9F10CE8B20613C78002DD61A /* SecretApiLayer73.swift in Sources */, C29340F41F5081280074991E /* UpdateGroupSpecificStickerset.swift in Sources */, C25638021E79E7FC00311607 /* TwoStepVerification.swift in Sources */, D00DBBD81E64E41100DB5485 /* CreateSecretChat.swift in Sources */, @@ -2661,6 +2630,7 @@ D0C26D6A1FE02402004ABF18 /* ManagedSynchronizeGroupedPeersOperations.swift in Sources */, D01C7F051EFC1C49008305F1 /* DeviceContact.swift in Sources */, D050F26A1E4A5B6D00988324 /* ManagedGlobalNotificationSettings.swift in Sources */, + D0750C9122B2FD8300BE5F6E /* PeerAccessHash.swift in Sources */, D050F26B1E4A5B6D00988324 /* ApplyMaxReadIndexInteractively.swift in Sources */, D033FEB11E61EB0200644997 /* PeerContactSettings.swift in Sources */, D0458C891E69B4AB00FB34C1 /* OutgoingContentInfoMessageAttribute.swift in Sources */, @@ -2700,7 +2670,6 @@ D0B844311DAB91E0005F29E1 /* NBPhoneMetaData.m in Sources */, D0E412EF206AF65500BEE4A2 /* GrantSecureIdAccess.swift in Sources */, C22EE61C1E67418000334C38 /* ToggleChannelSignatures.swift in Sources */, - D09F9DCB20767D2C00DB4DE1 /* Api1.swift in Sources */, D0B418AC1D7E0597004562A4 /* Network.swift in Sources */, D04CAA5B1E83310D0047E51F /* MD5.swift in Sources */, D0B844141DAB91CD005F29E1 /* PhoneNumbers.swift in Sources */, @@ -2749,7 +2718,6 @@ D0E412F2206B9BB700BEE4A2 /* SecureIdPassportValue.swift in Sources */, D001F3EB1E128A1C007A8C60 /* EnqueueMessage.swift in Sources */, D01A21A71F38CDC700DDA104 /* SynchronizeSavedStickersOperation.swift in Sources */, - D0E68776207534CA0064BDB2 /* Api0.swift in Sources */, D00C7CEC1E37A8540080C3D5 /* SetSecretChatMessageAutoremoveTimeoutInteractively.swift in Sources */, D048B4AD20A5DA4300C79D31 /* ManagedProxyInfoUpdates.swift in Sources */, D0B844481DAB91FD005F29E1 /* ManagedMessageHistoryHoles.swift in Sources */, @@ -2817,12 +2785,10 @@ D0EE7FC220986BF400981319 /* SecureIdInternalPassportValue.swift in Sources */, D0B418A61D7E0592004562A4 /* CloudFileMediaResource.swift in Sources */, D073CEA51DCBF3F5007511FD /* StickerManagement.swift in Sources */, - D06AFE8A20BF66BF00EA5124 /* DeserializeFunctionResponse.swift in Sources */, D03C536D1DAD5CA9004C17B3 /* ApiGroupOrChannel.swift in Sources */, D051DB18215ECC4D00F30F92 /* AppChangelog.swift in Sources */, D01C06B81FBBA269001561AB /* CanSendMessagesToPeer.swift in Sources */, D0E35A151DE4C6A200BC6096 /* OutgoingMessageWithChatContextResult.swift in Sources */, - D0B418A91D7E0597004562A4 /* Buffer.swift in Sources */, D02ABC821E310E5D00CAE539 /* ManagedCloudChatRemoveMessagesOperations.swift in Sources */, C2FD33E51E687BF1008D13D4 /* PeerPhotoUpdater.swift in Sources */, D0BE304C20627D9800FBE6D8 /* AccessSecureId.swift in Sources */, @@ -2843,7 +2809,6 @@ D0529D2521A4123400D7C3C4 /* SynchronizeRecentlyUsedMediaOperations.swift in Sources */, D06ECFC920B810D300C576C2 /* TermsOfService.swift in Sources */, 9F06831121A40DEC001D8EDB /* NotificationExceptionsList.swift in Sources */, - D0F8C39E20178B9B00236FC5 /* GroupFeedPeers.swift in Sources */, D0AB262C21C3CE80008F6685 /* Polls.swift in Sources */, D073CE6C1DCBCF17007511FD /* TextEntitiesMessageAttribute.swift in Sources */, D03C53751DAD5CA9004C17B3 /* TelegramUserPresence.swift in Sources */, @@ -2856,7 +2821,6 @@ D0F02CE61E9926C50065DEE2 /* ManagedConfigurationUpdates.swift in Sources */, D073CE6D1DCBCF17007511FD /* InlineBotMessageAttribute.swift in Sources */, D033FEB71E61F3F900644997 /* BlockedPeers.swift in Sources */, - D0448C9A1E268F9A005A61A7 /* SecretApiLayer46.swift in Sources */, D0E412D8206A866B00BEE4A2 /* UploadSecureIdFile.swift in Sources */, D050F2611E4A5AE700988324 /* PrivacySettings.swift in Sources */, C210DD631FBDB90800F673D8 /* SourceReferenceMessageAttribute.swift in Sources */, @@ -2885,6 +2849,7 @@ D08F4A671E79CC4A00A2AA15 /* SynchronizeInstalledStickerPacksOperations.swift in Sources */, D05A32E81E6F0B5C002760B4 /* RecentAccountSession.swift in Sources */, D0F7B1E31E045C7B007EB8A5 /* RichText.swift in Sources */, + D0575C2E22B922DF00A71A0E /* DeleteAccount.swift in Sources */, D0FA8BB11E1FEC7E001E855B /* SecretChatEncryptionConfig.swift in Sources */, D0B418AA1D7E0597004562A4 /* Download.swift in Sources */, D001F3F41E128A1C007A8C60 /* UpdatesApiUtils.swift in Sources */, @@ -2924,7 +2889,6 @@ D0E412DD206A99AE00BEE4A2 /* SecureIdValueAccessContext.swift in Sources */, D0B418941D7E0580004562A4 /* TelegramMediaAction.swift in Sources */, D0B8442C1DAB91E0005F29E1 /* NBMetadataCoreMapper.m in Sources */, - D0FA8BB71E223C16001E855B /* SecretApiLayer8.swift in Sources */, D0EC559B2101ED0800D1992C /* DeleteMessages.swift in Sources */, D073CE6A1DCBCF17007511FD /* ViewCountMessageAttribute.swift in Sources */, D0B418AB1D7E0597004562A4 /* MultipartFetch.swift in Sources */, @@ -2944,7 +2908,6 @@ D0A89990217A37A000759EE6 /* NotificationAutolockReportManager.swift in Sources */, D054648C2073854A002ECC1E /* SecureIdPersonalDetailsValue.swift in Sources */, D0F8C3A12017AF2700236FC5 /* GlobalTelegramCoreConfiguration.swift in Sources */, - D09F9DC920767D2C00DB4DE1 /* Api3.swift in Sources */, D099D7471EEF0C2700A3128C /* ChannelMessageStateVersionAttribute.swift in Sources */, D058E0D21E8AD65C00A442DE /* StandaloneSendMessage.swift in Sources */, D03C536F1DAD5CA9004C17B3 /* BotInfo.swift in Sources */, @@ -3001,7 +2964,6 @@ D0B844431DAB91FD005F29E1 /* Account.swift in Sources */, D08CAA7E1ED77EE90000FDA8 /* LocalizationSettings.swift in Sources */, D054649220738653002ECC1E /* SecureIdIDCardValue.swift in Sources */, - D09F9DCD20767D2C00DB4DE1 /* Api2.swift in Sources */, D0448CA01E27F5EB005A61A7 /* Random.swift in Sources */, C251D7441E65E50500283EDE /* StickerSetInstallation.swift in Sources */, D053B41C1F18DEF500E2D58A /* TelegramMediaExpiredContent.swift in Sources */, @@ -3276,6 +3238,141 @@ }; name = DebugFork; }; + D0364D4D22B3E37C002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D03B0E591D63215200955575 /* TelegramCore.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = 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_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; + 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.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/third-party/FFmpeg-iOS/include"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = HockeyappMacAlpha; + }; + D0364D4E22B3E37C002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D03B0E591D63215200955575 /* TelegramCore.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = TelegramCore/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/third-party/FFmpeg-iOS/lib", + "$(PROJECT_DIR)/third-party/libwebp/lib", + ); + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private.modulemap"; + OTHER_LDFLAGS = "-Wl,-dead_strip"; + OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramCore; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_REFLECTION_METADATA_LEVEL = all; + SWIFT_VERSION = 4.0; + USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/third-party/FFmpeg-iOS/include"; + }; + name = HockeyappMacAlpha; + }; + D0364D4F22B3E37C002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D03B0E591D63215200955575 /* TelegramCore.xcconfig */; + buildSettings = { + INFOPLIST_FILE = TelegramCoreTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.TelegramCoreTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = HockeyappMacAlpha; + }; + D0364D5022B3E37C002A6EF0 /* HockeyappMacAlpha */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D03B0E591D63215200955575 /* TelegramCore.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + 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; + FRAMEWORK_VERSION = A; + GCC_OPTIMIZATION_LEVEL = 0; + INFOPLIST_FILE = TelegramCoreMac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private-mac.modulemap"; + OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.TelegramCoreMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + }; + name = HockeyappMacAlpha; + }; D06706551D51162400DED3E3 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; baseConfigurationReference = D03B0E591D63215200955575 /* TelegramCore.xcconfig */; @@ -4043,6 +4140,7 @@ isa = XCConfigurationList; buildConfigurations = ( D09D8C131D4FAB1D0081DBEC /* DebugHockeyapp */, + D0364D4D22B3E37C002A6EF0 /* HockeyappMacAlpha */, D021D508219CB1E40064BEBA /* DebugFork */, D09D8C141D4FAB1D0081DBEC /* DebugAppStore */, D0ADF934212B3ADA00310BBC /* DebugAppStoreLLC */, @@ -4058,6 +4156,7 @@ isa = XCConfigurationList; buildConfigurations = ( D09D8C161D4FAB1D0081DBEC /* DebugHockeyapp */, + D0364D4E22B3E37C002A6EF0 /* HockeyappMacAlpha */, D021D509219CB1E40064BEBA /* DebugFork */, D09D8C171D4FAB1D0081DBEC /* DebugAppStore */, D0ADF935212B3ADA00310BBC /* DebugAppStoreLLC */, @@ -4073,6 +4172,7 @@ isa = XCConfigurationList; buildConfigurations = ( D09D8C191D4FAB1D0081DBEC /* DebugHockeyapp */, + D0364D4F22B3E37C002A6EF0 /* HockeyappMacAlpha */, D021D50A219CB1E40064BEBA /* DebugFork */, D09D8C1A1D4FAB1D0081DBEC /* DebugAppStore */, D0ADF936212B3ADA00310BBC /* DebugAppStoreLLC */, @@ -4088,6 +4188,7 @@ isa = XCConfigurationList; buildConfigurations = ( D0B4186D1D7E03D5004562A4 /* DebugHockeyapp */, + D0364D5022B3E37C002A6EF0 /* HockeyappMacAlpha */, D021D50B219CB1E40064BEBA /* DebugFork */, D0B4186E1D7E03D5004562A4 /* DebugAppStore */, D0ADF937212B3ADA00310BBC /* DebugAppStoreLLC */, diff --git a/submodules/TelegramPresentationData/Info.plist b/submodules/TelegramPresentationData/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramPresentationData/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/TelegramUI/TelegramUI/ComponentsThemes.swift b/submodules/TelegramPresentationData/Sources/ComponentsThemes.swift similarity index 77% rename from submodules/TelegramUI/TelegramUI/ComponentsThemes.swift rename to submodules/TelegramPresentationData/Sources/ComponentsThemes.swift index 68be053da1..6e83f7453b 100644 --- a/submodules/TelegramUI/TelegramUI/ComponentsThemes.swift +++ b/submodules/TelegramPresentationData/Sources/ComponentsThemes.swift @@ -3,53 +3,53 @@ import UIKit import Display public extension TabBarControllerTheme { - convenience init(rootControllerTheme: PresentationTheme) { + convenience public 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 init(rootControllerTheme: PresentationTheme) { + convenience public 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 init(presentationStrings: PresentationStrings) { + convenience public init(presentationStrings: PresentationStrings) { self.init(back: presentationStrings.Common_Back, close: presentationStrings.Common_Close) } } public extension NavigationBarPresentationData { - convenience init(presentationData: PresentationData) { + convenience public init(presentationData: PresentationData) { self.init(theme: NavigationBarTheme(rootControllerTheme: presentationData.theme), strings: NavigationBarStrings(presentationStrings: presentationData.strings)) } } -extension ActionSheetControllerTheme { - convenience init(presentationTheme: PresentationTheme) { +public extension ActionSheetControllerTheme { + convenience public 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) } } -extension ActionSheetController { - convenience init(presentationTheme: PresentationTheme) { +public extension ActionSheetController { + convenience public init(presentationTheme: PresentationTheme) { self.init(theme: ActionSheetControllerTheme(presentationTheme: presentationTheme)) } } public extension AlertControllerTheme { - convenience init(presentationTheme: PresentationTheme) { + convenience public 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) } } extension PeekControllerTheme { - convenience init(presentationTheme: PresentationTheme) { + convenience public init(presentationTheme: PresentationTheme) { let actionSheet = presentationTheme.actionSheet self.init(isDark: actionSheet.backgroundType == .dark, menuBackgroundColor: actionSheet.opaqueItemBackgroundColor, menuItemHighligtedColor: actionSheet.opaqueItemHighlightedBackgroundColor, menuItemSeparatorColor: actionSheet.opaqueItemSeparatorColor, accentColor: actionSheet.controlAccentColor, destructiveColor: actionSheet.destructiveActionTextColor) } @@ -59,4 +59,7 @@ public extension NavigationControllerTheme { convenience init(presentationTheme: PresentationTheme) { self.init(navigationBar: NavigationBarTheme(rootControllerTheme: presentationTheme), emptyAreaColor: presentationTheme.chatList.backgroundColor) } + convenience public init(presentationTheme: PresentationTheme) { + self.init(navigationBar: NavigationBarTheme(rootControllerTheme: presentationTheme), emptyAreaColor: presentationTheme.chatList.backgroundColor, emptyDetailIcon: generateTintedImage(image: UIImage(named: "Chat List/EmptyMasterDetailIcon", in: Bundle(for: PresentationTheme.self), compatibleWith: nil), color: presentationTheme.chatList.messageTextColor.withAlphaComponent(0.2))) + } } diff --git a/submodules/TelegramUI/TelegramUI/DefaultDarkAccentPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkAccentPresentationTheme.swift similarity index 99% rename from submodules/TelegramUI/TelegramUI/DefaultDarkAccentPresentationTheme.swift rename to submodules/TelegramPresentationData/Sources/DefaultDarkAccentPresentationTheme.swift index 3ee2c92bf1..ec501447e5 100644 --- a/submodules/TelegramUI/TelegramUI/DefaultDarkAccentPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkAccentPresentationTheme.swift @@ -136,6 +136,8 @@ private let chatList = PresentationThemeChatList( messageDraftTextColor: UIColor(rgb: 0xdd4b39), //!!! checkmarkColor: accentColor, pendingIndicatorColor: UIColor(rgb: 0x8E8E93), + failedFillColor: destructiveColor, + failedForegroundColor: .white, muteIconColor: UIColor(rgb: 0x8E8E93), unreadBadgeActiveBackgroundColor: accentColor, unreadBadgeActiveTextColor: UIColor(rgb: 0xffffff), @@ -332,7 +334,7 @@ private let inAppNotification = PresentationThemeInAppNotification( ) ) -let defaultDarkAccentPresentationTheme = PresentationTheme( +public let defaultDarkAccentPresentationTheme = PresentationTheme( name: .builtin(.nightAccent), overallDarkAppearance: true, allowsCustomWallpapers: false, diff --git a/submodules/TelegramUI/TelegramUI/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift similarity index 99% rename from submodules/TelegramUI/TelegramUI/DefaultDarkPresentationTheme.swift rename to submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index 872bce4f22..33f1543c78 100644 --- a/submodules/TelegramUI/TelegramUI/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -134,6 +134,8 @@ private let chatList = PresentationThemeChatList( messageDraftTextColor: UIColor(rgb: 0xdd4b39), //!!! checkmarkColor: UIColor(rgb: 0xffffff), pendingIndicatorColor: UIColor(rgb: 0xffffff), //!!! + failedFillColor: destructiveColor, + failedForegroundColor: .white, muteIconColor: UIColor(rgb: 0x8e8e93), //!!! unreadBadgeActiveBackgroundColor: UIColor(rgb: 0xffffff), unreadBadgeActiveTextColor: UIColor(rgb: 0x000000), @@ -330,7 +332,7 @@ private let inAppNotification = PresentationThemeInAppNotification( ) ) -let defaultDarkPresentationTheme = PresentationTheme( +public let defaultDarkPresentationTheme = PresentationTheme( name: .builtin(.nightGrayscale), overallDarkAppearance: true, allowsCustomWallpapers: false, diff --git a/submodules/TelegramUI/TelegramUI/DefaultPresentationStrings.swift b/submodules/TelegramPresentationData/Sources/DefaultPresentationStrings.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/DefaultPresentationStrings.swift rename to submodules/TelegramPresentationData/Sources/DefaultPresentationStrings.swift diff --git a/submodules/TelegramUI/TelegramUI/DefaultPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultPresentationTheme.swift similarity index 98% rename from submodules/TelegramUI/TelegramUI/DefaultPresentationTheme.swift rename to submodules/TelegramPresentationData/Sources/DefaultPresentationTheme.swift index f7cc1f51cc..68f6c6bfbe 100644 --- a/submodules/TelegramUI/TelegramUI/DefaultPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultPresentationTheme.swift @@ -134,6 +134,8 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroun messageDraftTextColor: UIColor(rgb: 0xdd4b39), checkmarkColor: UIColor(rgb: 0x21c004), pendingIndicatorColor: UIColor(rgb: 0x8e8e93), + failedFillColor: destructiveColor, + failedForegroundColor: .white, muteIconColor: UIColor(rgb: 0xa7a7ad), unreadBadgeActiveBackgroundColor: accentColor, unreadBadgeActiveTextColor: .white, @@ -168,6 +170,8 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroun messageDraftTextColor: UIColor(rgb: 0xdd4b39), checkmarkColor: accentColor, pendingIndicatorColor: UIColor(rgb: 0x8e8e93), + failedFillColor: destructiveColor, + failedForegroundColor: .white, muteIconColor: UIColor(rgb: 0xa7a7ad), unreadBadgeActiveBackgroundColor: accentColor, unreadBadgeActiveTextColor: .white, @@ -184,7 +188,7 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroun secretIconColor: secretColor, pinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors(backgroundColors: (UIColor(rgb: 0x72d5fd), UIColor(rgb: 0x2a9ef1)), foregroundColor: .white), unpinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors(backgroundColors: (UIColor(rgb: 0xDEDEE5), UIColor(rgb: 0xC5C6CC)), foregroundColor: .white), - onlineDotColor: accentColor + onlineDotColor: UIColor(rgb: 0x4cc91f) ) let bubble = PresentationThemeChatBubble( @@ -458,14 +462,14 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroun public let defaultPresentationTheme = makeDefaultPresentationTheme(accentColor: UIColor(rgb: 0x007ee5), serviceBackgroundColor: defaultServiceBackgroundColor, day: false) -let defaultDayAccentColor: Int32 = 0x007ee5 -let defaultServiceBackgroundColor: UIColor = UIColor(rgb: 0x000000, alpha: 0.3) +public let defaultDayAccentColor: Int32 = 0x007ee5 +public let defaultServiceBackgroundColor: UIColor = UIColor(rgb: 0x000000, alpha: 0.3) -func makeDefaultPresentationTheme(serviceBackgroundColor: UIColor?) -> PresentationTheme { +public func makeDefaultPresentationTheme(serviceBackgroundColor: UIColor?) -> PresentationTheme { return makeDefaultPresentationTheme(accentColor: UIColor(rgb: 0x007ee5), serviceBackgroundColor: serviceBackgroundColor ?? .black, day: false) } -func makeDefaultDayPresentationTheme(accentColor: Int32?, serviceBackgroundColor: UIColor) -> PresentationTheme { +public func makeDefaultDayPresentationTheme(accentColor: Int32?, serviceBackgroundColor: UIColor) -> PresentationTheme { let color: UIColor if let accentColor = accentColor { color = UIColor(rgb: UInt32(bitPattern: accentColor)) diff --git a/submodules/TelegramUI/TelegramUI/EDSunriseSet.h b/submodules/TelegramPresentationData/Sources/EDSunriseSet.h similarity index 100% rename from submodules/TelegramUI/TelegramUI/EDSunriseSet.h rename to submodules/TelegramPresentationData/Sources/EDSunriseSet.h diff --git a/submodules/TelegramUI/TelegramUI/EDSunriseSet.m b/submodules/TelegramPresentationData/Sources/EDSunriseSet.m similarity index 100% rename from submodules/TelegramUI/TelegramUI/EDSunriseSet.m rename to submodules/TelegramPresentationData/Sources/EDSunriseSet.m diff --git a/submodules/TelegramUI/TelegramUI/NumberPluralizationForm.h b/submodules/TelegramPresentationData/Sources/NumberPluralizationForm.h similarity index 100% rename from submodules/TelegramUI/TelegramUI/NumberPluralizationForm.h rename to submodules/TelegramPresentationData/Sources/NumberPluralizationForm.h diff --git a/submodules/TelegramUI/TelegramUI/NumberPluralizationForm.m b/submodules/TelegramPresentationData/Sources/NumberPluralizationForm.m similarity index 100% rename from submodules/TelegramUI/TelegramUI/NumberPluralizationForm.m rename to submodules/TelegramPresentationData/Sources/NumberPluralizationForm.m diff --git a/submodules/TelegramUI/TelegramUI/NumericFormat.swift b/submodules/TelegramPresentationData/Sources/NumericFormat.swift similarity index 87% rename from submodules/TelegramUI/TelegramUI/NumericFormat.swift rename to submodules/TelegramPresentationData/Sources/NumericFormat.swift index 0c6a871717..8da690175d 100644 --- a/submodules/TelegramUI/TelegramUI/NumericFormat.swift +++ b/submodules/TelegramPresentationData/Sources/NumericFormat.swift @@ -37,7 +37,7 @@ public func presentationStringsFormattedNumber(_ count: Int32, _ groupingSeparat } } -func timeIntervalString(strings: PresentationStrings, value: Int32) -> String { +public func timeIntervalString(strings: PresentationStrings, value: Int32) -> String { if value < 60 { return strings.MessageTimer_Seconds(max(1, value)) } else if value < 60 * 60 { @@ -53,7 +53,7 @@ func timeIntervalString(strings: PresentationStrings, value: Int32) -> String { } } -func shortTimeIntervalString(strings: PresentationStrings, value: Int32) -> String { +public func shortTimeIntervalString(strings: PresentationStrings, value: Int32) -> String { if value < 60 { return strings.MessageTimer_ShortSeconds(max(1, value)) } else if value < 60 * 60 { @@ -67,7 +67,7 @@ func shortTimeIntervalString(strings: PresentationStrings, value: Int32) -> Stri } } -func muteForIntervalString(strings: PresentationStrings, value: Int32) -> String { +public func muteForIntervalString(strings: PresentationStrings, value: Int32) -> String { if value < 60 * 60 * 24 { return strings.MuteFor_Hours(max(1, value / (60 * 60))) } else { @@ -75,7 +75,7 @@ func muteForIntervalString(strings: PresentationStrings, value: Int32) -> String } } -func unmuteIntervalString(strings: PresentationStrings, value: Int32) -> String { +public func unmuteIntervalString(strings: PresentationStrings, value: Int32) -> String { if value < 60 * 60 { return strings.MuteExpires_Minutes(max(1, value / 60)) } else if value < 60 * 60 * 24 { @@ -85,7 +85,7 @@ func unmuteIntervalString(strings: PresentationStrings, value: Int32) -> String } } -func callDurationString(strings: PresentationStrings, value: Int32) -> String { +public func callDurationString(strings: PresentationStrings, value: Int32) -> String { if value < 60 { return strings.Call_Seconds(max(1, value)) } else { diff --git a/submodules/TelegramUI/TelegramUI/PresentationData.swift b/submodules/TelegramPresentationData/Sources/PresentationData.swift similarity index 79% rename from submodules/TelegramUI/TelegramUI/PresentationData.swift rename to submodules/TelegramPresentationData/Sources/PresentationData.swift index 0f8ad5854f..b1c42ddcbc 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationData.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationData.swift @@ -5,20 +5,29 @@ import Postbox import TelegramCore import Contacts import AddressBook -import TelegramUIPrivateModule +import Display +import TelegramUIPreferences public struct PresentationDateTimeFormat: Equatable { - let timeFormat: PresentationTimeFormat - let dateFormat: PresentationDateFormat - let dateSeparator: String - let decimalSeparator: String - let groupingSeparator: String + public let timeFormat: PresentationTimeFormat + public let dateFormat: PresentationDateFormat + public let dateSeparator: String + public let decimalSeparator: String + public let groupingSeparator: String + + public init(timeFormat: PresentationTimeFormat, dateFormat: PresentationDateFormat, dateSeparator: String, decimalSeparator: String, groupingSeparator: String) { + self.timeFormat = timeFormat + self.dateFormat = dateFormat + self.dateSeparator = dateSeparator + self.decimalSeparator = decimalSeparator + self.groupingSeparator = groupingSeparator + } } public struct PresentationVolumeControlStatusBarIcons: Equatable { - let offIcon: UIImage - let halfIcon: UIImage - let fullIcon: UIImage + public let offIcon: UIImage + public let halfIcon: UIImage + public let fullIcon: UIImage public var images: (UIImage, UIImage, UIImage) { return (self.offIcon, self.halfIcon, self.fullIcon) @@ -26,9 +35,9 @@ public struct PresentationVolumeControlStatusBarIcons: Equatable { } public struct PresentationAppIcon: Equatable { - let name: String - let imageName: String - let isDefault: Bool + public let name: String + public let imageName: String + public let isDefault: Bool public init(name: String, imageName: String, isDefault: Bool) { self.name = name @@ -47,12 +56,7 @@ public enum PresentationDateFormat { case dayFirst } -public enum PresentationPersonNameOrder: Int32 { - case firstLast = 0 - case lastFirst = 1 -} - -extension PresentationStrings : Equatable { +extension PresentationStrings: Equatable { public static func ==(lhs: PresentationStrings, rhs: PresentationStrings) -> Bool { return lhs === rhs } @@ -88,7 +92,7 @@ public final class PresentationData: Equatable { } } -func dictFromLocalization(_ value: Localization) -> [String: String] { +public func dictFromLocalization(_ value: Localization) -> [String: String] { var dict: [String: String] = [:] for entry in value.entries { switch entry { @@ -117,7 +121,8 @@ func dictFromLocalization(_ value: Localization) -> [String: String] { } private func volumeControlStatusBarIcons() -> PresentationVolumeControlStatusBarIcons { - return PresentationVolumeControlStatusBarIcons(offIcon: UIImage(bundleImageName: "Components/Volume/VolumeOff")!, halfIcon: UIImage(bundleImageName: "Components/Volume/VolumeHalf")!, fullIcon: UIImage(bundleImageName: "Components/Volume/VolumeFull")!) + let bundle = Bundle(for: PresentationTheme.self) + return PresentationVolumeControlStatusBarIcons(offIcon: UIImage(named: "Components/Volume/VolumeOff", in: bundle, compatibleWith: nil)!, halfIcon: UIImage(named: "Components/Volume/VolumeHalf", in: bundle, compatibleWith: nil)!, fullIcon: UIImage(named: "Components/Volume/VolumeFull", in: bundle, compatibleWith: nil)!) } private func currentDateTimeFormat() -> PresentationDateTimeFormat { @@ -183,7 +188,7 @@ public final class InitialPresentationDataAndSettings { public let mediaInputSettings: MediaInputSettings public let experimentalUISettings: ExperimentalUISettings - init(presentationData: PresentationData, automaticMediaDownloadSettings: MediaAutoDownloadSettings, callListSettings: CallListSettings, inAppNotificationSettings: InAppNotificationSettings, mediaInputSettings: MediaInputSettings, experimentalUISettings: ExperimentalUISettings) { + public init(presentationData: PresentationData, automaticMediaDownloadSettings: MediaAutoDownloadSettings, callListSettings: CallListSettings, inAppNotificationSettings: InAppNotificationSettings, mediaInputSettings: MediaInputSettings, experimentalUISettings: ExperimentalUISettings) { self.presentationData = presentationData self.automaticMediaDownloadSettings = automaticMediaDownloadSettings self.callListSettings = callListSettings @@ -362,7 +367,7 @@ private func automaticThemeShouldSwitchNow(_ parameters: AutomaticThemeSwitchPar } } -func automaticThemeShouldSwitchNow(settings: AutomaticThemeSwitchSetting, currentTheme: PresentationThemeReference) -> Bool { +public func automaticThemeShouldSwitchNow(settings: AutomaticThemeSwitchSetting, currentTheme: PresentationThemeReference) -> Bool { let parameters = AutomaticThemeSwitchParameters(settings: settings) return automaticThemeShouldSwitchNow(parameters, currentTheme: currentTheme) } @@ -389,7 +394,108 @@ private func automaticThemeShouldSwitch(_ settings: AutomaticThemeSwitchSetting, } } -public func updatedPresentationData(accountManager: AccountManager, applicationBindings: TelegramApplicationBindings) -> Signal { +private func serviceColor(for data: Signal) -> Signal { + return data + |> mapToSignal { data -> Signal in + if data.complete, let image = UIImage(contentsOfFile: data.path) { + return serviceColor(from: .single(image)) + } + return .complete() + } +} + +public func serviceColor(from image: Signal) -> Signal { + return image + |> mapToSignal { image -> Signal in + if let image = image { + let context = DrawingContext(size: CGSize(width: 1.0, height: 1.0), scale: 1.0, clear: false) + context.withFlippedContext({ context in + if let cgImage = image.cgImage { + context.draw(cgImage, in: CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)) + } + }) + return .single(serviceColor(with: context.colorAt(CGPoint()))) + } + return .complete() + } +} + +public func serviceColor(with color: UIColor) -> UIColor { + var hue: CGFloat = 0.0 + var saturation: CGFloat = 0.0 + var brightness: CGFloat = 0.0 + var alpha: CGFloat = 0.0 + if color.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) { + if saturation > 0.0 { + saturation = min(1.0, saturation + 0.05 + 0.1 * (1.0 - saturation)) + } + brightness = max(0.0, brightness * 0.65) + alpha = 0.4 + return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha) + } + return color +} + +private var serviceBackgroundColorForWallpaper: (TelegramWallpaper, UIColor)? + +public func chatServiceBackgroundColor(wallpaper: TelegramWallpaper, mediaBox: MediaBox) -> Signal { + if wallpaper == serviceBackgroundColorForWallpaper?.0, let color = serviceBackgroundColorForWallpaper?.1 { + return .single(color) + } else { + switch wallpaper { + case .builtin: + return .single(UIColor(rgb: 0x748391, alpha: 0.45)) + case let .color(color): + return .single(serviceColor(with: UIColor(rgb: UInt32(bitPattern: color)))) + case let .image(representations, _): + if let largest = largestImageRepresentation(representations) { + return Signal { subscriber in + let fetch = mediaBox.fetchedResource(largest.resource, parameters: nil).start() + let data = serviceColor(for: mediaBox.resourceData(largest.resource)).start(next: { next in + subscriber.putNext(next) + }, completed: { + subscriber.putCompletion() + }) + return ActionDisposable { + fetch.dispose() + data.dispose() + } + } + |> afterNext { color in + serviceBackgroundColorForWallpaper = (wallpaper, color) + } + } else { + return .single(UIColor(rgb: 0x000000, alpha: 0.3)) + } + case let .file(file): + if file.isPattern { + if let color = file.settings.color { + return .single(serviceColor(with: UIColor(rgb: UInt32(bitPattern: color)))) + } else { + return .single(UIColor(rgb: 0x000000, alpha: 0.3)) + } + } else { + return Signal { subscriber in + let fetch = mediaBox.fetchedResource(file.file.resource, parameters: nil).start() + let data = serviceColor(for: mediaBox.resourceData(file.file.resource)).start(next: { next in + subscriber.putNext(next) + }, completed: { + subscriber.putCompletion() + }) + return ActionDisposable { + fetch.dispose() + data.dispose() + } + } + |> afterNext { color in + serviceBackgroundColorForWallpaper = (wallpaper, color) + } + } + } + } +} + +public func updatedPresentationData(accountManager: AccountManager, applicationInForeground: Signal) -> Signal { return accountManager.sharedData(keys: [SharedDataKeys.localizationSettings, ApplicationSpecificSharedDataKeys.presentationThemeSettings, ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]) |> mapToSignal { sharedData -> Signal in let themeSettings: PresentationThemeSettings @@ -411,7 +517,7 @@ public func updatedPresentationData(accountManager: AccountManager, applicationB return (.single(UIColor(rgb: 0x000000, alpha: 0.3)) |> then(chatServiceBackgroundColor(wallpaper: currentWallpaper, mediaBox: accountManager.mediaBox))) |> mapToSignal { serviceBackgroundColor in - return applicationBindings.applicationInForeground + return applicationInForeground |> mapToSignal { inForeground -> Signal in if inForeground { return automaticThemeShouldSwitch(themeSettings.automaticThemeSwitchSetting, currentTheme: themeSettings.theme) diff --git a/submodules/TelegramUI/TelegramUI/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift similarity index 68% rename from submodules/TelegramUI/TelegramUI/PresentationStrings.swift rename to submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 176697a2ee..4ed1bd9129 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -88,7 +88,7 @@ private func extractArgumentRanges(_ value: String) -> [(Int, NSRange)] { return result } -func formatWithArgumentRanges(_ value: String, _ ranges: [(Int, NSRange)], _ arguments: [String]) -> (String, [(Int, NSRange)]) { +public func formatWithArgumentRanges(_ value: String, _ ranges: [(Int, NSRange)], _ arguments: [String]) -> (String, [(Int, NSRange)]) { let string = value as NSString var resultingRanges: [(Int, NSRange)] = [] @@ -139,7 +139,7 @@ private final class DataReader { } private func loadMapping() -> ([Int], [String], [Int], [Int], [String]) { - guard let filePath = frameworkBundle.path(forResource: "PresentationStrings", ofType: "mapping") else { + guard let filePath = Bundle(for: PresentationStrings.self).path(forResource: "PresentationStrings", ofType: "mapping") else { fatalError() } guard let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) else { @@ -223,4177 +223,4219 @@ public final class PresentationStrings { public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[35]! } public var Login_InvalidPhoneError: String { return self._s[37]! } public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[38]! } - public var Conversation_Moderate_Delete: String { return self._s[39]! } - public var Conversation_DeleteMessagesForEveryone: String { return self._s[40]! } - public var WatchRemote_AlertOpen: String { return self._s[41]! } + public var GroupInfo_LabelOwner: String { return self._s[39]! } + public var Conversation_Moderate_Delete: String { return self._s[40]! } + public var Conversation_DeleteMessagesForEveryone: String { return self._s[41]! } + public var WatchRemote_AlertOpen: String { return self._s[42]! } public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[42]!, self._r[42]!, [_0]) + return formatWithArgumentRanges(self._s[43]!, self._r[43]!, [_0]) } - public var AutoDownloadSettings_MediaTypes: String { return self._s[44]! } - public var Watch_GroupInfo_Title: String { return self._s[45]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[46]! } - public var Channel_Info_Members: String { return self._s[47]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[49]! } - public var Conversation_LiveLocation: String { return self._s[50]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[51]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[53]! } - public var Stickers_Search: String { return self._s[55]! } - public var NotificationsSound_Synth: String { return self._s[56]! } - public var LogoutOptions_LogOutInfo: String { return self._s[57]! } - public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[59]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[61]! } - public var FastTwoStepSetup_Title: String { return self._s[62]! } - public var Channel_Info_BlackList: String { return self._s[63]! } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[64]! } - public var Conversation_OpenFile: String { return self._s[65]! } - public var SecretTimer_ImageDescription: String { return self._s[66]! } - public var StickerSettings_ContextInfo: String { return self._s[67]! } - public var TwoStepAuth_GenericHelp: String { return self._s[69]! } - public var AutoDownloadSettings_Unlimited: String { return self._s[70]! } - public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[71]! } - public var AutoDownloadSettings_DataUsageHigh: String { return self._s[72]! } + public var AutoDownloadSettings_MediaTypes: String { return self._s[45]! } + public var Watch_GroupInfo_Title: String { return self._s[46]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[47]! } + public var Channel_Info_Members: String { return self._s[48]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[50]! } + public var Conversation_LiveLocation: String { return self._s[51]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[52]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[54]! } + public var Stickers_Search: String { return self._s[56]! } + public var NotificationsSound_Synth: String { return self._s[57]! } + public var LogoutOptions_LogOutInfo: String { return self._s[58]! } + public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[60]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[62]! } + public var FastTwoStepSetup_Title: String { return self._s[63]! } + public var Channel_Info_BlackList: String { return self._s[64]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[65]! } + public var Conversation_OpenFile: String { return self._s[66]! } + public var SecretTimer_ImageDescription: String { return self._s[67]! } + public var StickerSettings_ContextInfo: String { return self._s[68]! } + public var TwoStepAuth_GenericHelp: String { return self._s[70]! } + public var AutoDownloadSettings_Unlimited: String { return self._s[71]! } + public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[72]! } + public var AutoDownloadSettings_DataUsageHigh: String { return self._s[73]! } public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[73]!, self._r[73]!, [_1, _2]) + return formatWithArgumentRanges(self._s[74]!, self._r[74]!, [_1, _2]) } - public var Notifications_AddExceptionTitle: String { return self._s[74]! } - public var Watch_MessageView_Reply: String { return self._s[75]! } - public var Tour_Text6: String { return self._s[76]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[77]! } + public var Notifications_AddExceptionTitle: String { return self._s[75]! } + public var Watch_MessageView_Reply: String { return self._s[76]! } + public var Tour_Text6: String { return self._s[77]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[78]! } public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[78]!, self._r[78]!, [_0]) - } - public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[79]!, self._r[79]!, [_0]) } - public var AccessDenied_LocationDenied: String { return self._s[80]! } - public var CallSettings_RecentCalls: String { return self._s[81]! } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[82]! } - public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[83]! } - public var Passport_Authorize: String { return self._s[84]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[85]! } - public var AutoDownloadSettings_Videos: String { return self._s[86]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[87]! } - public var Tour_StartButton: String { return self._s[88]! } - public var Watch_AppName: String { return self._s[90]! } - public var StickerPack_ErrorNotFound: String { return self._s[91]! } - public var Channel_Info_Subscribers: String { return self._s[92]! } - public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[93]!, self._r[93]!, [_0]) + public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[80]!, self._r[80]!, [_0]) } - public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { + public var AccessDenied_LocationDenied: String { return self._s[81]! } + public var CallSettings_RecentCalls: String { return self._s[82]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[83]! } + public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[84]! } + public var Passport_Authorize: String { return self._s[85]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[86]! } + public var AutoDownloadSettings_Videos: String { return self._s[87]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[88]! } + public var Tour_StartButton: String { return self._s[89]! } + public var Watch_AppName: String { return self._s[91]! } + public var StickerPack_ErrorNotFound: String { return self._s[92]! } + public var Channel_Info_Subscribers: String { return self._s[93]! } + public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[94]!, self._r[94]!, [_0]) } - public var Conversation_StopLiveLocation: String { return self._s[96]! } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[97]! } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[99]! } - public var Username_LinkCopied: String { return self._s[101]! } - public var GroupRemoved_Title: String { return self._s[102]! } - public var SecretVideo_Title: String { return self._s[103]! } + public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[95]!, self._r[95]!, [_0]) + } + public var Conversation_StopLiveLocation: String { return self._s[97]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[98]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[100]! } + public var Username_LinkCopied: String { return self._s[102]! } + public var GroupRemoved_Title: String { return self._s[103]! } + public var SecretVideo_Title: String { return self._s[104]! } public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[104]!, self._r[104]!, [_1]) + return formatWithArgumentRanges(self._s[105]!, self._r[105]!, [_1]) } - public var AccessDenied_PhotosAndVideos: String { return self._s[105]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[106]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[106]!, self._r[106]!, [_1]) + return formatWithArgumentRanges(self._s[107]!, self._r[107]!, [_1]) } - public var Map_OpenInGoogleMaps: String { return self._s[107]! } + public var Map_OpenInGoogleMaps: String { return self._s[108]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[109]!, self._r[109]!, [_1, _2, _3]) } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[109]!, self._r[109]!, [_1, _2]) + return formatWithArgumentRanges(self._s[110]!, self._r[110]!, [_1, _2]) } - public var Call_StatusRinging: String { return self._s[110]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[111]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[112]! } - public var UserInfo_NotificationsEnabled: String { return self._s[113]! } - public var Map_Search: String { return self._s[114]! } - public var Login_TermsOfServiceHeader: String { return self._s[116]! } + public var Call_StatusRinging: String { return self._s[111]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[112]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[113]! } + public var UserInfo_NotificationsEnabled: String { return self._s[114]! } + public var Map_Search: String { return self._s[115]! } + public var Login_TermsOfServiceHeader: String { return self._s[117]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[117]!, self._r[117]!, [_0]) - } - public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_0]) } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[119]! } - public var Weekday_Today: String { return self._s[120]! } + public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[119]!, self._r[119]!, [_0]) + } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[120]! } + public var Weekday_Today: String { return self._s[121]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[122]!, self._r[122]!, [_1, _2]) + return formatWithArgumentRanges(self._s[123]!, self._r[123]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[123]!, self._r[123]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[124]!, self._r[124]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[125]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[126]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[127]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[128]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[129]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[130]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[131]! } - public var Weekday_ShortMonday: String { return self._s[132]! } - public var Cache_KeepMedia: String { return self._s[133]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[134]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[126]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[127]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[128]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[129]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[130]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[131]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[132]! } + public var Weekday_ShortMonday: String { return self._s[133]! } + public var Cache_KeepMedia: String { return self._s[134]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[135]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[135]!, self._r[135]!, [_1, _2]) + return formatWithArgumentRanges(self._s[136]!, self._r[136]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[136]! } - public var Passport_Language_ru: String { return self._s[137]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[137]! } + public var Passport_Language_ru: String { return self._s[138]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[138]!, self._r[138]!, [_0, _1]) + return formatWithArgumentRanges(self._s[139]!, self._r[139]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[139]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[140]! } - public var EnterPasscode_TouchId: String { return self._s[141]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[144]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[146]! } - public var Gif_NoGifsPlaceholder: String { return self._s[148]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[150]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[151]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[152]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[153]! } - public var AuthSessions_TerminateSession: String { return self._s[154]! } - public var Message_File: String { return self._s[155]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[156]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[157]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[158]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[159]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[140]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[141]! } + public var EnterPasscode_TouchId: String { return self._s[142]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[145]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[147]! } + public var Gif_NoGifsPlaceholder: String { return self._s[149]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[151]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[152]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[153]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[154]! } + public var AuthSessions_TerminateSession: String { return self._s[155]! } + public var Message_File: String { return self._s[156]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[157]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[158]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[159]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[160]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[160]!, self._r[160]!, [_0]) + return formatWithArgumentRanges(self._s[161]!, self._r[161]!, [_0]) } - public var Conversation_Moderate_Report: String { return self._s[162]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[163]! } - public var Passport_Language_ms: String { return self._s[164]! } - public var Channel_Edit_AboutItem: String { return self._s[166]! } - public var DialogList_SearchSectionGlobal: String { return self._s[170]! } - public var AttachmentMenu_WebSearch: String { return self._s[171]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[172]! } - public var Channel_BanUser_Title: String { return self._s[173]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[174]! } - public var ArchivedChats_IntroText2: String { return self._s[175]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[176]! } - public var ChatSearch_SearchPlaceholder: String { return self._s[178]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[179]! } - public var NotificationsSound_Aurora: String { return self._s[180]! } + public var Conversation_Moderate_Report: String { return self._s[163]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[164]! } + public var Passport_Language_ms: String { return self._s[165]! } + public var Channel_Edit_AboutItem: String { return self._s[167]! } + public var DialogList_SearchSectionGlobal: String { return self._s[171]! } + public var AttachmentMenu_WebSearch: String { return self._s[172]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[173]! } + public var Channel_BanUser_Title: String { return self._s[174]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[175]! } + public var ArchivedChats_IntroText2: String { return self._s[176]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[177]! } + public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_1, _2]) + } + public var ChatSearch_SearchPlaceholder: String { return self._s[180]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[181]! } + public var NotificationsSound_Aurora: String { return self._s[182]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[181]!, self._r[181]!, [_0]) + return formatWithArgumentRanges(self._s[183]!, self._r[183]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[184]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[186]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[185]!, self._r[185]!, [_0, _1]) + return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[186]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[187]! } - public var EmptyGroupInfo_Line2: String { return self._s[188]! } - public var Settings_FAQ_Intro: String { return self._s[190]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[192]! } - public var FeaturedStickerPacks_Title: String { return self._s[193]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[194]! } - public var Username_Title: String { return self._s[195]! } + public var Passport_PasswordNext: String { return self._s[188]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[189]! } + public var EmptyGroupInfo_Line2: String { return self._s[190]! } + public var Settings_FAQ_Intro: String { return self._s[192]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[194]! } + public var FeaturedStickerPacks_Title: String { return self._s[195]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[196]! } + public var Username_Title: String { return self._s[197]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[196]!, self._r[196]!, [_0]) + return formatWithArgumentRanges(self._s[198]!, self._r[198]!, [_0]) } - public var PasscodeSettings_AlphanumericCode: String { return self._s[197]! } - public var Localization_LanguageOther: String { return self._s[198]! } - public var Stickers_SuggestStickers: String { return self._s[199]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[199]! } + public var Localization_LanguageOther: String { return self._s[200]! } + public var Stickers_SuggestStickers: String { return self._s[201]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[200]!, self._r[200]!, [_0]) + return formatWithArgumentRanges(self._s[202]!, self._r[202]!, [_0]) } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[201]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[202]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[203]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[203]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[204]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[205]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[204]!, self._r[204]!, [_0]) + return formatWithArgumentRanges(self._s[206]!, self._r[206]!, [_0]) } - public var Group_UpgradeConfirmation: String { return self._s[206]! } - public var DialogList_Unpin: String { return self._s[207]! } - public var Passport_Identity_DateOfBirth: String { return self._s[208]! } - public var Month_ShortOctober: String { return self._s[209]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[210]! } - public var Notification_CallCanceledShort: String { return self._s[211]! } - public var Passport_Phone_Help: String { return self._s[212]! } - public var Passport_Language_az: String { return self._s[214]! } - public var CreatePoll_TextPlaceholder: String { return self._s[216]! } - public var PeopleNearby_Channels: String { return self._s[217]! } - public var Passport_Identity_DocumentNumber: String { return self._s[218]! } - public var PhotoEditor_CurvesRed: String { return self._s[219]! } - public var PhoneNumberHelp_Alert: String { return self._s[221]! } - public var SocksProxySetup_Port: String { return self._s[222]! } - public var Checkout_PayNone: String { return self._s[223]! } - public var AutoDownloadSettings_WiFi: String { return self._s[224]! } - public var GroupInfo_GroupType: String { return self._s[225]! } - public var StickerSettings_ContextHide: String { return self._s[226]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[227]! } - public var Group_Setup_HistoryTitle: String { return self._s[229]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[230]! } - public var PasscodeSettings_AutoLock: String { return self._s[231]! } - public var Passport_Title: String { return self._s[232]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[233]! } - public var GroupPermission_NoSendGifs: String { return self._s[234]! } - public var PrivacySettings_PasscodeOn: String { return self._s[235]! } - public var State_WaitingForNetwork: String { return self._s[237]! } + public var Group_UpgradeConfirmation: String { return self._s[208]! } + public var DialogList_Unpin: String { return self._s[209]! } + public var Passport_Identity_DateOfBirth: String { return self._s[210]! } + public var Month_ShortOctober: String { return self._s[211]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[212]! } + public var Notification_CallCanceledShort: String { return self._s[213]! } + public var Passport_Phone_Help: String { return self._s[214]! } + public var Passport_Language_az: String { return self._s[216]! } + public var CreatePoll_TextPlaceholder: String { return self._s[218]! } + public var Passport_Identity_DocumentNumber: String { return self._s[219]! } + public var PhotoEditor_CurvesRed: String { return self._s[220]! } + public var PhoneNumberHelp_Alert: String { return self._s[222]! } + public var SocksProxySetup_Port: String { return self._s[223]! } + public var Checkout_PayNone: String { return self._s[224]! } + public var AutoDownloadSettings_WiFi: String { return self._s[225]! } + public var GroupInfo_GroupType: String { return self._s[226]! } + public var StickerSettings_ContextHide: String { return self._s[227]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[228]! } + public var Group_Setup_HistoryTitle: String { return self._s[230]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[231]! } + public var PasscodeSettings_AutoLock: String { return self._s[232]! } + public var Passport_Title: String { return self._s[233]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[234]! } + public var GroupPermission_NoSendGifs: String { return self._s[235]! } + public var PrivacySettings_PasscodeOn: String { return self._s[236]! } + public var State_WaitingForNetwork: String { return self._s[238]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[238]!, self._r[238]!, [_0, _1]) + return formatWithArgumentRanges(self._s[239]!, self._r[239]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[240]! } + public var Calls_NotNow: String { return self._s[241]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[241]!, self._r[241]!, [_0]) + return formatWithArgumentRanges(self._s[242]!, self._r[242]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[242]! } - public var TwoStepAuth_PasswordSet: String { return self._s[243]! } - public var Passport_DeleteDocument: String { return self._s[244]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[245]! } + public var UserInfo_SendMessage: String { return self._s[243]! } + public var TwoStepAuth_PasswordSet: String { return self._s[244]! } + public var Passport_DeleteDocument: String { return self._s[245]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[246]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[246]!, self._r[246]!, [_1]) + return formatWithArgumentRanges(self._s[247]!, self._r[247]!, [_1]) } - public var GroupRemoved_Remove: String { return self._s[247]! } - public var Passport_FieldIdentity: String { return self._s[248]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[249]! } - public var Conversation_Processing: String { return self._s[251]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[253]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[256]! } - public var Month_GenFebruary: String { return self._s[257]! } + public var GroupRemoved_Remove: String { return self._s[248]! } + public var Passport_FieldIdentity: String { return self._s[249]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[250]! } + public var Conversation_Processing: String { return self._s[252]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[254]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[257]! } + public var Month_GenFebruary: String { return self._s[258]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[259]!, self._r[259]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[260]!, self._r[260]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[260]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[262]! } - public var GroupInfo_AddParticipant: String { return self._s[263]! } - public var KeyCommand_SendMessage: String { return self._s[264]! } - public var Map_LiveLocationShowAll: String { return self._s[266]! } - public var WallpaperSearch_ColorOrange: String { return self._s[268]! } - public var Appearance_AppIconDefaultX: String { return self._s[269]! } - public var Checkout_Receipt_Title: String { return self._s[270]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[271]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[272]! } - public var Message_Contact: String { return self._s[273]! } - public var Call_StatusIncoming: String { return self._s[274]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[261]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[263]! } + public var GroupInfo_AddParticipant: String { return self._s[264]! } + public var KeyCommand_SendMessage: String { return self._s[265]! } + public var Map_LiveLocationShowAll: String { return self._s[267]! } + public var WallpaperSearch_ColorOrange: String { return self._s[269]! } + public var Appearance_AppIconDefaultX: String { return self._s[270]! } + public var Checkout_Receipt_Title: String { return self._s[271]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[272]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[273]! } + public var Message_Contact: String { return self._s[274]! } + public var Call_StatusIncoming: String { return self._s[275]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[275]!, self._r[275]!, [_1]) + return formatWithArgumentRanges(self._s[276]!, self._r[276]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[277]!, self._r[277]!, [_1]) + return formatWithArgumentRanges(self._s[278]!, self._r[278]!, [_1]) } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[278]! } - public var Conversation_ViewChannel: String { return self._s[279]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[279]! } + public var Conversation_ViewChannel: String { return self._s[280]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[280]!, self._r[280]!, [_0]) + return formatWithArgumentRanges(self._s[281]!, self._r[281]!, [_0]) } - public var Passport_Language_nl: String { return self._s[282]! } - public var Camera_Retake: String { return self._s[283]! } + public var Passport_Language_nl: String { return self._s[283]! } + public var Camera_Retake: String { return self._s[284]! } public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[284]!, self._r[284]!, [_0]) + return formatWithArgumentRanges(self._s[285]!, self._r[285]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[285]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[286]! } - public var Tour_Title6: String { return self._s[287]! } - public var Map_ChooseAPlace: String { return self._s[288]! } - public var CallSettings_Never: String { return self._s[290]! } + public var AuthSessions_LogOutApplications: String { return self._s[286]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[287]! } + public var Tour_Title6: String { return self._s[288]! } + public var Map_ChooseAPlace: String { return self._s[289]! } + public var CallSettings_Never: String { return self._s[291]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[291]!, self._r[291]!, [_0]) + return formatWithArgumentRanges(self._s[292]!, self._r[292]!, [_0]) } - public var ChannelRemoved_RemoveInfo: String { return self._s[292]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[293]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[293]!, self._r[293]!, [_0]) + return formatWithArgumentRanges(self._s[294]!, self._r[294]!, [_0]) } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[294]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[295]! } public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[295]!, self._r[295]!, [_0]) + return formatWithArgumentRanges(self._s[296]!, self._r[296]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[296]! } + public var GroupInfo_InviteLink_Title: String { return self._s[297]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[297]!, self._r[297]!, [_1, _2]) + return formatWithArgumentRanges(self._s[298]!, self._r[298]!, [_1, _2]) } - public var KeyCommand_ScrollUp: String { return self._s[298]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[299]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[300]! } + public var KeyCommand_ScrollUp: String { return self._s[299]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[300]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[301]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[301]!, self._r[301]!, [_0]) + return formatWithArgumentRanges(self._s[302]!, self._r[302]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[302]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[303]! } - public var Weekday_Tuesday: String { return self._s[305]! } - public var UserInfo_StartSecretChat: String { return self._s[307]! } - public var Passport_Identity_FilesTitle: String { return self._s[308]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[309]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[311]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[312]! } - public var AuthSessions_Sessions: String { return self._s[313]! } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[303]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[304]! } + public var Weekday_Tuesday: String { return self._s[306]! } + public var UserInfo_StartSecretChat: String { return self._s[308]! } + public var Passport_Identity_FilesTitle: String { return self._s[309]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[310]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[312]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[313]! } + public var AuthSessions_Sessions: String { return self._s[314]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[315]!, self._r[315]!, [_0]) + return formatWithArgumentRanges(self._s[316]!, self._r[316]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[316]! } - public var Call_StatusWaiting: String { return self._s[317]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[318]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[319]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[320]! } - public var LogoutOptions_AddAccountText: String { return self._s[321]! } - public var PasscodeSettings_6DigitCode: String { return self._s[322]! } - public var Settings_LogoutConfirmationText: String { return self._s[323]! } - public var Passport_Identity_TypePassport: String { return self._s[325]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[317]! } + public var Call_StatusWaiting: String { return self._s[318]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[319]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[320]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[321]! } + public var LogoutOptions_AddAccountText: String { return self._s[322]! } + public var PasscodeSettings_6DigitCode: String { return self._s[323]! } + public var Settings_LogoutConfirmationText: String { return self._s[324]! } + public var Passport_Identity_TypePassport: String { return self._s[326]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[328]!, self._r[328]!, [_1, _2]) + return formatWithArgumentRanges(self._s[329]!, self._r[329]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[329]! } - public var AccessDenied_SaveMedia: String { return self._s[330]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[332]! } - public var Settings_Title: String { return self._s[334]! } - public var Contacts_InviteSearchLabel: String { return self._s[336]! } - public var ConvertToSupergroup_Title: String { return self._s[337]! } + public var SocksProxySetup_SaveProxy: String { return self._s[330]! } + public var AccessDenied_SaveMedia: String { return self._s[331]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[333]! } + public var Settings_Title: String { return self._s[335]! } + public var Contacts_InviteSearchLabel: String { return self._s[337]! } + public var ConvertToSupergroup_Title: String { return self._s[338]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[338]!, self._r[338]!, [_0]) + return formatWithArgumentRanges(self._s[339]!, self._r[339]!, [_0]) } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[339]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[340]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[340]!, self._r[340]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[341]!, self._r[341]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[341]! } - public var UserInfo_BotHelp: String { return self._s[342]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[343]! } - public var Checkout_Name: String { return self._s[344]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[345]! } - public var Channel_BanUser_BlockFor: String { return self._s[346]! } - public var Checkout_ShippingAddress: String { return self._s[347]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[348]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[349]! } - public var Privacy_Forwards: String { return self._s[350]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[351]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[342]! } + public var UserInfo_BotHelp: String { return self._s[343]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[344]! } + public var Checkout_Name: String { return self._s[345]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[346]! } + public var Channel_BanUser_BlockFor: String { return self._s[347]! } + public var Checkout_ShippingAddress: String { return self._s[348]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[349]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[350]! } + public var Privacy_Forwards: String { return self._s[351]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[352]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[354]!, self._r[354]!, [_0]) + return formatWithArgumentRanges(self._s[355]!, self._r[355]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[355]! } - public var Group_OwnershipTransfer_Title: String { return self._s[356]! } - public var Group_LeaveGroup: String { return self._s[357]! } - public var Settings_UsernameEmpty: String { return self._s[358]! } + public var Contacts_SortedByName: String { return self._s[356]! } + public var Group_OwnershipTransfer_Title: String { return self._s[357]! } + public var Group_LeaveGroup: String { return self._s[358]! } + public var Settings_UsernameEmpty: String { return self._s[359]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[359]!, self._r[359]!, [_0]) + return formatWithArgumentRanges(self._s[360]!, self._r[360]!, [_0]) } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[360]!, self._r[360]!, [_1]) + return formatWithArgumentRanges(self._s[361]!, self._r[361]!, [_1]) } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[361]!, self._r[361]!, [_1, _2]) + return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_1, _2]) } - public var Message_ImageExpired: String { return self._s[362]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[364]! } - public var UserInfo_AddToExisting: String { return self._s[365]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[366]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[367]! } + public var Message_ImageExpired: String { return self._s[363]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[365]! } + public var UserInfo_AddToExisting: String { return self._s[366]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[367]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[368]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[368]!, self._r[368]!, [_1]) + return formatWithArgumentRanges(self._s[369]!, self._r[369]!, [_1]) } - public var Notifications_GroupNotificationsAlert: String { return self._s[369]! } - public var Passport_Language_km: String { return self._s[370]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[372]! } - public var Notification_CallMissedShort: String { return self._s[373]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[374]! } - public var Watch_Compose_Send: String { return self._s[375]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[378]! } - public var Conversation_HoldForVideo: String { return self._s[379]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[381]! } - public var Appearance_AutoNightThemeDisabled: String { return self._s[383]! } - public var Channel_LinkItem: String { return self._s[384]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[370]! } + public var Passport_Language_km: String { return self._s[371]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[373]! } + public var Notification_CallMissedShort: String { return self._s[374]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[375]! } + public var Watch_Compose_Send: String { return self._s[376]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[379]! } + public var Conversation_HoldForVideo: String { return self._s[380]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[382]! } + public var Appearance_AutoNightThemeDisabled: String { return self._s[384]! } + public var Channel_LinkItem: String { return self._s[385]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[385]!, self._r[385]!, [_0, _1]) + return formatWithArgumentRanges(self._s[386]!, self._r[386]!, [_0, _1]) } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[388]!, self._r[388]!, [_0]) + return formatWithArgumentRanges(self._s[389]!, self._r[389]!, [_0]) } - public var Passport_Language_dv: String { return self._s[389]! } - public var Undo_LeftChannel: String { return self._s[390]! } - public var Notifications_ExceptionsMuted: String { return self._s[391]! } - public var ChatList_UnhideAction: String { return self._s[392]! } - public var Conversation_ContextMenuShare: String { return self._s[393]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[394]! } - public var ShareFileTip_Title: String { return self._s[395]! } - public var NotificationsSound_Chord: String { return self._s[396]! } + public var Passport_Language_dv: String { return self._s[390]! } + public var Undo_LeftChannel: String { return self._s[391]! } + public var Notifications_ExceptionsMuted: String { return self._s[392]! } + public var ChatList_UnhideAction: String { return self._s[393]! } + public var Conversation_ContextMenuShare: String { return self._s[394]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[395]! } + public var ShareFileTip_Title: String { return self._s[396]! } + public var NotificationsSound_Chord: String { return self._s[397]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[397]!, self._r[397]!, [_1, _2]) + return formatWithArgumentRanges(self._s[398]!, self._r[398]!, [_1, _2]) } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[398]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[399]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[399]!, self._r[399]!, [_0]) + return formatWithArgumentRanges(self._s[400]!, self._r[400]!, [_0]) } - public var Notification_CallOutgoingShort: String { return self._s[401]! } + public var Notification_CallOutgoingShort: String { return self._s[402]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[402]!, self._r[402]!, [_1, _2]) + return formatWithArgumentRanges(self._s[403]!, self._r[403]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBill: String { return self._s[403]! } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[404]! } - public var ReportPeer_Report: String { return self._s[405]! } - public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[406]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[407]! } - public var StickerPack_Send: String { return self._s[408]! } - public var Login_CodeSentInternal: String { return self._s[409]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[410]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[404]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[405]! } + public var ReportPeer_Report: String { return self._s[406]! } + public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[407]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[408]! } + public var StickerPack_Send: String { return self._s[409]! } + public var Login_CodeSentInternal: String { return self._s[410]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[411]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[411]!, self._r[411]!, [_0]) + return formatWithArgumentRanges(self._s[412]!, self._r[412]!, [_0]) } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[413]!, self._r[413]!, [_0]) + return formatWithArgumentRanges(self._s[414]!, self._r[414]!, [_0]) } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[414]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[415]! } public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[415]!, self._r[415]!, [_1]) + return formatWithArgumentRanges(self._s[416]!, self._r[416]!, [_1]) } - public var ReportPeer_ReasonViolence: String { return self._s[417]! } - public var Map_Locating: String { return self._s[418]! } - public var AutoDownloadSettings_GroupChats: String { return self._s[420]! } - public var CheckoutInfo_SaveInfo: String { return self._s[421]! } - public var SharedMedia_EmptyLinksText: String { return self._s[423]! } - public var Passport_Address_CityPlaceholder: String { return self._s[424]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[425]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[426]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[428]! } + public var ReportPeer_ReasonViolence: String { return self._s[418]! } + public var Map_Locating: String { return self._s[419]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[421]! } + public var CheckoutInfo_SaveInfo: String { return self._s[422]! } + public var SharedMedia_EmptyLinksText: String { return self._s[424]! } + public var Passport_Address_CityPlaceholder: String { return self._s[425]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[426]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[427]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[429]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[429]!, self._r[429]!, [_1]) + return formatWithArgumentRanges(self._s[430]!, self._r[430]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[430]!, self._r[430]!, [_0]) + return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[431]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[432]! } - public var ChangePhoneNumberCode_Code: String { return self._s[433]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[432]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[433]! } + public var ChangePhoneNumberCode_Code: String { return self._s[434]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[434]!, self._r[434]!, [_0]) + return formatWithArgumentRanges(self._s[435]!, self._r[435]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[435]! } - public var HashtagSearch_AllChats: String { return self._s[436]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[438]! } + public var TwoStepAuth_SetupEmail: String { return self._s[436]! } + public var HashtagSearch_AllChats: String { return self._s[437]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[439]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[439]!, self._r[439]!, [_0]) + return formatWithArgumentRanges(self._s[440]!, self._r[440]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[441]! } + public var PhotoEditor_QualityHigh: String { return self._s[442]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[442]!, self._r[442]!, [_0]) + return formatWithArgumentRanges(self._s[443]!, self._r[443]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[443]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[444]! } - public var Message_LiveLocation: String { return self._s[445]! } - public var Cache_LowDiskSpaceText: String { return self._s[446]! } - public var Conversation_SendMessage: String { return self._s[447]! } - public var AuthSessions_EmptyTitle: String { return self._s[448]! } - public var Privacy_PhoneNumber: String { return self._s[449]! } - public var PeopleNearby_CreateGroup: String { return self._s[450]! } - public var CallSettings_UseLessData: String { return self._s[451]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[452]! } - public var Stickers_AddToFavorites: String { return self._s[453]! } - public var PhotoEditor_QualityLow: String { return self._s[454]! } - public var Watch_UserInfo_Unblock: String { return self._s[455]! } - public var Settings_Logout: String { return self._s[456]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[444]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[445]! } + public var Message_LiveLocation: String { return self._s[446]! } + public var Cache_LowDiskSpaceText: String { return self._s[447]! } + public var Conversation_SendMessage: String { return self._s[448]! } + public var AuthSessions_EmptyTitle: String { return self._s[449]! } + public var Privacy_PhoneNumber: String { return self._s[450]! } + public var PeopleNearby_CreateGroup: String { return self._s[451]! } + public var CallSettings_UseLessData: String { return self._s[452]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[453]! } + public var Stickers_AddToFavorites: String { return self._s[454]! } + public var PhotoEditor_QualityLow: String { return self._s[455]! } + public var Watch_UserInfo_Unblock: String { return self._s[456]! } + public var Settings_Logout: String { return self._s[457]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[457]!, self._r[457]!, [_1]) + return formatWithArgumentRanges(self._s[458]!, self._r[458]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[458]! } - public var ChannelInfo_Stats: String { return self._s[459]! } - public var TextFormat_Link: String { return self._s[460]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[459]! } + public var ChannelInfo_Stats: String { return self._s[460]! } + public var TextFormat_Link: String { return self._s[461]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[461]!, self._r[461]!, [_1, _2]) + return formatWithArgumentRanges(self._s[462]!, self._r[462]!, [_1, _2]) } public func Message_ForwardedMessage(_ _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 Watch_Notification_Joined: String { return self._s[463]! } - public var Group_Setup_TypePublicHelp: String { return self._s[464]! } - public var Passport_Scans_UploadNew: String { return self._s[465]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[466]! } - public var DialogList_Title: String { return self._s[469]! } - public var NotificationSettings_ContactJoined: String { return self._s[470]! } - public var GroupInfo_LabelAdmin: String { return self._s[471]! } - public var KeyCommand_ChatInfo: String { return self._s[472]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[473]! } - public var Call_ReportIncludeLog: String { return self._s[474]! } + public var Watch_Notification_Joined: String { return self._s[464]! } + public var Group_Setup_TypePublicHelp: String { return self._s[465]! } + public var Passport_Scans_UploadNew: String { return self._s[466]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[467]! } + public var DialogList_Title: String { return self._s[470]! } + public var NotificationSettings_ContactJoined: String { return self._s[471]! } + public var GroupInfo_LabelAdmin: String { return self._s[472]! } + public var KeyCommand_ChatInfo: String { return self._s[473]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[474]! } + public var Call_ReportIncludeLog: String { return self._s[475]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[477]!, self._r[477]!, [_0]) + return formatWithArgumentRanges(self._s[478]!, self._r[478]!, [_0]) } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[478]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[479]! } - public var Message_Sticker: String { return self._s[480]! } - public var LastSeen_JustNow: String { return self._s[482]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[484]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[485]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[486]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[487]! } - public var TwoStepAuth_Email: String { return self._s[488]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[489]! } - public var PhotoEditor_BlurToolOff: String { return self._s[490]! } - public var Message_PinnedStickerMessage: String { return self._s[491]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[492]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[493]! } - public var Passport_DiscardMessageTitle: String { return self._s[494]! } - public var Privacy_PaymentsTitle: String { return self._s[495]! } - public var Channel_DiscussionGroup_Header: String { return self._s[497]! } - public var Appearance_ColorTheme: String { return self._s[498]! } - public var UserInfo_ShareContact: String { return self._s[499]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[500]! } - public var Common_More: String { return self._s[501]! } - public var Watch_Message_Call: String { return self._s[502]! } - public var Profile_EncryptionKey: String { return self._s[505]! } - public var Privacy_TopPeers: String { return self._s[506]! } - public var Conversation_StopPollConfirmation: String { return self._s[507]! } - public var Privacy_TopPeersWarning: String { return self._s[509]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[510]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[511]! } - public var DialogList_SearchSectionMessages: String { return self._s[514]! } - public var Notifications_ChannelNotifications: String { return self._s[515]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[516]! } - public var Passport_Language_sk: String { return self._s[517]! } - public var Notification_MessageLifetime1h: String { return self._s[518]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[519]! } - public var Call_ReportSkip: String { return self._s[521]! } - public var Cache_ServiceFiles: String { return self._s[522]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[523]! } - public var Map_Hybrid: String { return self._s[524]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[526]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[528]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[529]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[530]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[533]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[479]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[480]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[481]! } + public var Message_Sticker: String { return self._s[482]! } + public var LastSeen_JustNow: String { return self._s[484]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[486]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[487]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[488]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[489]! } + public var TwoStepAuth_Email: String { return self._s[490]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[491]! } + public var PhotoEditor_BlurToolOff: String { return self._s[492]! } + public var Message_PinnedStickerMessage: String { return self._s[493]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[494]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[495]! } + public var Passport_DiscardMessageTitle: String { return self._s[496]! } + public var Privacy_PaymentsTitle: String { return self._s[497]! } + public var Channel_DiscussionGroup_Header: String { return self._s[499]! } + public var Appearance_ColorTheme: String { return self._s[500]! } + public var UserInfo_ShareContact: String { return self._s[501]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[502]! } + public var Common_More: String { return self._s[503]! } + public var Watch_Message_Call: String { return self._s[504]! } + public var Profile_EncryptionKey: String { return self._s[507]! } + public var Privacy_TopPeers: String { return self._s[508]! } + public var Conversation_StopPollConfirmation: String { return self._s[509]! } + public var Privacy_TopPeersWarning: String { return self._s[511]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[512]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[513]! } + public var DialogList_SearchSectionMessages: String { return self._s[516]! } + public var Notifications_ChannelNotifications: String { return self._s[517]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[518]! } + public var Passport_Language_sk: String { return self._s[519]! } + public var Notification_MessageLifetime1h: String { return self._s[520]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[521]! } + public var Call_ReportSkip: String { return self._s[523]! } + public var Cache_ServiceFiles: String { return self._s[524]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[525]! } + public var Map_Hybrid: String { return self._s[526]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[528]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[530]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[531]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[532]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[535]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[534]!, self._r[534]!, [_1]) + return formatWithArgumentRanges(self._s[536]!, self._r[536]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[536]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[538]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[537]!, self._r[537]!, [_1, _2]) + return formatWithArgumentRanges(self._s[539]!, self._r[539]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[538]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[539]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[540]! } - public var UserInfo_ShareBot: String { return self._s[543]! } + public var Conversation_LiveLocationYou: String { return self._s[540]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[541]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[542]! } + public var UserInfo_ShareBot: String { return self._s[545]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[544]!, self._r[544]!, [_1, _2]) + return formatWithArgumentRanges(self._s[546]!, self._r[546]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[545]! } - public var Message_Audio: String { return self._s[546]! } - public var Passport_Language_lt: String { return self._s[547]! } + public var PhotoEditor_ShadowsTint: String { return self._s[547]! } + public var Message_Audio: String { return self._s[548]! } + public var Passport_Language_lt: String { return self._s[549]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[548]!, self._r[548]!, [_0]) + return formatWithArgumentRanges(self._s[550]!, self._r[550]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[549]! } - public var Conversation_FileICloudDrive: String { return self._s[550]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[551]! } + public var Permissions_SiriText_v0: String { return self._s[551]! } + public var Conversation_FileICloudDrive: String { return self._s[552]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[553]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[552]!, self._r[552]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[554]!, self._r[554]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[553]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[555]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[554]!, self._r[554]!, [_0]) + return formatWithArgumentRanges(self._s[556]!, self._r[556]!, [_0]) } - public var Channel_SignMessages: String { return self._s[555]! } + public var Channel_SignMessages: String { return self._s[557]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[556]!, self._r[556]!, [_1]) + return formatWithArgumentRanges(self._s[558]!, self._r[558]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[557]! } - public var Passport_ScanPassport: String { return self._s[558]! } - public var Watch_Suggestion_Thanks: String { return self._s[559]! } - public var BlockedUsers_AddNew: String { return self._s[560]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[559]! } + public var Passport_ScanPassport: String { return self._s[560]! } + public var Watch_Suggestion_Thanks: String { return self._s[561]! } + public var BlockedUsers_AddNew: String { return self._s[562]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[561]!, self._r[561]!, [_1, _2]) + return formatWithArgumentRanges(self._s[563]!, self._r[563]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[562]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[563]! } - public var Month_GenJuly: String { return self._s[564]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[565]! } - public var Notification_ChannelInviterSelf: String { return self._s[567]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[568]! } + public var Watch_Message_Invoice: String { return self._s[564]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[565]! } + public var Month_GenJuly: String { return self._s[566]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[567]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[569]! } + public var Notification_ChannelInviterSelf: String { return self._s[570]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[571]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[569]!, self._r[569]!, [_1, _2]) + return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[570]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[571]! } + public var CheckoutInfo_Title: String { return self._s[573]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[574]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_0]) + return formatWithArgumentRanges(self._s[575]!, self._r[575]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[573]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[574]! } - public var Passport_Language_de: String { return self._s[575]! } - public var Update_Title: String { return self._s[576]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[577]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[578]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[579]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[580]! } - public var NotificationsSound_Telegraph: String { return self._s[581]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[582]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[583]! } + public var Passport_Identity_MainPage: String { return self._s[576]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[577]! } + public var Passport_Language_de: String { return self._s[578]! } + public var Update_Title: String { return self._s[579]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[580]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[581]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[582]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[583]! } + public var NotificationsSound_Telegraph: String { return self._s[584]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[585]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[586]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[584]!, self._r[584]!, [_0]) - } - public var Stickers_SuggestAll: String { return self._s[585]! } - public var Conversation_ForwardTitle: String { return self._s[586]! } - public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[587]!, self._r[587]!, [_0]) } - public var Calls_NewCall: String { return self._s[588]! } - public var Call_StatusEnded: String { return self._s[589]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[590]! } - public var Settings_ProxyConnected: String { return self._s[591]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[592]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[593]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[594]! } - public var Passport_PasswordPlaceholder: String { return self._s[595]! } - public var Message_PinnedInvoice: String { return self._s[596]! } - public var Passport_Identity_IssueDate: String { return self._s[597]! } - public var Passport_Language_pl: String { return self._s[598]! } - public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_0]) + public var Stickers_SuggestAll: String { return self._s[588]! } + public var Conversation_ForwardTitle: String { return self._s[589]! } + public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[590]!, self._r[590]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[600]! } - public var Call_StatusConnecting: String { return self._s[601]! } - public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Calls_NewCall: String { return self._s[591]! } + public var Call_StatusEnded: String { return self._s[592]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[593]! } + public var Settings_ProxyConnected: String { return self._s[594]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[595]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[596]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[597]! } + public var Passport_PasswordPlaceholder: String { return self._s[598]! } + public var Message_PinnedInvoice: String { return self._s[599]! } + public var Passport_Identity_IssueDate: String { return self._s[600]! } + public var Passport_Language_pl: String { return self._s[601]! } + public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[602]!, self._r[602]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[604]! } - public var Common_Edit: String { return self._s[605]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[606]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[603]! } + public var Call_StatusConnecting: String { return self._s[604]! } + public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[605]!, self._r[605]!, [_0]) + } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[607]! } + public var Common_Edit: String { return self._s[608]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[609]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[607]!, self._r[607]!, [_0]) + return formatWithArgumentRanges(self._s[610]!, self._r[610]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[608]! } - public var PrivateDataSettings_Title: String { return self._s[609]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[610]! } - public var ChatList_Read: String { return self._s[611]! } - public var Undo_ChatClearedForBothSides: String { return self._s[612]! } - public var GroupPermission_SectionTitle: String { return self._s[613]! } + public var GroupInfo_ChatAdmins: String { return self._s[611]! } + public var PrivateDataSettings_Title: String { return self._s[612]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[613]! } + public var ChatList_Read: String { return self._s[614]! } + public var Undo_ChatClearedForBothSides: String { return self._s[615]! } + public var GroupPermission_SectionTitle: String { return self._s[616]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[615]!, self._r[615]!, [_1, _2]) + return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[616]! } - public var Update_UpdateApp: String { return self._s[617]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[618]! } - public var Settings_Appearance: String { return self._s[619]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[621]! } - public var Watch_Location_Access: String { return self._s[622]! } - public var ShareMenu_CopyShareLink: String { return self._s[624]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[625]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[619]! } + public var Update_UpdateApp: String { return self._s[620]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[621]! } + public var Settings_Appearance: String { return self._s[622]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[624]! } + public var Watch_Location_Access: String { return self._s[625]! } + public var ShareMenu_CopyShareLink: String { return self._s[627]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[628]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[627]!, self._r[627]!, [_0]) + return formatWithArgumentRanges(self._s[630]!, self._r[630]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[628]! } - public var Weekday_ShortWednesday: String { return self._s[629]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[630]! } - public var Undo_LeftGroup: String { return self._s[633]! } - public var Conversation_LinkDialogCopy: String { return self._s[634]! } - public var KeyCommand_FocusOnInputField: String { return self._s[636]! } - public var Contacts_SelectAll: String { return self._s[637]! } - public var Preview_SaveToCameraRoll: String { return self._s[638]! } - public var PrivacySettings_PasscodeOff: String { return self._s[639]! } - public var Wallpaper_Title: String { return self._s[640]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[641]! } - public var AccessDenied_Camera: String { return self._s[642]! } - public var Watch_Compose_CurrentLocation: String { return self._s[643]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[645]! } + public var Notifications_ClassicTones: String { return self._s[631]! } + public var Weekday_ShortWednesday: String { return self._s[632]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[633]! } + public var Undo_LeftGroup: String { return self._s[636]! } + public var Conversation_LinkDialogCopy: String { return self._s[637]! } + public var KeyCommand_FocusOnInputField: String { return self._s[639]! } + public var Contacts_SelectAll: String { return self._s[640]! } + public var Preview_SaveToCameraRoll: String { return self._s[641]! } + public var PrivacySettings_PasscodeOff: String { return self._s[642]! } + public var Wallpaper_Title: String { return self._s[643]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[644]! } + public var AccessDenied_Camera: String { return self._s[645]! } + public var Watch_Compose_CurrentLocation: String { return self._s[646]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[648]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_0]) + return formatWithArgumentRanges(self._s[649]!, self._r[649]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[647]! } - public var Passport_Language_ro: String { return self._s[648]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[649]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[650]! } + public var Passport_Language_ro: String { return self._s[651]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[652]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[650]!, self._r[650]!, [_0]) + return formatWithArgumentRanges(self._s[653]!, self._r[653]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[651]! } - public var State_ConnectingToProxy: String { return self._s[652]! } - public var Calls_RatingTitle: String { return self._s[653]! } - public var Generic_ErrorMoreInfo: String { return self._s[654]! } - public var Appearance_PreviewReplyText: String { return self._s[655]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[656]! } - public var SharedMedia_CategoryLinks: String { return self._s[657]! } - public var Calls_Missed: String { return self._s[658]! } - public var Cache_Photos: String { return self._s[662]! } - public var GroupPermission_NoAddMembers: String { return self._s[663]! } + public var Login_CancelPhoneVerification: String { return self._s[654]! } + public var State_ConnectingToProxy: String { return self._s[655]! } + public var Calls_RatingTitle: String { return self._s[656]! } + public var Generic_ErrorMoreInfo: String { return self._s[657]! } + public var Appearance_PreviewReplyText: String { return self._s[658]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[659]! } + public var SharedMedia_CategoryLinks: String { return self._s[660]! } + public var Calls_Missed: String { return self._s[661]! } + public var Cache_Photos: String { return self._s[665]! } + public var GroupPermission_NoAddMembers: String { return self._s[666]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[664]!, self._r[664]!, [_0]) + return formatWithArgumentRanges(self._s[667]!, self._r[667]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[665]! } - public var Settings_ProxyDisabled: String { return self._s[666]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[668]! } + public var Settings_ProxyDisabled: String { return self._s[669]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[667]!, self._r[667]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[670]!, self._r[670]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[668]!, self._r[668]!, [_0]) - } - public var Appearance_Title: String { return self._s[669]! } - public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[671]!, self._r[671]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[672]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[673]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[674]! } - public var Preview_DeletePhoto: String { return self._s[675]! } - public var Appearance_AppIconFilledX: String { return self._s[676]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[677]! } + public var Appearance_Title: String { return self._s[672]! } + public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[674]!, self._r[674]!, [_0]) + } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[675]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[676]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[677]! } + public var Preview_DeletePhoto: String { return self._s[678]! } + public var Appearance_AppIconFilledX: String { return self._s[679]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[680]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[678]!, self._r[678]!, [_0]) + return formatWithArgumentRanges(self._s[681]!, self._r[681]!, [_0]) } - public var Coub_TapForSound: String { return self._s[680]! } - public var Map_LocatingError: String { return self._s[681]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[683]! } - public var Passport_ForgottenPassword: String { return self._s[684]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[685]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[686]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[688]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[689]! } - public var Message_Location: String { return self._s[690]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[691]! } - public var Channel_Management_Title: String { return self._s[692]! } - public var DialogList_SearchSectionDialogs: String { return self._s[694]! } - public var Compose_NewChannel_Members: String { return self._s[695]! } + public var Coub_TapForSound: String { return self._s[683]! } + public var Map_LocatingError: String { return self._s[684]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[686]! } + public var Passport_ForgottenPassword: String { return self._s[687]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[688]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[689]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[691]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[692]! } + public var Message_Location: String { return self._s[693]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[694]! } + public var Channel_Management_Title: String { return self._s[695]! } + public var DialogList_SearchSectionDialogs: String { return self._s[697]! } + public var Compose_NewChannel_Members: String { return self._s[698]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[696]!, self._r[696]!, [_0]) + return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_0]) } - public var AutoNightTheme_ScheduledFrom: String { return self._s[697]! } - public var PhotoEditor_WarmthTool: String { return self._s[698]! } - public var Passport_Language_tr: String { return self._s[699]! } + public var GroupInfo_Location: String { return self._s[700]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[701]! } + public var PhotoEditor_WarmthTool: String { return self._s[702]! } + public var Passport_Language_tr: String { return self._s[703]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[702]! } - public var Watch_PhotoView_Title: String { return self._s[703]! } - public var Passport_Phone_Delete: String { return self._s[704]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[705]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[706]! } - public var GroupInfo_Permissions: String { return self._s[707]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[708]! } - public var Profile_ShareContactButton: String { return self._s[709]! } - public var ChatSettings_Other: String { return self._s[710]! } - public var UserInfo_NotificationsDisabled: String { return self._s[711]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[712]! } - public var LastSeen_WithinAMonth: String { return self._s[713]! } - public var Conversation_EncryptionCanceled: String { return self._s[714]! } - public var MediaPicker_GroupDescription: String { return self._s[715]! } - public var WebSearch_Images: String { return self._s[716]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[706]! } + public var Watch_PhotoView_Title: String { return self._s[707]! } + public var Passport_Phone_Delete: String { return self._s[708]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[709]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[710]! } + public var GroupInfo_Permissions: String { return self._s[711]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[712]! } + public var Profile_ShareContactButton: String { return self._s[713]! } + public var ChatSettings_Other: String { return self._s[714]! } + public var UserInfo_NotificationsDisabled: String { return self._s[715]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[716]! } + public var LastSeen_WithinAMonth: String { return self._s[717]! } + public var Conversation_ReportGroupLocation: String { return self._s[718]! } + public var Conversation_EncryptionCanceled: String { return self._s[719]! } + public var MediaPicker_GroupDescription: String { return self._s[720]! } + public var WebSearch_Images: String { return self._s[721]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[717]!, self._r[717]!, [_0]) + return formatWithArgumentRanges(self._s[722]!, self._r[722]!, [_0]) } - public var Message_Photo: String { return self._s[718]! } - public var PasscodeSettings_HelpBottom: String { return self._s[719]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[720]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[721]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[722]! } - public var NotificationsSound_Calypso: String { return self._s[723]! } - public var Map_Map: String { return self._s[724]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[726]! } - public var ChatSettings_TextSizeUnits: String { return self._s[727]! } - public var Common_of: String { return self._s[728]! } - public var Conversation_ForwardContacts: String { return self._s[730]! } + public var Message_Photo: String { return self._s[723]! } + public var PasscodeSettings_HelpBottom: String { return self._s[724]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[725]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[726]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[727]! } + public var NotificationsSound_Calypso: String { return self._s[728]! } + public var Map_Map: String { return self._s[729]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[731]! } + public var ChatSettings_TextSizeUnits: String { return self._s[732]! } + public var Common_of: String { return self._s[733]! } + public var Conversation_ForwardContacts: String { return self._s[735]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[732]!, self._r[732]!, [_0]) + return formatWithArgumentRanges(self._s[737]!, self._r[737]!, [_0]) } - public var Passport_Language_hy: String { return self._s[733]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[734]! } - public var AutoDownloadSettings_Reset: String { return self._s[735]! } - public var Paint_ClearConfirm: String { return self._s[736]! } - public var Camera_VideoMode: String { return self._s[737]! } + public var Passport_Language_hy: String { return self._s[738]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[739]! } + public var AutoDownloadSettings_Reset: String { return self._s[740]! } + public var Paint_ClearConfirm: String { return self._s[741]! } + public var Camera_VideoMode: String { return self._s[742]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[738]!, self._r[738]!, [_0]) + return formatWithArgumentRanges(self._s[743]!, self._r[743]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[739]! } - public var Conversation_ViewBackground: String { return self._s[740]! } - public var Passport_Language_el: String { return self._s[741]! } - public var PhotoEditor_Original: String { return self._s[742]! } - public var Settings_FAQ_Button: String { return self._s[744]! } - public var Channel_Setup_PublicNoLink: String { return self._s[746]! } - public var Conversation_UnsupportedMedia: String { return self._s[747]! } - public var Conversation_SlideToCancel: String { return self._s[748]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[749]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[750]! } - public var AutoNightTheme_NotAvailable: String { return self._s[751]! } - public var Common_Create: String { return self._s[752]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[753]! } - public var Localization_ChooseLanguage: String { return self._s[755]! } - public var Settings_Proxy: String { return self._s[758]! } - public var Privacy_TopPeersHelp: String { return self._s[759]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[760]! } - public var Chat_UnsendMyMessages: String { return self._s[761]! } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[762]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[744]! } + public var Conversation_ViewBackground: String { return self._s[745]! } + public var Passport_Language_el: String { return self._s[746]! } + public var PhotoEditor_Original: String { return self._s[747]! } + public var Settings_FAQ_Button: String { return self._s[749]! } + public var Channel_Setup_PublicNoLink: String { return self._s[751]! } + public var Conversation_UnsupportedMedia: String { return self._s[752]! } + public var Conversation_SlideToCancel: String { return self._s[753]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[754]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[755]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[756]! } + public var AutoNightTheme_NotAvailable: String { return self._s[757]! } + public var Common_Create: String { return self._s[758]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[759]! } + public var Localization_ChooseLanguage: String { return self._s[761]! } + public var Settings_Proxy: String { return self._s[764]! } + public var Privacy_TopPeersHelp: String { return self._s[765]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[766]! } + public var Chat_UnsendMyMessages: String { return self._s[767]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[768]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[764]!, self._r[764]!, [_0]) + return formatWithArgumentRanges(self._s[770]!, self._r[770]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[765]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[766]! } - public var Cache_Title: String { return self._s[767]! } + public var Contacts_SortedByPresence: String { return self._s[771]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[772]! } + public var Cache_Title: String { return self._s[773]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[768]!, self._r[768]!, [_0]) + return formatWithArgumentRanges(self._s[774]!, self._r[774]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[769]! } - public var Channel_Moderator_Title: String { return self._s[770]! } - public var InstantPage_AutoNightTheme: String { return self._s[772]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[775]! } + public var Channel_Moderator_Title: String { return self._s[776]! } + public var InstantPage_AutoNightTheme: String { return self._s[778]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_1]) + return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[776]! } - public var Undo_Undo: String { return self._s[778]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[779]! } - public var TwoStepAuth_RemovePassword: String { return self._s[780]! } - public var Common_Delete: String { return self._s[781]! } - public var Contacts_AddPeopleNearby: String { return self._s[783]! } - public var Conversation_ContextMenuDelete: String { return self._s[784]! } - public var SocksProxySetup_Credentials: String { return self._s[785]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[787]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[790]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[791]! } - public var Passport_Language_id: String { return self._s[793]! } - public var WallpaperSearch_ColorTeal: String { return self._s[794]! } - public var ChannelIntro_Title: String { return self._s[795]! } + public var Passport_Scans_Upload: String { return self._s[782]! } + public var Undo_Undo: String { return self._s[784]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[785]! } + public var TwoStepAuth_RemovePassword: String { return self._s[786]! } + public var Common_Delete: String { return self._s[787]! } + public var Contacts_AddPeopleNearby: String { return self._s[789]! } + public var Conversation_ContextMenuDelete: String { return self._s[790]! } + public var SocksProxySetup_Credentials: String { return self._s[791]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[793]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[796]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[797]! } + public var Passport_Language_id: String { return self._s[799]! } + public var WallpaperSearch_ColorTeal: String { return self._s[800]! } + public var ChannelIntro_Title: String { return self._s[801]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[796]!, self._r[796]!, [_0]) + return formatWithArgumentRanges(self._s[802]!, self._r[802]!, [_0]) } - public var Channel_Info_Description: String { return self._s[798]! } - public var Stickers_FavoriteStickers: String { return self._s[799]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[800]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[801]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[802]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[803]! } + public var Channel_Info_Description: String { return self._s[804]! } + public var Stickers_FavoriteStickers: String { return self._s[805]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[806]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[807]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[808]! } + public var Group_PublicLink_Placeholder: String { return self._s[809]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[810]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[804]!, self._r[804]!, [_1]) + return formatWithArgumentRanges(self._s[811]!, self._r[811]!, [_1]) } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[805]!, self._r[805]!, [_1, _2]) + return formatWithArgumentRanges(self._s[812]!, self._r[812]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[806]!, self._r[806]!, [_0]) + return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_0]) } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[807]!, self._r[807]!, [_1, _2]) + return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[808]! } - public var Passport_Language_uk: String { return self._s[809]! } - public var StickerPack_HideStickers: String { return self._s[811]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[812]! } + public var GroupPermission_Delete: String { return self._s[815]! } + public var Passport_Language_uk: String { return self._s[816]! } + public var StickerPack_HideStickers: String { return self._s[818]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[819]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_1, _2]) + return formatWithArgumentRanges(self._s[820]!, self._r[820]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[814]! } + public var Activity_UploadingVideoMessage: String { return self._s[821]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) + return formatWithArgumentRanges(self._s[822]!, self._r[822]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[816]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[817]! } - public var Settings_CallSettings: String { return self._s[818]! } - public var Camera_SquareMode: String { return self._s[819]! } - public var GroupInfo_SharedMediaNone: String { return self._s[820]! } + public var Channel_TitleInfo: String { return self._s[823]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[824]! } + public var Settings_CallSettings: String { return self._s[825]! } + public var Camera_SquareMode: String { return self._s[826]! } + public var GroupInfo_SharedMediaNone: String { return self._s[827]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[821]!, self._r[821]!, [_1]) + return formatWithArgumentRanges(self._s[828]!, self._r[828]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[822]! } - public var Application_Update: String { return self._s[824]! } - public var Month_ShortJanuary: String { return self._s[825]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[826]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[827]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[828]! } - public var Passport_Address_Street2Placeholder: String { return self._s[829]! } + public var Bot_GenericBotStatus: String { return self._s[829]! } + public var Application_Update: String { return self._s[831]! } + public var Month_ShortJanuary: String { return self._s[832]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[833]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[834]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[835]! } + public var Passport_Address_Street2Placeholder: String { return self._s[836]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[830]!, self._r[830]!, [_0]) + return formatWithArgumentRanges(self._s[837]!, self._r[837]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[831]! } - public var Appearance_PreviewOutgoingText: String { return self._s[832]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[833]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[835]! } - public var Map_Directions: String { return self._s[836]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[838]! } - public var Appearance_ThemeDay: String { return self._s[839]! } - public var LogoutOptions_LogOut: String { return self._s[840]! } - public var Channel_AddBotErrorNoRights: String { return self._s[842]! } - public var Passport_Identity_AddPassport: String { return self._s[843]! } - public var Call_Message: String { return self._s[844]! } - public var PhotoEditor_ExposureTool: String { return self._s[845]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[847]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[849]! } - public var Appearance_Preview: String { return self._s[850]! } - public var Compose_ChannelMembers: String { return self._s[851]! } - public var Conversation_DeleteManyMessages: String { return self._s[852]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[853]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[854]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[855]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[858]! } - public var Conversation_UpdateTelegram: String { return self._s[859]! } + public var NetworkUsageSettings_Cellular: String { return self._s[838]! } + public var Appearance_PreviewOutgoingText: String { return self._s[839]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[840]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[842]! } + public var Map_Directions: String { return self._s[843]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[845]! } + public var Appearance_ThemeDay: String { return self._s[846]! } + public var LogoutOptions_LogOut: String { return self._s[847]! } + public var Group_PublicLink_Title: String { return self._s[849]! } + public var Channel_AddBotErrorNoRights: String { return self._s[850]! } + public var Passport_Identity_AddPassport: String { return self._s[851]! } + public var LocalGroup_ButtonTitle: String { return self._s[852]! } + public var Call_Message: String { return self._s[853]! } + public var PhotoEditor_ExposureTool: String { return self._s[854]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[856]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[858]! } + public var Appearance_Preview: String { return self._s[859]! } + public var Compose_ChannelMembers: String { return self._s[860]! } + public var Conversation_DeleteManyMessages: String { return self._s[861]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[862]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[863]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[864]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[867]! } + public var Conversation_UpdateTelegram: String { return self._s[868]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_0]) + return formatWithArgumentRanges(self._s[869]!, self._r[869]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_1]) + return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[862]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[863]! } + public var GroupInfo_Administrators_Title: String { return self._s[871]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[872]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[864]!, self._r[864]!, [_0]) - } - public var Tour_Title3: String { return self._s[865]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[866]! } - public var Clipboard_SendPhoto: String { return self._s[870]! } - public var MediaPicker_Videos: String { return self._s[871]! } - public var Passport_Email_Title: String { return self._s[872]! } - public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[874]! } - public var Conversation_MessageDialogDelete: String { return self._s[875]! } - public var Privacy_Calls_CustomHelp: String { return self._s[877]! } - public var Message_Wallpaper: String { return self._s[878]! } - public var MemberSearch_BotSection: String { return self._s[879]! } - public var GroupInfo_SetSound: String { return self._s[880]! } - public var Core_ServiceUserStatus: String { return self._s[881]! } - public var LiveLocationUpdated_JustNow: String { return self._s[882]! } - public var Call_StatusFailed: String { return self._s[883]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[884]! } - public var TwoStepAuth_SetPassword: String { return self._s[885]! } - public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[887]!, self._r[887]!, [_0]) + public var Tour_Title3: String { return self._s[874]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[875]! } + public var Clipboard_SendPhoto: String { return self._s[879]! } + public var MediaPicker_Videos: String { return self._s[880]! } + public var Passport_Email_Title: String { return self._s[881]! } + public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[882]!, self._r[882]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[888]! } - public var Profile_Username: String { return self._s[889]! } - public var Bot_DescriptionTitle: String { return self._s[890]! } - public var MaskStickerSettings_Title: String { return self._s[891]! } - public var SharedMedia_CategoryOther: String { return self._s[892]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[893]! } - public var Common_NotNow: String { return self._s[894]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[895]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[896]! } - public var Map_Location: String { return self._s[897]! } - public var Invitation_JoinGroup: String { return self._s[898]! } - public var AutoDownloadSettings_Title: String { return self._s[900]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[901]! } - public var Channel_ErrorAddBlocked: String { return self._s[902]! } - public var Conversation_UnblockUser: String { return self._s[903]! } - public var Watch_Bot_Restart: String { return self._s[904]! } - public var TwoStepAuth_Title: String { return self._s[905]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[906]! } - public var Checkout_ShippingMethod: String { return self._s[907]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[908]! } + public var StickerPacksSettings_Title: String { return self._s[883]! } + public var Conversation_MessageDialogDelete: String { return self._s[884]! } + public var Privacy_Calls_CustomHelp: String { return self._s[886]! } + public var Message_Wallpaper: String { return self._s[887]! } + public var MemberSearch_BotSection: String { return self._s[888]! } + public var GroupInfo_SetSound: String { return self._s[889]! } + public var Core_ServiceUserStatus: String { return self._s[890]! } + public var LiveLocationUpdated_JustNow: String { return self._s[891]! } + public var Call_StatusFailed: String { return self._s[892]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[893]! } + public var TwoStepAuth_SetPassword: String { return self._s[894]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[895]! } + public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[897]!, self._r[897]!, [_0]) + } + public var Calls_SubmitRating: String { return self._s[898]! } + public var Profile_Username: String { return self._s[899]! } + public var Bot_DescriptionTitle: String { return self._s[900]! } + public var MaskStickerSettings_Title: String { return self._s[901]! } + public var SharedMedia_CategoryOther: String { return self._s[902]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[903]! } + public var Common_NotNow: String { return self._s[904]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[905]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[906]! } + public var Map_Location: String { return self._s[907]! } + public var Invitation_JoinGroup: String { return self._s[908]! } + public var AutoDownloadSettings_Title: String { return self._s[910]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[911]! } + public var Channel_ErrorAddBlocked: String { return self._s[912]! } + public var Conversation_UnblockUser: String { return self._s[913]! } + public var Watch_Bot_Restart: String { return self._s[914]! } + public var TwoStepAuth_Title: String { return self._s[915]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[916]! } + public var Checkout_ShippingMethod: String { return self._s[917]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[918]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[909]!, self._r[909]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[911]!, self._r[911]!, [_0]) + return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[912]!, self._r[912]!, [_0]) + return formatWithArgumentRanges(self._s[922]!, self._r[922]!, [_0]) } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[913]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[914]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[915]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[916]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[917]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[918]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[919]! } - public var Checkout_PaymentMethod_Title: String { return self._s[920]! } - public var SocksProxySetup_Connection: String { return self._s[921]! } - public var Group_MessagePhotoRemoved: String { return self._s[922]! } - public var Channel_Stickers_NotFound: String { return self._s[924]! } - public var Group_About_Help: String { return self._s[925]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[926]! } - public var PeopleNearby_Title: String { return self._s[928]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[923]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[924]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[925]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[926]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[927]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[928]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[929]! } + public var Checkout_PaymentMethod_Title: String { return self._s[930]! } + public var SocksProxySetup_Connection: String { return self._s[931]! } + public var Group_MessagePhotoRemoved: String { return self._s[932]! } + public var Channel_Stickers_NotFound: String { return self._s[934]! } + public var Group_About_Help: String { return self._s[935]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[936]! } + public var PeopleNearby_Title: String { return self._s[938]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[929]!, self._r[929]!, [_1]) + return formatWithArgumentRanges(self._s[939]!, self._r[939]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[931]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[932]! } - public var SocksProxySetup_Password: String { return self._s[933]! } - public var Notifications_PermissionsEnable: String { return self._s[934]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[936]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[941]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[942]! } + public var SocksProxySetup_Password: String { return self._s[943]! } + public var Notifications_PermissionsEnable: String { return self._s[944]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[946]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[937]!, self._r[937]!, [_1]) + return formatWithArgumentRanges(self._s[947]!, self._r[947]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[939]!, self._r[939]!, [_0]) + return formatWithArgumentRanges(self._s[949]!, self._r[949]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[940]! } - public var ArchivedPacksAlert_Title: String { return self._s[941]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[950]! } + public var ArchivedPacksAlert_Title: String { return self._s[951]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[942]!, self._r[942]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[952]!, self._r[952]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[943]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[945]! } - public var Conversation_StatusTyping: String { return self._s[946]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[947]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[948]! } - public var UserInfo_CreateNewContact: String { return self._s[949]! } - public var Passport_Identity_FrontSide: String { return self._s[950]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[951]! } - public var Calls_CallTabTitle: String { return self._s[952]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[953]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[953]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[955]! } + public var Conversation_StatusTyping: String { return self._s[956]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[957]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[958]! } + public var UserInfo_CreateNewContact: String { return self._s[959]! } + public var Passport_Identity_FrontSide: String { return self._s[960]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[961]! } + public var Calls_CallTabTitle: String { return self._s[962]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[963]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[954]!, self._r[954]!, [_0]) + return formatWithArgumentRanges(self._s[964]!, self._r[964]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[955]! } - public var SharedMedia_EmptyMusicText: String { return self._s[956]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[957]! } - public var Paint_Stickers: String { return self._s[958]! } - public var Privacy_GroupsAndChannels: String { return self._s[959]! } - public var UserInfo_AddContact: String { return self._s[961]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[965]! } + public var SharedMedia_EmptyMusicText: String { return self._s[966]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[967]! } + public var Paint_Stickers: String { return self._s[968]! } + public var Privacy_GroupsAndChannels: String { return self._s[969]! } + public var UserInfo_AddContact: String { return self._s[971]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[962]!, self._r[962]!, [_0]) + return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[964]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[974]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[966]!, self._r[966]!, [_0]) + return formatWithArgumentRanges(self._s[976]!, self._r[976]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[967]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[968]! } - public var BlockedUsers_BlockUser: String { return self._s[969]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[970]! } - public var MediaPicker_UngroupDescription: String { return self._s[971]! } - public var Watch_NoConnection: String { return self._s[972]! } - public var Month_GenSeptember: String { return self._s[973]! } - public var Conversation_ViewGroup: String { return self._s[974]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[977]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[978]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[979]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[980]! } - public var MediaPicker_CameraRoll: String { return self._s[982]! } - public var Month_GenAugust: String { return self._s[983]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[984]! } - public var SharedMedia_EmptyText: String { return self._s[985]! } - public var Map_ShareLiveLocation: String { return self._s[986]! } - public var Calls_All: String { return self._s[987]! } - public var Appearance_ThemeNight: String { return self._s[990]! } - public var Conversation_HoldForAudio: String { return self._s[991]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[994]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[995]! } - public var SocksProxySetup_Secret: String { return self._s[996]! } - public var Channel_BanList_RestrictedTitle: String { return self._s[998]! } - public var Conversation_Location: String { return self._s[999]! } + public var DialogList_NoMessagesTitle: String { return self._s[977]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[978]! } + public var BlockedUsers_BlockUser: String { return self._s[979]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[980]! } + public var MediaPicker_UngroupDescription: String { return self._s[981]! } + public var Watch_NoConnection: String { return self._s[982]! } + public var Month_GenSeptember: String { return self._s[983]! } + public var Conversation_ViewGroup: String { return self._s[984]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[987]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[988]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[989]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[990]! } + public var MediaPicker_CameraRoll: String { return self._s[992]! } + public var Month_GenAugust: String { return self._s[993]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[994]! } + public var SharedMedia_EmptyText: String { return self._s[995]! } + public var Map_ShareLiveLocation: String { return self._s[996]! } + public var Calls_All: String { return self._s[997]! } + public var Appearance_ThemeNight: String { return self._s[1000]! } + public var Conversation_HoldForAudio: String { return self._s[1001]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1004]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1005]! } + public var SocksProxySetup_Secret: String { return self._s[1006]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1008]! } + public var Conversation_Location: String { return self._s[1009]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1000]!, self._r[1000]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1010]!, self._r[1010]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1002]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1003]! } - public var Notifications_PermissionsText: String { return self._s[1004]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1005]! } - public var Call_Flip: String { return self._s[1006]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1007]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1009]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1011]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1013]! } - public var Login_InvalidCodeError: String { return self._s[1014]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1015]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1012]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1013]! } + public var Notifications_PermissionsText: String { return self._s[1014]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1015]! } + public var Call_Flip: String { return self._s[1016]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1017]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1019]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1021]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1023]! } + public var Login_InvalidCodeError: String { return self._s[1024]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1025]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1016]!, self._r[1016]!, [_0]) + return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_0]) + return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_0]) } - public var Call_CallInProgressTitle: String { return self._s[1018]! } - public var Month_ShortSeptember: String { return self._s[1019]! } - public var Watch_ChannelInfo_Title: String { return self._s[1020]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1023]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1024]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1025]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1026]! } - public var PhotoEditor_CropReset: String { return self._s[1027]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1029]! } - public var Channel_Management_LabelEditor: String { return self._s[1030]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1032]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1033]! } - public var UserInfo_Title: String { return self._s[1034]! } - public var ChatList_HideAction: String { return self._s[1035]! } - public var AccessDenied_Title: String { return self._s[1036]! } - public var DialogList_SearchLabel: String { return self._s[1037]! } - public var Group_Setup_HistoryHidden: String { return self._s[1038]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1039]! } - public var State_Updating: String { return self._s[1041]! } - public var Contacts_TabTitle: String { return self._s[1042]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1044]! } - public var GroupInfo_GroupHistory: String { return self._s[1045]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1046]! } - public var Wallpaper_SetColor: String { return self._s[1047]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1048]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1049]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1050]! } - public var Contacts_NotRegisteredSection: String { return self._s[1051]! } + public var Call_CallInProgressTitle: String { return self._s[1028]! } + public var Month_ShortSeptember: String { return self._s[1029]! } + public var Watch_ChannelInfo_Title: String { return self._s[1030]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1033]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1034]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1035]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1036]! } + public var PhotoEditor_CropReset: String { return self._s[1037]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1039]! } + public var Channel_Management_LabelEditor: String { return self._s[1040]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1042]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1043]! } + public var UserInfo_Title: String { return self._s[1044]! } + public var ChatList_HideAction: String { return self._s[1045]! } + public var AccessDenied_Title: String { return self._s[1046]! } + public var DialogList_SearchLabel: String { return self._s[1047]! } + public var Group_Setup_HistoryHidden: String { return self._s[1048]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1049]! } + public var State_Updating: String { return self._s[1051]! } + public var Contacts_TabTitle: String { return self._s[1052]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1054]! } + public var GroupInfo_GroupHistory: String { return self._s[1055]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1056]! } + public var Wallpaper_SetColor: String { return self._s[1057]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1058]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1059]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1060]! } + public var Contacts_NotRegisteredSection: String { return self._s[1061]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1052]!, self._r[1052]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1053]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1054]! } - public var SocksProxySetup_Connecting: String { return self._s[1055]! } - public var ExplicitContent_AlertChannel: String { return self._s[1056]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1057]! } - public var Conversation_Contact: String { return self._s[1058]! } - public var Login_CodeExpired: String { return self._s[1059]! } - public var Passport_DiscardMessageAction: String { return self._s[1060]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1061]! } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1062]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1063]! } - public var Month_ShortApril: String { return self._s[1064]! } - public var AuthSessions_CurrentSession: String { return self._s[1065]! } - public var WallpaperPreview_CropTopText: String { return self._s[1069]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1070]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1071]! } - public var Channel_Setup_TypePrivate: String { return self._s[1073]! } - public var Forward_ChannelReadOnly: String { return self._s[1076]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1077]! } - public var UserInfo_BotPrivacy: String { return self._s[1078]! } - public var Notification_PassportValueEmail: String { return self._s[1079]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1080]! } - public var GroupPermission_NewTitle: String { return self._s[1081]! } - public var CallFeedback_ReasonDropped: String { return self._s[1082]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1083]! } - public var Channel_SignMessages_Help: String { return self._s[1085]! } - public var Undo_ChatDeleted: String { return self._s[1087]! } - public var Conversation_ChatBackground: String { return self._s[1088]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1089]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1090]! } - public var Passport_Language_pt: String { return self._s[1091]! } - public var NotificationsSound_Popcorn: String { return self._s[1094]! } - public var AutoNightTheme_Disabled: String { return self._s[1095]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1096]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1097]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1098]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1099]! } + public var Paint_Clear: String { return self._s[1063]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1064]! } + public var SocksProxySetup_Connecting: String { return self._s[1065]! } + public var ExplicitContent_AlertChannel: String { return self._s[1066]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1067]! } + public var Conversation_Contact: String { return self._s[1068]! } + public var Login_CodeExpired: String { return self._s[1069]! } + public var Passport_DiscardMessageAction: String { return self._s[1070]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1071]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1072]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1073]! } + public var Month_ShortApril: String { return self._s[1074]! } + public var AuthSessions_CurrentSession: String { return self._s[1075]! } + public var WallpaperPreview_CropTopText: String { return self._s[1079]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1080]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1081]! } + public var Channel_Setup_TypePrivate: String { return self._s[1083]! } + public var Forward_ChannelReadOnly: String { return self._s[1086]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1087]! } + public var AddContact_SharedContactException: String { return self._s[1088]! } + public var UserInfo_BotPrivacy: String { return self._s[1089]! } + public var Notification_PassportValueEmail: String { return self._s[1090]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1091]! } + public var GroupPermission_NewTitle: String { return self._s[1092]! } + public var CallFeedback_ReasonDropped: String { return self._s[1093]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1094]! } + public var Channel_SignMessages_Help: String { return self._s[1096]! } + public var Undo_ChatDeleted: String { return self._s[1098]! } + public var Conversation_ChatBackground: String { return self._s[1099]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1100]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1101]! } + public var Passport_Language_pt: String { return self._s[1102]! } + public var NotificationsSound_Popcorn: String { return self._s[1105]! } + public var AutoNightTheme_Disabled: String { return self._s[1106]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1107]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1108]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1109]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1110]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1100]!, self._r[1100]!, [_0]) + return formatWithArgumentRanges(self._s[1111]!, self._r[1111]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1101]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1102]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1104]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1112]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1113]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1115]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1105]!, self._r[1105]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1116]!, self._r[1116]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1108]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1109]! } - public var Compose_NewEncryptedChat: String { return self._s[1110]! } - public var Login_CodeFloodError: String { return self._s[1111]! } - public var Calls_TabTitle: String { return self._s[1112]! } - public var Privacy_ProfilePhoto: String { return self._s[1113]! } - public var Passport_Language_he: String { return self._s[1114]! } - public var GroupPermission_Title: String { return self._s[1115]! } + public var SocksProxySetup_Hostname: String { return self._s[1119]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1120]! } + public var Compose_NewEncryptedChat: String { return self._s[1121]! } + public var Login_CodeFloodError: String { return self._s[1122]! } + public var Calls_TabTitle: String { return self._s[1123]! } + public var Privacy_ProfilePhoto: String { return self._s[1124]! } + public var Passport_Language_he: String { return self._s[1125]! } + public var GroupPermission_Title: String { return self._s[1126]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1116]!, self._r[1116]!, [_0]) + return formatWithArgumentRanges(self._s[1127]!, self._r[1127]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1117]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1118]! } - public var Tour_Text1: String { return self._s[1119]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1120]! } - public var Month_ShortFebruary: String { return self._s[1121]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1122]! } - public var NotificationsSound_Glass: String { return self._s[1123]! } - public var Appearance_ThemeNightBlue: String { return self._s[1124]! } - public var CheckoutInfo_Pay: String { return self._s[1125]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1127]! } - public var Call_CallAgain: String { return self._s[1129]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1130]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1131]! } - public var Passport_InvalidPasswordError: String { return self._s[1132]! } - public var Watch_Message_Game: String { return self._s[1133]! } - public var Stickers_Install: String { return self._s[1134]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1135]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1137]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1138]! } - public var AuthSessions_OtherSessions: String { return self._s[1139]! } - public var Channel_Username_Help: String { return self._s[1140]! } - public var Camera_Title: String { return self._s[1141]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1143]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1144]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1145]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1146]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1147]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1148]! } - public var Conversation_RestrictedStickers: String { return self._s[1149]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1151]! } - public var UserInfo_TelegramCall: String { return self._s[1153]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1154]! } - public var CreatePoll_OptionsHeader: String { return self._s[1155]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1156]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1157]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1158]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1159]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1128]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1129]! } + public var Tour_Text1: String { return self._s[1130]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1131]! } + public var Month_ShortFebruary: String { return self._s[1132]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1133]! } + public var NotificationsSound_Glass: String { return self._s[1134]! } + public var Appearance_ThemeNightBlue: String { return self._s[1135]! } + public var CheckoutInfo_Pay: String { return self._s[1136]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1138]! } + public var Call_CallAgain: String { return self._s[1140]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1141]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1142]! } + public var Passport_InvalidPasswordError: String { return self._s[1143]! } + public var Watch_Message_Game: String { return self._s[1144]! } + public var Stickers_Install: String { return self._s[1145]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1146]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1148]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1149]! } + public var AuthSessions_OtherSessions: String { return self._s[1150]! } + public var Channel_Username_Help: String { return self._s[1151]! } + public var Camera_Title: String { return self._s[1152]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1154]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1155]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1156]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1157]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1158]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1159]! } + public var Conversation_RestrictedStickers: String { return self._s[1160]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1162]! } + public var UserInfo_TelegramCall: String { return self._s[1164]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1165]! } + public var CreatePoll_OptionsHeader: String { return self._s[1166]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1167]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1168]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1169]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1170]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1160]!, self._r[1160]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1171]!, self._r[1171]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1161]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1162]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1163]! } - public var Conversation_MessageDialogRetry: String { return self._s[1164]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1165]! } - public var Group_Setup_TypeHeader: String { return self._s[1166]! } - public var Paint_RecentStickers: String { return self._s[1167]! } - public var PhotoEditor_GrainTool: String { return self._s[1168]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1169]! } - public var EmptyGroupInfo_Line4: String { return self._s[1170]! } - public var Watch_AuthRequired: String { return self._s[1172]! } + public var Settings_SaveEditedPhotos: String { return self._s[1172]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1173]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1174]! } + public var Conversation_MessageDialogRetry: String { return self._s[1175]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1176]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1177]! } + public var Group_Setup_TypeHeader: String { return self._s[1178]! } + public var Paint_RecentStickers: String { return self._s[1179]! } + public var PhotoEditor_GrainTool: String { return self._s[1180]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1181]! } + public var EmptyGroupInfo_Line4: String { return self._s[1182]! } + public var Watch_AuthRequired: String { return self._s[1184]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1173]!, self._r[1173]!, [_0]) + return formatWithArgumentRanges(self._s[1185]!, self._r[1185]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1174]! } - public var ChannelIntro_Text: String { return self._s[1175]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1176]! } - public var GroupPermission_NoSendMedia: String { return self._s[1177]! } - public var Calls_AddTab: String { return self._s[1178]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1179]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1180]! } - public var Notification_MessageLifetime1d: String { return self._s[1181]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1182]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1183]! } - public var Passport_Identity_GenderFemale: String { return self._s[1184]! } - public var BlockedUsers_BlockTitle: String { return self._s[1185]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1186]! } + public var ChannelIntro_Text: String { return self._s[1187]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1188]! } + public var GroupPermission_NoSendMedia: String { return self._s[1189]! } + public var Calls_AddTab: String { return self._s[1190]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1191]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1192]! } + public var Notification_MessageLifetime1d: String { return self._s[1193]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1194]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1195]! } + public var Passport_Identity_GenderFemale: String { return self._s[1196]! } + public var BlockedUsers_BlockTitle: String { return self._s[1197]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1186]!, self._r[1186]!, [_1]) + return formatWithArgumentRanges(self._s[1198]!, self._r[1198]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1187]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1188]! } - public var ChatList_ArchiveAction: String { return self._s[1189]! } - public var AutoNightTheme_Scheduled: String { return self._s[1190]! } + public var Weekday_Yesterday: String { return self._s[1199]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1200]! } + public var ChatList_ArchiveAction: String { return self._s[1201]! } + public var AutoNightTheme_Scheduled: String { return self._s[1202]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1191]!, self._r[1191]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1203]!, self._r[1203]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1192]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1204]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1194]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1195]! } + public var CreatePoll_Create: String { return self._s[1206]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1207]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1196]!, self._r[1196]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1208]!, self._r[1208]!, [_1, _2]) } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1197]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1199]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1209]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1211]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1200]!, self._r[1200]!, [_1]) + return formatWithArgumentRanges(self._s[1212]!, self._r[1212]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1201]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1202]! } + public var Preview_OpenInInstagram: String { return self._s[1213]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1214]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1203]!, self._r[1203]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1215]!, self._r[1215]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1205]! } - public var ArchivedChats_IntroText3: String { return self._s[1206]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1207]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1208]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1209]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1217]! } + public var ArchivedChats_IntroText3: String { return self._s[1218]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1219]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1220]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1221]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1210]!, self._r[1210]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1222]!, self._r[1222]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1212]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1213]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1214]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1215]! } - public var Gif_NoGifsFound: String { return self._s[1216]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1217]! } - public var GroupInfo_ActionPromote: String { return self._s[1218]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1219]! } - public var GroupInfo_Permissions_Title: String { return self._s[1220]! } - public var Permissions_ContactsText_v0: String { return self._s[1221]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1222]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1225]! } - public var Passport_FieldEmailHelp: String { return self._s[1226]! } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1227]! } - public var Weekday_ShortSaturday: String { return self._s[1228]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1229]! } - public var Watch_Conversation_UserInfo: String { return self._s[1230]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1231]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1232]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1233]! } - public var PhotoEditor_VignetteTool: String { return self._s[1234]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1235]! } - public var Passport_Language_et: String { return self._s[1236]! } - public var AppUpgrade_Running: String { return self._s[1237]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1239]! } - public var Passport_Language_bg: String { return self._s[1240]! } - public var Stickers_NoStickersFound: String { return self._s[1242]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1224]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1225]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1226]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1227]! } + public var Gif_NoGifsFound: String { return self._s[1228]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1229]! } + public var GroupInfo_ActionPromote: String { return self._s[1230]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1231]! } + public var GroupInfo_Permissions_Title: String { return self._s[1232]! } + public var Permissions_ContactsText_v0: String { return self._s[1233]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1234]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1237]! } + public var Passport_FieldEmailHelp: String { return self._s[1238]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1239]! } + public var Weekday_ShortSaturday: String { return self._s[1240]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1241]! } + public var Watch_Conversation_UserInfo: String { return self._s[1242]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1243]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1244]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1245]! } + public var PhotoEditor_VignetteTool: String { return self._s[1246]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1247]! } + public var Passport_Language_et: String { return self._s[1248]! } + public var AppUpgrade_Running: String { return self._s[1249]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1251]! } + public var Passport_Language_bg: String { return self._s[1252]! } + public var Stickers_NoStickersFound: String { return self._s[1254]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1244]!, self._r[1244]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1256]!, self._r[1256]!, [_1, _2]) } - public var Settings_About: String { return self._s[1245]! } + public var Settings_About: String { return self._s[1257]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1246]!, self._r[1246]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1258]!, self._r[1258]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1248]! } - public var Group_ErrorAddBlocked: String { return self._s[1249]! } + public var KeyCommand_NewMessage: String { return self._s[1260]! } + public var Group_ErrorAddBlocked: String { return self._s[1261]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1250]!, self._r[1250]!, [_0]) + return formatWithArgumentRanges(self._s[1262]!, self._r[1262]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1251]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1252]! } - public var Cache_ClearProgress: String { return self._s[1253]! } + public var Map_LocationTitle: String { return self._s[1263]! } + public var ReportGroupLocation_Title: String { return self._s[1264]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1265]! } + public var Cache_ClearProgress: String { return self._s[1266]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1254]!, self._r[1254]!, [_0]) - } - public var GroupRemoved_AddToGroup: String { return self._s[1255]! } - public var Passport_UpdateRequiredError: String { return self._s[1256]! } - public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1257]!, self._r[1257]!, [_1]) - } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1259]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1260]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1261]! } - public var Passport_Language_ka: String { return self._s[1262]! } - public var Call_Decline: String { return self._s[1263]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1264]! } - public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1268]! } + public var GroupRemoved_AddToGroup: String { return self._s[1268]! } + public var Passport_UpdateRequiredError: String { return self._s[1269]! } + public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_1]) + } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1272]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1273]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1274]! } + public var Passport_Language_ka: String { return self._s[1275]! } + public var Call_Decline: String { return self._s[1276]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1277]! } + public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_0]) + } + public var CallFeedback_Send: String { return self._s[1281]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1269]!, self._r[1269]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1270]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1272]! } - public var Passport_DeletePassport: String { return self._s[1273]! } - public var Appearance_AppIconFilled: String { return self._s[1274]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1275]! } - public var Month_ShortDecember: String { return self._s[1276]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1278]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1283]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1285]! } + public var Passport_DeletePassport: String { return self._s[1286]! } + public var Appearance_AppIconFilled: String { return self._s[1287]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1288]! } + public var Month_ShortDecember: String { return self._s[1289]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1291]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1279]!, self._r[1279]!, [_0]) + return formatWithArgumentRanges(self._s[1292]!, self._r[1292]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1280]! } - public var Conversation_EncryptedDescription1: String { return self._s[1281]! } - public var Conversation_EncryptedDescription2: String { return self._s[1282]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1283]! } - public var Conversation_EncryptedDescription3: String { return self._s[1284]! } - public var PhotoEditor_SharpenTool: String { return self._s[1285]! } + public var Channel_Stickers_Searching: String { return self._s[1293]! } + public var Conversation_EncryptedDescription1: String { return self._s[1294]! } + public var Conversation_EncryptedDescription2: String { return self._s[1295]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1296]! } + public var Conversation_EncryptedDescription3: String { return self._s[1297]! } + public var PhotoEditor_SharpenTool: String { return self._s[1298]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1286]!, self._r[1286]!, [_0]) + return formatWithArgumentRanges(self._s[1299]!, self._r[1299]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1288]! } - public var Channel_Members_AddMembers: String { return self._s[1289]! } - public var Wallpaper_Search: String { return self._s[1290]! } - public var Weekday_Friday: String { return self._s[1291]! } - public var Privacy_ContactsSync: String { return self._s[1292]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1293]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1294]! } + public var Conversation_EncryptedDescription4: String { return self._s[1301]! } + public var Channel_Members_AddMembers: String { return self._s[1302]! } + public var Wallpaper_Search: String { return self._s[1303]! } + public var Weekday_Friday: String { return self._s[1304]! } + public var Privacy_ContactsSync: String { return self._s[1305]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1306]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1307]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1295]!, self._r[1295]!, [_0]) + return formatWithArgumentRanges(self._s[1308]!, self._r[1308]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1296]! } - public var Passport_Identity_GenderMale: String { return self._s[1297]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1309]! } + public var Passport_Identity_GenderMale: String { return self._s[1310]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1298]!, self._r[1298]!, [_0]) + return formatWithArgumentRanges(self._s[1311]!, self._r[1311]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1299]! } - public var Conversation_JumpToDate: String { return self._s[1300]! } - public var Contacts_GlobalSearch: String { return self._s[1301]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1302]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1303]! } - public var Profile_MessageLifetime1d: String { return self._s[1304]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1312]! } + public var Conversation_JumpToDate: String { return self._s[1313]! } + public var Contacts_GlobalSearch: String { return self._s[1314]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1315]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1316]! } + public var Profile_MessageLifetime1d: String { return self._s[1317]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1305]!, self._r[1305]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1318]!, self._r[1318]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1308]! } + public var StickerPack_BuiltinPackName: String { return self._s[1321]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1309]!, self._r[1309]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1322]!, self._r[1322]!, [_1, _2]) } - public var Passport_InfoTitle: String { return self._s[1311]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1312]! } + public var Passport_InfoTitle: String { return self._s[1324]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1325]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1316]!, self._r[1316]!, [_0]) + return formatWithArgumentRanges(self._s[1329]!, self._r[1329]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1317]!, self._r[1317]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1318]! } - public var Profile_BotInfo: String { return self._s[1319]! } - public var Watch_Compose_CreateMessage: String { return self._s[1320]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1321]! } - public var Month_ShortNovember: String { return self._s[1322]! } - public var Conversation_ScamWarning: String { return self._s[1323]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1324]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1325]! } - public var NotificationsSound_Chime: String { return self._s[1326]! } - public var Passport_Language_ko: String { return self._s[1328]! } - public var InviteText_URL: String { return self._s[1329]! } - public var TextFormat_Monospace: String { return self._s[1330]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1331]! } + public var Profile_BotInfo: String { return self._s[1332]! } + public var Watch_Compose_CreateMessage: String { return self._s[1333]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1334]! } + public var Month_ShortNovember: String { return self._s[1335]! } + public var Conversation_ScamWarning: String { return self._s[1336]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1337]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1338]! } + public var NotificationsSound_Chime: String { return self._s[1339]! } + public var Passport_Language_ko: String { return self._s[1341]! } + public var InviteText_URL: String { return self._s[1342]! } + public var TextFormat_Monospace: String { return self._s[1343]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_0]) + return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1346]!, self._r[1346]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1335]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1336]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1337]! } - public var Your_card_has_expired: String { return self._s[1338]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1339]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1340]! } - public var Conversation_Report: String { return self._s[1344]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1345]! } - public var Notification_MessageLifetime1m: String { return self._s[1346]! } - public var Privacy_ContactsTitle: String { return self._s[1347]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1348]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1349]! } - public var Channel_Members_Title: String { return self._s[1350]! } - public var Map_OpenInWaze: String { return self._s[1351]! } - public var Login_PhoneBannedError: String { return self._s[1352]! } + public var Passport_InfoLearnMore: String { return self._s[1348]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1349]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1350]! } + public var Your_card_has_expired: String { return self._s[1351]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1352]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1353]! } + public var Conversation_Report: String { return self._s[1357]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1358]! } + public var Notification_MessageLifetime1m: String { return self._s[1359]! } + public var Privacy_ContactsTitle: String { return self._s[1360]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1361]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1362]! } + public var Channel_Members_Title: String { return self._s[1363]! } + public var Map_OpenInWaze: String { return self._s[1364]! } + public var Login_PhoneBannedError: String { return self._s[1365]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1353]!, self._r[1353]!, [_0]) + return formatWithArgumentRanges(self._s[1366]!, self._r[1366]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1354]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1355]! } - public var Common_OK: String { return self._s[1356]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1357]! } - public var Cache_Music: String { return self._s[1358]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1359]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1360]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1361]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1367]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1368]! } + public var Common_OK: String { return self._s[1369]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1370]! } + public var Cache_Music: String { return self._s[1371]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1372]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1373]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1374]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_1]) + return formatWithArgumentRanges(self._s[1375]!, self._r[1375]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1363]!, self._r[1363]!, [_0]) + return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1365]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1366]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1368]! } - public var State_ConnectingToProxyInfo: String { return self._s[1369]! } - public var Message_VideoMessage: String { return self._s[1371]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1372]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1373]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1374]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1375]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1376]! } - public var Activity_RecordingAudio: String { return self._s[1377]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1378]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1379]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1378]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1379]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1381]! } + public var State_ConnectingToProxyInfo: String { return self._s[1382]! } + public var Message_VideoMessage: String { return self._s[1384]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1385]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1386]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1387]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1388]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1389]! } + public var Activity_RecordingAudio: String { return self._s[1390]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1391]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1392]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1381]!, self._r[1381]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_0]) + return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1386]! } - public var UserInfo_AddPhone: String { return self._s[1387]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1388]! } + public var Conversation_ApplyLocalization: String { return self._s[1399]! } + public var UserInfo_AddPhone: String { return self._s[1400]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1401]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1389]!, self._r[1389]!, [_0]) + return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_0]) } - public var Passport_Scans: String { return self._s[1391]! } - public var BlockedUsers_Unblock: String { return self._s[1392]! } + public var Passport_Scans: String { return self._s[1404]! } + public var BlockedUsers_Unblock: String { return self._s[1405]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1393]!, self._r[1393]!, [_1]) + return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1394]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1395]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1396]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1397]! } + public var Channel_Management_LabelCreator: String { return self._s[1407]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1408]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1409]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1410]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1411]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1412]!, self._r[1412]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1399]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1400]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1401]! } - public var ChannelIntro_CreateChannel: String { return self._s[1402]! } - public var Conversation_UnreadMessages: String { return self._s[1403]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1404]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1405]! } - public var Notification_GroupActivated: String { return self._s[1406]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1407]! } + public var Login_PhoneNumberHelp: String { return self._s[1413]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1414]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1415]! } + public var ChannelIntro_CreateChannel: String { return self._s[1416]! } + public var Conversation_UnreadMessages: String { return self._s[1417]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1418]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1419]! } + public var Notification_GroupActivated: String { return self._s[1420]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1421]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_0]) + return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1409]!, self._r[1409]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1411]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1425]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1412]!, self._r[1412]!, [_0]) + return formatWithArgumentRanges(self._s[1426]!, self._r[1426]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1413]! } - public var CallFeedback_AddComment: String { return self._s[1414]! } + public var Undo_DeletedChannel: String { return self._s[1427]! } + public var CallFeedback_AddComment: String { return self._s[1428]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1415]!, self._r[1415]!, [_0]) + return formatWithArgumentRanges(self._s[1429]!, self._r[1429]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1416]! } + public var Document_TargetConfirmationFormat: String { return self._s[1430]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_0]) + return formatWithArgumentRanges(self._s[1431]!, self._r[1431]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1418]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1432]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1433]!, self._r[1433]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1420]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1421]! } + public var Contacts_SortByName: String { return self._s[1434]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1435]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1437]!, self._r[1437]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1424]! } - public var Conversation_ClearSelfHistory: String { return self._s[1425]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1426]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1427]! } - public var Stickers_SuggestNone: String { return self._s[1428]! } - public var ChatSettings_Cache: String { return self._s[1429]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1430]! } - public var Media_ShareThisPhoto: String { return self._s[1431]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1432]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1433]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1434]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1435]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1436]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1437]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1439]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1440]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1441]! } - public var Map_OpenIn: String { return self._s[1442]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1438]! } + public var Conversation_ClearSelfHistory: String { return self._s[1439]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1440]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1441]! } + public var Stickers_SuggestNone: String { return self._s[1442]! } + public var ChatSettings_Cache: String { return self._s[1443]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1444]! } + public var Media_ShareThisPhoto: String { return self._s[1445]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1446]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1447]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1448]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1449]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1450]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1451]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1453]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1454]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1455]! } + public var Map_OpenIn: String { return self._s[1456]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_1]) + return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1446]!, self._r[1446]!, [_0]) + return formatWithArgumentRanges(self._s[1460]!, self._r[1460]!, [_0]) } - public var MessagePoll_LabelClosed: String { return self._s[1447]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1449]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1450]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1451]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1452]! } - public var Login_SelectCountry_Title: String { return self._s[1453]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1454]! } + public var MessagePoll_LabelClosed: String { return self._s[1461]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1463]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1464]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1465]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1466]! } + public var Login_SelectCountry_Title: String { return self._s[1467]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1468]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1455]!, self._r[1455]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1469]!, self._r[1469]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1456]! } - public var Watch_Suggestion_BRB: String { return self._s[1457]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1458]! } - public var Contacts_PermissionsTitle: String { return self._s[1459]! } - public var Conversation_RestrictedInline: String { return self._s[1460]! } - public var StickerPack_ViewPack: String { return self._s[1462]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1470]! } + public var Watch_Suggestion_BRB: String { return self._s[1471]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1472]! } + public var Contacts_PermissionsTitle: String { return self._s[1473]! } + public var Conversation_RestrictedInline: String { return self._s[1474]! } + public var StickerPack_ViewPack: String { return self._s[1476]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1463]!, self._r[1463]!, [_0]) + return formatWithArgumentRanges(self._s[1477]!, self._r[1477]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1465]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1468]! } - public var Channel_Info_Stickers: String { return self._s[1470]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1471]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1472]! } - public var Passport_DeletePersonalDetails: String { return self._s[1473]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1474]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1475]! } - public var Conversation_SearchNoResults: String { return self._s[1477]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1478]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1479]! } - public var Login_Code: String { return self._s[1480]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1481]! } - public var Weekday_ShortThursday: String { return self._s[1482]! } - public var Resolve_ErrorNotFound: String { return self._s[1484]! } - public var LastSeen_Offline: String { return self._s[1485]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1486]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1487]! } - public var GroupInfo_Title: String { return self._s[1488]! } - public var NotificationsSound_Note: String { return self._s[1489]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1490]! } - public var Watch_Message_Poll: String { return self._s[1491]! } - public var Privacy_Calls: String { return self._s[1492]! } - public var Month_ShortAugust: String { return self._s[1493]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1494]! } - public var Notifications_Reset: String { return self._s[1495]! } - public var Conversation_Pin: String { return self._s[1496]! } - public var Passport_Language_lv: String { return self._s[1497]! } - public var BlockedUsers_Info: String { return self._s[1498]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1500]! } - public var Watch_Conversation_Unblock: String { return self._s[1502]! } + public var Compose_NewChannel: String { return self._s[1479]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1482]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1484]! } + public var Channel_Info_Stickers: String { return self._s[1485]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1486]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1487]! } + public var Passport_DeletePersonalDetails: String { return self._s[1488]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1489]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1490]! } + public var Conversation_SearchNoResults: String { return self._s[1492]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1493]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1494]! } + public var Login_Code: String { return self._s[1495]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1496]! } + public var Weekday_ShortThursday: String { return self._s[1497]! } + public var Resolve_ErrorNotFound: String { return self._s[1499]! } + public var LastSeen_Offline: String { return self._s[1500]! } + public var PeopleNearby_NoMembers: String { return self._s[1501]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1502]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1503]! } + public var GroupInfo_Title: String { return self._s[1504]! } + public var NotificationsSound_Note: String { return self._s[1505]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1506]! } + public var Watch_Message_Poll: String { return self._s[1507]! } + public var Privacy_Calls: String { return self._s[1508]! } + public var Month_ShortAugust: String { return self._s[1509]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1510]! } + public var Notifications_Reset: String { return self._s[1511]! } + public var Conversation_Pin: String { return self._s[1512]! } + public var Passport_Language_lv: String { return self._s[1513]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1514]! } + public var BlockedUsers_Info: String { return self._s[1515]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1517]! } + public var Watch_Conversation_Unblock: String { return self._s[1519]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1503]!, self._r[1503]!, [_0]) + return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1504]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1505]! } + public var CloudStorage_Title: String { return self._s[1521]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1522]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1506]!, self._r[1506]!, [_0]) + return formatWithArgumentRanges(self._s[1523]!, self._r[1523]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1507]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1508]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1509]! } - public var Passport_Address_EditBankStatement: String { return self._s[1510]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1524]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1525]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1526]! } + public var Passport_Address_EditBankStatement: String { return self._s[1527]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1528]!, self._r[1528]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1512]! } - public var ShareMenu_Comment: String { return self._s[1513]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1514]! } - public var Notifications_PermissionsTitle: String { return self._s[1515]! } - public var GroupPermission_NoSendLinks: String { return self._s[1516]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1517]! } - public var Settings_Support: String { return self._s[1518]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1519]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1520]! } - public var Privacy_Forwards_Preview: String { return self._s[1521]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1522]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1523]! } - public var Common_Select: String { return self._s[1525]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1526]! } - public var WallpaperSearch_ColorGray: String { return self._s[1528]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1529]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1530]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1531]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1532]! } - public var Widget_AuthRequired: String { return self._s[1533]! } - public var Camera_FlashOn: String { return self._s[1534]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1535]! } - public var Watch_Suggestion_OK: String { return self._s[1536]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1529]! } + public var ShareMenu_Comment: String { return self._s[1530]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1531]! } + public var Notifications_PermissionsTitle: String { return self._s[1532]! } + public var GroupPermission_NoSendLinks: String { return self._s[1533]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1534]! } + public var Settings_Support: String { return self._s[1535]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1536]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1537]! } + public var Privacy_Forwards_Preview: String { return self._s[1538]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1539]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1540]! } + public var Common_Select: String { return self._s[1542]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1543]! } + public var WallpaperSearch_ColorGray: String { return self._s[1545]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1546]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1547]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1548]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1549]! } + public var Widget_AuthRequired: String { return self._s[1550]! } + public var Camera_FlashOn: String { return self._s[1551]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1552]! } + public var Watch_Suggestion_OK: String { return self._s[1553]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1538]!, self._r[1538]!, [_0]) + return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_0]) + return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_0]) } - public var DialogList_AdLabel: String { return self._s[1541]! } - public var WatchRemote_NotificationText: String { return self._s[1542]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1543]! } - public var Conversation_ReportSpam: String { return self._s[1544]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1545]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1547]! } - public var PhoneLabel_Title: String { return self._s[1548]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1549]! } - public var Settings_ChangePhoneNumber: String { return self._s[1550]! } - public func AddContact_ContactWillBeSharedNow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_0]) - } - public var Notifications_ExceptionsTitle: String { return self._s[1552]! } - public var Notifications_AlertTones: String { return self._s[1553]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1554]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1555]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1556]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1558]! } - public var ReportPeer_ReasonOther: String { return self._s[1559]! } - public var KeyCommand_ScrollDown: String { return self._s[1561]! } + public var DialogList_AdLabel: String { return self._s[1558]! } + public var WatchRemote_NotificationText: String { return self._s[1559]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1560]! } + public var Conversation_ReportSpam: String { return self._s[1561]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1562]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1564]! } + public var PhoneLabel_Title: String { return self._s[1565]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1566]! } + public var Settings_ChangePhoneNumber: String { return self._s[1567]! } + public var Notifications_ExceptionsTitle: String { return self._s[1568]! } + public var Notifications_AlertTones: String { return self._s[1569]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1570]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1571]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1572]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1574]! } + public var ReportPeer_ReasonOther: String { return self._s[1575]! } + public var KeyCommand_ScrollDown: String { return self._s[1577]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1562]!, self._r[1562]!, [_0]) + return formatWithArgumentRanges(self._s[1578]!, self._r[1578]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1563]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1564]! } - public var AuthSessions_LogOut: String { return self._s[1565]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1566]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1567]! } - public var Passport_Phone_Title: String { return self._s[1568]! } - public var Settings_PhoneNumber: String { return self._s[1569]! } - public var NotificationsSound_Alert: String { return self._s[1570]! } - public var WebSearch_SearchNoResults: String { return self._s[1571]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1573]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1574]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1575]! } - public var PhotoEditor_CurvesTool: String { return self._s[1576]! } - public var Checkout_PaymentMethod: String { return self._s[1578]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1579]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1580]! } + public var AuthSessions_LogOut: String { return self._s[1581]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1582]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1583]! } + public var Passport_Phone_Title: String { return self._s[1584]! } + public var Settings_PhoneNumber: String { return self._s[1585]! } + public var NotificationsSound_Alert: String { return self._s[1586]! } + public var WebSearch_SearchNoResults: String { return self._s[1587]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1589]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1590]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1591]! } + public var PhotoEditor_CurvesTool: String { return self._s[1592]! } + public var Checkout_PaymentMethod: String { return self._s[1594]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1579]!, self._r[1579]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1595]!, self._r[1595]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1580]! } - public var Camera_PhotoMode: String { return self._s[1583]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1584]! } - public var CallSettings_OnMobile: String { return self._s[1585]! } - public var Tour_Text2: String { return self._s[1586]! } + public var Contacts_AccessDeniedError: String { return self._s[1596]! } + public var Camera_PhotoMode: String { return self._s[1599]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1600]! } + public var CallSettings_OnMobile: String { return self._s[1601]! } + public var Tour_Text2: String { return self._s[1602]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1587]!, self._r[1587]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1589]! } - public var Permissions_Skip: String { return self._s[1590]! } - public var SecretImage_Title: String { return self._s[1591]! } - public var Watch_MessageView_Title: String { return self._s[1592]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1593]! } - public var AttachmentMenu_Poll: String { return self._s[1594]! } + public var DialogList_EncryptionProcessing: String { return self._s[1605]! } + public var Permissions_Skip: String { return self._s[1606]! } + public var SecretImage_Title: String { return self._s[1607]! } + public var Watch_MessageView_Title: String { return self._s[1608]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1609]! } + public var AttachmentMenu_Poll: String { return self._s[1610]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1595]!, self._r[1595]!, [_0]) + return formatWithArgumentRanges(self._s[1611]!, self._r[1611]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1596]!, self._r[1596]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1597]! } - public var WallpaperPreview_Title: String { return self._s[1598]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1599]! } - public var Settings_ProxyConnecting: String { return self._s[1600]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1602]! } - public var Profile_MessageLifetime5s: String { return self._s[1603]! } - public var Username_InvalidCharacters: String { return self._s[1604]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1605]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1606]! } - public var Settings_AddAccount: String { return self._s[1607]! } - public var Notification_CreatedChannel: String { return self._s[1610]! } + public var Notification_CallCanceled: String { return self._s[1613]! } + public var WallpaperPreview_Title: String { return self._s[1614]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1615]! } + public var Settings_ProxyConnecting: String { return self._s[1616]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1618]! } + public var Profile_MessageLifetime5s: String { return self._s[1619]! } + public var Username_InvalidCharacters: String { return self._s[1620]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1621]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1622]! } + public var Settings_AddAccount: String { return self._s[1623]! } + public var Notification_CreatedChannel: String { return self._s[1626]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1611]!, self._r[1611]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1627]!, self._r[1627]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1613]! } - public var Contacts_TopSection: String { return self._s[1614]! } + public var Passcode_AppLockedAlert: String { return self._s[1629]! } + public var Contacts_TopSection: String { return self._s[1630]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1615]!, self._r[1615]!, [_0]) + return formatWithArgumentRanges(self._s[1631]!, self._r[1631]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1616]! } - public var UserInfo_TapToCall: String { return self._s[1617]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1619]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1620]! } - public var Common_Search: String { return self._s[1621]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1622]! } - public var Message_InvoiceLabel: String { return self._s[1623]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1624]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1625]! } + public var ReportPeer_ReasonSpam: String { return self._s[1632]! } + public var UserInfo_TapToCall: String { return self._s[1633]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1635]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1636]! } + public var Common_Search: String { return self._s[1637]! } + public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1638]!, self._r[1638]!, [_0]) + } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1639]! } + public var Message_InvoiceLabel: String { return self._s[1640]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1641]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1642]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1626]!, self._r[1626]!, [_0]) + return formatWithArgumentRanges(self._s[1643]!, self._r[1643]!, [_0]) } - public var Conversation_Info: String { return self._s[1627]! } - public var Login_InfoDeletePhoto: String { return self._s[1628]! } - public var Passport_Language_vi: String { return self._s[1630]! } - public var UserInfo_ScamUserWarning: String { return self._s[1631]! } - public var Conversation_Search: String { return self._s[1632]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1633]! } - public var ReportPeer_ReasonPornography: String { return self._s[1634]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1635]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1636]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1637]! } - public var Channel_Setup_TypeHeader: String { return self._s[1638]! } - public var AuthSessions_LoggedIn: String { return self._s[1639]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1640]! } - public var Login_SmsRequestState3: String { return self._s[1641]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1642]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1643]! } - public var Channel_Edit_LinkItem: String { return self._s[1644]! } - public var Privacy_Calls_P2PNever: String { return self._s[1645]! } - public var Conversation_AddToReadingList: String { return self._s[1647]! } - public var Message_Animation: String { return self._s[1648]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1649]! } - public var Map_Unknown: String { return self._s[1650]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1651]! } + public var Conversation_Info: String { return self._s[1644]! } + public var Login_InfoDeletePhoto: String { return self._s[1645]! } + public var Passport_Language_vi: String { return self._s[1647]! } + public var UserInfo_ScamUserWarning: String { return self._s[1648]! } + public var Conversation_Search: String { return self._s[1649]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1650]! } + public var ReportPeer_ReasonPornography: String { return self._s[1651]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1652]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1653]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1654]! } + public var Channel_Setup_TypeHeader: String { return self._s[1655]! } + public var AuthSessions_LoggedIn: String { return self._s[1656]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1657]! } + public var Login_SmsRequestState3: String { return self._s[1658]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1659]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1660]! } + public var Channel_Edit_LinkItem: String { return self._s[1661]! } + public var Privacy_Calls_P2PNever: String { return self._s[1662]! } + public var Conversation_AddToReadingList: String { return self._s[1664]! } + public var Message_Animation: String { return self._s[1665]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1666]! } + public var Map_Unknown: String { return self._s[1667]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1668]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1652]!, self._r[1652]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1669]!, self._r[1669]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1653]!, self._r[1653]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1670]!, self._r[1670]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1654]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1655]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1656]! } + public var Call_StatusRequesting: String { return self._s[1671]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1672]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1673]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1657]!, self._r[1657]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1658]!, self._r[1658]!, [_0]) + return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_0]) } - public var Update_Skip: String { return self._s[1659]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1660]! } - public var Message_PinnedPollMessage: String { return self._s[1661]! } - public var BlockedUsers_Title: String { return self._s[1662]! } + public var Update_Skip: String { return self._s[1676]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1677]! } + public var Message_PinnedPollMessage: String { return self._s[1678]! } + public var BlockedUsers_Title: String { return self._s[1679]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_1]) + return formatWithArgumentRanges(self._s[1680]!, self._r[1680]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1664]! } - public var NotificationsSound_Bell: String { return self._s[1665]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1666]! } - public var Weekday_Monday: String { return self._s[1667]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1668]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1669]! } - public var ChatSettings_Groups: String { return self._s[1670]! } - public var Your_card_was_declined: String { return self._s[1671]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1673]! } - public var ChatList_Unmute: String { return self._s[1674]! } - public var PhotoEditor_CurvesAll: String { return self._s[1675]! } - public var Weekday_ShortTuesday: String { return self._s[1676]! } - public var DialogList_Read: String { return self._s[1677]! } - public var Appearance_AppIconClassic: String { return self._s[1678]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1679]! } - public var Passport_Identity_Gender: String { return self._s[1680]! } + public var Username_CheckingUsername: String { return self._s[1681]! } + public var NotificationsSound_Bell: String { return self._s[1682]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1683]! } + public var Weekday_Monday: String { return self._s[1684]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1685]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1686]! } + public var ChatSettings_Groups: String { return self._s[1687]! } + public var Your_card_was_declined: String { return self._s[1688]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1690]! } + public var ChatList_Unmute: String { return self._s[1691]! } + public var PhotoEditor_CurvesAll: String { return self._s[1692]! } + public var Weekday_ShortTuesday: String { return self._s[1693]! } + public var DialogList_Read: String { return self._s[1694]! } + public var Appearance_AppIconClassic: String { return self._s[1695]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1696]! } + public var Passport_Identity_Gender: String { return self._s[1697]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1681]!, self._r[1681]!, [_0]) + return formatWithArgumentRanges(self._s[1698]!, self._r[1698]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1682]! } + public var Target_SelectGroup: String { return self._s[1699]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_0]) + return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_0]) } - public var Passport_Language_en: String { return self._s[1685]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1686]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1687]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1688]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1690]! } - public var Login_InfoHelp: String { return self._s[1691]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1692]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1693]! } + public var Passport_Language_en: String { return self._s[1702]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1703]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1704]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1705]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1707]! } + public var Login_InfoHelp: String { return self._s[1708]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1709]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1710]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1694]!, self._r[1694]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1711]!, self._r[1711]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1697]! } - public var CreatePoll_Title: String { return self._s[1698]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1699]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1700]! } - public var UserInfo_GroupsInCommon: String { return self._s[1701]! } - public var Call_AudioRouteHide: String { return self._s[1702]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1704]! } + public var SocksProxySetup_AddProxy: String { return self._s[1714]! } + public var CreatePoll_Title: String { return self._s[1715]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1716]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1717]! } + public var UserInfo_GroupsInCommon: String { return self._s[1718]! } + public var Call_AudioRouteHide: String { return self._s[1719]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1721]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_0]) + return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1706]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1707]! } - public var Notifications_Title: String { return self._s[1708]! } - public var Group_Username_InvalidTooShort: String { return self._s[1709]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1710]! } + public var TextFormat_Bold: String { return self._s[1723]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1724]! } + public var Notifications_Title: String { return self._s[1725]! } + public var Group_Username_InvalidTooShort: String { return self._s[1726]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1727]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1711]!, self._r[1711]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, ["\(_0)"]) } - public var Stickers_SuggestAdded: String { return self._s[1713]! } - public var Login_CountryCode: String { return self._s[1714]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1715]! } - public var Map_GetDirections: String { return self._s[1716]! } - public var Login_PhoneFloodError: String { return self._s[1717]! } + public var Stickers_SuggestAdded: String { return self._s[1730]! } + public var Login_CountryCode: String { return self._s[1731]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1732]! } + public var Map_GetDirections: String { return self._s[1733]! } + public var Login_PhoneFloodError: String { return self._s[1734]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1718]!, self._r[1718]!, [_0]) + return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1720]! } - public var Notification_GroupInviterSelf: String { return self._s[1721]! } - public var InstantPage_TapToOpenLink: String { return self._s[1722]! } + public var Settings_SetUsername: String { return self._s[1737]! } + public var Group_Location_ChangeLocation: String { return self._s[1738]! } + public var Notification_GroupInviterSelf: String { return self._s[1739]! } + public var InstantPage_TapToOpenLink: String { return self._s[1740]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1723]!, self._r[1723]!, [_0]) + return formatWithArgumentRanges(self._s[1741]!, self._r[1741]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1724]! } - public var SecretChat_Title: String { return self._s[1725]! } - public var Group_UpgradeNoticeText1: String { return self._s[1726]! } - public var AuthSessions_Title: String { return self._s[1727]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1742]! } + public var SecretChat_Title: String { return self._s[1743]! } + public var Group_UpgradeNoticeText1: String { return self._s[1744]! } + public var AuthSessions_Title: String { return self._s[1745]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, [_0]) + return formatWithArgumentRanges(self._s[1746]!, self._r[1746]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1729]! } - public var Channel_About_Title: String { return self._s[1730]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1731]! } + public var PhotoEditor_CropAuto: String { return self._s[1747]! } + public var Channel_About_Title: String { return self._s[1748]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1749]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1733]!, self._r[1733]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1751]!, self._r[1751]!, ["\(_0)"]) } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1735]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1736]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1753]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1754]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1737]!, self._r[1737]!, [_1]) + return formatWithArgumentRanges(self._s[1755]!, self._r[1755]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0]) - } - public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1740]!, self._r[1740]!, [_0]) - } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1741]! } - public var Presence_online: String { return self._s[1743]! } - public var PasscodeSettings_Title: String { return self._s[1744]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1745]! } - public var Web_OpenExternal: String { return self._s[1746]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1748]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1749]! } - public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1750]!, self._r[1750]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1751]! } - public var Map_YouAreHere: String { return self._s[1752]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1753]!, self._r[1753]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1754]!, self._r[1754]!, [_0]) - } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1755]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1756]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1757]!, self._r[1757]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1758]!, self._r[1758]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1759]! } - public var Bot_Start: String { return self._s[1760]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1759]! } + public var Presence_online: String { return self._s[1761]! } + public var PasscodeSettings_Title: String { return self._s[1762]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1763]! } + public var Web_OpenExternal: String { return self._s[1764]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1766]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1767]! } + public var LocalGroup_Title: String { return self._s[1768]! } + public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1769]!, self._r[1769]!, [_0]) + } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1770]! } + public var Map_YouAreHere: String { return self._s[1771]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_0]) + } + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_0]) + } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1774]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1775]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1776]!, self._r[1776]!, [_0]) + } + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_0]) + } + public var SocksProxySetup_Username: String { return self._s[1778]! } + public var Bot_Start: String { return self._s[1779]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1761]!, self._r[1761]!, [_0]) + return formatWithArgumentRanges(self._s[1780]!, self._r[1780]!, [_0]) } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1762]!, self._r[1762]!, [_0]) + return formatWithArgumentRanges(self._s[1781]!, self._r[1781]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1763]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1765]! } + public var Contacts_SortByPresence: String { return self._s[1782]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1784]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1766]!, self._r[1766]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1785]!, self._r[1785]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1767]!, self._r[1767]!, [_0]) + return formatWithArgumentRanges(self._s[1786]!, self._r[1786]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1787]!, self._r[1787]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1769]! } - public var Login_InfoAvatarPhoto: String { return self._s[1770]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1771]! } - public var Tour_Title4: String { return self._s[1772]! } - public var Passport_Identity_Translation: String { return self._s[1773]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1774]! } - public var Login_TermsOfServiceLabel: String { return self._s[1776]! } - public var Passport_Language_it: String { return self._s[1777]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1778]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1779]! } - public var Conversation_ClearAll: String { return self._s[1781]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1783]! } - public var TwoStepAuth_FloodError: String { return self._s[1784]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1788]! } + public var Login_InfoAvatarPhoto: String { return self._s[1789]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1790]! } + public var Tour_Title4: String { return self._s[1791]! } + public var Passport_Identity_Translation: String { return self._s[1792]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1793]! } + public var Login_TermsOfServiceLabel: String { return self._s[1795]! } + public var Passport_Language_it: String { return self._s[1796]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1797]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1798]! } + public var Conversation_ClearAll: String { return self._s[1800]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1802]! } + public var TwoStepAuth_FloodError: String { return self._s[1803]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1785]!, self._r[1785]!, [_1]) + return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_1]) } - public var Paint_Delete: String { return self._s[1786]! } - public var Privacy_AddNewPeer: String { return self._s[1787]! } - public var LogoutOptions_SetPasscodeText: String { return self._s[1788]! } + public var Paint_Delete: String { return self._s[1805]! } + public var Privacy_AddNewPeer: String { return self._s[1806]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1807]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1789]!, self._r[1789]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1808]!, self._r[1808]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1790]! } + public var Message_PinnedAudioMessage: String { return self._s[1809]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1791]!, self._r[1791]!, [_0]) + return formatWithArgumentRanges(self._s[1810]!, self._r[1810]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1792]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1793]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1794]! } - public var Conversation_MessageEditedLabel: String { return self._s[1795]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1796]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1797]! } + public var Notification_Mute1hMin: String { return self._s[1811]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1812]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1813]! } + public var Conversation_MessageEditedLabel: String { return self._s[1814]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1815]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1816]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1817]!, self._r[1817]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1799]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1818]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_1]) + return formatWithArgumentRanges(self._s[1819]!, self._r[1819]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1801]! } - public var Month_GenOctober: String { return self._s[1802]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1803]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1804]! } - public var MediaPicker_TimerTooltip: String { return self._s[1806]! } - public var SharedMedia_TitleAll: String { return self._s[1807]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1810]! } - public var Conversation_RestrictedMedia: String { return self._s[1811]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1812]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1814]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1815]! } + public var AccessDenied_LocationTracking: String { return self._s[1820]! } + public var Month_GenOctober: String { return self._s[1821]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1822]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1823]! } + public var MediaPicker_TimerTooltip: String { return self._s[1825]! } + public var SharedMedia_TitleAll: String { return self._s[1826]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1829]! } + public var Conversation_RestrictedMedia: String { return self._s[1830]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1831]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1833]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1834]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1816]!, self._r[1816]!, [_0]) + return formatWithArgumentRanges(self._s[1835]!, self._r[1835]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1819]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1821]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1822]! } + public var Conversation_SavedMessages: String { return self._s[1838]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1840]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1841]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_0]) + return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1825]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1826]! } + public var ReportPeer_AlertSuccess: String { return self._s[1844]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1845]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1827]!, self._r[1827]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1846]!, self._r[1846]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1828]! } - public var PhotoEditor_FadeTool: String { return self._s[1829]! } - public var Privacy_ContactsReset: String { return self._s[1830]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1847]! } + public var PhotoEditor_FadeTool: String { return self._s[1848]! } + public var Privacy_ContactsReset: String { return self._s[1849]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1832]!, self._r[1832]!, [_0]) + return formatWithArgumentRanges(self._s[1851]!, self._r[1851]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1833]! } - public var ChatList_Mute: String { return self._s[1834]! } - public var Permissions_CellularDataText_v0: String { return self._s[1835]! } - public var ShareMenu_SelectChats: String { return self._s[1837]! } - public var MusicPlayer_VoiceNote: String { return self._s[1838]! } - public var Conversation_RestrictedText: String { return self._s[1839]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1840]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1841]! } - public var Cache_Videos: String { return self._s[1842]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1843]! } - public var FeatureDisabled_Oops: String { return self._s[1845]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1846]! } + public var Message_PinnedVideoMessage: String { return self._s[1852]! } + public var ChatList_Mute: String { return self._s[1853]! } + public var Permissions_CellularDataText_v0: String { return self._s[1854]! } + public var ShareMenu_SelectChats: String { return self._s[1856]! } + public var MusicPlayer_VoiceNote: String { return self._s[1857]! } + public var Conversation_RestrictedText: String { return self._s[1858]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1859]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1860]! } + public var Cache_Videos: String { return self._s[1861]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1862]! } + public var FeatureDisabled_Oops: String { return self._s[1864]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1865]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1847]!, self._r[1847]!, [_0]) + return formatWithArgumentRanges(self._s[1866]!, self._r[1866]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1848]! } - public var GroupPermission_NoSendPolls: String { return self._s[1849]! } - public var Message_VideoExpired: String { return self._s[1851]! } - public var Notifications_Badge: String { return self._s[1852]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1853]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1854]! } - public var Username_InvalidTooShort: String { return self._s[1855]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1856]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1857]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1858]! } + public var Stickers_GroupStickersHelp: String { return self._s[1867]! } + public var GroupPermission_NoSendPolls: String { return self._s[1868]! } + public var Message_VideoExpired: String { return self._s[1870]! } + public var Notifications_Badge: String { return self._s[1871]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1872]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1873]! } + public var Username_InvalidTooShort: String { return self._s[1874]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1875]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1876]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1877]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_1]) + return formatWithArgumentRanges(self._s[1878]!, self._r[1878]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1860]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1861]! } - public var SharedMedia_CategoryDocs: String { return self._s[1864]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1879]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1880]! } + public var SharedMedia_CategoryDocs: String { return self._s[1883]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1865]!, self._r[1865]!, [_1]) + return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[1867]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1886]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1868]!, self._r[1868]!, [_1]) + return formatWithArgumentRanges(self._s[1887]!, self._r[1887]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1869]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1888]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) + return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1871]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1872]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1873]! } - public var Channel_UpdatePhotoItem: String { return self._s[1874]! } - public var GroupInfo_LeftStatus: String { return self._s[1875]! } - public var Watch_MessageView_Forward: String { return self._s[1877]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[1878]! } - public var Cache_ClearEmpty: String { return self._s[1880]! } - public var Localization_LanguageName: String { return self._s[1881]! } - public var WebSearch_GIFs: String { return self._s[1882]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1883]! } - public var Username_InvalidStartsWithNumber: String { return self._s[1884]! } - public var Common_Back: String { return self._s[1885]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[1886]! } + public var ChatSettings_PrivateChats: String { return self._s[1890]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1891]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1892]! } + public var Channel_UpdatePhotoItem: String { return self._s[1893]! } + public var GroupInfo_LeftStatus: String { return self._s[1894]! } + public var Watch_MessageView_Forward: String { return self._s[1896]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[1897]! } + public var Cache_ClearEmpty: String { return self._s[1899]! } + public var Localization_LanguageName: String { return self._s[1900]! } + public var WebSearch_GIFs: String { return self._s[1901]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1902]! } + public var Username_InvalidStartsWithNumber: String { return self._s[1903]! } + public var Common_Back: String { return self._s[1904]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[1905]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1887]!, self._r[1887]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1906]!, self._r[1906]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[1888]! } - public var Watch_Conversation_Reply: String { return self._s[1890]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[1892]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[1893]! } - public var Channel_BanUser_Unban: String { return self._s[1895]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1896]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[1897]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1899]! } - public var Passport_Identity_Name: String { return self._s[1900]! } + public var Passport_Email_Help: String { return self._s[1907]! } + public var Watch_Conversation_Reply: String { return self._s[1909]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[1911]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[1912]! } + public var Channel_BanUser_Unban: String { return self._s[1914]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1915]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[1916]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1918]! } + public var Passport_Identity_Name: String { return self._s[1919]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1901]!, self._r[1901]!, [_0]) + return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[1902]! } - public var Conversation_BlockUser: String { return self._s[1903]! } - public var Month_GenJanuary: String { return self._s[1904]! } - public var ChatSettings_TextSize: String { return self._s[1905]! } - public var Notification_PassportValuePhone: String { return self._s[1906]! } - public var Passport_Language_ne: String { return self._s[1907]! } - public var Notification_CallBack: String { return self._s[1908]! } - public var TwoStepAuth_EmailHelp: String { return self._s[1909]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[1921]! } + public var Conversation_BlockUser: String { return self._s[1922]! } + public var Month_GenJanuary: String { return self._s[1923]! } + public var ChatSettings_TextSize: String { return self._s[1924]! } + public var Notification_PassportValuePhone: String { return self._s[1925]! } + public var Passport_Language_ne: String { return self._s[1926]! } + public var Notification_CallBack: String { return self._s[1927]! } + public var TwoStepAuth_EmailHelp: String { return self._s[1928]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1910]!, self._r[1910]!, [_0]) + return formatWithArgumentRanges(self._s[1929]!, self._r[1929]!, [_0]) } - public var Channel_Info_Management: String { return self._s[1911]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[1912]! } - public var Stickers_FrequentlyUsed: String { return self._s[1913]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[1914]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1916]! } + public var Channel_Info_Management: String { return self._s[1930]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[1931]! } + public var Stickers_FrequentlyUsed: String { return self._s[1932]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[1933]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1935]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1917]!, self._r[1917]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[1936]!, self._r[1936]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[1918]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[1919]! } - public var CreatePoll_TextHeader: String { return self._s[1920]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[1937]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[1938]! } + public var CreatePoll_TextHeader: String { return self._s[1939]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1921]!, self._r[1921]!, [_0]) + return formatWithArgumentRanges(self._s[1940]!, self._r[1940]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[1922]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1923]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[1925]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[1926]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[1927]! } + public var PhotoEditor_QualityMedium: String { return self._s[1941]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1942]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[1944]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[1945]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[1946]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1928]!, self._r[1928]!, [_0]) - } - public var Conversation_LinkDialogOpen: String { return self._s[1930]! } - public var Settings_Username: String { return self._s[1931]! } - public var Conversation_Block: String { return self._s[1933]! } - public var Wallpaper_Wallpaper: String { return self._s[1934]! } - public var SocksProxySetup_UseProxy: String { return self._s[1936]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[1937]! } - public var MessageTimer_Forever: String { return self._s[1938]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[1939]! } - public var PhotoEditor_DiscardChanges: String { return self._s[1940]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1941]! } - public var Passport_Language_da: String { return self._s[1942]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[1943]! } - public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1944]!, self._r[1944]!, [_0]) - } - public var Passport_Address_EditPassportRegistration: String { return self._s[1945]! } - public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1947]!, self._r[1947]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[1949]! } - public var Conversation_SearchByName_Prefix: String { return self._s[1950]! } - public var Conversation_PinnedPoll: String { return self._s[1951]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[1952]! } + public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_1]) + } + public var Conversation_LinkDialogOpen: String { return self._s[1950]! } + public var Settings_Username: String { return self._s[1951]! } + public var Conversation_Block: String { return self._s[1953]! } + public var Wallpaper_Wallpaper: String { return self._s[1954]! } + public var SocksProxySetup_UseProxy: String { return self._s[1956]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[1957]! } + public var MessageTimer_Forever: String { return self._s[1958]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[1959]! } + public var PhotoEditor_DiscardChanges: String { return self._s[1960]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1961]! } + public var Passport_Language_da: String { return self._s[1962]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[1963]! } + public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1964]!, self._r[1964]!, [_0]) + } + public var Passport_Address_EditPassportRegistration: String { return self._s[1965]! } + public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1967]!, self._r[1967]!, [_0]) + } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[1969]! } + public var Conversation_SearchByName_Prefix: String { return self._s[1970]! } + public var Conversation_PinnedPoll: String { return self._s[1971]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[1972]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_1]) + return formatWithArgumentRanges(self._s[1973]!, self._r[1973]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[1954]! } - public var Cache_ByPeerHeader: String { return self._s[1955]! } + public var WallpaperSearch_ColorPurple: String { return self._s[1974]! } + public var Cache_ByPeerHeader: String { return self._s[1975]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1956]!, self._r[1956]!, [_0]) + return formatWithArgumentRanges(self._s[1976]!, self._r[1976]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[1957]! } - public var Notification_PinnedMessage: String { return self._s[1960]! } - public var Contacts_SortBy: String { return self._s[1962]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[1977]! } + public var Notification_PinnedMessage: String { return self._s[1980]! } + public var Contacts_SortBy: String { return self._s[1982]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_1]) + return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1965]!, self._r[1965]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1985]!, self._r[1985]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[1966]! } - public var Watch_UserInfo_Service: String { return self._s[1967]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[1969]! } - public var Conversation_Unpin: String { return self._s[1971]! } - public var CancelResetAccount_Title: String { return self._s[1972]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[1973]! } + public var Call_EncryptionKey_Title: String { return self._s[1986]! } + public var Watch_UserInfo_Service: String { return self._s[1987]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[1989]! } + public var Conversation_Unpin: String { return self._s[1991]! } + public var CancelResetAccount_Title: String { return self._s[1992]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[1993]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1975]!, self._r[1975]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[1976]! } - public var CallSettings_Title: String { return self._s[1977]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1978]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[1980]! } - public var AutoDownloadSettings_Contacts: String { return self._s[1981]! } - public var Passport_Identity_DocumentDetails: String { return self._s[1982]! } - public var LoginPassword_PasswordHelp: String { return self._s[1983]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[1984]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[1985]! } - public var Checkout_TotalPaidAmount: String { return self._s[1986]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[1996]! } + public var CallSettings_Title: String { return self._s[1997]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1998]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2000]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2001]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2002]! } + public var LoginPassword_PasswordHelp: String { return self._s[2003]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2004]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2005]! } + public var Checkout_TotalPaidAmount: String { return self._s[2006]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1987]!, self._r[1987]!, [_0]) + return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[1988]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[1990]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[1991]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2008]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2010]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2011]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_1]) + return formatWithArgumentRanges(self._s[2012]!, self._r[2012]!, [_1]) } - public var Contacts_InviteFriends: String { return self._s[1994]! } - public var Map_ChooseLocationTitle: String { return self._s[1995]! } - public var Conversation_StopPoll: String { return self._s[1997]! } + public var Contacts_InviteFriends: String { return self._s[2014]! } + public var Map_ChooseLocationTitle: String { return self._s[2015]! } + public var Conversation_StopPoll: String { return self._s[2017]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1998]!, self._r[1998]!, [_0]) + return formatWithArgumentRanges(self._s[2018]!, self._r[2018]!, [_0]) } - public var Call_Camera: String { return self._s[1999]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2000]! } - public var Calls_RatingFeedback: String { return self._s[2001]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2002]! } - public var NotificationsSound_Pulse: String { return self._s[2003]! } - public var Watch_LastSeen_Lately: String { return self._s[2004]! } - public var Widget_NoUsers: String { return self._s[2007]! } - public var Conversation_UnvotePoll: String { return self._s[2008]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2010]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2011]! } - public var NotificationsSound_Circles: String { return self._s[2012]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2014]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2015]! } - public var Proxy_TooltipUnavailable: String { return self._s[2016]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2018]! } - public var Conversation_FileDropbox: String { return self._s[2020]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2021]! } - public var Tour_Text3: String { return self._s[2023]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2025]! } - public var GroupPermission_NoSendMessages: String { return self._s[2026]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2027]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2028]! } + public var Call_Camera: String { return self._s[2019]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2020]! } + public var Calls_RatingFeedback: String { return self._s[2021]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2022]! } + public var NotificationsSound_Pulse: String { return self._s[2023]! } + public var Watch_LastSeen_Lately: String { return self._s[2024]! } + public var ReportGroupLocation_Report: String { return self._s[2027]! } + public var Widget_NoUsers: String { return self._s[2028]! } + public var Conversation_UnvotePoll: String { return self._s[2029]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2031]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2032]! } + public var NotificationsSound_Circles: String { return self._s[2033]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2035]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2036]! } + public var Proxy_TooltipUnavailable: String { return self._s[2037]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2039]! } + public var Conversation_FileDropbox: String { return self._s[2041]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2042]! } + public var Tour_Text3: String { return self._s[2044]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2046]! } + public var GroupPermission_NoSendMessages: String { return self._s[2047]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2048]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2049]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2030]!, self._r[2030]!, [_0]) + return formatWithArgumentRanges(self._s[2051]!, self._r[2051]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2031]! } - public var Checkout_ShippingOption_Title: String { return self._s[2032]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2033]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2052]! } + public var Checkout_ShippingOption_Title: String { return self._s[2053]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2054]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2034]!, self._r[2034]!, [_0]) + return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2035]!, self._r[2035]!, [_0]) + return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2036]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2037]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2038]! } - public var AutoDownloadSettings_Photos: String { return self._s[2040]! } - public var Appearance_PreviewIncomingText: String { return self._s[2041]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2042]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2043]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2044]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2045]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2046]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2047]! } - public var Notification_SecretChatScreenshot: String { return self._s[2048]! } - public var AccessDenied_Wallpapers: String { return self._s[2049]! } - public var Passport_Address_City: String { return self._s[2051]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2052]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2053]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2054]! } - public var AccessDenied_LocationDisabled: String { return self._s[2055]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2057]! } - public var GroupInfo_Sound: String { return self._s[2058]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2059]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2060]! } - public var Contacts_Title: String { return self._s[2061]! } - public var Passport_Language_fr: String { return self._s[2062]! } - public var Notifications_ResetAllNotifications: String { return self._s[2063]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2066]! } - public var Checkout_NewCard_Title: String { return self._s[2067]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2068]! } - public var Conversation_ForwardChats: String { return self._s[2069]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2071]! } - public var Settings_FAQ: String { return self._s[2073]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2074]! } - public var Conversation_ContextMenuForward: String { return self._s[2075]! } - public var PrivacyPolicy_Title: String { return self._s[2080]! } - public var Notifications_TextTone: String { return self._s[2081]! } - public var Profile_CreateNewContact: String { return self._s[2082]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2083]! } - public var Call_Speaker: String { return self._s[2085]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2086]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2088]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2089]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2057]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2058]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2059]! } + public var AutoDownloadSettings_Photos: String { return self._s[2061]! } + public var Appearance_PreviewIncomingText: String { return self._s[2062]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2063]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2064]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2065]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2066]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2067]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2068]! } + public var Notification_SecretChatScreenshot: String { return self._s[2069]! } + public var AccessDenied_Wallpapers: String { return self._s[2070]! } + public var Passport_Address_City: String { return self._s[2072]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2073]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2074]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2075]! } + public var AccessDenied_LocationDisabled: String { return self._s[2076]! } + public var Group_Location_Title: String { return self._s[2077]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2079]! } + public var GroupInfo_Sound: String { return self._s[2080]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2081]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2082]! } + public var Contacts_Title: String { return self._s[2083]! } + public var Passport_Language_fr: String { return self._s[2084]! } + public var Notifications_ResetAllNotifications: String { return self._s[2085]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2088]! } + public var Checkout_NewCard_Title: String { return self._s[2089]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2090]! } + public var Conversation_ForwardChats: String { return self._s[2091]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2093]! } + public var Settings_FAQ: String { return self._s[2095]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2096]! } + public var Conversation_ContextMenuForward: String { return self._s[2097]! } + public var PrivacyPolicy_Title: String { return self._s[2102]! } + public var Notifications_TextTone: String { return self._s[2103]! } + public var Profile_CreateNewContact: String { return self._s[2104]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2105]! } + public var Call_Speaker: String { return self._s[2107]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2108]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2110]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2111]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_0]) + return formatWithArgumentRanges(self._s[2112]!, self._r[2112]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2091]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2092]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2093]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2094]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2095]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2096]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2097]! } - public var Bot_Unblock: String { return self._s[2098]! } - public var TextFormat_Italic: String { return self._s[2099]! } - public var WallpaperSearch_ColorPink: String { return self._s[2100]! } - public var Settings_About_Help: String { return self._s[2101]! } - public var SearchImages_Title: String { return self._s[2102]! } - public var Weekday_Wednesday: String { return self._s[2103]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2104]! } - public var ExplicitContent_AlertTitle: String { return self._s[2105]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2113]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2114]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2115]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2116]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2117]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2118]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2119]! } + public var Bot_Unblock: String { return self._s[2120]! } + public var TextFormat_Italic: String { return self._s[2121]! } + public var WallpaperSearch_ColorPink: String { return self._s[2122]! } + public var Settings_About_Help: String { return self._s[2123]! } + public var SearchImages_Title: String { return self._s[2124]! } + public var Weekday_Wednesday: String { return self._s[2125]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2126]! } + public var ExplicitContent_AlertTitle: String { return self._s[2127]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2128]!, self._r[2128]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2107]! } - public var Weekday_Thursday: String { return self._s[2108]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2109]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2110]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2129]! } + public var Weekday_Thursday: String { return self._s[2130]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2131]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2132]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, [_0]) + return formatWithArgumentRanges(self._s[2133]!, self._r[2133]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2112]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2113]! } - public var Passport_RequestedInformation: String { return self._s[2114]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2115]! } - public var Conversation_EncryptionProcessing: String { return self._s[2117]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2118]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2120]! } - public var Channel_Setup_Title: String { return self._s[2121]! } - public var Conversation_SearchPlaceholder: String { return self._s[2122]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2123]! } - public var Checkout_ErrorGeneric: String { return self._s[2124]! } - public var Passport_Language_hu: String { return self._s[2125]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2134]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2135]! } + public var Passport_RequestedInformation: String { return self._s[2136]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2137]! } + public var Conversation_EncryptionProcessing: String { return self._s[2139]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2140]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2142]! } + public var Channel_Setup_Title: String { return self._s[2143]! } + public var Conversation_SearchPlaceholder: String { return self._s[2144]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2145]! } + public var Checkout_ErrorGeneric: String { return self._s[2146]! } + public var Passport_Language_hu: String { return self._s[2147]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2127]!, self._r[2127]!, [_0]) - } - public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2130]!, self._r[2130]!, [_1]) - } - public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2131]!, self._r[2131]!, [_0]) - } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2132]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2133]! } - public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_0]) - } - public var Conversation_ClearPrivateHistory: String { return self._s[2135]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2136]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2137]! } - public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2138]!, self._r[2138]!, [_0]) - } - public var Passport_Language_cs: String { return self._s[2139]! } - public var Message_PinnedAnimationMessage: String { return self._s[2141]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2143]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2144]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2146]! } - public var Embed_PlayingInPIP: String { return self._s[2147]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2148]! } - public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2149]!, self._r[2149]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2150]! } - public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2151]!, self._r[2151]!, [_1]) + public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2152]!, self._r[2152]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2152]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2153]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2154]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2155]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2156]! } + public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2153]!, self._r[2153]!, [_0]) + } + public var Group_Location_Info: String { return self._s[2154]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2155]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2156]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2157]! } + public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2158]!, self._r[2158]!, [_0]) + } + public var Conversation_ClearPrivateHistory: String { return self._s[2159]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2160]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2161]! } + public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2162]!, self._r[2162]!, [_0]) + } + public var Passport_Language_cs: String { return self._s[2163]! } + public var Message_PinnedAnimationMessage: String { return self._s[2165]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2167]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2168]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2170]! } + public var Embed_PlayingInPIP: String { return self._s[2171]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2172]! } + public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2173]!, self._r[2173]!, [_0]) + } + public var MediaPicker_LivePhotoDescription: String { return self._s[2174]! } + public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2175]!, self._r[2175]!, [_1]) + } + public var Notification_PaymentSent: String { return self._s[2176]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2177]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2178]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2179]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2180]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2159]!, self._r[2159]!, [_1]) + return formatWithArgumentRanges(self._s[2183]!, self._r[2183]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_1]) + return formatWithArgumentRanges(self._s[2184]!, self._r[2184]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2161]!, self._r[2161]!, [_1]) + return formatWithArgumentRanges(self._s[2185]!, self._r[2185]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2163]! } - public var PasscodeSettings_HelpTop: String { return self._s[2164]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2165]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2166]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2167]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2168]! } - public var Call_Accept: String { return self._s[2170]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2171]! } - public var Month_GenMarch: String { return self._s[2173]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2174]! } - public var LoginPassword_Title: String { return self._s[2175]! } - public var Call_End: String { return self._s[2176]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2177]! } - public var CallSettings_Always: String { return self._s[2178]! } - public var CallFeedback_Success: String { return self._s[2179]! } - public var TwoStepAuth_SetupHint: String { return self._s[2180]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2187]! } + public var PasscodeSettings_HelpTop: String { return self._s[2188]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2189]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2190]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2191]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2192]! } + public var Call_Accept: String { return self._s[2194]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2195]! } + public var Month_GenMarch: String { return self._s[2197]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2198]! } + public var LoginPassword_Title: String { return self._s[2199]! } + public var Call_End: String { return self._s[2200]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2201]! } + public var CallSettings_Always: String { return self._s[2202]! } + public var CallFeedback_Success: String { return self._s[2203]! } + public var TwoStepAuth_SetupHint: String { return self._s[2204]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2181]!, self._r[2181]!, [_1, _1]) + return formatWithArgumentRanges(self._s[2205]!, self._r[2205]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2182]! } - public var Login_PhoneTitle: String { return self._s[2183]! } - public var Passport_FieldPhoneHelp: String { return self._s[2184]! } - public var Weekday_ShortSunday: String { return self._s[2185]! } - public var Passport_InfoFAQ_URL: String { return self._s[2186]! } - public var ContactInfo_Job: String { return self._s[2188]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2189]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2190]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2191]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2192]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2193]! } - public var CallFeedback_ReasonNoise: String { return self._s[2194]! } - public var Appearance_AppIconDefault: String { return self._s[2196]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2197]! } - public var MediaPicker_AddCaption: String { return self._s[2198]! } - public var CallSettings_TabIconDescription: String { return self._s[2199]! } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2200]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2201]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2202]! } - public var DialogList_SearchSectionRecent: String { return self._s[2203]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2204]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2207]! } - public var LastSeen_WithinAWeek: String { return self._s[2208]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2209]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2211]! } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2212]! } - public var Conversation_StatusLeftGroup: String { return self._s[2213]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2214]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2216]! } - public var GroupPermission_AddSuccess: String { return self._s[2217]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2219]! } - public var Conversation_ContextMenuCopy: String { return self._s[2220]! } - public var AccessDenied_CallMicrophone: String { return self._s[2221]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2206]! } + public var Login_PhoneTitle: String { return self._s[2207]! } + public var Passport_FieldPhoneHelp: String { return self._s[2208]! } + public var Weekday_ShortSunday: String { return self._s[2209]! } + public var Passport_InfoFAQ_URL: String { return self._s[2210]! } + public var ContactInfo_Job: String { return self._s[2212]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2213]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2214]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2215]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2216]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2217]! } + public var CallFeedback_ReasonNoise: String { return self._s[2218]! } + public var Appearance_AppIconDefault: String { return self._s[2220]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2221]! } + public var MediaPicker_AddCaption: String { return self._s[2222]! } + public var CallSettings_TabIconDescription: String { return self._s[2223]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2224]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2225]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2226]! } + public var DialogList_SearchSectionRecent: String { return self._s[2227]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2228]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2231]! } + public var LastSeen_WithinAWeek: String { return self._s[2232]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2233]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2235]! } + public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_0]) + } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2237]! } + public var Conversation_StatusLeftGroup: String { return self._s[2238]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2239]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2241]! } + public var GroupPermission_AddSuccess: String { return self._s[2242]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2244]! } + public var Conversation_ContextMenuCopy: String { return self._s[2245]! } + public var AccessDenied_CallMicrophone: String { return self._s[2246]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2247]!, self._r[2247]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2223]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2224]! } - public var Checkout_PaymentMethod_New: String { return self._s[2225]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2226]! } - public var PhotoEditor_QualityTool: String { return self._s[2227]! } - public var Login_SendCodeViaSms: String { return self._s[2228]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2229]! } - public var Login_EmailNotConfiguredError: String { return self._s[2230]! } - public var SocksProxySetup_Status: String { return self._s[2231]! } - public var PrivacyPolicy_Accept: String { return self._s[2232]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2233]! } - public var Appearance_AppIconClassicX: String { return self._s[2234]! } + public var Login_InvalidFirstNameError: String { return self._s[2248]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2249]! } + public var Checkout_PaymentMethod_New: String { return self._s[2250]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2251]! } + public var PhotoEditor_QualityTool: String { return self._s[2252]! } + public var Login_SendCodeViaSms: String { return self._s[2253]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2254]! } + public var Login_EmailNotConfiguredError: String { return self._s[2255]! } + public var SocksProxySetup_Status: String { return self._s[2256]! } + public var PrivacyPolicy_Accept: String { return self._s[2257]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2258]! } + public var Appearance_AppIconClassicX: String { return self._s[2259]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2235]!, self._r[2235]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2260]!, self._r[2260]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2236]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2237]! } - public var AutoNightTheme_Automatic: String { return self._s[2238]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2239]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2240]! } - public var Cache_Help: String { return self._s[2241]! } - public var Group_ErrorAccessDenied: String { return self._s[2242]! } - public var Passport_Language_fa: String { return self._s[2243]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2244]! } - public var PrivacySettings_LastSeen: String { return self._s[2245]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2261]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2262]! } + public var AutoNightTheme_Automatic: String { return self._s[2263]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2264]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2265]! } + public var Cache_Help: String { return self._s[2266]! } + public var Group_ErrorAccessDenied: String { return self._s[2267]! } + public var Passport_Language_fa: String { return self._s[2268]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2269]! } + public var PrivacySettings_LastSeen: String { return self._s[2270]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2246]!, self._r[2246]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2271]!, self._r[2271]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2250]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2251]! } - public var Profile_About: String { return self._s[2252]! } - public var Channel_About_Placeholder: String { return self._s[2253]! } - public var Login_InfoTitle: String { return self._s[2254]! } + public var Preview_SaveGif: String { return self._s[2275]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2276]! } + public var Profile_About: String { return self._s[2277]! } + public var Channel_About_Placeholder: String { return self._s[2278]! } + public var Login_InfoTitle: String { return self._s[2279]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_0]) + return formatWithArgumentRanges(self._s[2280]!, self._r[2280]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2257]! } - public var ContactInfo_Title: String { return self._s[2258]! } - public var Media_ShareThisVideo: String { return self._s[2259]! } - public var Weekday_ShortFriday: String { return self._s[2260]! } - public var AccessDenied_Contacts: String { return self._s[2261]! } - public var Notification_CallIncomingShort: String { return self._s[2262]! } - public var Group_Setup_TypePublic: String { return self._s[2263]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2264]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2265]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2268]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2269]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2270]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2271]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2272]! } - public var DialogList_Typing: String { return self._s[2273]! } - public var CallFeedback_IncludeLogs: String { return self._s[2275]! } - public var Checkout_Phone: String { return self._s[2277]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2280]! } - public var Privacy_Calls_Integration: String { return self._s[2281]! } - public var Notifications_PermissionsAllow: String { return self._s[2282]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2286]! } - public var Settings_ChatSettings: String { return self._s[2287]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2282]! } + public var ContactInfo_Title: String { return self._s[2283]! } + public var Media_ShareThisVideo: String { return self._s[2284]! } + public var Weekday_ShortFriday: String { return self._s[2285]! } + public var AccessDenied_Contacts: String { return self._s[2286]! } + public var Notification_CallIncomingShort: String { return self._s[2287]! } + public var Group_Setup_TypePublic: String { return self._s[2288]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2289]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2290]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2293]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2294]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2295]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2296]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2297]! } + public var DialogList_Typing: String { return self._s[2298]! } + public var CallFeedback_IncludeLogs: String { return self._s[2300]! } + public var Checkout_Phone: String { return self._s[2302]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2305]! } + public var Privacy_Calls_Integration: String { return self._s[2306]! } + public var Notifications_PermissionsAllow: String { return self._s[2307]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2311]! } + public var Settings_ChatSettings: String { return self._s[2312]! } public func PUSH_MESSAGE_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_1]) + return formatWithArgumentRanges(self._s[2313]!, self._r[2313]!, [_1]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2314]!, self._r[2314]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2291]! } + public var GroupRemoved_DeleteUser: String { return self._s[2316]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2292]!, self._r[2292]!, [_0]) - } - public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2293]!, self._r[2293]!, [_1]) - } - public var Login_ContinueWithLocalization: String { return self._s[2294]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2295]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2297]! } - public var Conversation_Unblock: String { return self._s[2298]! } - public var PrivacySettings_DataSettings: String { return self._s[2299]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2300]! } - public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2301]!, self._r[2301]!, [_0, _1]) - } - public var PrivacySettings_Passcode: String { return self._s[2304]! } - public var Call_Mute: String { return self._s[2305]! } - public var Passport_Language_dz: String { return self._s[2306]! } - public var Passport_Language_tk: String { return self._s[2307]! } - public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2308]!, self._r[2308]!, [_0]) - } - public var Settings_Search: String { return self._s[2309]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2310]! } - public var Conversation_ContextMenuReply: String { return self._s[2311]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2312]! } - public var Tour_Title1: String { return self._s[2313]! } - public var Conversation_ClearGroupHistory: String { return self._s[2315]! } - public var WallpaperPreview_Motion: String { return self._s[2316]! } - public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2317]!, self._r[2317]!, [_0]) } - public var Call_RateCall: String { return self._s[2318]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2319]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2320]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2321]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2323]! } + public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_1]) + } + public var Login_ContinueWithLocalization: String { return self._s[2319]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2320]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2322]! } + public var Conversation_Unblock: String { return self._s[2323]! } + public var PrivacySettings_DataSettings: String { return self._s[2324]! } + public var Group_PublicLink_Info: String { return self._s[2325]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2326]! } + public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2327]!, self._r[2327]!, [_0, _1]) + } + public var PrivacySettings_Passcode: String { return self._s[2330]! } + public var Call_Mute: String { return self._s[2331]! } + public var Passport_Language_dz: String { return self._s[2332]! } + public var Passport_Language_tk: String { return self._s[2333]! } + public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2334]!, self._r[2334]!, [_0]) + } + public var Settings_Search: String { return self._s[2335]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2336]! } + public var Conversation_ContextMenuReply: String { return self._s[2337]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2338]! } + public var Tour_Title1: String { return self._s[2339]! } + public var Conversation_ClearGroupHistory: String { return self._s[2341]! } + public var WallpaperPreview_Motion: String { return self._s[2342]! } + public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2343]!, self._r[2343]!, [_0]) + } + public var Call_RateCall: String { return self._s[2344]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2345]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2346]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2347]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2349]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2325]!, self._r[2325]!, [_0]) + return formatWithArgumentRanges(self._s[2351]!, self._r[2351]!, [_0]) } - public var Compose_Create: String { return self._s[2326]! } - public var Contacts_InviteToTelegram: String { return self._s[2327]! } - public var GroupInfo_Notifications: String { return self._s[2328]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2330]! } - public var Month_GenApril: String { return self._s[2331]! } - public var Appearance_AutoNightTheme: String { return self._s[2332]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2334]! } - public var Login_CodeSentSms: String { return self._s[2336]! } + public var Compose_Create: String { return self._s[2352]! } + public var Contacts_InviteToTelegram: String { return self._s[2353]! } + public var GroupInfo_Notifications: String { return self._s[2354]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2356]! } + public var Month_GenApril: String { return self._s[2357]! } + public var Appearance_AutoNightTheme: String { return self._s[2358]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2360]! } + public var Login_CodeSentSms: String { return self._s[2362]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2337]!, self._r[2337]!, [_0]) + return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2338]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2339]! } - public var Passport_Language_hr: String { return self._s[2340]! } - public var Common_ActionNotAllowedError: String { return self._s[2341]! } + public var EmptyGroupInfo_Line3: String { return self._s[2364]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2365]! } + public var Passport_Language_hr: String { return self._s[2366]! } + public var Common_ActionNotAllowedError: String { return self._s[2367]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2342]!, self._r[2342]!, [_0]) + return formatWithArgumentRanges(self._s[2368]!, self._r[2368]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2343]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2344]! } - public var Privacy_SecretChatsTitle: String { return self._s[2345]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2347]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2348]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2349]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2350]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2351]! } - public var Preview_DeleteGif: String { return self._s[2352]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2353]! } - public var Group_ErrorNotMutualContact: String { return self._s[2354]! } - public var Notification_MessageLifetime5s: String { return self._s[2355]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2369]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2370]! } + public var Privacy_SecretChatsTitle: String { return self._s[2371]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2373]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2374]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2375]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2376]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2377]! } + public var Preview_DeleteGif: String { return self._s[2378]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2379]! } + public var Group_ErrorNotMutualContact: String { return self._s[2380]! } + public var Notification_MessageLifetime5s: String { return self._s[2381]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2356]!, self._r[2356]!, [_0]) + return formatWithArgumentRanges(self._s[2382]!, self._r[2382]!, [_0]) } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2358]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2359]! } - public var Passport_Address_AddBankStatement: String { return self._s[2360]! } - public var Notification_CallIncoming: String { return self._s[2361]! } - public var Compose_NewGroupTitle: String { return self._s[2362]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2364]! } - public var Passport_Address_Postcode: String { return self._s[2366]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2384]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2385]! } + public var Passport_Address_AddBankStatement: String { return self._s[2386]! } + public var Notification_CallIncoming: String { return self._s[2387]! } + public var Compose_NewGroupTitle: String { return self._s[2388]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2390]! } + public var Passport_Address_Postcode: String { return self._s[2392]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2367]!, self._r[2367]!, [_0]) + return formatWithArgumentRanges(self._s[2393]!, self._r[2393]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2368]! } - public var WallpaperColors_Title: String { return self._s[2369]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2370]! } - public var GroupPermission_Duration: String { return self._s[2371]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2394]! } + public var WallpaperColors_Title: String { return self._s[2395]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2396]! } + public var GroupPermission_Duration: String { return self._s[2397]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2372]!, self._r[2372]!, [_0]) + return formatWithArgumentRanges(self._s[2398]!, self._r[2398]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2373]! } - public var Username_Placeholder: String { return self._s[2374]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2375]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2376]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2377]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2399]! } + public var Username_Placeholder: String { return self._s[2400]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2401]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2402]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2403]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2379]!, self._r[2379]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2405]!, self._r[2405]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2380]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2381]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2382]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2383]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2384]! } - public var Conversation_ContextMenuMore: String { return self._s[2385]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2386]! } - public var CallSettings_TabIcon: String { return self._s[2387]! } - public var KeyCommand_Find: String { return self._s[2388]! } - public var Message_PinnedGame: String { return self._s[2389]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2391]! } - public var Login_CallRequestState2: String { return self._s[2393]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2395]! } + public var Passport_PasswordDescription: String { return self._s[2406]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2407]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2408]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2409]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2410]! } + public var Conversation_ContextMenuMore: String { return self._s[2411]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2412]! } + public var CallSettings_TabIcon: String { return self._s[2413]! } + public var KeyCommand_Find: String { return self._s[2414]! } + public var Message_PinnedGame: String { return self._s[2415]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2417]! } + public var Login_CallRequestState2: String { return self._s[2419]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2421]! } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2397]!, self._r[2397]!, [_0]) + return formatWithArgumentRanges(self._s[2423]!, self._r[2423]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2398]! } - public var Conversation_InstantPagePreview: String { return self._s[2399]! } + public var WallpaperPreview_Blurred: String { return self._s[2424]! } + public var Conversation_InstantPagePreview: String { return self._s[2425]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2400]!, self._r[2400]!, [_0]) + return formatWithArgumentRanges(self._s[2426]!, self._r[2426]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2403]! } - public var WallpaperSearch_ColorRed: String { return self._s[2404]! } - public var GroupPermission_NoPinMessages: String { return self._s[2405]! } - public var Passport_Language_es: String { return self._s[2406]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2408]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2409]! } + public var SecretTimer_VideoDescription: String { return self._s[2429]! } + public var WallpaperSearch_ColorRed: String { return self._s[2430]! } + public var GroupPermission_NoPinMessages: String { return self._s[2431]! } + public var Passport_Language_es: String { return self._s[2432]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2434]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2435]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2410]!, self._r[2410]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2411]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2412]! } - public var Watch_UserInfo_Unmute: String { return self._s[2413]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2414]! } - public var AccessDenied_CameraRestricted: String { return self._s[2416]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2437]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2438]! } + public var Watch_UserInfo_Unmute: String { return self._s[2439]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2440]! } + public var AccessDenied_CameraRestricted: String { return self._s[2442]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2417]!, self._r[2417]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2419]! } - public var Settings_CopyUsername: String { return self._s[2420]! } - public var Contacts_SearchLabel: String { return self._s[2421]! } - public var Map_OpenInYandexNavigator: String { return self._s[2423]! } - public var PasscodeSettings_EncryptData: String { return self._s[2424]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2425]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2426]! } - public var DialogList_AdNoticeAlert: String { return self._s[2427]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2429]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2430]! } - public var Localization_LanguageCustom: String { return self._s[2431]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2432]! } - public var CallFeedback_Title: String { return self._s[2433]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2436]! } - public var Conversation_InfoGroup: String { return self._s[2437]! } - public var Compose_NewMessage: String { return self._s[2438]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2439]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2440]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2441]! } + public var ChatList_ReadAll: String { return self._s[2445]! } + public var Settings_CopyUsername: String { return self._s[2446]! } + public var Contacts_SearchLabel: String { return self._s[2447]! } + public var Map_OpenInYandexNavigator: String { return self._s[2449]! } + public var PasscodeSettings_EncryptData: String { return self._s[2450]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2451]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2452]! } + public var DialogList_AdNoticeAlert: String { return self._s[2453]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2455]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2456]! } + public var Localization_LanguageCustom: String { return self._s[2457]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2458]! } + public var CallFeedback_Title: String { return self._s[2459]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2462]! } + public var Conversation_InfoGroup: String { return self._s[2463]! } + public var Compose_NewMessage: String { return self._s[2464]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2465]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2466]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2467]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2442]!, self._r[2442]!, [_0]) + return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2443]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2444]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2445]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2446]! } - public var Channel_BlackList_Title: String { return self._s[2447]! } - public var UserInfo_PhoneCall: String { return self._s[2448]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2450]! } - public var State_connecting: String { return self._s[2451]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2469]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2470]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2471]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2472]! } + public var Channel_BlackList_Title: String { return self._s[2473]! } + public var UserInfo_PhoneCall: String { return self._s[2474]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2476]! } + public var State_connecting: String { return self._s[2477]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2452]!, self._r[2452]!, [_0]) + return formatWithArgumentRanges(self._s[2478]!, self._r[2478]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2453]! } - public var Passport_Identity_EditPassport: String { return self._s[2454]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2456]! } - public var Localization_EnglishLanguageName: String { return self._s[2457]! } - public var Share_AuthDescription: String { return self._s[2458]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2459]! } - public var Passport_Identity_Surname: String { return self._s[2460]! } - public var Compose_TokenListPlaceholder: String { return self._s[2461]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2462]! } - public var Settings_AboutEmpty: String { return self._s[2463]! } - public var Conversation_Unmute: String { return self._s[2464]! } + public var Notifications_GroupNotifications: String { return self._s[2479]! } + public var Passport_Identity_EditPassport: String { return self._s[2480]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2482]! } + public var Localization_EnglishLanguageName: String { return self._s[2483]! } + public var Share_AuthDescription: String { return self._s[2484]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2485]! } + public var Passport_Identity_Surname: String { return self._s[2486]! } + public var Compose_TokenListPlaceholder: String { return self._s[2487]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2488]! } + public var Settings_AboutEmpty: String { return self._s[2489]! } + public var Conversation_Unmute: String { return self._s[2490]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2466]!, self._r[2466]!, [_1]) + return formatWithArgumentRanges(self._s[2492]!, self._r[2492]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2467]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2469]! } - public var ChatSettings_Appearance: String { return self._s[2470]! } - public var Appearance_PickAccentColor: String { return self._s[2471]! } + public var Login_CodeSentCall: String { return self._s[2493]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2495]! } + public var ChatSettings_Appearance: String { return self._s[2496]! } + public var Appearance_PickAccentColor: String { return self._s[2497]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2472]!, self._r[2472]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2498]!, self._r[2498]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_1]) + return formatWithArgumentRanges(self._s[2499]!, self._r[2499]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2474]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2475]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2476]! } - public var ChatAdmins_AdminLabel: String { return self._s[2478]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2479]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2481]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2482]! } - public var Month_GenJune: String { return self._s[2483]! } - public var Watch_Location_Current: String { return self._s[2484]! } - public var Conversation_TitleMute: String { return self._s[2485]! } + public var Notification_CallMissed: String { return self._s[2500]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2501]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2502]! } + public var ChatAdmins_AdminLabel: String { return self._s[2504]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2505]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2507]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2508]! } + public var Month_GenJune: String { return self._s[2509]! } + public var Watch_Location_Current: String { return self._s[2510]! } + public var Conversation_TitleMute: String { return self._s[2511]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2486]!, self._r[2486]!, [_1]) + return formatWithArgumentRanges(self._s[2512]!, self._r[2512]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2487]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2513]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2488]!, self._r[2488]!, [_0]) + return formatWithArgumentRanges(self._s[2514]!, self._r[2514]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2489]! } - public var MaskStickerSettings_Info: String { return self._s[2490]! } + public var Call_ReportPlaceholder: String { return self._s[2515]! } + public var MaskStickerSettings_Info: String { return self._s[2516]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2491]!, self._r[2491]!, [_0]) + return formatWithArgumentRanges(self._s[2517]!, self._r[2517]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2492]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2494]! } - public var Contacts_ShareTelegram: String { return self._s[2495]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2496]! } - public var Channel_ErrorAccessDenied: String { return self._s[2497]! } - public var UserInfo_ScamBotWarning: String { return self._s[2499]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2500]! } - public var Call_ConnectionErrorTitle: String { return self._s[2501]! } - public var UserInfo_NotificationsEnable: String { return self._s[2502]! } - public var ArchivedChats_IntroText1: String { return self._s[2503]! } - public var Tour_Text4: String { return self._s[2506]! } - public var WallpaperSearch_Recent: String { return self._s[2507]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2508]! } - public var Profile_MessageLifetime2s: String { return self._s[2510]! } - public var Notification_MessageLifetime2s: String { return self._s[2511]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2518]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2520]! } + public var Contacts_ShareTelegram: String { return self._s[2521]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2522]! } + public var Channel_ErrorAccessDenied: String { return self._s[2523]! } + public var UserInfo_ScamBotWarning: String { return self._s[2525]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2526]! } + public var Call_ConnectionErrorTitle: String { return self._s[2527]! } + public var UserInfo_NotificationsEnable: String { return self._s[2528]! } + public var ArchivedChats_IntroText1: String { return self._s[2529]! } + public var Tour_Text4: String { return self._s[2532]! } + public var WallpaperSearch_Recent: String { return self._s[2533]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2534]! } + public var Profile_MessageLifetime2s: String { return self._s[2536]! } + public var Notification_MessageLifetime2s: String { return self._s[2537]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2512]!, self._r[2512]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2513]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2514]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2515]! } + public var Cache_ClearCache: String { return self._s[2539]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2540]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2541]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_0]) + return formatWithArgumentRanges(self._s[2545]!, self._r[2545]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2521]!, self._r[2521]!, [_0]) + return formatWithArgumentRanges(self._s[2547]!, self._r[2547]!, [_0]) } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2522]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2523]! } - public var ChatList_UnarchiveAction: String { return self._s[2524]! } - public var AutoNightTheme_Title: String { return self._s[2525]! } - public var InstantPage_FeedbackButton: String { return self._s[2526]! } - public var Passport_FieldAddress: String { return self._s[2527]! } - public var Month_ShortMarch: String { return self._s[2528]! } + public var LocalGroup_Text: String { return self._s[2548]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2549]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2550]! } + public var ChatList_UnarchiveAction: String { return self._s[2551]! } + public var AutoNightTheme_Title: String { return self._s[2552]! } + public var InstantPage_FeedbackButton: String { return self._s[2553]! } + public var Passport_FieldAddress: String { return self._s[2554]! } + public var Month_ShortMarch: String { return self._s[2555]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2529]!, self._r[2529]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2530]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2531]! } - public var Passport_FloodError: String { return self._s[2532]! } - public var SecretGif_Title: String { return self._s[2533]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2534]! } - public var Passport_Language_th: String { return self._s[2536]! } - public var Passport_Address_Address: String { return self._s[2537]! } - public var Login_InvalidLastNameError: String { return self._s[2538]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2539]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2540]! } - public var SettingsSearch_FAQ: String { return self._s[2541]! } - public var ShareMenu_Send: String { return self._s[2542]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2544]! } - public var Month_GenNovember: String { return self._s[2546]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2548]! } - public var Checkout_Email: String { return self._s[2549]! } - public var NotificationsSound_Tritone: String { return self._s[2550]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2552]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2557]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2558]! } + public var Passport_FloodError: String { return self._s[2559]! } + public var SecretGif_Title: String { return self._s[2560]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2561]! } + public var Passport_Language_th: String { return self._s[2563]! } + public var Passport_Address_Address: String { return self._s[2564]! } + public var Login_InvalidLastNameError: String { return self._s[2565]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2566]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2567]! } + public var SettingsSearch_FAQ: String { return self._s[2568]! } + public var ShareMenu_Send: String { return self._s[2569]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2571]! } + public var Month_GenNovember: String { return self._s[2573]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2575]! } + public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2576]!, self._r[2576]!, [_1, _2]) + } + public var Checkout_Email: String { return self._s[2577]! } + public var NotificationsSound_Tritone: String { return self._s[2578]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2580]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2555]!, self._r[2555]!, [_1]) + return formatWithArgumentRanges(self._s[2583]!, self._r[2583]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2556]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2584]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2558]! } - public var Notification_Exceptions_Add: String { return self._s[2559]! } - public var DialogList_You: String { return self._s[2560]! } - public var MediaPicker_Send: String { return self._s[2563]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2564]! } - public var Call_AudioRouteSpeaker: String { return self._s[2565]! } - public var Watch_UserInfo_Title: String { return self._s[2566]! } - public var Appearance_AccentColor: String { return self._s[2567]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2586]! } + public var Notification_Exceptions_Add: String { return self._s[2587]! } + public var DialogList_You: String { return self._s[2588]! } + public var MediaPicker_Send: String { return self._s[2591]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2592]! } + public var Call_AudioRouteSpeaker: String { return self._s[2593]! } + public var Watch_UserInfo_Title: String { return self._s[2594]! } + public var Appearance_AccentColor: String { return self._s[2595]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2568]!, self._r[2568]!, [_0]) + return formatWithArgumentRanges(self._s[2596]!, self._r[2596]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2569]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2597]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2570]!, self._r[2570]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2598]!, self._r[2598]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2571]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2572]! } - public var Notification_CallOutgoing: String { return self._s[2573]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2574]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2575]! } - public var Call_RecordingDisabledMessage: String { return self._s[2576]! } - public var Message_Game: String { return self._s[2577]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2578]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2579]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2580]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2581]! } - public var Date_DialogDateFormat: String { return self._s[2582]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2583]! } - public var Notifications_InAppNotifications: String { return self._s[2584]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2599]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2600]! } + public var Notification_CallOutgoing: String { return self._s[2601]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2602]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2603]! } + public var Call_RecordingDisabledMessage: String { return self._s[2604]! } + public var Message_Game: String { return self._s[2605]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2606]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2607]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2608]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2609]! } + public var Date_DialogDateFormat: String { return self._s[2610]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2611]! } + public var Notifications_InAppNotifications: String { return self._s[2612]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_0]) + return formatWithArgumentRanges(self._s[2613]!, self._r[2613]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2586]!, self._r[2586]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2614]!, self._r[2614]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2587]! } + public var NewContact_Title: String { return self._s[2615]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2588]!, self._r[2588]!, [_0]) - } - public var Conversation_ViewContactDetails: String { return self._s[2589]! } - public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2591]!, self._r[2591]!, [_1]) - } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2592]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2593]! } - public var PrivacySettings_Title: String { return self._s[2594]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2597]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2598]! } - public var Contacts_PhoneNumber: String { return self._s[2599]! } - public var Map_ShowPlaces: String { return self._s[2601]! } - public var ChatAdmins_Title: String { return self._s[2602]! } - public var InstantPage_Reference: String { return self._s[2604]! } - public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2605]!, self._r[2605]!, [_1, _2]) - } - public var Camera_FlashOff: String { return self._s[2606]! } - public var Watch_UserInfo_Block: String { return self._s[2607]! } - public var ChatSettings_Stickers: String { return self._s[2608]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2609]! } - public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_0]) - } - public var Settings_ViewPhoto: String { return self._s[2611]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2612]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2613]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2614]! } - public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2616]!, self._r[2616]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2617]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2618]! } - public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_0]) + public var Conversation_ViewContactDetails: String { return self._s[2617]! } + public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_1]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2620]! } - public var DialogList_SavedMessages: String { return self._s[2621]! } - public var GroupInfo_UpgradeButton: String { return self._s[2622]! } - public var DialogList_Pin: String { return self._s[2624]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2620]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2621]! } + public var PrivacySettings_Title: String { return self._s[2622]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2625]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2626]! } + public var Contacts_PhoneNumber: String { return self._s[2627]! } + public var Map_ShowPlaces: String { return self._s[2629]! } + public var ChatAdmins_Title: String { return self._s[2630]! } + public var InstantPage_Reference: String { return self._s[2632]! } + public var ReportGroupLocation_Text: String { return self._s[2633]! } + public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2634]!, self._r[2634]!, [_1, _2]) + } + public var Camera_FlashOff: String { return self._s[2635]! } + public var Watch_UserInfo_Block: String { return self._s[2636]! } + public var ChatSettings_Stickers: String { return self._s[2637]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2638]! } + public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_0]) + } + public var Settings_ViewPhoto: String { return self._s[2640]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2641]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2642]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2643]! } + public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_0]) + } + public var Privacy_DeleteDrafts: String { return self._s[2646]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2647]! } + public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_0]) + } + public var DialogList_SavedMessagesHelp: String { return self._s[2649]! } + public var DialogList_SavedMessages: String { return self._s[2650]! } + public var GroupInfo_UpgradeButton: String { return self._s[2651]! } + public var DialogList_Pin: String { return self._s[2653]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2654]!, self._r[2654]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_0]) + return formatWithArgumentRanges(self._s[2655]!, self._r[2655]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2627]! } - public var UserInfo_NotificationsDisable: String { return self._s[2628]! } - public var Paint_Outlined: String { return self._s[2629]! } - public var Activity_PlayingGame: String { return self._s[2630]! } - public var SearchImages_NoImagesFound: String { return self._s[2631]! } - public var SocksProxySetup_ProxyType: String { return self._s[2632]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2634]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2635]! } - public var Settings_AppLanguage: String { return self._s[2636]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2637]! } - public var Common_ChoosePhoto: String { return self._s[2638]! } - public var CallFeedback_ReasonEcho: String { return self._s[2639]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2656]! } + public var UserInfo_NotificationsDisable: String { return self._s[2657]! } + public var Paint_Outlined: String { return self._s[2658]! } + public var Activity_PlayingGame: String { return self._s[2659]! } + public var SearchImages_NoImagesFound: String { return self._s[2660]! } + public var SocksProxySetup_ProxyType: String { return self._s[2661]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2663]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2664]! } + public var Settings_AppLanguage: String { return self._s[2665]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2666]! } + public var Common_ChoosePhoto: String { return self._s[2667]! } + public var CallFeedback_ReasonEcho: String { return self._s[2668]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2640]!, self._r[2640]!, [_1]) + return formatWithArgumentRanges(self._s[2669]!, self._r[2669]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2641]! } - public var Activity_UploadingVideo: String { return self._s[2642]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2643]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2644]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2645]! } - public var Checkout_PayWithTouchId: String { return self._s[2646]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2647]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2670]! } + public var Activity_UploadingVideo: String { return self._s[2671]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2672]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2673]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2674]! } + public var Checkout_PayWithTouchId: String { return self._s[2675]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2676]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_1]) + return formatWithArgumentRanges(self._s[2678]!, self._r[2678]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2650]! } + public var Notifications_ExceptionsNone: String { return self._s[2679]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2651]!, self._r[2651]!, [_0]) + return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2652]!, self._r[2652]!, [_1]) + return formatWithArgumentRanges(self._s[2681]!, self._r[2681]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2654]! } - public var Passport_Address_Region: String { return self._s[2657]! } - public var ChatList_DeleteChat: String { return self._s[2658]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2659]! } - public var PhotoEditor_TiltShift: String { return self._s[2660]! } - public var Settings_FAQ_URL: String { return self._s[2661]! } - public var Passport_Language_sl: String { return self._s[2662]! } - public var Settings_PrivacySettings: String { return self._s[2664]! } - public var SharedMedia_TitleLink: String { return self._s[2665]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2666]! } - public var Settings_SetProfilePhoto: String { return self._s[2667]! } - public var Channel_About_Help: String { return self._s[2668]! } - public var Contacts_PermissionsEnable: String { return self._s[2669]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2670]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2671]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2673]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2674]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2675]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2676]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2677]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2679]! } - public var Map_OpenInYandexMaps: String { return self._s[2681]! } - public var PhotoEditor_SaturationTool: String { return self._s[2682]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2683]! } + public var Passport_Address_Region: String { return self._s[2686]! } + public var ChatList_DeleteChat: String { return self._s[2687]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2688]! } + public var PhotoEditor_TiltShift: String { return self._s[2689]! } + public var Settings_FAQ_URL: String { return self._s[2690]! } + public var Passport_Language_sl: String { return self._s[2691]! } + public var Settings_PrivacySettings: String { return self._s[2693]! } + public var SharedMedia_TitleLink: String { return self._s[2694]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2695]! } + public var Settings_SetProfilePhoto: String { return self._s[2696]! } + public var Channel_About_Help: String { return self._s[2697]! } + public var Contacts_PermissionsEnable: String { return self._s[2698]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2699]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2700]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2702]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2703]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2704]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2705]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2706]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2708]! } + public var Map_OpenInYandexMaps: String { return self._s[2710]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2711]! } + public var PhotoEditor_SaturationTool: String { return self._s[2712]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2683]!, self._r[2683]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2713]!, self._r[2713]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2684]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2685]! } - public var Appearance_TextSize: String { return self._s[2686]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2714]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2715]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2716]! } + public var Appearance_TextSize: String { return self._s[2717]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2687]!, self._r[2687]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1, "\(_2)"]) } - public var Channel_Username_InvalidTooShort: String { return self._s[2689]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2720]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2691]!, self._r[2691]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2722]!, self._r[2722]!, [_1, _2, _3]) } - public var Passport_PassportInformation: String { return self._s[2694]! } - public var WatchRemote_AlertTitle: String { return self._s[2695]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2696]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2698]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2723]! } + public var Passport_PassportInformation: String { return self._s[2726]! } + public var WatchRemote_AlertTitle: String { return self._s[2727]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2728]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2730]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2699]!, self._r[2699]!, [_0]) + return formatWithArgumentRanges(self._s[2731]!, self._r[2731]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2700]!, self._r[2700]!, [_1]) + return formatWithArgumentRanges(self._s[2732]!, self._r[2732]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2701]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2703]! } - public var AccessDenied_CameraDisabled: String { return self._s[2704]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2733]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2735]! } + public var AccessDenied_CameraDisabled: String { return self._s[2736]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2705]!, self._r[2705]!, [_0]) + return formatWithArgumentRanges(self._s[2737]!, self._r[2737]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2708]! } + public var PhotoEditor_ContrastTool: String { return self._s[2740]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2709]!, self._r[2709]!, [_1]) + return formatWithArgumentRanges(self._s[2741]!, self._r[2741]!, [_1]) } - public var DialogList_Draft: String { return self._s[2710]! } - public var Privacy_TopPeersDelete: String { return self._s[2712]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2713]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2714]! } - public var WebSearch_RecentSectionClear: String { return self._s[2715]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2717]! } - public var Common_Done: String { return self._s[2719]! } - public var AuthSessions_EmptyText: String { return self._s[2720]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2721]! } - public var Tour_Title5: String { return self._s[2722]! } + public var DialogList_Draft: String { return self._s[2742]! } + public var Privacy_TopPeersDelete: String { return self._s[2744]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2745]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2746]! } + public var WebSearch_RecentSectionClear: String { return self._s[2747]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2749]! } + public var Common_Done: String { return self._s[2751]! } + public var AuthSessions_EmptyText: String { return self._s[2752]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2753]! } + public var Tour_Title5: String { return self._s[2754]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2723]!, self._r[2723]!, [_0]) + return formatWithArgumentRanges(self._s[2755]!, self._r[2755]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2724]! } - public var Conversation_LinkDialogSave: String { return self._s[2725]! } - public var GroupInfo_ActionRestrict: String { return self._s[2726]! } - public var Checkout_Title: String { return self._s[2727]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2729]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2731]! } - public var Notification_RenamedGroup: String { return self._s[2732]! } - public var PeopleNearby_Groups: String { return self._s[2733]! } - public var Checkout_PayWithFaceId: String { return self._s[2734]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2735]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2737]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2738]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2739]! } - public var Profile_AddToExisting: String { return self._s[2741]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2756]! } + public var Conversation_LinkDialogSave: String { return self._s[2757]! } + public var GroupInfo_ActionRestrict: String { return self._s[2758]! } + public var Checkout_Title: String { return self._s[2759]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2761]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2763]! } + public var Notification_RenamedGroup: String { return self._s[2764]! } + public var PeopleNearby_Groups: String { return self._s[2765]! } + public var Checkout_PayWithFaceId: String { return self._s[2766]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2767]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2769]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2770]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2771]! } + public var Profile_AddToExisting: String { return self._s[2773]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2742]!, self._r[2742]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2774]!, self._r[2774]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2744]! } - public var Permissions_PrivacyPolicy: String { return self._s[2745]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2746]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2747]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2749]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2751]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2752]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2754]! } + public var Cache_Files: String { return self._s[2776]! } + public var Permissions_PrivacyPolicy: String { return self._s[2777]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2778]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2779]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2781]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2783]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2784]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2786]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2755]!, self._r[2755]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2756]! } - public var Passport_FieldAddressHelp: String { return self._s[2757]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2758]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2788]! } + public var Passport_FieldAddressHelp: String { return self._s[2789]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2790]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_0]) + return formatWithArgumentRanges(self._s[2791]!, self._r[2791]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2760]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2762]! } - public var Login_UnknownError: String { return self._s[2763]! } - public var Group_UpgradeNoticeText2: String { return self._s[2765]! } - public var Watch_Compose_AddContact: String { return self._s[2766]! } - public var Web_Error: String { return self._s[2767]! } - public var Gif_Search: String { return self._s[2768]! } - public var Profile_MessageLifetime1h: String { return self._s[2769]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2770]! } - public var Channel_Username_CheckingUsername: String { return self._s[2771]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2772]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2773]! } - public var Channel_AboutItem: String { return self._s[2774]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2776]! } - public var GroupInfo_SharedMedia: String { return self._s[2777]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2792]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2794]! } + public var Login_UnknownError: String { return self._s[2795]! } + public var Group_UpgradeNoticeText2: String { return self._s[2797]! } + public var Watch_Compose_AddContact: String { return self._s[2798]! } + public var Web_Error: String { return self._s[2799]! } + public var Gif_Search: String { return self._s[2800]! } + public var Profile_MessageLifetime1h: String { return self._s[2801]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2802]! } + public var Channel_Username_CheckingUsername: String { return self._s[2803]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2804]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2805]! } + public var Channel_AboutItem: String { return self._s[2806]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2808]! } + public var GroupInfo_SharedMedia: String { return self._s[2809]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2778]!, self._r[2778]!, [_1]) + return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[2779]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2811]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2780]!, self._r[2780]!, [_1]) + return formatWithArgumentRanges(self._s[2812]!, self._r[2812]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2781]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2782]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2783]! } - public var CreatePoll_AddOption: String { return self._s[2784]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2785]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2786]! } - public var Channel_Management_AddModerator: String { return self._s[2787]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2788]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2789]! } - public var NotificationsSound_Hello: String { return self._s[2790]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2791]! } - public var Channel_Stickers_Placeholder: String { return self._s[2793]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2813]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2814]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2815]! } + public var CreatePoll_AddOption: String { return self._s[2816]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2817]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2818]! } + public var Channel_Management_AddModerator: String { return self._s[2819]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2820]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2821]! } + public var NotificationsSound_Hello: String { return self._s[2822]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2823]! } + public var Channel_Stickers_Placeholder: String { return self._s[2825]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) + return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2795]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2796]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2797]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2798]! } - public var AutoDownloadSettings_Channels: String { return self._s[2799]! } - public var Passport_Language_mn: String { return self._s[2800]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2803]! } - public var Passport_Language_ja: String { return self._s[2805]! } - public var Settings_About_Title: String { return self._s[2806]! } - public var Settings_NotificationsAndSounds: String { return self._s[2807]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2808]! } - public var Settings_BlockedUsers: String { return self._s[2809]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2827]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2828]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2829]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2830]! } + public var AutoDownloadSettings_Channels: String { return self._s[2831]! } + public var Passport_Language_mn: String { return self._s[2832]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2835]! } + public var Passport_Language_ja: String { return self._s[2837]! } + public var Settings_About_Title: String { return self._s[2838]! } + public var Settings_NotificationsAndSounds: String { return self._s[2839]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2840]! } + public var Settings_BlockedUsers: String { return self._s[2841]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2810]!, self._r[2810]!, [_0]) + return formatWithArgumentRanges(self._s[2842]!, self._r[2842]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2811]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2812]! } - public var Channel_Username_Title: String { return self._s[2813]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2843]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2844]! } + public var Channel_Username_Title: String { return self._s[2845]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2814]!, self._r[2814]!, [_0]) + return formatWithArgumentRanges(self._s[2846]!, self._r[2846]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[2816]! } - public var AppleWatch_Title: String { return self._s[2817]! } - public var Activity_RecordingVideoMessage: String { return self._s[2818]! } + public var AttachmentMenu_File: String { return self._s[2848]! } + public var AppleWatch_Title: String { return self._s[2849]! } + public var Activity_RecordingVideoMessage: String { return self._s[2850]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2819]!, self._r[2819]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2851]!, self._r[2851]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[2820]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[2821]! } - public var Profile_CreateEncryptedChatError: String { return self._s[2822]! } - public var Common_Next: String { return self._s[2824]! } - public var Channel_Stickers_YourStickers: String { return self._s[2826]! } - public var Call_AudioRouteHeadphones: String { return self._s[2827]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[2829]! } - public var Watch_Contacts_NoResults: String { return self._s[2831]! } - public var PhotoEditor_TintTool: String { return self._s[2834]! } - public var LoginPassword_ResetAccount: String { return self._s[2836]! } - public var Settings_SavedMessages: String { return self._s[2837]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[2838]! } - public var Bot_GenericSupportStatus: String { return self._s[2839]! } - public var StickerPack_Add: String { return self._s[2840]! } - public var Checkout_TotalAmount: String { return self._s[2841]! } - public var Your_cards_number_is_invalid: String { return self._s[2842]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[2843]! } + public var Weekday_Saturday: String { return self._s[2852]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[2853]! } + public var Profile_CreateEncryptedChatError: String { return self._s[2854]! } + public var Common_Next: String { return self._s[2856]! } + public var Channel_Stickers_YourStickers: String { return self._s[2858]! } + public var Call_AudioRouteHeadphones: String { return self._s[2859]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[2861]! } + public var Watch_Contacts_NoResults: String { return self._s[2863]! } + public var PhotoEditor_TintTool: String { return self._s[2866]! } + public var LoginPassword_ResetAccount: String { return self._s[2868]! } + public var Settings_SavedMessages: String { return self._s[2869]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[2870]! } + public var Bot_GenericSupportStatus: String { return self._s[2871]! } + public var StickerPack_Add: String { return self._s[2872]! } + public var Checkout_TotalAmount: String { return self._s[2873]! } + public var Your_cards_number_is_invalid: String { return self._s[2874]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[2875]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2844]!, self._r[2844]!, [_0]) + return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2877]!, self._r[2877]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2846]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2878]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2848]!, self._r[2848]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2849]!, self._r[2849]!, [_0]) + return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[2850]! } - public var StickerPack_Share: String { return self._s[2851]! } - public var Passport_DeleteAddress: String { return self._s[2852]! } - public var Settings_Passport: String { return self._s[2853]! } - public var SharedMedia_EmptyFilesText: String { return self._s[2854]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[2855]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[2856]! } - public var Contacts_PermissionsText: String { return self._s[2857]! } - public var Group_Setup_HistoryVisible: String { return self._s[2858]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[2860]! } - public var SocksProxySetup_Title: String { return self._s[2861]! } - public var Notification_Mute1h: String { return self._s[2862]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[2882]! } + public var StickerPack_Share: String { return self._s[2883]! } + public var Passport_DeleteAddress: String { return self._s[2884]! } + public var Settings_Passport: String { return self._s[2885]! } + public var SharedMedia_EmptyFilesText: String { return self._s[2886]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[2887]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[2888]! } + public var Contacts_PermissionsText: String { return self._s[2889]! } + public var Group_Setup_HistoryVisible: String { return self._s[2890]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[2892]! } + public var SocksProxySetup_Title: String { return self._s[2893]! } + public var Notification_Mute1h: String { return self._s[2894]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2863]!, self._r[2863]!, [_0]) + return formatWithArgumentRanges(self._s[2895]!, self._r[2895]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[2864]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[2896]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_1]) + return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[2866]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2869]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2871]! } - public var DialogList_NoMessagesText: String { return self._s[2872]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[2873]! } - public var Privacy_Calls_P2PHelp: String { return self._s[2874]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[2876]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[2877]! } - public var Common_TakePhotoOrVideo: String { return self._s[2878]! } - public var Call_StatusBusy: String { return self._s[2879]! } - public var Conversation_PinnedMessage: String { return self._s[2880]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2881]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2882]! } - public var Undo_ChatCleared: String { return self._s[2883]! } - public var AppleWatch_ReplyPresets: String { return self._s[2884]! } - public var Passport_DiscardMessageDescription: String { return self._s[2886]! } - public var Login_NetworkError: String { return self._s[2887]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[2898]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2901]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2903]! } + public var DialogList_NoMessagesText: String { return self._s[2904]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[2905]! } + public var Privacy_Calls_P2PHelp: String { return self._s[2906]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[2908]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[2909]! } + public var Common_TakePhotoOrVideo: String { return self._s[2910]! } + public var Call_StatusBusy: String { return self._s[2911]! } + public var Conversation_PinnedMessage: String { return self._s[2912]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2913]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2914]! } + public var Undo_ChatCleared: String { return self._s[2915]! } + public var AppleWatch_ReplyPresets: String { return self._s[2916]! } + public var Passport_DiscardMessageDescription: String { return self._s[2918]! } + public var Login_NetworkError: String { return self._s[2919]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2888]!, self._r[2888]!, [_0]) + return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2889]!, self._r[2889]!, [_0]) + return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[2890]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2892]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[2922]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2924]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2894]!, self._r[2894]!, [_0]) + return formatWithArgumentRanges(self._s[2926]!, self._r[2926]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[2895]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[2896]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[2898]! } - public var ConversationMedia_Title: String { return self._s[2899]! } - public var EncryptionKey_Title: String { return self._s[2901]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[2902]! } - public var Notification_Exceptions_AddException: String { return self._s[2903]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[2904]! } - public var Profile_MessageLifetime1m: String { return self._s[2905]! } + public var Call_ConnectionErrorMessage: String { return self._s[2927]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[2928]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[2930]! } + public var ConversationMedia_Title: String { return self._s[2931]! } + public var EncryptionKey_Title: String { return self._s[2933]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[2934]! } + public var Notification_Exceptions_AddException: String { return self._s[2935]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[2936]! } + public var Profile_MessageLifetime1m: String { return self._s[2937]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2906]!, self._r[2906]!, [_1]) + return formatWithArgumentRanges(self._s[2938]!, self._r[2938]!, [_1]) } - public var Month_GenMay: String { return self._s[2907]! } + public var Month_GenMay: String { return self._s[2939]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2908]!, self._r[2908]!, [_0]) + return formatWithArgumentRanges(self._s[2940]!, self._r[2940]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[2909]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2910]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[2911]! } - public var Conversation_EmptyPlaceholder: String { return self._s[2913]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[2914]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[2915]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2916]! } - public var Camera_TapAndHoldForVideo: String { return self._s[2917]! } - public var Channel_JoinChannel: String { return self._s[2919]! } - public var Appearance_Animations: String { return self._s[2922]! } + public var PeopleNearby_Users: String { return self._s[2941]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2942]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[2943]! } + public var Conversation_EmptyPlaceholder: String { return self._s[2945]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[2946]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[2947]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2948]! } + public var Camera_TapAndHoldForVideo: String { return self._s[2949]! } + public var Channel_JoinChannel: String { return self._s[2951]! } + public var Appearance_Animations: String { return self._s[2954]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2955]!, self._r[2955]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[2925]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[2927]! } - public var Passport_Address_Street: String { return self._s[2928]! } - public var Conversation_AddContact: String { return self._s[2929]! } - public var Login_PhonePlaceholder: String { return self._s[2930]! } - public var Channel_Members_InviteLink: String { return self._s[2932]! } - public var Bot_Stop: String { return self._s[2933]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[2935]! } - public var Notification_PassportValueAddress: String { return self._s[2936]! } - public var Month_ShortJuly: String { return self._s[2937]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[2938]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[2939]! } - public var Passport_Identity_ReverseSide: String { return self._s[2940]! } - public var Watch_Stickers_Recents: String { return self._s[2943]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[2945]! } - public var Map_SendThisLocation: String { return self._s[2946]! } + public var Stickers_GroupStickers: String { return self._s[2957]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[2959]! } + public var Passport_Address_Street: String { return self._s[2960]! } + public var Conversation_AddContact: String { return self._s[2961]! } + public var Login_PhonePlaceholder: String { return self._s[2962]! } + public var Channel_Members_InviteLink: String { return self._s[2964]! } + public var Bot_Stop: String { return self._s[2965]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[2967]! } + public var Notification_PassportValueAddress: String { return self._s[2968]! } + public var Month_ShortJuly: String { return self._s[2969]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[2970]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[2971]! } + public var Passport_Identity_ReverseSide: String { return self._s[2972]! } + public var Watch_Stickers_Recents: String { return self._s[2975]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[2977]! } + public var Map_SendThisLocation: String { return self._s[2978]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2947]!, self._r[2947]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2948]!, self._r[2948]!, [_0]) - } - public var ConvertToSupergroup_Note: String { return self._s[2949]! } - public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2950]!, self._r[2950]!, [_0]) - } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[2951]! } - public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2952]!, self._r[2952]!, [_0, _1]) - } - public var Login_CallRequestState3: String { return self._s[2954]! } - public var Wallpaper_SearchShort: String { return self._s[2955]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[2957]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[2958]! } - public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_1, _2]) - } - public var Channel_AdminLogFilter_Title: String { return self._s[2960]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[2964]! } - public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_0]) - } - public var Passport_CorrectErrors: String { return self._s[2966]! } - public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2967]!, self._r[2967]!, [_0]) - } - public var Map_SendMyCurrentLocation: String { return self._s[2968]! } - public var Channel_DiscussionGroup: String { return self._s[2969]! } - public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2970]!, self._r[2970]!, [_1, _2]) - } - public var SharedMedia_SearchNoResults: String { return self._s[2971]! } - public var Permissions_NotificationsText_v0: String { return self._s[2972]! } - public var Appearance_AppIcon: String { return self._s[2973]! } - public var LoginPassword_FloodError: String { return self._s[2974]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[2976]! } - public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2977]!, self._r[2977]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[2978]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2979]!, self._r[2979]!, [_0]) } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2980]!, self._r[2980]!, [_0]) } + public var ConvertToSupergroup_Note: String { return self._s[2981]! } + public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2982]!, self._r[2982]!, [_0]) + } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[2983]! } + public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_0, _1]) + } + public var Login_CallRequestState3: String { return self._s[2986]! } + public var Wallpaper_SearchShort: String { return self._s[2987]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[2989]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[2990]! } + public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_1, _2]) + } + public var Channel_AdminLogFilter_Title: String { return self._s[2992]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[2996]! } + public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2997]!, self._r[2997]!, [_0]) + } + public var Passport_CorrectErrors: String { return self._s[2998]! } + public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_0]) + } + public var Map_SendMyCurrentLocation: String { return self._s[3000]! } + public var Channel_DiscussionGroup: String { return self._s[3001]! } + public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3002]!, self._r[3002]!, [_1, _2]) + } + public var SharedMedia_SearchNoResults: String { return self._s[3003]! } + public var Permissions_NotificationsText_v0: String { return self._s[3004]! } + public var Appearance_AppIcon: String { return self._s[3005]! } + public var LoginPassword_FloodError: String { return self._s[3006]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3008]! } + public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3009]!, self._r[3009]!, [_0]) + } + public var Passport_Language_bn: String { return self._s[3010]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_0]) + } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_0]) + } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2981]!, self._r[2981]!, [_0]) + return formatWithArgumentRanges(self._s[3013]!, self._r[3013]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[2984]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[2986]! } - public var Contacts_PermissionsAllow: String { return self._s[2987]! } - public var ReportPeer_ReasonCopyright: String { return self._s[2988]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[2989]! } - public var WallpaperPreview_Pattern: String { return self._s[2990]! } - public var Paint_Duplicate: String { return self._s[2991]! } - public var Passport_Address_Country: String { return self._s[2992]! } - public var Notification_RenamedChannel: String { return self._s[2994]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[2995]! } - public var Group_MessagePhotoUpdated: String { return self._s[2996]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[2997]! } - public var Conversation_ContextMenuBan: String { return self._s[2998]! } - public var TwoStepAuth_EmailSent: String { return self._s[2999]! } - public var MessagePoll_NoVotes: String { return self._s[3000]! } - public var Passport_Language_is: String { return self._s[3001]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3003]! } - public var Tour_Text5: String { return self._s[3004]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3016]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3018]! } + public var Contacts_PermissionsAllow: String { return self._s[3019]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3020]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3021]! } + public var WallpaperPreview_Pattern: String { return self._s[3022]! } + public var Paint_Duplicate: String { return self._s[3023]! } + public var Passport_Address_Country: String { return self._s[3024]! } + public var Notification_RenamedChannel: String { return self._s[3026]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3027]! } + public var Group_MessagePhotoUpdated: String { return self._s[3028]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3029]! } + public var Conversation_ContextMenuBan: String { return self._s[3030]! } + public var TwoStepAuth_EmailSent: String { return self._s[3031]! } + public var MessagePoll_NoVotes: String { return self._s[3032]! } + public var Passport_Language_is: String { return self._s[3033]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3035]! } + public var Tour_Text5: String { return self._s[3036]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3006]!, self._r[3006]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3007]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3008]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3009]! } - public var Paint_Edit: String { return self._s[3011]! } - public var Undo_DeletedGroup: String { return self._s[3014]! } - public var LoginPassword_ForgotPassword: String { return self._s[3015]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3016]! } + public var Undo_SecretChatDeleted: String { return self._s[3039]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3040]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3041]! } + public var Paint_Edit: String { return self._s[3043]! } + public var Undo_DeletedGroup: String { return self._s[3046]! } + public var LoginPassword_ForgotPassword: String { return self._s[3047]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3048]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3017]!, self._r[3017]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3018]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3019]! } - public var Passport_Language_uz: String { return self._s[3020]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3021]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3022]! } - public var Map_StopLiveLocation: String { return self._s[3024]! } - public var PasscodeSettings_Help: String { return self._s[3026]! } - public var NotificationsSound_Input: String { return self._s[3027]! } - public var Share_Title: String { return self._s[3030]! } - public var LogoutOptions_Title: String { return self._s[3031]! } - public var Login_TermsOfServiceAgree: String { return self._s[3032]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3033]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3034]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3035]! } - public var EnterPasscode_EnterTitle: String { return self._s[3036]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3050]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3051]! } + public var Passport_Language_uz: String { return self._s[3052]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3053]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3054]! } + public var Map_StopLiveLocation: String { return self._s[3056]! } + public var PasscodeSettings_Help: String { return self._s[3058]! } + public var NotificationsSound_Input: String { return self._s[3059]! } + public var Share_Title: String { return self._s[3062]! } + public var LogoutOptions_Title: String { return self._s[3063]! } + public var Login_TermsOfServiceAgree: String { return self._s[3064]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3065]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3066]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3067]! } + public var EnterPasscode_EnterTitle: String { return self._s[3068]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3037]!, self._r[3037]!, [_0]) + return formatWithArgumentRanges(self._s[3069]!, self._r[3069]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3038]! } - public var Conversation_AddToContacts: String { return self._s[3039]! } - public var NotificationsSound_Keys: String { return self._s[3040]! } + public var Settings_CopyPhoneNumber: String { return self._s[3070]! } + public var Conversation_AddToContacts: String { return self._s[3071]! } + public var NotificationsSound_Keys: String { return self._s[3072]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3041]!, self._r[3041]!, [_0]) + return formatWithArgumentRanges(self._s[3073]!, self._r[3073]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3042]! } - public var Message_Video: String { return self._s[3043]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3044]! } + public var Notification_MessageLifetime1w: String { return self._s[3074]! } + public var Message_Video: String { return self._s[3075]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3076]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3045]!, self._r[3045]!, [_1]) + return formatWithArgumentRanges(self._s[3077]!, self._r[3077]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_0]) + return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0]) + return formatWithArgumentRanges(self._s[3081]!, self._r[3081]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3050]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3051]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3053]! } - public var PrivacyPolicy_Decline: String { return self._s[3054]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3055]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3056]! } - public var Permissions_SiriAllow_v0: String { return self._s[3058]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3059]! } + public var Passport_Language_mk: String { return self._s[3082]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3083]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3085]! } + public var PrivacyPolicy_Decline: String { return self._s[3086]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3087]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3088]! } + public var Permissions_SiriAllow_v0: String { return self._s[3090]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3091]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3060]!, self._r[3060]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_0]) + return formatWithArgumentRanges(self._s[3093]!, self._r[3093]!, [_0]) } - public var Paint_Regular: String { return self._s[3062]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3063]! } - public var SocksProxySetup_ShareLink: String { return self._s[3064]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3065]! } - public var GroupInfo_InviteByLink: String { return self._s[3067]! } - public var MessageTimer_Custom: String { return self._s[3068]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3069]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3071]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3072]! } - public var Channel_Username_InvalidTaken: String { return self._s[3073]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3074]! } - public var Settings_ChatBackground: String { return self._s[3075]! } - public var Channel_Subscribers_Title: String { return self._s[3076]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3077]! } - public var Watch_ConnectionDescription: String { return self._s[3078]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3082]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3083]! } - public var EditProfile_Title: String { return self._s[3084]! } - public var NotificationsSound_Bamboo: String { return self._s[3086]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3088]! } - public var Login_SmsRequestState2: String { return self._s[3089]! } - public var Passport_Language_ar: String { return self._s[3090]! } + public var Paint_Regular: String { return self._s[3094]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3095]! } + public var SocksProxySetup_ShareLink: String { return self._s[3096]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3097]! } + public var GroupInfo_InviteByLink: String { return self._s[3099]! } + public var MessageTimer_Custom: String { return self._s[3100]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3101]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3103]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3104]! } + public var Channel_Username_InvalidTaken: String { return self._s[3105]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3106]! } + public var Settings_ChatBackground: String { return self._s[3107]! } + public var Channel_Subscribers_Title: String { return self._s[3108]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3109]! } + public var Watch_ConnectionDescription: String { return self._s[3110]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3114]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3115]! } + public var EditProfile_Title: String { return self._s[3116]! } + public var NotificationsSound_Bamboo: String { return self._s[3118]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3120]! } + public var Login_SmsRequestState2: String { return self._s[3121]! } + public var Passport_Language_ar: String { return self._s[3122]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3091]!, self._r[3091]!, [_0]) + return formatWithArgumentRanges(self._s[3123]!, self._r[3123]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3092]! } - public var Conversation_MessageDialogEdit: String { return self._s[3093]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3124]! } + public var Conversation_MessageDialogEdit: String { return self._s[3125]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3094]!, self._r[3094]!, [_1]) + return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_1]) } - public var Common_Close: String { return self._s[3095]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3096]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3097]! } + public var Common_Close: String { return self._s[3127]! } + public var GroupInfo_PublicLink: String { return self._s[3128]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3129]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3130]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3101]!, self._r[3101]!, [_0]) + return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3102]! } + public var UserInfo_About_Placeholder: String { return self._s[3135]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3103]!, self._r[3103]!, [_0]) + return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3104]! } - public var Channel_Info_Banned: String { return self._s[3106]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3137]! } + public var Channel_Info_Banned: String { return self._s[3139]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3107]!, self._r[3107]!, [_0]) + return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_0]) } - public var Appearance_Other: String { return self._s[3108]! } - public var Passport_Language_my: String { return self._s[3109]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3110]! } + public var Appearance_Other: String { return self._s[3141]! } + public var Passport_Language_my: String { return self._s[3142]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3143]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3144]!, self._r[3144]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3112]! } - public var Preview_CopyAddress: String { return self._s[3113]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3145]! } + public var Preview_CopyAddress: String { return self._s[3146]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3114]!, self._r[3114]!, [_0]) - } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3115]! } - public var UserInfo_BotSettings: String { return self._s[3116]! } - public var LiveLocation_MenuStopAll: String { return self._s[3118]! } - public var Passport_PasswordCreate: String { return self._s[3119]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3120]! } - public var Message_PinnedLocationMessage: String { return self._s[3121]! } - public var Map_Satellite: String { return self._s[3122]! } - public var Watch_Message_Unsupported: String { return self._s[3123]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3124]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3125]! } - public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_0, _1]) - } - public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3127]!, self._r[3127]!, [_0]) - } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3128]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3129]! } - public var NotificationsSound_None: String { return self._s[3130]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3132]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3133]! } - public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3134]!, self._r[3134]!, [_1]) - } - public var Cache_Indexing: String { return self._s[3135]! } - public var DialogList_RecentTitlePeople: String { return self._s[3137]! } - public var DialogList_EncryptionRejected: String { return self._s[3138]! } - public var GroupInfo_Administrators: String { return self._s[3139]! } - public var Passport_ScanPassportHelp: String { return self._s[3140]! } - public var Application_Name: String { return self._s[3141]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3142]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3144]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3145]! } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_0]) - } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3147]!, self._r[3147]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3148]! } - public var Privacy_ChatsTitle: String { return self._s[3149]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3150]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3151]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3152]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3153]! } - public var Group_LinkedChannel: String { return self._s[3154]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3155]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3156]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3157]! } - public var Channel_Setup_TypePublic: String { return self._s[3160]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3148]! } + public var UserInfo_BotSettings: String { return self._s[3149]! } + public var LiveLocation_MenuStopAll: String { return self._s[3151]! } + public var Passport_PasswordCreate: String { return self._s[3152]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3153]! } + public var Message_PinnedLocationMessage: String { return self._s[3154]! } + public var Map_Satellite: String { return self._s[3155]! } + public var Watch_Message_Unsupported: String { return self._s[3156]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3157]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3158]! } + public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_0, _1]) + } + public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_0]) + } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3161]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3162]! } + public var NotificationsSound_None: String { return self._s[3163]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3165]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3166]! } + public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3167]!, self._r[3167]!, [_1]) + } + public var Cache_Indexing: String { return self._s[3168]! } + public var DialogList_RecentTitlePeople: String { return self._s[3170]! } + public var DialogList_EncryptionRejected: String { return self._s[3171]! } + public var GroupInfo_Administrators: String { return self._s[3172]! } + public var Passport_ScanPassportHelp: String { return self._s[3173]! } + public var Application_Name: String { return self._s[3174]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3175]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3177]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3178]! } + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3179]!, self._r[3179]!, [_0]) + } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3180]!, self._r[3180]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3181]! } + public var Privacy_ChatsTitle: String { return self._s[3182]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3183]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3184]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3185]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3186]! } + public var Group_LinkedChannel: String { return self._s[3187]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3188]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3189]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3190]! } + public var Channel_Setup_TypePublic: String { return self._s[3193]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_0]) + return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3163]! } - public var Map_OpenInMaps: String { return self._s[3165]! } + public var Channel_TypeSetup_Title: String { return self._s[3196]! } + public var Map_OpenInMaps: String { return self._s[3198]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3166]!, self._r[3166]!, [_1]) + return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3168]! } + public var NotificationsSound_Tremolo: String { return self._s[3201]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3202]!, self._r[3202]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3170]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3171]! } - public var Passport_PasswordHelp: String { return self._s[3172]! } - public var Login_CodeExpiredError: String { return self._s[3173]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3174]! } - public var Conversation_TitleUnmute: String { return self._s[3175]! } - public var Passport_Identity_ScansHelp: String { return self._s[3176]! } - public var Passport_Language_lo: String { return self._s[3177]! } - public var Camera_FlashAuto: String { return self._s[3178]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3179]! } - public var Common_Cancel: String { return self._s[3180]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3181]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3182]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3203]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3204]! } + public var Passport_PasswordHelp: String { return self._s[3205]! } + public var Login_CodeExpiredError: String { return self._s[3206]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3207]! } + public var Conversation_TitleUnmute: String { return self._s[3208]! } + public var Passport_Identity_ScansHelp: String { return self._s[3209]! } + public var Passport_Language_lo: String { return self._s[3210]! } + public var Camera_FlashAuto: String { return self._s[3211]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3212]! } + public var Common_Cancel: String { return self._s[3213]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3214]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3215]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3183]!, self._r[3183]!, [_1]) + return formatWithArgumentRanges(self._s[3216]!, self._r[3216]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3184]! } - public var ChatSettings_Title: String { return self._s[3186]! } - public var Passport_PasswordReset: String { return self._s[3187]! } - public var SocksProxySetup_TypeNone: String { return self._s[3188]! } - public var PhoneNumberHelp_Help: String { return self._s[3190]! } - public var Checkout_EnterPassword: String { return self._s[3191]! } - public var Share_AuthTitle: String { return self._s[3193]! } - public var Activity_UploadingDocument: String { return self._s[3194]! } - public var State_Connecting: String { return self._s[3195]! } - public var Profile_MessageLifetime1w: String { return self._s[3196]! } - public var Conversation_ContextMenuReport: String { return self._s[3197]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3198]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3199]! } - public var AuthSessions_Terminate: String { return self._s[3200]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3201]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3202]! } - public var PhotoEditor_Set: String { return self._s[3203]! } - public var EmptyGroupInfo_Title: String { return self._s[3204]! } - public var Login_PadPhoneHelp: String { return self._s[3205]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3207]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3209]! } - public var NotificationsSound_Complete: String { return self._s[3210]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3211]! } - public var Group_Info_AdminLog: String { return self._s[3212]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3213]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3214]! } - public var Conversation_Admin: String { return self._s[3216]! } - public var Conversation_GifTooltip: String { return self._s[3217]! } - public var Passport_NotLoggedInMessage: String { return self._s[3218]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3217]! } + public var ChatSettings_Title: String { return self._s[3219]! } + public var Passport_PasswordReset: String { return self._s[3220]! } + public var SocksProxySetup_TypeNone: String { return self._s[3221]! } + public var PhoneNumberHelp_Help: String { return self._s[3223]! } + public var Checkout_EnterPassword: String { return self._s[3224]! } + public var Share_AuthTitle: String { return self._s[3226]! } + public var Activity_UploadingDocument: String { return self._s[3227]! } + public var State_Connecting: String { return self._s[3228]! } + public var Profile_MessageLifetime1w: String { return self._s[3229]! } + public var Conversation_ContextMenuReport: String { return self._s[3230]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3231]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3232]! } + public var AuthSessions_Terminate: String { return self._s[3233]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3234]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3235]! } + public var PhotoEditor_Set: String { return self._s[3236]! } + public var EmptyGroupInfo_Title: String { return self._s[3237]! } + public var Login_PadPhoneHelp: String { return self._s[3238]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3240]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3242]! } + public var NotificationsSound_Complete: String { return self._s[3243]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3244]! } + public var Group_Info_AdminLog: String { return self._s[3245]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3246]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3247]! } + public var Conversation_Admin: String { return self._s[3249]! } + public var Conversation_GifTooltip: String { return self._s[3250]! } + public var Passport_NotLoggedInMessage: String { return self._s[3251]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3219]!, self._r[3219]!, [_0]) + return formatWithArgumentRanges(self._s[3252]!, self._r[3252]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3220]! } - public var SharedMedia_EmptyTitle: String { return self._s[3222]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3224]! } - public var Username_Help: String { return self._s[3225]! } - public var DialogList_LanguageTooltip: String { return self._s[3227]! } - public var Map_LoadError: String { return self._s[3228]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3229]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3230]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3231]! } - public var Notification_Exceptions_NewException: String { return self._s[3232]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3233]! } - public var WatchRemote_AlertText: String { return self._s[3234]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3237]! } + public var Profile_MessageLifetimeForever: String { return self._s[3253]! } + public var SharedMedia_EmptyTitle: String { return self._s[3255]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3257]! } + public var Username_Help: String { return self._s[3258]! } + public var DialogList_LanguageTooltip: String { return self._s[3260]! } + public var Map_LoadError: String { return self._s[3261]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3262]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3263]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3264]! } + public var Notification_Exceptions_NewException: String { return self._s[3265]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3266]! } + public var WatchRemote_AlertText: String { return self._s[3267]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3270]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_0]) + return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3239]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3240]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3272]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3273]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_0]) + return formatWithArgumentRanges(self._s[3274]!, self._r[3274]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3242]!, self._r[3242]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3243]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3244]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3246]! } - public var ChatList_UndoArchiveText1: String { return self._s[3247]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3248]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3249]! } - public var Cache_ClearNone: String { return self._s[3250]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3251]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3252]! } + public var Group_AdminLog_EmptyText: String { return self._s[3276]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3277]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3279]! } + public var ChatList_UndoArchiveText1: String { return self._s[3280]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3281]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3282]! } + public var Cache_ClearNone: String { return self._s[3283]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3284]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3285]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_0]) + return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3254]! } + public var Passport_Identity_Country: String { return self._s[3287]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3255]!, self._r[3255]!, [_0]) + return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3256]!, self._r[3256]!, [_0]) + return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3257]! } - public var AccessDenied_Settings: String { return self._s[3258]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3259]! } - public var Month_ShortMay: String { return self._s[3260]! } - public var Compose_NewGroup: String { return self._s[3261]! } - public var Group_Setup_TypePrivate: String { return self._s[3263]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3265]! } - public var Appearance_ThemeDayClassic: String { return self._s[3266]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3267]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3268]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3269]! } - public var Conversation_typing: String { return self._s[3271]! } - public var Paint_Masks: String { return self._s[3272]! } - public var Username_InvalidTaken: String { return self._s[3273]! } - public var Call_StatusNoAnswer: String { return self._s[3274]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3275]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3276]! } - public var Passport_Identity_Selfie: String { return self._s[3277]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3278]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3279]! } - public var Conversation_ClearSecretHistory: String { return self._s[3280]! } - public var PeopleNearby_Description: String { return self._s[3282]! } - public var NetworkUsageSettings_Title: String { return self._s[3283]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3285]! } + public var Exceptions_AddToExceptions: String { return self._s[3290]! } + public var AccessDenied_Settings: String { return self._s[3291]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3292]! } + public var Month_ShortMay: String { return self._s[3293]! } + public var Compose_NewGroup: String { return self._s[3294]! } + public var Group_Setup_TypePrivate: String { return self._s[3296]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3298]! } + public var Appearance_ThemeDayClassic: String { return self._s[3299]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3300]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3301]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3302]! } + public var Conversation_typing: String { return self._s[3304]! } + public var Paint_Masks: String { return self._s[3305]! } + public var Username_InvalidTaken: String { return self._s[3306]! } + public var Call_StatusNoAnswer: String { return self._s[3307]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3308]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3309]! } + public var Passport_Identity_Selfie: String { return self._s[3310]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3311]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3312]! } + public var Conversation_ClearSecretHistory: String { return self._s[3313]! } + public var PeopleNearby_Description: String { return self._s[3315]! } + public var NetworkUsageSettings_Title: String { return self._s[3316]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3318]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3287]!, self._r[3287]!, [_0]) + return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_1, _2]) - } - public var SaveIncomingPhotosSettings_From: String { return self._s[3290]! } - public var Map_LiveLocationTitle: String { return self._s[3291]! } - public var Login_InfoAvatarAdd: String { return self._s[3292]! } - public var Passport_Identity_FilesView: String { return self._s[3293]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3294]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3295]! } - public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) - } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3297]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3298]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3299]! } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_1, _2, _3]) - } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3301]! } - public var Tour_Title2: String { return self._s[3302]! } - public var Conversation_FileOpenIn: String { return self._s[3303]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3304]! } - public var Wallpaper_Set: String { return self._s[3305]! } - public var Passport_Identity_Translations: String { return self._s[3307]! } - public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_0]) - } - public var Channel_LeaveChannel: String { return self._s[3309]! } - public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3310]!, self._r[3310]!, [_1]) - } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3311]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3312]! } - public var Passport_Email_Delete: String { return self._s[3313]! } - public var Conversation_Mute: String { return self._s[3315]! } - public var Channel_AddBotAsAdmin: String { return self._s[3316]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3318]! } - public var Channel_Management_LabelOwner: String { return self._s[3320]! } - public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3322]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3323]! } - public var Common_No: String { return self._s[3324]! } - public var Weekday_Sunday: String { return self._s[3325]! } - public var Notification_Reply: String { return self._s[3326]! } - public var Conversation_ViewMessage: String { return self._s[3327]! } - public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3328]!, self._r[3328]!, [_0]) - } - public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + public var SaveIncomingPhotosSettings_From: String { return self._s[3323]! } + public var Map_LiveLocationTitle: String { return self._s[3324]! } + public var Login_InfoAvatarAdd: String { return self._s[3325]! } + public var Passport_Identity_FilesView: String { return self._s[3326]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3327]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3328]! } + public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3329]!, self._r[3329]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3330]! } - public var Message_PinnedDocumentMessage: String { return self._s[3331]! } - public var DialogList_TabTitle: String { return self._s[3333]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3334]! } - public var Passport_FieldEmail: String { return self._s[3335]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3336]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3337]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3338]! } - public var Privacy_Calls_P2P: String { return self._s[3339]! } - public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { + public var ContactInfo_PhoneNumberHidden: String { return self._s[3330]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3331]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3332]! } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_1, _2, _3]) + } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3334]! } + public var Tour_Title2: String { return self._s[3335]! } + public var Conversation_FileOpenIn: String { return self._s[3336]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3337]! } + public var Wallpaper_Set: String { return self._s[3338]! } + public var Passport_Identity_Translations: String { return self._s[3340]! } + public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3342]! } - public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_1, _2]) + public var Channel_LeaveChannel: String { return self._s[3342]! } + public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_1]) } - public var Stickers_ClearRecent: String { return self._s[3344]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3345]! } - public var Passport_InfoText: String { return self._s[3346]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3347]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3344]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3345]! } + public var Passport_Email_Delete: String { return self._s[3346]! } + public var Conversation_Mute: String { return self._s[3348]! } + public var Channel_AddBotAsAdmin: String { return self._s[3349]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3351]! } + public var Channel_Management_LabelOwner: String { return self._s[3353]! } + public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_1, _2]) + } + public var Calls_CallTabDescription: String { return self._s[3355]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3356]! } + public var Common_No: String { return self._s[3357]! } + public var Weekday_Sunday: String { return self._s[3358]! } + public var Notification_Reply: String { return self._s[3359]! } + public var Conversation_ViewMessage: String { return self._s[3360]! } + public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3361]!, self._r[3361]!, [_0]) + } + public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_0]) + } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3363]! } + public var Message_PinnedDocumentMessage: String { return self._s[3364]! } + public var DialogList_TabTitle: String { return self._s[3366]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3367]! } + public var Passport_FieldEmail: String { return self._s[3368]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3369]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3370]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3371]! } + public var Privacy_Calls_P2P: String { return self._s[3372]! } + public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3374]!, self._r[3374]!, [_0]) + } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3375]! } + public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_1, _2]) + } + public var Stickers_ClearRecent: String { return self._s[3377]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3378]! } + public var Passport_InfoText: String { return self._s[3379]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3380]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3348]!, self._r[3348]!, [_0]) + return formatWithArgumentRanges(self._s[3381]!, self._r[3381]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3382]!, self._r[3382]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3350]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3351]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3353]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3354]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3383]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3384]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3386]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3387]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3357]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3390]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_0]) + return formatWithArgumentRanges(self._s[3392]!, self._r[3392]!, [_0]) } - public var DialogList_Unread: String { return self._s[3360]! } + public var DialogList_Unread: String { return self._s[3393]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3361]!, self._r[3361]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3362]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3363]! } + public var User_DeletedAccount: String { return self._s[3395]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3396]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_0]) - } - public var UserInfo_NotificationsDefault: String { return self._s[3365]! } - public var SharedMedia_CategoryMedia: String { return self._s[3366]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3367]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3368]! } - public var Watch_ChatList_Compose: String { return self._s[3369]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3370]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3371]! } - public var Watch_Microphone_Access: String { return self._s[3372]! } - public var Group_Setup_HistoryHeader: String { return self._s[3373]! } - public var Activity_UploadingPhoto: String { return self._s[3374]! } - public var Conversation_Edit: String { return self._s[3376]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3377]! } - public var Login_TermsOfServiceDecline: String { return self._s[3378]! } - public var Message_PinnedContactMessage: String { return self._s[3379]! } - public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3380]!, self._r[3380]!, [_1, _2]) - } - public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3381]!, self._r[3381]!, [_1, _2, _3, _4, _5]) - } - public var Appearance_LargeEmoji: String { return self._s[3382]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3384]! } - public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3385]!, self._r[3385]!, [_1, _2]) - } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3386]! } - public var Message_PinnedPhotoMessage: String { return self._s[3387]! } - public var Passport_FieldPhone: String { return self._s[3388]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3389]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3390]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3392]! } - public var Conversation_Call: String { return self._s[3393]! } - public var Common_TakePhoto: String { return self._s[3395]! } - public var Channel_NotificationLoading: String { return self._s[3396]! } - public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_0]) } + public var UserInfo_NotificationsDefault: String { return self._s[3398]! } + public var SharedMedia_CategoryMedia: String { return self._s[3399]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3400]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3401]! } + public var Watch_ChatList_Compose: String { return self._s[3402]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3403]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3404]! } + public var Watch_Microphone_Access: String { return self._s[3405]! } + public var Group_Setup_HistoryHeader: String { return self._s[3406]! } + public var Map_SetThisLocation: String { return self._s[3407]! } + public var Activity_UploadingPhoto: String { return self._s[3408]! } + public var Conversation_Edit: String { return self._s[3410]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3411]! } + public var Login_TermsOfServiceDecline: String { return self._s[3412]! } + public var Message_PinnedContactMessage: String { return self._s[3413]! } + public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3414]!, self._r[3414]!, [_1, _2]) + } + public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_1, _2, _3, _4, _5]) + } + public var Appearance_LargeEmoji: String { return self._s[3416]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3418]! } + public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_1, _2]) + } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3420]! } + public var Message_PinnedPhotoMessage: String { return self._s[3421]! } + public var Passport_FieldPhone: String { return self._s[3422]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3423]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3424]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3426]! } + public var Conversation_Call: String { return self._s[3427]! } + public var Common_TakePhoto: String { return self._s[3429]! } + public var Channel_NotificationLoading: String { return self._s[3430]! } + public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3431]!, self._r[3431]!, [_0]) + } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_1]) + return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3399]! } + public var Permissions_SiriTitle_v0: String { return self._s[3433]! } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3400]!, self._r[3400]!, [_0]) + return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3401]! } - public var Common_edit: String { return self._s[3402]! } - public var PrivacySettings_AuthSessions: String { return self._s[3403]! } - public var Month_ShortJune: String { return self._s[3404]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3405]! } - public var Call_ReportSend: String { return self._s[3406]! } - public var Watch_LastSeen_JustNow: String { return self._s[3407]! } - public var Notifications_MessageNotifications: String { return self._s[3408]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3409]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3411]! } - public var Group_Status: String { return self._s[3412]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3435]! } + public var Common_edit: String { return self._s[3436]! } + public var PrivacySettings_AuthSessions: String { return self._s[3437]! } + public var Month_ShortJune: String { return self._s[3438]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3439]! } + public var Call_ReportSend: String { return self._s[3440]! } + public var Watch_LastSeen_JustNow: String { return self._s[3441]! } + public var Notifications_MessageNotifications: String { return self._s[3442]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3443]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3445]! } + public var Group_Status: String { return self._s[3446]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3413]!, self._r[3413]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3447]!, self._r[3447]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3414]! } - public var ShareMenu_ShareTo: String { return self._s[3415]! } - public var Conversation_Moderate_Ban: String { return self._s[3416]! } + public var TextFormat_AddLinkTitle: String { return self._s[3448]! } + public var ShareMenu_ShareTo: String { return self._s[3449]! } + public var Conversation_Moderate_Ban: String { return self._s[3450]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3417]!, self._r[3417]!, [_0]) + return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3418]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3419]! } + public var SharedMedia_ViewInChat: String { return self._s[3452]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3453]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3420]!, self._r[3420]!, [_1]) + return formatWithArgumentRanges(self._s[3454]!, self._r[3454]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3421]!, self._r[3421]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3423]!, self._r[3423]!, [_0]) + return formatWithArgumentRanges(self._s[3457]!, self._r[3457]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3424]! } - public var Appearance_ReduceMotion: String { return self._s[3425]! } + public var Map_OpenInHereMaps: String { return self._s[3458]! } + public var Appearance_ReduceMotion: String { return self._s[3459]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3460]!, self._r[3460]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3427]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3428]! } - public var PhotoEditor_Skip: String { return self._s[3429]! } + public var Channel_Setup_TypePublicHelp: String { return self._s[3461]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3462]! } + public var PhotoEditor_Skip: String { return self._s[3463]! } public func MessageTimer_Weeks(_ 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_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[1 * 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[2 * 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[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func Conversation_StatusSubscribers(_ 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 Passport_Scans(_ 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[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ 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 Watch_UserInfo_Mute(_ 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[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ 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[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocationUpdated_MinutesAgo(_ 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[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Months(_ 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[9 * 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[10 * 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[11 * 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[12 * 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[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 PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: 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[15 * 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[16 * 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[17 * 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[18 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - 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[19 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortDays(_ 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 Forward_ConfirmMultipleFiles(_ 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 Call_Seconds(_ 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 StickerPack_RemoveMaskCount(_ 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 Notification_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 Chat_DeleteMessagesConfirmation(_ 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 SharedMedia_Link(_ 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 Conversation_StatusOnline(_ 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 Notification_GameScoreExtended(_ 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 LiveLocation_MenuChatsCount(_ 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 ForwardedPolls(_ 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 Notifications_ExceptionMuteExpires_Minutes(_ 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 MessageTimer_Days(_ 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 ForwardedAudios(_ 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 ForwardedVideoMessages(_ 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_LastSeen_MinutesAgo(_ 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 MessageTimer_ShortMinutes(_ 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 PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, _1, _2) - } - 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 Call_Minutes(_ 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 AttachmentMenu_SendVideo(_ 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 Watch_LastSeen_HoursAgo(_ 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 Notifications_ExceptionMuteExpires_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) + return String(format: self._ps[10 * 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[45 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ 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[46 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[12 * 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[13 * 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[14 * 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[15 * 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[16 * 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[17 * 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[47 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 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[19 * 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[20 * 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[21 * 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[22 * 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[23 * 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[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 ForwardedGifs(_ 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_RemoveStickerCount(_ 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 MuteFor_Hours(_ 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 ForwardedPolls(_ 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 Conversation_StatusMembers(_ 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 Call_Minutes(_ 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 Passport_Scans(_ 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 Notification_GameScoreSelfSimple(_ 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_AddMaskCount(_ 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_PHOTOS(_ 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) + return String(format: self._ps[36 * 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[37 * 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[38 * 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[39 * 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[40 * 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[41 * 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[42 * 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[43 * 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[44 * 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[45 * 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[46 * 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[47 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ServiceMessage_GameScoreSelfSimple(_ 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 ServiceMessage_GameScoreSelfExtended(_ 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 Conversation_LiveLocationMembersCount(_ 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[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 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 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 ForwardedPhotos(_ 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 SharedMedia_Photo(_ 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 Media_ShareItem(_ 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 ServiceMessage_GameScoreExtended(_ 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 Media_ShareVideo(_ 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 Notification_GameScoreSimple(_ 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 Map_ETAHours(_ 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 AttachmentMenu_SendItem(_ 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_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[62 * 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[63 * 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[64 * 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[65 * 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[66 * 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[67 * 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[68 * 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[69 * 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[70 * 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[71 * 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[72 * 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[73 * 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[74 * 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[75 * 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[76 * 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[77 * 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[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 SharedMedia_Video(_ 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 LastSeen_HoursAgo(_ 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 MessagePoll_VotedCount(_ 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[51 * 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[83 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Years(_ 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[84 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Days(_ value: Int32) -> String { + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[54 * 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[85 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Hours(_ 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[86 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[56 * 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[57 * 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[58 * 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[87 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_Exceptions(_ 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[88 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Generic(_ 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[89 * 6 + Int(form.rawValue)]!, stringValue) + 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[90 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Conversation_StatusSubscribers(_ 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[91 * 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[92 * 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[93 * 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[94 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func QuickSend_Photos(_ 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[62 * 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[96 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Minutes(_ 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[97 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedStickers(_ 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[98 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[65 * 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[66 * 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[67 * 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[68 * 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[69 * 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[70 * 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[71 * 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[72 * 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[73 * 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[74 * 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[75 * 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[76 * 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[77 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Hours(_ 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 Conversation_LiveLocationMembersCount(_ 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_SelectedChats(_ 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 Watch_UserInfo_Mute(_ 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_CHANNEL_MESSAGES(_ 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 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 Notifications_ExceptionMuteExpires_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 Watch_LastSeen_MinutesAgo(_ 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_Generic(_ 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_ROUNDS(_ 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 SharedMedia_DeleteItemsConfirmation(_ 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 ForwardedContacts(_ 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 Wallpaper_DeleteConfirmation(_ 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 CreatePoll_AddMoreOptions(_ 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 AttachmentMenu_SendVideo(_ 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_ShortWeeks(_ 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_Photo(_ 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 PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + 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[96 * 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[97 * 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[98 * 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[99 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_File(_ 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[100 * 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[101 * 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[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 MuteExpires_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 InviteText_ContactsCountText(_ 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[103 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { + 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[104 * 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[105 * 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[105 * 6 + Int(form.rawValue)]!, _0, _1) } - public func PasscodeSettings_FailedAttempts(_ 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[106 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_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[107 * 6 + Int(form.rawValue)]!, stringValue) } - init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { + public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { self.primaryComponent = primaryComponent self.secondaryComponent = secondaryComponent self.groupingSeparator = groupingSeparator diff --git a/submodules/TelegramUI/TelegramUI/PresentationTheme.swift b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift similarity index 97% rename from submodules/TelegramUI/TelegramUI/PresentationTheme.swift rename to submodules/TelegramPresentationData/Sources/PresentationTheme.swift index 5e44d67453..f931624977 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationTheme.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import TelegramCore +import TelegramUIPreferences public enum PresentationThemeParsingError: Error { case generic @@ -68,7 +69,7 @@ public enum PresentationThemeStatusBarStyle: Int32 { } } - var style: StatusBarStyle { + public var style: StatusBarStyle { switch self { case .black: return .Black @@ -387,6 +388,8 @@ public final class PresentationThemeChatList { public let messageDraftTextColor: UIColor public let checkmarkColor: UIColor public let pendingIndicatorColor: UIColor + public let failedFillColor: UIColor + public let failedForegroundColor: UIColor public let muteIconColor: UIColor public let unreadBadgeActiveBackgroundColor: UIColor public let unreadBadgeActiveTextColor: UIColor @@ -405,7 +408,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, 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, searchBarKeyboardColor: PresentationThemeKeyboardColor, verifiedIconFillColor: UIColor, verifiedIconForegroundColor: UIColor, secretIconColor: UIColor, pinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors, unpinnedArchiveAvatarColor: PresentationThemeArchiveAvatarColors, onlineDotColor: UIColor) { self.backgroundColor = backgroundColor self.itemSeparatorColor = itemSeparatorColor self.itemBackgroundColor = itemBackgroundColor @@ -420,6 +423,8 @@ public final class PresentationThemeChatList { self.messageDraftTextColor = messageDraftTextColor self.checkmarkColor = checkmarkColor self.pendingIndicatorColor = pendingIndicatorColor + self.failedFillColor = failedFillColor + self.failedForegroundColor = failedForegroundColor self.muteIconColor = muteIconColor self.unreadBadgeActiveBackgroundColor = unreadBadgeActiveBackgroundColor self.unreadBadgeActiveTextColor = unreadBadgeActiveTextColor @@ -503,11 +508,11 @@ public func bubbleVariableColor(variableColor: PresentationThemeVariableColor, w } public final class PresentationThemeChatBubblePolls { - let radioButton: UIColor - let radioProgress: UIColor - let highlight: UIColor - let separator: UIColor - let bar: UIColor + public let radioButton: UIColor + public let radioProgress: UIColor + public let highlight: UIColor + public let separator: UIColor + public let bar: UIColor public init(radioButton: UIColor, radioProgress: UIColor, highlight: UIColor, separator: UIColor, bar: UIColor) { self.radioButton = radioButton @@ -905,7 +910,7 @@ public enum PresentationThemeBuiltinName { case nightGrayscale case nightAccent - var reference: PresentationBuiltinThemeReference { + public var reference: PresentationBuiltinThemeReference { switch self { case .dayClassic: return .dayClassic diff --git a/submodules/TelegramUI/TelegramUI/PresentationsResourceCache.swift b/submodules/TelegramPresentationData/Sources/PresentationsResourceCache.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/PresentationsResourceCache.swift rename to submodules/TelegramPresentationData/Sources/PresentationsResourceCache.swift diff --git a/submodules/TelegramUI/TelegramUI/StringPluralization.swift b/submodules/TelegramPresentationData/Sources/StringPluralization.swift similarity index 96% rename from submodules/TelegramUI/TelegramUI/StringPluralization.swift rename to submodules/TelegramPresentationData/Sources/StringPluralization.swift index f07a89967e..6eccf01d42 100644 --- a/submodules/TelegramUI/TelegramUI/StringPluralization.swift +++ b/submodules/TelegramPresentationData/Sources/StringPluralization.swift @@ -1,7 +1,5 @@ import Foundation -import TelegramUIPrivateModule - enum PluralizationForm: Int32 { case zero = 0 case one = 1 diff --git a/submodules/TelegramPresentationData/Sources/TelegramPresentationData.h b/submodules/TelegramPresentationData/Sources/TelegramPresentationData.h new file mode 100644 index 0000000000..d2dfa86ab0 --- /dev/null +++ b/submodules/TelegramPresentationData/Sources/TelegramPresentationData.h @@ -0,0 +1,10 @@ +#import + +//! Project version number for TelegramPresentationData. +FOUNDATION_EXPORT double TelegramPresentationDataVersionNumber; + +//! Project version string for TelegramPresentationData. +FOUNDATION_EXPORT const unsigned char TelegramPresentationDataVersionString[]; + +#import +#import diff --git a/submodules/TelegramPresentationData/TelegramPresentationData_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramPresentationData/TelegramPresentationData_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..9adf6a8b06 --- /dev/null +++ b/submodules/TelegramPresentationData/TelegramPresentationData_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,619 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D0AE31AB22B273F20058D3BC /* TelegramPresentationData.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE31A922B273F20058D3BC /* TelegramPresentationData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE31B422B2746B0058D3BC /* PresentationStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31B122B2746B0058D3BC /* PresentationStrings.swift */; }; + D0AE31B522B2746B0058D3BC /* PresentationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31B222B2746B0058D3BC /* PresentationData.swift */; }; + D0AE31B622B2746B0058D3BC /* PresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31B322B2746B0058D3BC /* PresentationTheme.swift */; }; + D0AE31B922B2747A0058D3BC /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE31B822B2747A0058D3BC /* SwiftSignalKit.framework */; }; + D0AE31BB22B2747F0058D3BC /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE31BA22B2747F0058D3BC /* Postbox.framework */; }; + D0AE31BD22B274830058D3BC /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE31BC22B274830058D3BC /* TelegramCore.framework */; }; + D0AE31BF22B274950058D3BC /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE31BE22B274950058D3BC /* Display.framework */; }; + D0AE31C322B274E90058D3BC /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE31C222B274E90058D3BC /* TelegramUIPreferences.framework */; }; + D0AE31C522B279720058D3BC /* StringPluralization.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31C422B279720058D3BC /* StringPluralization.swift */; }; + D0AE31C822B2799B0058D3BC /* NumberPluralizationForm.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE31C622B2799B0058D3BC /* NumberPluralizationForm.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE31C922B2799B0058D3BC /* NumberPluralizationForm.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31C722B2799B0058D3BC /* NumberPluralizationForm.m */; }; + D0AE31CB22B279D00058D3BC /* NumericFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31CA22B279D00058D3BC /* NumericFormat.swift */; }; + D0AE31CD22B279FD0058D3BC /* PresentationsResourceCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31CC22B279FD0058D3BC /* PresentationsResourceCache.swift */; }; + D0AE31D222B27A780058D3BC /* DefaultDarkPresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31CE22B27A780058D3BC /* DefaultDarkPresentationTheme.swift */; }; + D0AE31D322B27A780058D3BC /* DefaultDarkAccentPresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31CF22B27A780058D3BC /* DefaultDarkAccentPresentationTheme.swift */; }; + D0AE31D422B27A780058D3BC /* DefaultPresentationStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31D022B27A780058D3BC /* DefaultPresentationStrings.swift */; }; + D0AE31D522B27A780058D3BC /* DefaultPresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31D122B27A780058D3BC /* DefaultPresentationTheme.swift */; }; + D0AE31D822B27AAF0058D3BC /* EDSunriseSet.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE31D622B27AAE0058D3BC /* EDSunriseSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE31D922B27AAF0058D3BC /* EDSunriseSet.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE31D722B27AAE0058D3BC /* EDSunriseSet.m */; }; + D0AE321422B2826A0058D3BC /* ComponentsThemes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE321322B282690058D3BC /* ComponentsThemes.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D0AE31A622B273F20058D3BC /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31A922B273F20058D3BC /* TelegramPresentationData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramPresentationData.h; sourceTree = ""; }; + D0AE31AA22B273F20058D3BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE31B122B2746B0058D3BC /* PresentationStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationStrings.swift; sourceTree = ""; }; + D0AE31B222B2746B0058D3BC /* PresentationData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationData.swift; sourceTree = ""; }; + D0AE31B322B2746B0058D3BC /* PresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationTheme.swift; sourceTree = ""; }; + D0AE31B822B2747A0058D3BC /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31BA22B2747F0058D3BC /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31BC22B274830058D3BC /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31BE22B274950058D3BC /* Display.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Display.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31C222B274E90058D3BC /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE31C422B279720058D3BC /* StringPluralization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringPluralization.swift; sourceTree = ""; }; + D0AE31C622B2799B0058D3BC /* NumberPluralizationForm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberPluralizationForm.h; sourceTree = ""; }; + D0AE31C722B2799B0058D3BC /* NumberPluralizationForm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NumberPluralizationForm.m; sourceTree = ""; }; + D0AE31CA22B279D00058D3BC /* NumericFormat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericFormat.swift; sourceTree = ""; }; + D0AE31CC22B279FD0058D3BC /* PresentationsResourceCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationsResourceCache.swift; sourceTree = ""; }; + D0AE31CE22B27A780058D3BC /* DefaultDarkPresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultDarkPresentationTheme.swift; sourceTree = ""; }; + D0AE31CF22B27A780058D3BC /* DefaultDarkAccentPresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultDarkAccentPresentationTheme.swift; sourceTree = ""; }; + D0AE31D022B27A780058D3BC /* DefaultPresentationStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultPresentationStrings.swift; sourceTree = ""; }; + D0AE31D122B27A780058D3BC /* DefaultPresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultPresentationTheme.swift; sourceTree = ""; }; + D0AE31D622B27AAE0058D3BC /* EDSunriseSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EDSunriseSet.h; sourceTree = ""; }; + D0AE31D722B27AAE0058D3BC /* EDSunriseSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EDSunriseSet.m; sourceTree = ""; }; + D0AE321322B282690058D3BC /* ComponentsThemes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComponentsThemes.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE31A322B273F20058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE31C322B274E90058D3BC /* TelegramUIPreferences.framework in Frameworks */, + D0AE31BF22B274950058D3BC /* Display.framework in Frameworks */, + D0AE31BD22B274830058D3BC /* TelegramCore.framework in Frameworks */, + D0AE31BB22B2747F0058D3BC /* Postbox.framework in Frameworks */, + D0AE31B922B2747A0058D3BC /* SwiftSignalKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0AE319C22B273F20058D3BC = { + isa = PBXGroup; + children = ( + D0AE31AA22B273F20058D3BC /* Info.plist */, + D0AE31A822B273F20058D3BC /* Sources */, + D0AE31A722B273F20058D3BC /* Products */, + D0AE31B722B2747A0058D3BC /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE31A722B273F20058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE31A622B273F20058D3BC /* TelegramPresentationData.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE31A822B273F20058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE321322B282690058D3BC /* ComponentsThemes.swift */, + D0AE31D622B27AAE0058D3BC /* EDSunriseSet.h */, + D0AE31D722B27AAE0058D3BC /* EDSunriseSet.m */, + D0AE31CF22B27A780058D3BC /* DefaultDarkAccentPresentationTheme.swift */, + D0AE31CE22B27A780058D3BC /* DefaultDarkPresentationTheme.swift */, + D0AE31D022B27A780058D3BC /* DefaultPresentationStrings.swift */, + D0AE31D122B27A780058D3BC /* DefaultPresentationTheme.swift */, + D0AE31CC22B279FD0058D3BC /* PresentationsResourceCache.swift */, + D0AE31CA22B279D00058D3BC /* NumericFormat.swift */, + D0AE31C622B2799B0058D3BC /* NumberPluralizationForm.h */, + D0AE31C722B2799B0058D3BC /* NumberPluralizationForm.m */, + D0AE31C422B279720058D3BC /* StringPluralization.swift */, + D0AE31B222B2746B0058D3BC /* PresentationData.swift */, + D0AE31B122B2746B0058D3BC /* PresentationStrings.swift */, + D0AE31B322B2746B0058D3BC /* PresentationTheme.swift */, + D0AE31A922B273F20058D3BC /* TelegramPresentationData.h */, + ); + path = Sources; + sourceTree = ""; + }; + D0AE31B722B2747A0058D3BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0AE31C222B274E90058D3BC /* TelegramUIPreferences.framework */, + D0AE31BE22B274950058D3BC /* Display.framework */, + D0AE31BC22B274830058D3BC /* TelegramCore.framework */, + D0AE31BA22B2747F0058D3BC /* Postbox.framework */, + D0AE31B822B2747A0058D3BC /* SwiftSignalKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE31A122B273F20058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE31D822B27AAF0058D3BC /* EDSunriseSet.h in Headers */, + D0AE31C822B2799B0058D3BC /* NumberPluralizationForm.h in Headers */, + D0AE31AB22B273F20058D3BC /* TelegramPresentationData.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE31A522B273F20058D3BC /* TelegramPresentationData */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE31AE22B273F20058D3BC /* Build configuration list for PBXNativeTarget "TelegramPresentationData" */; + buildPhases = ( + D0AE31A122B273F20058D3BC /* Headers */, + D0AE31A222B273F20058D3BC /* Sources */, + D0AE31A322B273F20058D3BC /* Frameworks */, + D0AE31A422B273F20058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelegramPresentationData; + productName = TelegramPresentationData; + productReference = D0AE31A622B273F20058D3BC /* TelegramPresentationData.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE319D22B273F20058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE31A522B273F20058D3BC = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D0AE31A022B273F20058D3BC /* Build configuration list for PBXProject "TelegramPresentationData_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE319C22B273F20058D3BC; + productRefGroup = D0AE31A722B273F20058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE31A522B273F20058D3BC /* TelegramPresentationData */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE31A422B273F20058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE31A222B273F20058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE31D522B27A780058D3BC /* DefaultPresentationTheme.swift in Sources */, + D0AE31D422B27A780058D3BC /* DefaultPresentationStrings.swift in Sources */, + D0AE31CB22B279D00058D3BC /* NumericFormat.swift in Sources */, + D0AE31B422B2746B0058D3BC /* PresentationStrings.swift in Sources */, + D0AE321422B2826A0058D3BC /* ComponentsThemes.swift in Sources */, + D0AE31C522B279720058D3BC /* StringPluralization.swift in Sources */, + D0AE31CD22B279FD0058D3BC /* PresentationsResourceCache.swift in Sources */, + D0AE31C922B2799B0058D3BC /* NumberPluralizationForm.m in Sources */, + D0AE31D922B27AAF0058D3BC /* EDSunriseSet.m in Sources */, + D0AE31B522B2746B0058D3BC /* PresentationData.swift in Sources */, + D0AE31D322B27A780058D3BC /* DefaultDarkAccentPresentationTheme.swift in Sources */, + D0AE31B622B2746B0058D3BC /* PresentationTheme.swift in Sources */, + D0AE31D222B27A780058D3BC /* DefaultDarkPresentationTheme.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B6022B5BEF600AD4DE8 /* 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; + }; + D0A25B6122B5BEF600AD4DE8 /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramPresentationData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B7922B5BF4400AD4DE8 /* 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; + }; + D0A25B7A22B5BF4400AD4DE8 /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramPresentationData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE31AC22B273F20058D3BC /* 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; + }; + D0AE31AD22B273F20058D3BC /* 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; + }; + D0AE31AF22B273F20058D3BC /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramPresentationData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE31B022B273F20058D3BC /* 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"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramPresentationData; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE31A022B273F20058D3BC /* Build configuration list for PBXProject "TelegramPresentationData_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE31AC22B273F20058D3BC /* DebugAppStoreLLC */, + D0A25B6022B5BEF600AD4DE8 /* DebugHockeyapp */, + D0AE31AD22B273F20058D3BC /* ReleaseAppStoreLLC */, + D0A25B7922B5BF4400AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE31AE22B273F20058D3BC /* Build configuration list for PBXNativeTarget "TelegramPresentationData" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE31AF22B273F20058D3BC /* DebugAppStoreLLC */, + D0A25B6122B5BEF600AD4DE8 /* DebugHockeyapp */, + D0AE31B022B273F20058D3BC /* ReleaseAppStoreLLC */, + D0A25B7A22B5BF4400AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE319D22B273F20058D3BC /* Project object */; +} diff --git a/submodules/TelegramUI/BUCK b/submodules/TelegramUI/BUCK index faa9336477..d1176c0a40 100644 --- a/submodules/TelegramUI/BUCK +++ b/submodules/TelegramUI/BUCK @@ -72,8 +72,6 @@ apple_library( 'TelegramUI/DeviceProximityManager.h', 'TelegramUI/RaiseToListenActivator.h', 'TelegramUI/TGMimeTypeMap.h', - 'TelegramUI/TGEmojiSuggestions.h', - 'TelegramUI/TGChannelIntroController.h', 'TelegramUI/EDSunriseSet.h', 'TelegramUI/TGBridgeAudioDecoder.h', 'TelegramUI/TGBridgeAudioEncoder.h', diff --git a/submodules/TelegramUI/Images.xcassets/Location/Contents.json b/submodules/TelegramUI/Images.xcassets/Location/Contents.json new file mode 100644 index 0000000000..38f0c81fc2 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Location/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "provides-namespace" : true + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/Contents.json new file mode 100644 index 0000000000..df6bbfa164 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "createlocalgroup@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "createlocalgroup@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@2x.png b/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@2x.png new file mode 100644 index 0000000000..805b561cbe Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@3x.png b/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@3x.png new file mode 100644 index 0000000000..055212f537 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Location/CreateGroupIcon.imageset/createlocalgroup@3x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/Contents.json new file mode 100644 index 0000000000..f50f2d59d9 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "map_dark@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "map_dark@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/map_dark@2x.png b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/map_dark@2x.png new file mode 100644 index 0000000000..69761bb411 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/map_dark@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/map_dark@3x.png b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/map_dark@3x.png new file mode 100644 index 0000000000..5c528aac8b Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupDarkIcon.imageset/map_dark@3x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/Contents.json new file mode 100644 index 0000000000..3b79c9ae92 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "map_day@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "map_day@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/map_day@2x.png b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/map_day@2x.png new file mode 100644 index 0000000000..6c9f48299f Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/map_day@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/map_day@3x.png b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/map_day@3x.png new file mode 100644 index 0000000000..8b44f5c0f3 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Location/LocalGroupLightIcon.imageset/map_day@3x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Artboard Copy@2x.png b/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Artboard Copy@2x.png new file mode 100644 index 0000000000..b9f40b7ed7 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Artboard Copy@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Artboard Copy@3x.png b/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Artboard Copy@3x.png new file mode 100644 index 0000000000..ced1e1dd5d Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Artboard Copy@3x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Contents.json new file mode 100644 index 0000000000..80bd43b4f7 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Peer Info/LocationIcon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Artboard Copy@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Artboard Copy@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/TelegramUI/AccessoryPanelNode.swift b/submodules/TelegramUI/TelegramUI/AccessoryPanelNode.swift index 68d3c87daa..067fe48fc8 100644 --- a/submodules/TelegramUI/TelegramUI/AccessoryPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/AccessoryPanelNode.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import AsyncDisplayKit +import TelegramPresentationData class AccessoryPanelNode: ASDisplayNode { var dismiss: (() -> Void)? diff --git a/submodules/TelegramUI/TelegramUI/AccountContext.swift b/submodules/TelegramUI/TelegramUI/AccountContext.swift index 86e1ecd65d..cfd6b6b6b5 100644 --- a/submodules/TelegramUI/TelegramUI/AccountContext.swift +++ b/submodules/TelegramUI/TelegramUI/AccountContext.swift @@ -4,6 +4,8 @@ import UIKit import Postbox import TelegramCore import Display +import DeviceAccess +import TelegramPresentationData public final class TelegramApplicationOpenUrlCompletion { public let completion: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/AccountUtils.swift b/submodules/TelegramUI/TelegramUI/AccountUtils.swift index 875895197e..1b304eb172 100644 --- a/submodules/TelegramUI/TelegramUI/AccountUtils.swift +++ b/submodules/TelegramUI/TelegramUI/AccountUtils.swift @@ -2,6 +2,7 @@ import Foundation import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences func activeAccountsAndPeers(context: AccountContext) -> Signal<((Account, Peer)?, [(Account, Peer, Int32)]), NoError> { let sharedContext = context.sharedContext diff --git a/submodules/TelegramUI/TelegramUI/ActionSheetPeerItem.swift b/submodules/TelegramUI/TelegramUI/ActionSheetPeerItem.swift index c0b75d3107..7f73d5f8d3 100644 --- a/submodules/TelegramUI/TelegramUI/ActionSheetPeerItem.swift +++ b/submodules/TelegramUI/TelegramUI/ActionSheetPeerItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import Postbox +import TelegramPresentationData public class ActionSheetPeerItem: ActionSheetItem { public let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ActivityIndicator.swift b/submodules/TelegramUI/TelegramUI/ActivityIndicator.swift index 11b6ca974b..8b5c75e40a 100644 --- a/submodules/TelegramUI/TelegramUI/ActivityIndicator.swift +++ b/submodules/TelegramUI/TelegramUI/ActivityIndicator.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import AsyncDisplayKit +import TelegramPresentationData private func convertIndicatorColor(_ color: UIColor) -> UIColor { if color.isEqual(UIColor(rgb: 0x007ee5)) { diff --git a/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift b/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift index e0e7f8b08e..d565c29669 100644 --- a/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift +++ b/submodules/TelegramUI/TelegramUI/AnimatedStickerUtils.swift @@ -1,10 +1,13 @@ import Foundation import UIKit import SwiftSignalKit +import Postbox import Display import AVFoundation import Lottie import TelegramUIPrivateModule +import Compression +import GZip private func validateAnimationItems(_ items: [Any]?, shapes: Bool = true) -> Bool { if let items = items { @@ -77,6 +80,180 @@ func validateAnimationComposition(json: [AnyHashable: Any]) -> Bool { return true } +@available(iOS 9.0, *) +func experimentalConvertCompressedLottieToCombinedMp4(data: Data, size: CGSize) -> Signal { + return Signal({ subscriber in + let queue = Queue() + + queue.async { + let startTime = CACurrentMediaTime() + var drawingTime: Double = 0 + var appendingTime: Double = 0 + + let decompressedData = TGGUnzipData(data) + if let decompressedData = decompressedData, let json = (try? JSONSerialization.jsonObject(with: decompressedData, options: [])) as? [AnyHashable: Any] { + if validateAnimationComposition(json: json) { + let model = LOTComposition(json: json) + if let startFrame = model.startFrame?.int32Value, let endFrame = model.endFrame?.int32Value { + print("read at \(CACurrentMediaTime() - startTime)") + + var randomId: Int64 = 0 + arc4random_buf(&randomId, 8) + let path = NSTemporaryDirectory() + "\(randomId).lz4v" + guard let fileContext = ManagedFile(queue: queue, path: path, mode: .readwrite) else { + return + } + + let videoSize = CGSize(width: size.width, height: size.height * 2.0) + let scale = size.width / 512.0 + + var currentFrame: Int32 = 0 + + let container = LOTAnimationLayerContainer(model: model, size: size) + + let singleContext = DrawingContext(size: size, scale: 1.0, clear: true) + + var fps: Int32 = model.framerate?.int32Value ?? 30 + let _ = fileContext.write(&fps, count: 4) + + if true { + let frameLength = singleContext.length + assert(frameLength % 16 == 0) + + let previousFrameData = malloc(frameLength)! + memset(previousFrameData, 0, frameLength) + + defer { + free(previousFrameData) + } + + var compressedFrameData = Data(count: frameLength) + let compressedFrameDataLength = compressedFrameData.count + + let scratchData = malloc(compression_encode_scratch_buffer_size(COMPRESSION_LZ4))! + defer { + free(scratchData) + } + + while startFrame + currentFrame < endFrame { + let drawStartTime = CACurrentMediaTime() + singleContext.withContext { context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.saveGState() + context.scaleBy(x: scale, y: scale) + container?.renderFrame(startFrame + currentFrame, in: context) + context.restoreGState() + } + + var lhs = previousFrameData.assumingMemoryBound(to: UInt64.self) + var rhs = singleContext.bytes.assumingMemoryBound(to: UInt64.self) + for _ in 0 ..< frameLength / 8 { + lhs.pointee = rhs.pointee ^ lhs.pointee + lhs = lhs.advanced(by: 1) + rhs = rhs.advanced(by: 1) + } + + drawingTime += CACurrentMediaTime() - drawStartTime + + let appendStartTime = CACurrentMediaTime() + compressedFrameData.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in + let length = compression_encode_buffer(bytes, compressedFrameDataLength, previousFrameData.assumingMemoryBound(to: UInt8.self), frameLength, scratchData, COMPRESSION_LZ4) + var frameLengthValue: Int32 = Int32(length) + let _ = fileContext.write(&frameLengthValue, count: 4) + let _ = fileContext.write(bytes, count: length) + } + + memcpy(previousFrameData, singleContext.bytes, frameLength) + + appendingTime += CACurrentMediaTime() - appendStartTime + currentFrame += 1 + } + + if startFrame + currentFrame >= endFrame { + subscriber.putNext(path) + subscriber.putCompletion() + print("animation render time \(CACurrentMediaTime() - startTime)") + print("of which drawing time \(drawingTime)") + print("of which appending time \(appendingTime)") + } + } else { + let bgrg422Length = Int(size.width) * 2 * Int(size.height) + let aLength = Int(size.width) * Int(size.height) + let frameLength = bgrg422Length + aLength + + assert(frameLength % 16 == 0) + + let currentFrameData = malloc(frameLength)! + let previousFrameData = malloc(frameLength)! + memset(previousFrameData, 0, frameLength) + + defer { + free(currentFrameData) + free(previousFrameData) + } + + let fps: Int32 = model.framerate?.int32Value ?? 30 + + var compressedFrameData = Data(count: bgrg422Length + aLength) + let compressedFrameDataLength = compressedFrameData.count + + let scratchData = malloc(compression_encode_scratch_buffer_size(COMPRESSION_LZ4))! + defer { + free(scratchData) + } + + while startFrame + currentFrame < endFrame { + let drawStartTime = CACurrentMediaTime() + singleContext.withContext { context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.saveGState() + context.scaleBy(x: scale, y: scale) + container?.renderFrame(startFrame + currentFrame, in: context) + context.restoreGState() + } + + encodeRGBAToBRGR422A(currentFrameData.assumingMemoryBound(to: UInt8.self).advanced(by: 0), currentFrameData.assumingMemoryBound(to: UInt8.self).advanced(by: bgrg422Length), singleContext.bytes.assumingMemoryBound(to: UInt8.self), Int32(size.width), Int32(size.height)) + + var lhs = previousFrameData.assumingMemoryBound(to: UInt64.self) + var rhs = currentFrameData.assumingMemoryBound(to: UInt64.self) + for _ in 0 ..< frameLength / 8 { + lhs.pointee = rhs.pointee ^ lhs.pointee + lhs = lhs.advanced(by: 1) + rhs = rhs.advanced(by: 1) + } + + drawingTime += CACurrentMediaTime() - drawStartTime + + let appendStartTime = CACurrentMediaTime() + compressedFrameData.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in + let length = compression_encode_buffer(bytes, compressedFrameDataLength, previousFrameData.assumingMemoryBound(to: UInt8.self), frameLength, scratchData, COMPRESSION_LZ4) + var frameLengthValue: Int32 = Int32(length) + let _ = fileContext.write(&frameLengthValue, count: 4) + let _ = fileContext.write(bytes, count: length) + } + + memcpy(previousFrameData, currentFrameData, frameLength) + + appendingTime += CACurrentMediaTime() - appendStartTime + currentFrame += 1 + } + + if startFrame + currentFrame >= endFrame { + subscriber.putNext(path) + subscriber.putCompletion() + print("animation render time \(CACurrentMediaTime() - startTime)") + print("of which drawing time \(drawingTime)") + print("of which appending time \(appendingTime)") + } + } + } + } + } + } + return EmptyDisposable + }) +} + func convertCompressedLottieToCombinedMp4(data: Data, size: CGSize) -> Signal { return Signal({ subscriber in let startTime = CACurrentMediaTime() @@ -129,6 +306,7 @@ func convertCompressedLottieToCombinedMp4(data: Data, size: CGSize) -> Signal Signal String { } private let statusBarRootViewClass: AnyClass = NSClassFromString("UIStatusBar")! +private let statusBarPlaceholderClass: AnyClass? = NSClassFromString("UIStatusBar_Placeholder") private let cutoutStatusBarForegroundClass: AnyClass? = NSClassFromString("_UIStatusBar") private let keyboardViewClass: AnyClass? = NSClassFromString(encodeText("VJJoqvuTfuIptuWjfx", -1))! private let keyboardViewContainerClass: AnyClass? = NSClassFromString(encodeText("VJJoqvuTfuDpoubjofsWjfx", -1))! @@ -65,6 +66,12 @@ private class ApplicationStatusBarHost: StatusBarHost { if containerView.isKind(of: statusBarRootViewClass) { return containerView } + if let statusBarPlaceholderClass = statusBarPlaceholderClass { + if containerView.isKind(of: statusBarPlaceholderClass) { + return containerView + } + } + for subview in containerView.subviews { if let cutoutStatusBarForegroundClass = cutoutStatusBarForegroundClass, subview.isKind(of: cutoutStatusBarForegroundClass) { @@ -929,7 +936,7 @@ final class SharedApplicationContext { |> deliverOnMainQueue |> map { accountAndSettings -> UnauthorizedApplicationContext? in return accountAndSettings.flatMap { account, limitsConfiguration, callListSettings, otherAccountPhoneNumbers in - return UnauthorizedApplicationContext(buildConfig: buildConfig, sharedContext: sharedApplicationContext.sharedContext, account: account, otherAccountPhoneNumbers: otherAccountPhoneNumbers) + return UnauthorizedApplicationContext(apiId: buildConfig.apiId, apiHash: buildConfig.apiHash, sharedContext: sharedApplicationContext.sharedContext, account: account, otherAccountPhoneNumbers: otherAccountPhoneNumbers) } } }) @@ -1193,7 +1200,13 @@ final class SharedApplicationContext { let _ = (self.sharedContextPromise.get() |> take(1) |> deliverOnMainQueue).start(next: { sharedApplicationContext in - sharedApplicationContext.wakeupManager.allowBackgroundTimeExtension(timeout: 4.0) + var extendNow = false + if #available(iOS 9.0, *) { + if !ProcessInfo.processInfo.isLowPowerModeEnabled { + extendNow = true + } + } + sharedApplicationContext.wakeupManager.allowBackgroundTimeExtension(timeout: 4.0, extendNow: extendNow) }) self.isInForegroundValue = false @@ -1628,8 +1641,8 @@ final class SharedApplicationContext { } else if let sendMessageIntent = userActivity.interaction?.intent as? INSendMessageIntent { if let contact = sendMessageIntent.recipients?.first, let handle = contact.customIdentifier, handle.hasPrefix("tg") { let string = handle.suffix(from: handle.index(handle.startIndex, offsetBy: 2)) - if let id = Int32(string), let context = self.contextValue { - navigateToChatController(navigationController: context.rootController, context: context.context, chatLocation: .peer(PeerId(namespace: Namespaces.Peer.CloudUser, id: id))) + if let id = Int32(string) { + self.openChatWhenReady(accountId: nil, peerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), activateInput: true) } } } @@ -1676,7 +1689,7 @@ final class SharedApplicationContext { }) } - private func openChatWhenReady(accountId: AccountRecordId?, peerId: PeerId, messageId: MessageId? = nil) { + private func openChatWhenReady(accountId: AccountRecordId?, peerId: PeerId, messageId: MessageId? = nil, activateInput: Bool = false) { let signal = self.sharedContextPromise.get() |> take(1) |> mapToSignal { sharedApplicationContext -> Signal in @@ -1694,7 +1707,7 @@ final class SharedApplicationContext { } self.openChatWhenReadyDisposable.set((signal |> deliverOnMainQueue).start(next: { context in - context.openChatWithPeerId(peerId: peerId, messageId: messageId) + context.openChatWithPeerId(peerId: peerId, messageId: messageId, activateInput: activateInput) })) } diff --git a/Telegram-iOS/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift similarity index 93% rename from Telegram-iOS/ApplicationContext.swift rename to submodules/TelegramUI/TelegramUI/ApplicationContext.swift index af64c3cca9..87d33fe403 100644 --- a/Telegram-iOS/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -1,16 +1,13 @@ import Foundation import Intents -import TelegramUI +import TelegramPresentationData +import TelegramUIPreferences import SwiftSignalKit import Postbox import TelegramCore import Display import LegacyComponents - -#if BUCK -import BuildConfig -import AppBinaryPrivate -#endif +import DeviceAccess func isAccessLocked(data: PostboxAccessChallengeData, at timestamp: Int32) -> Bool { if data.isLockable, let autolockDeadline = data.autolockDeadline, autolockDeadline <= timestamp { @@ -26,12 +23,12 @@ final class UnauthorizedApplicationContext { let rootController: AuthorizationSequenceController - init(buildConfig: BuildConfig, sharedContext: SharedAccountContext, account: UnauthorizedAccount, otherAccountPhoneNumbers: ((String, AccountRecordId, Bool)?, [(String, AccountRecordId, Bool)])) { + init(apiId: Int32, apiHash: String, sharedContext: SharedAccountContext, account: UnauthorizedAccount, otherAccountPhoneNumbers: ((String, AccountRecordId, Bool)?, [(String, AccountRecordId, Bool)])) { self.sharedContext = sharedContext self.account = account let presentationData = sharedContext.currentPresentationData.with { $0 } - self.rootController = AuthorizationSequenceController(sharedContext: sharedContext, account: account, otherAccountPhoneNumbers: otherAccountPhoneNumbers, strings: presentationData.strings, theme: presentationData.theme, openUrl: sharedContext.applicationBindings.openUrl, apiId: buildConfig.apiId, apiHash: buildConfig.apiHash) + self.rootController = AuthorizationSequenceController(sharedContext: sharedContext, account: account, otherAccountPhoneNumbers: otherAccountPhoneNumbers, strings: presentationData.strings, theme: presentationData.theme, openUrl: sharedContext.applicationBindings.openUrl, apiId: apiId, apiHash: apiHash) account.shouldBeServiceTaskMaster.set(sharedContext.applicationBindings.applicationInForeground |> map { value -> AccountServiceTaskMasterMode in if value { @@ -61,7 +58,7 @@ final class AuthorizedApplicationContext { let rootController: TelegramRootController let notificationController: NotificationContainerController - private var scheduledOperChatWithPeerId: PeerId? + private var scheduledOperChatWithPeerId: (PeerId, MessageId?, Bool)? private var scheduledOpenExternalUrl: URL? private let passcodeStatusDisposable = MetaDisposable() @@ -271,9 +268,9 @@ final class AuthorizedApplicationContext { strongSelf.notificationController.view.isHidden = false if strongSelf.rootController.rootTabController == nil { strongSelf.rootController.addRootControllers(showCallsTab: strongSelf.showCallsTab) - if let peerId = strongSelf.scheduledOperChatWithPeerId { + if let (peerId, messageId, activateInput) = strongSelf.scheduledOperChatWithPeerId { strongSelf.scheduledOperChatWithPeerId = nil - strongSelf.openChatWithPeerId(peerId: peerId) + strongSelf.openChatWithPeerId(peerId: peerId, messageId: messageId, activateInput: activateInput) } if let url = strongSelf.scheduledOpenExternalUrl { @@ -326,10 +323,18 @@ final class AuthorizedApplicationContext { })) let accountId = context.account.id - self.loggedOutDisposable.set(context.account.loggedOut.start(next: { value in + self.loggedOutDisposable.set((context.account.loggedOut + |> deliverOnMainQueue).start(next: { [weak self] value in if value { Logger.shared.log("ApplicationContext", "account logged out") let _ = logoutFromAccount(id: accountId, accountManager: accountManager, alreadyLoggedOutRemotely: false).start() + if let strongSelf = self { + strongSelf.rootController.currentWindow?.forEachController { controller in + if let controller = controller as? TermsOfServiceController { + controller.dismiss() + } + } + } } })) @@ -489,15 +494,23 @@ final class AuthorizedApplicationContext { }) } - declineImpl = { + declineImpl = { [weak controller] in guard let strongSelf = self else { return } - let _ = (strongSelf.context.account.postbox.loadedPeerWithId(strongSelf.context.account.peerId) - |> deliverOnMainQueue).start(next: { peer in - if let phone = (peer as? TelegramUser)?.phone { - UIApplication.shared.openURL(URL(string: "https://telegram.org/deactivate?phone=\(phone)")!) + let accountId = strongSelf.context.account.id + let accountManager = strongSelf.context.sharedContext.accountManager + let _ = (deleteAccount(account: strongSelf.context.account) + |> deliverOnMainQueue).start(error: { _ in + guard let strongSelf = self else { + return } + let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } + let controller = textAlertController(context: strongSelf.context, title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + (strongSelf.rootController.viewControllers.last as? ViewController)?.present(controller, in: .window(.root)) + }, completed: { + controller?.dismiss() + let _ = logoutFromAccount(id: accountId, accountManager: accountManager, alreadyLoggedOutRemotely: true).start() }) } @@ -572,7 +585,7 @@ final class AuthorizedApplicationContext { strongSelf.currentPermissionsController = controller } - controller.setState(state, animated: didAppear) + controller.setState(.permission(state), animated: didAppear) controller.proceed = { resolved in permissionsPosition.set(position + 1) switch state { @@ -596,7 +609,7 @@ final class AuthorizedApplicationContext { switch state { case .contacts: splitTest.addEvent(.ContactsRequest) - DeviceAccess.authorizeAccess(to: .contacts, context: context) { result in + DeviceAccess.authorizeAccess(to: .contacts, presentationData: context.sharedContext.currentPresentationData.with { $0 }) { result in if result { splitTest.addEvent(.ContactsAllowed) } else { @@ -607,7 +620,9 @@ final class AuthorizedApplicationContext { } case .notifications: splitTest.addEvent(.NotificationsRequest) - DeviceAccess.authorizeAccess(to: .notifications, context: context) { result in + DeviceAccess.authorizeAccess(to: .notifications, registerForNotifications: { result in + context.sharedContext.applicationBindings.registerForNotifications(result) + }) { result in if result { splitTest.addEvent(.NotificationsAllowed) } else { @@ -617,7 +632,9 @@ final class AuthorizedApplicationContext { ApplicationSpecificNotice.setNotificationsPermissionWarning(accountManager: context.sharedContext.accountManager, value: 0) } case .siri: - DeviceAccess.authorizeAccess(to: .siri, context: context) { result in + DeviceAccess.authorizeAccess(to: .siri, requestSiriAuthorization: { completion in + return context.sharedContext.applicationBindings.requestSiriAuthorization(completion) + }) { result in permissionsPosition.set(position + 1) } default: @@ -765,7 +782,7 @@ final class AuthorizedApplicationContext { self.permissionsDisposable.dispose() } - func openChatWithPeerId(peerId: PeerId, messageId: MessageId? = nil) { + func openChatWithPeerId(peerId: PeerId, messageId: MessageId? = nil, activateInput: Bool = false) { var visiblePeerId: PeerId? if let controller = self.rootController.topViewController as? ChatController, case let .peer(peerId) = controller.chatLocation { visiblePeerId = peerId @@ -773,9 +790,9 @@ final class AuthorizedApplicationContext { if visiblePeerId != peerId || messageId != nil { if self.rootController.rootTabController != nil { - navigateToChatController(navigationController: self.rootController, context: self.context, chatLocation: .peer(peerId), messageId: messageId) + navigateToChatController(navigationController: self.rootController, context: self.context, chatLocation: .peer(peerId), messageId: messageId, activateInput: activateInput) } else { - self.scheduledOperChatWithPeerId = peerId + self.scheduledOperChatWithPeerId = (peerId, messageId, activateInput) } } } diff --git a/Telegram-iOS/ApplicationShortcutItem.swift b/submodules/TelegramUI/TelegramUI/ApplicationShortcutItem.swift similarity index 97% rename from Telegram-iOS/ApplicationShortcutItem.swift rename to submodules/TelegramUI/TelegramUI/ApplicationShortcutItem.swift index d49f139e1c..43841ee9b3 100644 --- a/Telegram-iOS/ApplicationShortcutItem.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationShortcutItem.swift @@ -1,6 +1,6 @@ import Foundation import UIKit -import TelegramUI +import TelegramPresentationData enum ApplicationShortcutItemType: String { case search diff --git a/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift b/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift index 6413d36a35..c35840f84b 100644 --- a/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift +++ b/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData public enum ArchivedStickerPacksControllerMode { case stickers diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetController.swift index cdec3e1f9a..0bf2188c48 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetController.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData final class AuthorizationSequenceAwaitingAccountResetController: ViewController { private var controllerNode: AuthorizationSequenceAwaitingAccountResetControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift index eb54ed2088..40c388239e 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceAwaitingAccountResetControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import TelegramPresentationData private func timerValueString(days: Int32, hours: Int32, minutes: Int32, color: UIColor, strings: PresentationStrings) -> NSAttributedString { var string = NSMutableAttributedString() diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryController.swift index e2cfb3d338..3abdf98695 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryController.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import TelegramCore +import TelegramPresentationData final class AuthorizationSequenceCodeEntryController: ViewController { private var controllerNode: AuthorizationSequenceCodeEntryControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift index ef13563e58..eb636ef070 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCodeEntryControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import SwiftSignalKit +import TelegramPresentationData func authorizationCurrentOptionText(_ type: SentAuthorizationCodeType, strings: PresentationStrings, primaryColor: UIColor, accentColor: UIColor) -> NSAttributedString { switch type { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift index 579216fa02..89ba95d958 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift @@ -12,6 +12,7 @@ import MtProtoKitDynamic #endif import MessageUI import CoreTelephony +import TelegramPresentationData private enum InnerState: Equatable { case state(UnauthorizedAccountStateContents) diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionController.swift index eb7fc52e9c..e44207261e 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionController.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData private func loadCountryCodes() -> [(String, Int)] { guard let filePath = frameworkBundle.path(forResource: "PhoneCountries", ofType: "txt") else { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift index 78f82dd90c..950f210572 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceCountrySelectionControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData private func loadCountryCodes() -> [(String, Int)] { guard let filePath = frameworkBundle.path(forResource: "PhoneCountries", ofType: "txt") else { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryController.swift index 2fff4777eb..b02f055bc0 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryController.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData final class AuthorizationSequencePasswordEntryController: ViewController { private var controllerNode: AuthorizationSequencePasswordEntryControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift index 971abb99ea..a5ac857177 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordEntryControllerNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UITextFieldDelegate { private let strings: PresentationStrings diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryController.swift index 1c6a990773..c58a91afc6 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryController.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData final class AuthorizationSequencePasswordRecoveryController: ViewController { private var controllerNode: AuthorizationSequencePasswordRecoveryControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift index d2a4760aa2..672a1f7f02 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePasswordRecoveryControllerNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode, UITextFieldDelegate { private let strings: PresentationStrings diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift index d21b77e5b9..625aa28f6c 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramCore import Postbox +import TelegramPresentationData final class AuthorizationSequencePhoneEntryController: ViewController { private var controllerNode: AuthorizationSequencePhoneEntryControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift index 04fe111f95..5dfa17ab7d 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequencePhoneEntryControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData private func emojiFlagForISOCountryCode(_ countryCode: NSString) -> String { if countryCode.length != 2 { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpController.swift index 7472b38acb..5c44aed0e4 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpController.swift @@ -4,7 +4,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore - +import TelegramPresentationData import LegacyComponents final class AuthorizationSequenceSignUpController: ViewController { diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift index f84333a1bb..ed4dc81184 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private func roundCorners(diameter: CGFloat) -> UIImage { UIGraphicsBeginImageContextWithOptions(CGSize(width: diameter, height: diameter), false, 0.0) diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashController.swift index 014c146a05..11ac1bb7b9 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashController.swift @@ -5,10 +5,12 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit - +import TelegramPresentationData import TelegramUIPrivateModule import LegacyComponents +import RMIntro + final class AuthorizationSequenceSplashController: ViewController { private var controllerNode: AuthorizationSequenceSplashControllerNode { return self.displayNode as! AuthorizationSequenceSplashControllerNode diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashControllerNode.swift index 574878c685..37e855f13f 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSplashControllerNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class AuthorizationSequenceSplashControllerNode: ASDisplayNode { init(theme: PresentationTheme) { diff --git a/submodules/TelegramUI/TelegramUI/AutodownloadConnectionTypeController.swift b/submodules/TelegramUI/TelegramUI/AutodownloadConnectionTypeController.swift index df91119946..3e6cd85188 100644 --- a/submodules/TelegramUI/TelegramUI/AutodownloadConnectionTypeController.swift +++ b/submodules/TelegramUI/TelegramUI/AutodownloadConnectionTypeController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences enum AutomaticDownloadConnectionType { case cellular diff --git a/submodules/TelegramUI/TelegramUI/AutodownloadDataUsagePickerItem.swift b/submodules/TelegramUI/TelegramUI/AutodownloadDataUsagePickerItem.swift index acfc1ccf19..8471eac64a 100644 --- a/submodules/TelegramUI/TelegramUI/AutodownloadDataUsagePickerItem.swift +++ b/submodules/TelegramUI/TelegramUI/AutodownloadDataUsagePickerItem.swift @@ -4,7 +4,8 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore - +import TelegramUIPreferences +import TelegramPresentationData import LegacyComponents enum AutomaticDownloadDataUsage: Int { diff --git a/submodules/TelegramUI/TelegramUI/AutodownloadMediaCategoryController.swift b/submodules/TelegramUI/TelegramUI/AutodownloadMediaCategoryController.swift index 7a91055ae6..6326860415 100644 --- a/submodules/TelegramUI/TelegramUI/AutodownloadMediaCategoryController.swift +++ b/submodules/TelegramUI/TelegramUI/AutodownloadMediaCategoryController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences public func autodownloadDataSizeString(_ size: Int64, decimalSeparator: String = ".") -> String { if size >= 1024 * 1024 * 1024 { diff --git a/submodules/TelegramUI/TelegramUI/AutodownloadSizeLimitItem.swift b/submodules/TelegramUI/TelegramUI/AutodownloadSizeLimitItem.swift index 6a86ae60e7..530a07738d 100644 --- a/submodules/TelegramUI/TelegramUI/AutodownloadSizeLimitItem.swift +++ b/submodules/TelegramUI/TelegramUI/AutodownloadSizeLimitItem.swift @@ -4,6 +4,8 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData +import TelegramPresentationData import LegacyComponents diff --git a/submodules/TelegramUI/TelegramUI/AvatarGalleryController.swift b/submodules/TelegramUI/TelegramUI/AvatarGalleryController.swift index 8a51ce322b..04e514f71e 100644 --- a/submodules/TelegramUI/TelegramUI/AvatarGalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/AvatarGalleryController.swift @@ -6,6 +6,7 @@ import Postbox import SwiftSignalKit import AsyncDisplayKit import TelegramCore +import TelegramPresentationData public struct ImageRepresentationWithReference: Equatable { public let representation: TelegramMediaImageRepresentation @@ -19,13 +20,13 @@ public struct ImageRepresentationWithReference: Equatable { enum AvatarGalleryEntry: Equatable { case topImage([ImageRepresentationWithReference], GalleryItemIndexData?) - case image(TelegramMediaImageReference?, [ImageRepresentationWithReference], Peer, Int32, GalleryItemIndexData?) + case image(TelegramMediaImageReference?, [ImageRepresentationWithReference], Peer, Int32, GalleryItemIndexData?, MessageId?) var representations: [ImageRepresentationWithReference] { switch self { case let .topImage(representations, _): return representations - case let .image(_, representations, _, _, _): + case let .image(_, representations, _, _, _, _): return representations } } @@ -34,7 +35,7 @@ enum AvatarGalleryEntry: Equatable { switch self { case let .topImage(_, indexData): return indexData - case let .image(_, _, _, _, indexData): + case let .image(_, _, _, _, indexData, _): return indexData } } @@ -47,8 +48,8 @@ enum AvatarGalleryEntry: Equatable { } else { return false } - case let .image(lhsImageReference, lhsRepresentations, lhsPeer, lhsDate, lhsIndexData): - if case let .image(rhsImageReference, rhsRepresentations, rhsPeer, rhsDate, rhsIndexData) = rhs, lhsImageReference == rhsImageReference, lhsRepresentations == rhsRepresentations, arePeersEqual(lhsPeer, rhsPeer), lhsDate == rhsDate, lhsIndexData == rhsIndexData { + case let .image(lhsImageReference, lhsRepresentations, lhsPeer, lhsDate, lhsIndexData, lhsMessageId): + if case let .image(rhsImageReference, rhsRepresentations, rhsPeer, rhsDate, rhsIndexData, rhsMessageId) = rhs, lhsImageReference == rhsImageReference, lhsRepresentations == rhsRepresentations, arePeersEqual(lhsPeer, rhsPeer), lhsDate == rhsDate, lhsIndexData == rhsIndexData, lhsMessageId == rhsMessageId { return true } else { return false @@ -76,7 +77,8 @@ private func initialAvatarGalleryEntries(peer: Peer) -> [AvatarGalleryEntry]{ } func fetchedAvatarGalleryEntries(account: Account, peer: Peer) -> Signal<[AvatarGalleryEntry], NoError> { - return requestPeerPhotos(account: account, peerId: peer.id) |> map { photos -> [AvatarGalleryEntry] in + return requestPeerPhotos(account: account, peerId: peer.id) + |> map { photos -> [AvatarGalleryEntry] in var result: [AvatarGalleryEntry] = [] let initialEntries = initialAvatarGalleryEntries(peer: peer) if photos.isEmpty { @@ -86,9 +88,9 @@ func fetchedAvatarGalleryEntries(account: Account, peer: Peer) -> Signal<[Avatar for photo in photos { let indexData = GalleryItemIndexData(position: index, totalCount: Int32(photos.count)) if result.isEmpty, let first = initialEntries.first { - result.append(.image(photo.image.reference, first.representations, peer, photo.date, indexData)) + result.append(.image(photo.image.reference, first.representations, peer, photo.date, indexData, photo.messageId)) } else { - result.append(.image(photo.image.reference, photo.image.representations.map({ ImageRepresentationWithReference(representation: $0, reference: MediaResourceReference.standalone(resource: $0.resource)) }), peer, photo.date, indexData)) + result.append(.image(photo.image.reference, photo.image.representations.map({ ImageRepresentationWithReference(representation: $0, reference: MediaResourceReference.standalone(resource: $0.resource)) }), peer, photo.date, indexData, photo.messageId)) } index += 1 } @@ -172,7 +174,22 @@ class AvatarGalleryController: ViewController { strongSelf.entries = entries strongSelf.centralEntryIndex = 0 if strongSelf.isViewLoaded { - strongSelf.galleryNode.pager.replaceItems(strongSelf.entries.map({ entry in PeerAvatarImageGalleryItem(context: context, peer: peer, presentationData: presentationData, entry: entry, delete: strongSelf.peer.id == strongSelf.context.account.peerId ? { + let canDelete: Bool + if strongSelf.peer.id == strongSelf.context.account.peerId { + canDelete = true + } else if let group = strongSelf.peer as? TelegramGroup { + switch group.role { + case .creator, .admin: + canDelete = true + case .member: + canDelete = false + } + } else if let channel = strongSelf.peer as? TelegramChannel { + canDelete = channel.hasPermission(.changeInfo) + } else { + canDelete = false + } + strongSelf.galleryNode.pager.replaceItems(strongSelf.entries.map({ entry in PeerAvatarImageGalleryItem(context: context, peer: peer, presentationData: presentationData, entry: entry, delete: canDelete ? { self?.deleteEntry(entry) } : nil) }), centralItemIndex: 0, keepFirst: true) @@ -307,8 +324,24 @@ class AvatarGalleryController: ViewController { self?.presentingViewController?.dismiss(animated: false, completion: nil) } + let canDelete: Bool + if self.peer.id == self.context.account.peerId { + canDelete = true + } else if let group = self.peer as? TelegramGroup { + switch group.role { + case .creator, .admin: + canDelete = true + case .member: + canDelete = false + } + } else if let channel = self.peer as? TelegramChannel { + canDelete = channel.hasPermission(.changeInfo) + } else { + canDelete = false + } + let presentationData = self.presentationData - self.galleryNode.pager.replaceItems(self.entries.map({ entry in PeerAvatarImageGalleryItem(context: self.context, peer: peer, presentationData: presentationData, entry: entry, delete: self.peer.id == self.context.account.peerId ? { [weak self] in + self.galleryNode.pager.replaceItems(self.entries.map({ entry in PeerAvatarImageGalleryItem(context: self.context, peer: peer, presentationData: presentationData, entry: entry, delete: canDelete ? { [weak self] in self?.deleteEntry(entry) } : nil) }), centralItemIndex: self.centralEntryIndex) @@ -392,17 +425,44 @@ class AvatarGalleryController: ViewController { private func deleteEntry(_ entry: AvatarGalleryEntry) { switch entry { case .topImage: - break - case let .image(reference, _, _, _, _): - if let reference = reference { - let _ = removeAccountPhoto(network: self.context.account.network, reference: reference).start() - } - if entry == self.entries.first { - self.dismiss(forceAway: true) + if self.peer.id == self.context.account.peerId { } else { - if let index = self.entries.index(of: entry) { - self.entries.remove(at: index) - self.galleryNode.pager.transaction(GalleryPagerTransaction(deleteItems: [index], insertItems: [], updateItems: [], focusOnItem: index - 1)) + if entry == self.entries.first { + let _ = updatePeerPhoto(postbox: self.context.account.postbox, network: self.context.account.network, stateManager: self.context.account.stateManager, accountPeerId: self.context.account.peerId, peerId: self.peer.id, photo: nil, mapResourceToAvatarSizes: { _, _ in .single([:]) }).start() + self.dismiss(forceAway: true) + } else { + if let index = self.entries.index(of: entry) { + self.entries.remove(at: index) + self.galleryNode.pager.transaction(GalleryPagerTransaction(deleteItems: [index], insertItems: [], updateItems: [], focusOnItem: index - 1)) + } + } + } + case let .image(reference, _, _, _, _, messageId): + if self.peer.id == self.context.account.peerId { + if let reference = reference { + let _ = removeAccountPhoto(network: self.context.account.network, reference: reference).start() + } + if entry == self.entries.first { + self.dismiss(forceAway: true) + } else { + if let index = self.entries.index(of: entry) { + self.entries.remove(at: index) + self.galleryNode.pager.transaction(GalleryPagerTransaction(deleteItems: [index], insertItems: [], updateItems: [], focusOnItem: index - 1)) + } + } + } else { + if let messageId = messageId { + let _ = deleteMessagesInteractively(postbox: self.context.account.postbox, messageIds: [messageId], type: .forEveryone).start() + } + + if entry == self.entries.first { + let _ = updatePeerPhoto(postbox: self.context.account.postbox, network: self.context.account.network, stateManager: self.context.account.stateManager, accountPeerId: self.context.account.peerId, peerId: self.peer.id, photo: nil, mapResourceToAvatarSizes: { _, _ in .single([:]) }).start() + self.dismiss(forceAway: true) + } else { + if let index = self.entries.index(of: entry) { + self.entries.remove(at: index) + self.galleryNode.pager.transaction(GalleryPagerTransaction(deleteItems: [index], insertItems: [], updateItems: [], focusOnItem: index - 1)) + } } } } diff --git a/submodules/TelegramUI/TelegramUI/AvatarGalleryItemFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/AvatarGalleryItemFooterContentNode.swift index 822e4f204f..af06ebf138 100644 --- a/submodules/TelegramUI/TelegramUI/AvatarGalleryItemFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/AvatarGalleryItemFooterContentNode.swift @@ -6,6 +6,8 @@ import Postbox import TelegramCore import SwiftSignalKit import Photos +import TelegramPresentationData +import TelegramUIPreferences private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white) @@ -75,7 +77,7 @@ final class AvatarGalleryItemFooterContentNode: GalleryFooterContentNode { var nameText: String? var dateText: String? switch entry { - case let .image(_, _, peer, date, _): + case let .image(_, _, peer, date, _, _): nameText = peer.displayTitle dateText = humanReadableStringForTimestamp(strings: self.strings, dateTimeFormat: self.dateTimeFormat, timestamp: date) default: diff --git a/submodules/TelegramUI/TelegramUI/AvatarNode.swift b/submodules/TelegramUI/TelegramUI/AvatarNode.swift index 93c93c07c5..ed7aa63623 100644 --- a/submodules/TelegramUI/TelegramUI/AvatarNode.swift +++ b/submodules/TelegramUI/TelegramUI/AvatarNode.swift @@ -5,6 +5,7 @@ import Postbox import Display import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let deletedIcon = UIImage(bundleImageName: "Avatar/DeletedIcon")?.precomposed() private let savedMessagesIcon = UIImage(bundleImageName: "Avatar/SavedMessagesIcon")?.precomposed() diff --git a/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift b/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift index 288ffef783..37032904d6 100644 --- a/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift +++ b/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class BlockedPeersControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutController.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutController.swift index 07a5d195b4..e2dc69d411 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutController.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class BotCheckoutController: ViewController { private var controllerNode: BotCheckoutControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutControllerNode.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutControllerNode.swift index 82fa8c2bc2..78b383571e 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutControllerNode.swift @@ -6,7 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import PassKit - +import TelegramPresentationData import TelegramUIPrivateModule final class BotCheckoutControllerArguments { diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutHeaderItem.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutHeaderItem.swift index e8b5b72486..a955210bfb 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutHeaderItem.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutHeaderItem.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData class BotCheckoutHeaderItem: ListViewItem, ItemListItem { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutInfoController.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutInfoController.swift index 8915ca9589..9856cf69a9 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutInfoController.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import Display import TelegramCore import Postbox +import TelegramPresentationData enum BotCheckoutInfoControllerAddressFocus { case street1 diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutInfoControllerNode.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutInfoControllerNode.swift index 8fb2543908..c0e365d95f 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutInfoControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutInfoControllerNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private final class BotCheckoutInfoAddressItems { let address1: BotPaymentFieldItemNode diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryController.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryController.swift index 1c55bcc85a..8cb62420c6 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryController.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Display import TelegramCore import Postbox +import TelegramPresentationData enum BotCheckoutNativeCardEntryStatus { case notReady diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryControllerNode.swift index 8b0f67ab50..d76018944b 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutNativeCardEntryControllerNode.swift @@ -5,7 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit - +import TelegramPresentationData import TelegramUIPrivateModule private final class BotCheckoutNativeCardEntryScrollerNodeView: UIScrollView { diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutPasswordEntryController.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutPasswordEntryController.swift index 0149eecfd4..f08da27cff 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutPasswordEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutPasswordEntryController.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import SwiftSignalKit +import TelegramPresentationData private struct BotCheckoutPasswordAlertAction { public let title: String diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutPriceItem.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutPriceItem.swift index ae98e1cffb..4589cc25a0 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutPriceItem.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutPriceItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class BotCheckoutPriceItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionController.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionController.swift index c4c853fee4..9eb70dc7a0 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionController.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData enum BotCheckoutWebInteractionControllerIntent { case addPaymentMethod((BotCheckoutPaymentWebToken) -> Void) diff --git a/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionControllerNode.swift b/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionControllerNode.swift index 487fe62d32..38b7e1cd7b 100644 --- a/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotCheckoutWebInteractionControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import WebKit +import TelegramPresentationData private class WeakPaymentScriptMessageHandler: NSObject, WKScriptMessageHandler { private let f: (WKScriptMessage) -> () diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentActionItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentActionItemNode.swift index c1b6c240de..0e59a1bb92 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentActionItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentActionItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentCardInputItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentCardInputItemNode.swift index 895e908656..accbbea24f 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentCardInputItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentCardInputItemNode.swift @@ -2,7 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display - +import TelegramPresentationData import TelegramUIPrivateModule struct BotPaymentCardInputData { diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentDateItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentDateItemNode.swift index 452eda32d3..4251eb426c 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentDateItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentDateItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentDisclosureItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentDisclosureItemNode.swift index 88ca7ae7ca..4962eeeef7 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentDisclosureItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentDisclosureItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentFieldItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentFieldItemNode.swift index 5af9700bd5..9f6f0685be 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentFieldItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentFieldItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentHeaderItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentHeaderItemNode.swift index eb66871898..1426dbf4bf 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentHeaderItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentHeaderItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentItemNode.swift index a325be9ca5..18ce2169a6 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData class BotPaymentItemNode: ASDisplayNode { private let needsBackground: Bool diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentSwitchItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentSwitchItemNode.swift index 2ae25bc698..b5114dc8ce 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentSwitchItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentSwitchItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/BotPaymentTextItemNode.swift b/submodules/TelegramUI/TelegramUI/BotPaymentTextItemNode.swift index c0d497a7d2..e638be0912 100644 --- a/submodules/TelegramUI/TelegramUI/BotPaymentTextItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotPaymentTextItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let textFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/BotReceiptController.swift b/submodules/TelegramUI/TelegramUI/BotReceiptController.swift index bc2263996b..9a68cc3a47 100644 --- a/submodules/TelegramUI/TelegramUI/BotReceiptController.swift +++ b/submodules/TelegramUI/TelegramUI/BotReceiptController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class BotReceiptController: ViewController { private var controllerNode: BotReceiptControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/BotReceiptControllerNode.swift b/submodules/TelegramUI/TelegramUI/BotReceiptControllerNode.swift index 4be231230d..2925e821d3 100644 --- a/submodules/TelegramUI/TelegramUI/BotReceiptControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/BotReceiptControllerNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class BotReceiptControllerArguments { fileprivate let account: Account diff --git a/submodules/TelegramUI/TelegramUI/LegacyBridgeAudio.swift b/submodules/TelegramUI/TelegramUI/Bridge Audio/LegacyBridgeAudio.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/LegacyBridgeAudio.swift rename to submodules/TelegramUI/TelegramUI/Bridge Audio/LegacyBridgeAudio.swift diff --git a/submodules/TelegramUI/TelegramUI/TGBridgeAudioDecoder.h b/submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioDecoder.h similarity index 100% rename from submodules/TelegramUI/TelegramUI/TGBridgeAudioDecoder.h rename to submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioDecoder.h diff --git a/submodules/TelegramUI/TelegramUI/TGBridgeAudioDecoder.mm b/submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioDecoder.mm similarity index 100% rename from submodules/TelegramUI/TelegramUI/TGBridgeAudioDecoder.mm rename to submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioDecoder.mm diff --git a/submodules/TelegramUI/TelegramUI/TGBridgeAudioEncoder.h b/submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioEncoder.h similarity index 100% rename from submodules/TelegramUI/TelegramUI/TGBridgeAudioEncoder.h rename to submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioEncoder.h diff --git a/submodules/TelegramUI/TelegramUI/TGBridgeAudioEncoder.m b/submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioEncoder.m similarity index 100% rename from submodules/TelegramUI/TelegramUI/TGBridgeAudioEncoder.m rename to submodules/TelegramUI/TelegramUI/Bridge Audio/TGBridgeAudioEncoder.m diff --git a/submodules/TelegramUI/TelegramUI/CachedInstantPages.swift b/submodules/TelegramUI/TelegramUI/CachedInstantPages.swift index df3f91608a..a912c88f36 100644 --- a/submodules/TelegramUI/TelegramUI/CachedInstantPages.swift +++ b/submodules/TelegramUI/TelegramUI/CachedInstantPages.swift @@ -3,6 +3,7 @@ import UIKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences final class CachedInstantPage: PostboxCoding { let webPage: TelegramMediaWebpage diff --git a/submodules/TelegramUI/TelegramUI/CachedResourceRepresentations.swift b/submodules/TelegramUI/TelegramUI/CachedResourceRepresentations.swift index 7a81a57876..513de44094 100644 --- a/submodules/TelegramUI/TelegramUI/CachedResourceRepresentations.swift +++ b/submodules/TelegramUI/TelegramUI/CachedResourceRepresentations.swift @@ -217,7 +217,7 @@ final class CachedEmojiRepresentation: CachedMediaResourceRepresentation { final class CachedAnimatedStickerRepresentation: CachedMediaResourceRepresentation { var uniqueId: String { - return "animated-sticker-v2" + return "animated-sticker-v3" } func isEqual(to: CachedMediaResourceRepresentation) -> Bool { diff --git a/submodules/TelegramUI/TelegramUI/CalculatingCacheSizeItem.swift b/submodules/TelegramUI/TelegramUI/CalculatingCacheSizeItem.swift index 04810baae9..0f31efa963 100644 --- a/submodules/TelegramUI/TelegramUI/CalculatingCacheSizeItem.swift +++ b/submodules/TelegramUI/TelegramUI/CalculatingCacheSizeItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class CalculatingCacheSizeItem: ListViewItem, ItemListItem { let theme: PresentationTheme @@ -132,6 +133,7 @@ class CalculatingCacheSizeItemNode: ListViewItemNode { activityIndicator = current } else { activityIndicator = ActivityIndicator(type: .custom(item.theme.list.itemAccentColor, 20.0, 2.0, false), speed: ActivityIndicatorSpeed.slow) + strongSelf.activityIndicator = activityIndicator strongSelf.addSubnode(activityIndicator) } diff --git a/submodules/TelegramUI/TelegramUI/CallController.swift b/submodules/TelegramUI/TelegramUI/CallController.swift index ef46f1c054..d92fa09336 100644 --- a/submodules/TelegramUI/TelegramUI/CallController.swift +++ b/submodules/TelegramUI/TelegramUI/CallController.swift @@ -5,6 +5,11 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences +import TelegramVoip +import TelegramCallsUI +import TelegramAudio public final class CallController: ViewController { private var controllerNode: CallControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/CallControllerButtonsNode.swift b/submodules/TelegramUI/TelegramUI/CallControllerButtonsNode.swift index 91ff50e0c1..41396b3392 100644 --- a/submodules/TelegramUI/TelegramUI/CallControllerButtonsNode.swift +++ b/submodules/TelegramUI/TelegramUI/CallControllerButtonsNode.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import MediaPlayer +import TelegramPresentationData enum CallControllerButtonsSpeakerMode { case none diff --git a/submodules/TelegramUI/TelegramUI/CallControllerNode.swift b/submodules/TelegramUI/TelegramUI/CallControllerNode.swift index 6663580b47..dc23280bb4 100644 --- a/submodules/TelegramUI/TelegramUI/CallControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/CallControllerNode.swift @@ -5,8 +5,11 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit - +import TelegramCallsUI import TelegramUIPrivateModule +import TelegramPresentationData +import TelegramUIPreferences +import TelegramAudio final class CallControllerNode: ASDisplayNode { private let sharedContext: SharedAccountContext diff --git a/submodules/TelegramUI/TelegramUI/CallFeedbackController.swift b/submodules/TelegramUI/TelegramUI/CallFeedbackController.swift index bb48b27eb6..9d0156a765 100644 --- a/submodules/TelegramUI/TelegramUI/CallFeedbackController.swift +++ b/submodules/TelegramUI/TelegramUI/CallFeedbackController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private enum CallFeedbackReason: Int32, CaseIterable { case echo diff --git a/submodules/TelegramUI/TelegramUI/CallListCallItem.swift b/submodules/TelegramUI/TelegramUI/CallListCallItem.swift index f090c2ab35..a533feca1e 100644 --- a/submodules/TelegramUI/TelegramUI/CallListCallItem.swift +++ b/submodules/TelegramUI/TelegramUI/CallListCallItem.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData private let titleFont = Font.regular(17.0) private let statusFont = Font.regular(14.0) @@ -23,7 +24,7 @@ private func callListNeighbors(item: ListViewItem, topItem: ListViewItem?, botto if let topItem = topItem { if let item = item as? ItemListItem, let topItem = topItem as? ItemListItem { if topItem.sectionId != item.sectionId { - topNeighbor = .otherSection(requestsNoInset: topItem.requestsNoInset) + topNeighbor = .otherSection(topItem.requestsNoInset ? .none : .full) } else { topNeighbor = .sameSection(alwaysPlain: topItem.isAlwaysPlain) } @@ -31,7 +32,7 @@ private func callListNeighbors(item: ListViewItem, topItem: ListViewItem?, botto if item is CallListCallItem && topItem is CallListCallItem { topNeighbor = .sameSection(alwaysPlain: false) } else { - topNeighbor = .otherSection(requestsNoInset: false) + topNeighbor = .otherSection(.full) } } } else { @@ -42,7 +43,7 @@ private func callListNeighbors(item: ListViewItem, topItem: ListViewItem?, botto if let bottomItem = bottomItem { if let item = item as? ItemListItem, let bottomItem = bottomItem as? ItemListItem { if bottomItem.sectionId != item.sectionId { - bottomNeighbor = .otherSection(requestsNoInset: bottomItem.requestsNoInset) + bottomNeighbor = .otherSection(bottomItem.requestsNoInset ? .none : .full) } else { bottomNeighbor = .sameSection(alwaysPlain: bottomItem.isAlwaysPlain) } @@ -50,7 +51,7 @@ private func callListNeighbors(item: ListViewItem, topItem: ListViewItem?, botto if item is CallListCallItem && bottomItem is CallListCallItem { bottomNeighbor = .sameSection(alwaysPlain: false) } else { - bottomNeighbor = .otherSection(requestsNoInset: false) + bottomNeighbor = .otherSection(.full) } } } else { diff --git a/submodules/TelegramUI/TelegramUI/CallListController.swift b/submodules/TelegramUI/TelegramUI/CallListController.swift index 94aec150cd..ecc59c8f6a 100644 --- a/submodules/TelegramUI/TelegramUI/CallListController.swift +++ b/submodules/TelegramUI/TelegramUI/CallListController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData public enum CallListControllerMode { case tab diff --git a/submodules/TelegramUI/TelegramUI/CallListControllerNode.swift b/submodules/TelegramUI/TelegramUI/CallListControllerNode.swift index 214992c1f2..b0a3722adc 100644 --- a/submodules/TelegramUI/TelegramUI/CallListControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/CallListControllerNode.swift @@ -5,6 +5,8 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences private struct CallListNodeListViewTransition { let callListView: CallListNodeView diff --git a/submodules/TelegramUI/TelegramUI/CallListNodeEntries.swift b/submodules/TelegramUI/TelegramUI/CallListNodeEntries.swift index ea1d0b4405..d76f3147a9 100644 --- a/submodules/TelegramUI/TelegramUI/CallListNodeEntries.swift +++ b/submodules/TelegramUI/TelegramUI/CallListNodeEntries.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Postbox import TelegramCore +import TelegramPresentationData enum CallListNodeEntryId: Hashable { case setting(Int32) diff --git a/submodules/TelegramUI/TelegramUI/CallRatingController.swift b/submodules/TelegramUI/TelegramUI/CallRatingController.swift index ed6310a125..19404151b7 100644 --- a/submodules/TelegramUI/TelegramUI/CallRatingController.swift +++ b/submodules/TelegramUI/TelegramUI/CallRatingController.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData +import TelegramVoip private final class CallRatingAlertContentNode: AlertContentNode { private let strings: PresentationStrings diff --git a/submodules/TelegramUI/TelegramUI/CallSuggestTabController.swift b/submodules/TelegramUI/TelegramUI/CallSuggestTabController.swift index 800bdb7c30..0c55d41b08 100644 --- a/submodules/TelegramUI/TelegramUI/CallSuggestTabController.swift +++ b/submodules/TelegramUI/TelegramUI/CallSuggestTabController.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private func generateIconImage(theme: AlertControllerTheme) -> UIImage? { return UIImage(bundleImageName: "Call List/AlertIcon") diff --git a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberCodeController.swift b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberCodeController.swift index ea49b7fb85..439926dff0 100644 --- a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberCodeController.swift +++ b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberCodeController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ChangePhoneNumberCodeControllerArguments { let updateEntryText: (String) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberController.swift b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberController.swift index c7ba9d64d6..9cdc2af30b 100644 --- a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberController.swift +++ b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberController.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class ChangePhoneNumberController: ViewController { private var controllerNode: ChangePhoneNumberControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberControllerNode.swift index 18729fe0cd..3ecfbcdf5e 100644 --- a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import CoreTelephony +import TelegramPresentationData private func generateCountryButtonBackground(color: UIColor, strokeColor: UIColor) -> UIImage? { return generateImage(CGSize(width: 45.0, height: 44.0 + 6.0), rotatedContext: { size, context in diff --git a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberIntroController.swift b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberIntroController.swift index 1dbe42e8a0..0a208d0ff5 100644 --- a/submodules/TelegramUI/TelegramUI/ChangePhoneNumberIntroController.swift +++ b/submodules/TelegramUI/TelegramUI/ChangePhoneNumberIntroController.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import TelegramCore +import TelegramPresentationData private final class ChangePhoneNumberIntroControllerNode: ASDisplayNode { var presentationData: PresentationData diff --git a/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift b/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift index 4b3d7b78ce..c2063fc5e3 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelAdminController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ChannelAdminControllerArguments { let account: Account @@ -256,7 +257,7 @@ private enum ChannelAdminEntry: ItemListNodeEntry { func item(_ arguments: ChannelAdminControllerArguments) -> ListViewItem { switch self { case let .info(theme, strings, dateTimeFormat, peer, presence): - return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, cachedData: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true), editingNameUpdated: { _ in + return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, cachedData: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in }, avatarTapped: { }) case let .rightsTitle(theme, text): @@ -455,7 +456,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s var index = 0 for right in rightsOrder { if accountUserRightsFlags.contains(right) { - entries.append(.rightItem(presentationData.theme, index, stringForRight(strings: presentationData.strings, right: right, isGroup: isGroup, defaultBannedRights: channel.defaultBannedRights), right, currentRightsFlags, currentRightsFlags.contains(right), !state.updating)) + entries.append(.rightItem(presentationData.theme, index, stringForRight(strings: presentationData.strings, right: right, isGroup: isGroup, defaultBannedRights: channel.defaultBannedRights), right, currentRightsFlags, currentRightsFlags.contains(right), !state.updating && admin.id != accountPeerId)) index += 1 } } @@ -464,11 +465,11 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s entries.append(.addAdminsInfo(presentationData.theme, currentRightsFlags.contains(.canAddAdmins) ? presentationData.strings.Channel_EditAdmin_PermissinAddAdminOn : presentationData.strings.Channel_EditAdmin_PermissinAddAdminOff)) } - if let admin = admin as? TelegramUser, admin.botInfo == nil && channel.flags.contains(.isCreator) && areAllAdminRightsEnabled(currentRightsFlags, group: isGroup) { + if let admin = admin as? TelegramUser, admin.botInfo == nil && !admin.isDeleted && channel.flags.contains(.isCreator) && areAllAdminRightsEnabled(currentRightsFlags, group: isGroup) { entries.append(.transfer(presentationData.theme, isGroup ? presentationData.strings.Group_EditAdmin_TransferOwnership : presentationData.strings.Channel_EditAdmin_TransferOwnership)) } - if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty { + if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId { var canDismiss = false if channel.flags.contains(.isCreator) { canDismiss = true @@ -534,11 +535,11 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s entries.append(.addAdminsInfo(presentationData.theme, currentRightsFlags.contains(.canAddAdmins) ? presentationData.strings.Channel_EditAdmin_PermissinAddAdminOn : presentationData.strings.Channel_EditAdmin_PermissinAddAdminOff)) } - if let admin = admin as? TelegramUser, admin.botInfo == nil && group.role == .creator && areAllAdminRightsEnabled(currentRightsFlags, group: true) { + if let admin = admin as? TelegramUser, admin.botInfo == nil && !admin.isDeleted && group.role == .creator && areAllAdminRightsEnabled(currentRightsFlags, group: true) { entries.append(.transfer(presentationData.theme, presentationData.strings.Group_EditAdmin_TransferOwnership)) } - if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty { + if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId { entries.append(.dismiss(presentationData.theme, presentationData.strings.Channel_Moderator_AccessLevelRevoke)) } } @@ -588,47 +589,21 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi return } - var signal: Signal = .complete() - if let channel = peer as? TelegramChannel { - signal = updateChannelOwnership(postbox: context.account.postbox, network: context.account.network, accountStateManager: context.account.stateManager, channelId: channel.id, memberId: adminId, password: nil) - } else if let _ = peer as? TelegramGroup { - signal = convertGroupToSupergroup(account: context.account, peerId: peerId) - |> map(Optional.init) - |> mapError { _ in ChannelOwnershipTransferError.generic } - |> mapToSignal { upgradedPeerId -> Signal in - guard let upgradedPeerId = upgradedPeerId else { - return .fail(.generic) - } - upgradedToSupergroupImpl(upgradedPeerId, {}) - - return updateChannelOwnership(postbox: context.account.postbox, network: context.account.network, accountStateManager: context.account.stateManager, channelId: upgradedPeerId, memberId: adminId, password: nil) - } - } - - transferOwnershipDisposable.set((signal |> deliverOnMainQueue).start(error: { error in - let currentPeerId = actualPeerId.with { $0 } - let channel: Signal - if currentPeerId == peerId { - channel = .single(peer) - } else { - channel = context.account.postbox.transaction { transaction -> Peer? in - return transaction.getPeer(currentPeerId) - } - } - - let _ = (channel |> deliverOnMainQueue).start(next: { channel in - guard let channel = channel as? TelegramChannel else { - return - } - - let controller = channelOwnershipTransferController(context: context, channel: channel, member: member, initialError: error, present: { c, a in - presentControllerImpl?(c, a) - }, completion: { + transferOwnershipDisposable.set((checkOwnershipTranfserAvailability(postbox: context.account.postbox, network: context.account.network, accountStateManager: context.account.stateManager, memberId: adminId) |> deliverOnMainQueue).start(error: { error in + let controller = channelOwnershipTransferController(context: context, peer: peer, member: member, initialError: error, present: { c, a in + presentControllerImpl?(c, a) + }, completion: { upgradedPeerId in + if let upgradedPeerId = upgradedPeerId { + upgradedToSupergroupImpl(upgradedPeerId, { + dismissImpl?() + transferedOwnership(member.id) + }) + } else { dismissImpl?() transferedOwnership(member.id) - }) - presentControllerImpl?(controller, nil) + } }) + presentControllerImpl?(controller, nil) })) }) }, dismissAdmin: { @@ -777,6 +752,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi } presentControllerImpl?(textAlertController(context: context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) } + dismissImpl?() }, completed: { updated(TelegramChatAdminRights(flags: updateFlags)) dismissImpl?() @@ -803,7 +779,13 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi return current.withUpdatedUpdating(true) } updateRightsDisposable.set((addGroupAdmin(account: context.account, peerId: peerId, adminId: adminId) - |> deliverOnMainQueue).start(completed: { + |> deliverOnMainQueue).start(error: { error in + if case let .addMemberError(error) = error, case .privacy = error, let admin = adminView.peers[adminView.peerId] { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.Privacy_GroupsAndChannels_InviteToGroupError(admin.compactDisplayTitle, admin.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + } + + dismissImpl?() + }, completed: { dismissImpl?() })) } else if updateFlags != defaultFlags { @@ -838,9 +820,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.Privacy_GroupsAndChannels_InviteToGroupError(admin.compactDisplayTitle, admin.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) } - updateState { current in - return current.withUpdatedUpdating(false) - } + dismissImpl?() })) } else { dismissImpl?() diff --git a/submodules/TelegramUI/TelegramUI/ChannelAdminsController.swift b/submodules/TelegramUI/TelegramUI/ChannelAdminsController.swift index ccc3c04a8c..f64bf7025f 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelAdminsController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelAdminsController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChannelAdminsControllerArguments { let account: Account @@ -503,7 +505,7 @@ public func channelAdminsController(context: AccountContext, peerId: PeerId, loa guard let peer = peer, let user = user else { return } - presentControllerImpl?(UndoOverlayController(context: context, content: .succeed(text: presentationData.strings.Channel_OwnershipTransfer_TransferCompleted(peer.displayTitle, user.displayTitle).0), elevatedLayout: false, action: { _ in }), nil) + presentControllerImpl?(UndoOverlayController(context: context, content: .succeed(text: presentationData.strings.Channel_OwnershipTransfer_TransferCompleted(user.displayTitle, peer.displayTitle).0), elevatedLayout: false, action: { _ in }), nil) }) } diff --git a/submodules/TelegramUI/TelegramUI/ChannelBannedMemberController.swift b/submodules/TelegramUI/TelegramUI/ChannelBannedMemberController.swift index e35dd3bf03..b128affe53 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelBannedMemberController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelBannedMemberController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ChannelBannedMemberControllerArguments { let account: Account @@ -214,7 +215,7 @@ private enum ChannelBannedMemberEntry: ItemListNodeEntry { func item(_ arguments: ChannelBannedMemberControllerArguments) -> ListViewItem { switch self { case let .info(theme, strings, dateTimeFormat, peer, presence): - return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, cachedData: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true), editingNameUpdated: { _ in + return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, cachedData: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in }, avatarTapped: { }) case let .rightsHeader(theme, text): diff --git a/submodules/TelegramUI/TelegramUI/ChannelBlacklistController.swift b/submodules/TelegramUI/TelegramUI/ChannelBlacklistController.swift index dbcbcecea7..eb835efcdf 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelBlacklistController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelBlacklistController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChannelBlacklistControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupActionSheetItem.swift b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupActionSheetItem.swift index 03c9b0174a..3c56493f56 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupActionSheetItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupActionSheetItem.swift @@ -5,6 +5,7 @@ import UIKit import Display import Postbox import TelegramCore +import TelegramPresentationData final class ChannelDiscussionGroupActionSheetItem: ActionSheetItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSearchContainerNode.swift index d9ead339d2..afa447837f 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSearchContainerNode.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private enum ChannelDiscussionGroupSearchContent: Equatable { case peer(Peer) diff --git a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupController.swift b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupController.swift index c9a2b6660a..a683579b17 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChannelDiscussionGroupSetupControllerArguments { let account: Account @@ -233,7 +235,7 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI guard let peer = peer else { return } - pushControllerImpl?(createGroupController(context: context, peerIds: [], initialTitle: peer.displayTitle + " Chat", supergroup: true, completion: { groupId, dismiss in + pushControllerImpl?(createGroupController(context: context, peerIds: [], initialTitle: peer.displayTitle + " Chat", mode: .supergroup, completion: { groupId, dismiss in var applySignal = updateGroupDiscussionForChannel(network: context.account.network, postbox: context.account.postbox, channelId: peerId, groupId: groupId) var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in diff --git a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupHeaderItem.swift b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupHeaderItem.swift index ccbe5558ee..b41f4825d7 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupHeaderItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupHeaderItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class ChannelDiscussionGroupSetupHeaderItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupSearchItem.swift b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupSearchItem.swift index f8908e2045..83079ee56b 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupSearchItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelDiscussionGroupSetupSearchItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class ChannelDiscussionGroupSetupSearchItem: ItemListControllerSearch { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift b/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift index d0391657fc..1a5a85d5dd 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents +import TelegramPresentationData private final class ChannelInfoControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift b/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift index 4d40ff0dec..caf8d372f6 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMemberCategoryListContext.swift @@ -294,19 +294,22 @@ private final class ChannelMemberSingleCategoryListContext: ChannelMemberCategor } switch self.category { case let .admins(query): - if let updated = updated, let _ = updated.participant.adminInfo, (query == nil || updated.peer.indexName.matchesByTokens(query!)) { - var found = false - loop: for i in 0 ..< list.count { - if list[i].peer.id == updated.peer.id { - list[i] = updated - found = true - updatedList = true - break loop + if let updated = updated, (query == nil || updated.peer.indexName.matchesByTokens(query!)) { + if case let .member(_, _, adminInfo, _) = updated.participant, adminInfo == nil { + } else { + var found = false + loop: for i in 0 ..< list.count { + if list[i].peer.id == updated.peer.id { + list[i] = updated + found = true + updatedList = true + break loop + } + } + if !found { + list.insert(updated, at: 0) + updatedList = true } - } - if !found { - list.insert(updated, at: 0) - updatedList = true } } else if let previous = previous, let _ = previous.adminInfo { loop: for i in 0 ..< list.count { @@ -316,6 +319,10 @@ private final class ChannelMemberSingleCategoryListContext: ChannelMemberCategor break loop } } + if let updated = updated, case .creator = updated.participant { + list.insert(updated, at: 0) + updatedList = true + } } case .restricted: if let updated = updated, let banInfo = updated.participant.banInfo, !banInfo.rights.flags.contains(.banReadMessages) { diff --git a/submodules/TelegramUI/TelegramUI/ChannelMembersController.swift b/submodules/TelegramUI/TelegramUI/ChannelMembersController.swift index 58e5cf66fa..51e4729cf4 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMembersController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMembersController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChannelMembersControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift index 4969e75b3f..a8536d341f 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchContainerNode.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences enum ChannelMembersSearchMode { case searchMembers @@ -823,6 +825,7 @@ final class ChannelMembersSearchContainerNode: SearchDisplayControllerContentNod updateActivity(true) let foundGroupMembers: Signal<[RenderedChannelParticipant], NoError> let foundMembers: Signal<[RenderedChannelParticipant], NoError> + let foundRemotePeers: Signal<([FoundPeer], [FoundPeer]), NoError> switch mode { case .searchMembers, .banAndPromoteActions: @@ -882,8 +885,15 @@ final class ChannelMembersSearchContainerNode: SearchDisplayControllerContentNod foundMembers = .single([]) } - return combineLatest(foundGroupMembers, foundMembers, themeAndStringsPromise.get(), statePromise.get()) - |> map { foundGroupMembers, foundMembers, themeAndStrings, state -> [ChannelMembersSearchEntry]? in + if mode == .banAndPromoteActions || mode == .inviteActions { + foundRemotePeers = .single(([], [])) |> then(searchPeers(account: context.account, query: query) + |> delay(0.2, queue: Queue.concurrentDefaultQueue())) + } else { + foundRemotePeers = .single(([], [])) + } + + return combineLatest(foundGroupMembers, foundMembers, foundRemotePeers, themeAndStringsPromise.get(), statePromise.get()) + |> map { foundGroupMembers, foundMembers, foundRemotePeers, themeAndStrings, state -> [ChannelMembersSearchEntry]? in var entries: [ChannelMembersSearchEntry] = [] var existingPeerIds = Set() @@ -1063,6 +1073,24 @@ final class ChannelMembersSearchContainerNode: SearchDisplayControllerContentNod } } + for foundPeer in foundRemotePeers.0 { + let peer = foundPeer.peer + if !existingPeerIds.contains(peer.id) && peer is TelegramUser { + existingPeerIds.insert(peer.id) + entries.append(ChannelMembersSearchEntry(index: index, content: .peer(peer), section: .global, dateTimeFormat: themeAndStrings.4)) + index += 1 + } + } + + for foundPeer in foundRemotePeers.1 { + let peer = foundPeer.peer + if !existingPeerIds.contains(peer.id) && peer is TelegramUser { + existingPeerIds.insert(peer.id) + entries.append(ChannelMembersSearchEntry(index: index, content: .peer(peer), section: .global, dateTimeFormat: themeAndStrings.4)) + index += 1 + } + } + return entries } } else { diff --git a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchController.swift b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchController.swift index bd7f8bcee4..be563e351f 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchController.swift @@ -4,6 +4,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData enum ChannelMembersSearchControllerMode { case promote diff --git a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift index e1ef1204f2..78858a6262 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelMembersSearchControllerNode.swift @@ -5,6 +5,8 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences private final class ChannelMembersSearchInteraction { let openPeer: (Peer, RenderedChannelParticipant?) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ChannelOwnershipTransferController.swift b/submodules/TelegramUI/TelegramUI/ChannelOwnershipTransferController.swift index 67b6522f79..dfca4096cd 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelOwnershipTransferController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelOwnershipTransferController.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ChannelOwnershipTransferPasswordFieldNode: ASDisplayNode, UITextFieldDelegate { private var theme: PresentationTheme @@ -396,7 +397,7 @@ private final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { } } -private func commitChannelOwnershipTransferController(context: AccountContext, channel: TelegramChannel, member: TelegramUser, completion: @escaping () -> Void) -> ViewController { +private func commitChannelOwnershipTransferController(context: AccountContext, peer: Peer, member: TelegramUser, present: @escaping (ViewController, Any?) -> Void, completion: @escaping (PeerId?) -> Void) -> ViewController { let presentationData = context.sharedContext.currentPresentationData.with { $0 } var dismissImpl: (() -> Void)? @@ -410,6 +411,10 @@ private func commitChannelOwnershipTransferController(context: AccountContext, c proceedImpl?() })]) + contentNode.complete = { + proceedImpl?() + } + let controller = AlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), contentNode: contentNode) let presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak controller, weak contentNode] presentationData in controller?.theme = AlertControllerTheme(presentationTheme: presentationData.theme) @@ -428,29 +433,85 @@ private func commitChannelOwnershipTransferController(context: AccountContext, c return } contentNode.updateIsChecking(true) - disposable.set((updateChannelOwnership(postbox: context.account.postbox, network: context.account.network, accountStateManager: context.account.stateManager, channelId: channel.id, memberId: member.id, password: contentNode.password) |> deliverOnMainQueue).start(error: { [weak contentNode] error in - contentNode?.updateIsChecking(false) - contentNode?.animateError() - }, completed: { + + let signal: Signal + if let peer = peer as? TelegramChannel { + signal = context.peerChannelMemberCategoriesContextsManager.transferOwnership(account: context.account, peerId: peer.id, memberId: member.id, password: contentNode.password) |> mapToSignal { _ in + return .complete() + } + |> then(.single(nil)) + } else if let peer = peer as? TelegramGroup { + signal = convertGroupToSupergroup(account: context.account, peerId: peer.id) + |> map(Optional.init) + |> mapError { _ in ChannelOwnershipTransferError.generic } + |> deliverOnMainQueue + |> mapToSignal { upgradedPeerId -> Signal in + guard let upgradedPeerId = upgradedPeerId else { + return .fail(.generic) + } + return context.peerChannelMemberCategoriesContextsManager.transferOwnership(account: context.account, peerId: upgradedPeerId, memberId: member.id, password: contentNode.password) |> mapToSignal { _ in + return .complete() + } + |> then(.single(upgradedPeerId)) + } + } else { + signal = .never() + } + + disposable.set((signal |> deliverOnMainQueue).start(next: { upgradedPeerId in dismissImpl?() - completion() + completion(upgradedPeerId) + }, error: { [weak contentNode] error in + var isGroup = true + if let channel = peer as? TelegramChannel, case .broadcast = channel.info { + isGroup = false + } + + var errorTextAndActions: (String, [TextAlertAction])? + switch error { + case .invalidPassword: + contentNode?.animateError() + case .limitExceeded: + errorTextAndActions = (presentationData.strings.TwoStepAuth_FloodError, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + case .adminsTooMuch: + errorTextAndActions = (isGroup ? presentationData.strings.Group_OwnershipTransfer_ErrorAdminsTooMuch : presentationData.strings.Channel_OwnershipTransfer_ErrorAdminsTooMuch, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + case .userPublicChannelsTooMuch: + errorTextAndActions = (presentationData.strings.Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + case .userLocatedGroupsTooMuch: + errorTextAndActions = (presentationData.strings.Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + case .userBlocked, .restricted: + errorTextAndActions = (isGroup ? presentationData.strings.Group_OwnershipTransfer_ErrorPrivacyRestricted : presentationData.strings.Channel_OwnershipTransfer_ErrorPrivacyRestricted, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + default: + errorTextAndActions = (presentationData.strings.Login_UnknownError, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + } + contentNode?.updateIsChecking(false) + + if let (text, actions) = errorTextAndActions { + dismissImpl?() + present(textAlertController(context: context, title: nil, text: text, actions: actions), nil) + } })) } return controller } -private func confirmChannelOwnershipTransferController(context: AccountContext, channel: TelegramChannel, member: TelegramUser, present: @escaping (ViewController, Any?) -> Void, completion: @escaping () -> Void) -> ViewController { +private func confirmChannelOwnershipTransferController(context: AccountContext, peer: Peer, member: TelegramUser, present: @escaping (ViewController, Any?) -> Void, completion: @escaping (PeerId?) -> Void) -> ViewController { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let theme = AlertControllerTheme(presentationTheme: presentationData.theme) + var isGroup = true + if let channel = peer as? TelegramChannel, case .broadcast = channel.info { + isGroup = false + } + var title: String var text: String - if case .group = channel.info { + if isGroup { title = presentationData.strings.Group_OwnershipTransfer_Title - text = presentationData.strings.Group_OwnershipTransfer_DescriptionInfo(channel.displayTitle, member.displayTitle).0 + text = presentationData.strings.Group_OwnershipTransfer_DescriptionInfo(peer.displayTitle, member.displayTitle).0 } else { title = presentationData.strings.Channel_OwnershipTransfer_Title - text = presentationData.strings.Channel_OwnershipTransfer_DescriptionInfo(channel.displayTitle, member.displayTitle).0 + text = presentationData.strings.Channel_OwnershipTransfer_DescriptionInfo(peer.displayTitle, member.displayTitle).0 } let attributedTitle = NSAttributedString(string: title, font: Font.medium(17.0), textColor: theme.primaryColor, paragraphAlignment: .center) @@ -458,38 +519,30 @@ private func confirmChannelOwnershipTransferController(context: AccountContext, let bold = MarkdownAttributeSet(font: Font.semibold(13.0), textColor: theme.primaryColor) let attributedText = parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: body, bold: bold, link: body, linkAttribute: { _ in return nil }), textAlignment: .center) - var dismissImpl: (() -> Void)? - let controller = richTextAlertController(context: context, title: attributedTitle, text: attributedText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Channel_OwnershipTransfer_ChangeOwner, action: { - dismissImpl?() - present(commitChannelOwnershipTransferController(context: context, channel: channel, member: member, completion: completion), nil) + present(commitChannelOwnershipTransferController(context: context, peer: peer, member: member, present: present, completion: completion), nil) }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: { - dismissImpl?() })], actionLayout: .vertical) - dismissImpl = { [weak controller] in - controller?.dismissAnimated() - } return controller } -func channelOwnershipTransferController(context: AccountContext, channel: TelegramChannel, member: TelegramUser, initialError: ChannelOwnershipTransferError, present: @escaping (ViewController, Any?) -> Void, completion: @escaping () -> Void) -> ViewController { +func channelOwnershipTransferController(context: AccountContext, peer: Peer, member: TelegramUser, initialError: ChannelOwnershipTransferError, present: @escaping (ViewController, Any?) -> Void, completion: @escaping (PeerId?) -> Void) -> ViewController { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let theme = AlertControllerTheme(presentationTheme: presentationData.theme) var title: NSAttributedString? = NSAttributedString(string: presentationData.strings.OwnershipTransfer_SecurityCheck, font: Font.medium(17.0), textColor: theme.primaryColor, paragraphAlignment: .center) var text = presentationData.strings.OwnershipTransfer_SecurityRequirements - var isGroup = false - if case .group = channel.info { - isGroup = true + var isGroup = true + if let channel = peer as? TelegramChannel, case .broadcast = channel.info { + isGroup = false } - var dismissImpl: (() -> Void)? var actions: [TextAlertAction] = [] switch initialError { case .requestPassword: - return confirmChannelOwnershipTransferController(context: context, channel: channel, member: member, present: present, completion: completion) + return confirmChannelOwnershipTransferController(context: context, peer: peer, member: member, present: present, completion: completion) case .twoStepAuthTooFresh, .authSessionTooFresh: text = text + presentationData.strings.OwnershipTransfer_ComeBackLater actions = [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})] @@ -524,9 +577,5 @@ func channelOwnershipTransferController(context: AccountContext, channel: Telegr let bold = MarkdownAttributeSet(font: Font.semibold(13.0), textColor: theme.primaryColor) let attributedText = parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: body, bold: bold, link: body, linkAttribute: { _ in return nil }), textAlignment: .center) - let controller = richTextAlertController(context: context, title: title, text: attributedText, actions: actions) - dismissImpl = { [weak controller] in - controller?.dismissAnimated() - } - return controller + return richTextAlertController(context: context, title: title, text: attributedText, actions: actions) } diff --git a/submodules/TelegramUI/TelegramUI/ChannelPermissionsController.swift b/submodules/TelegramUI/TelegramUI/ChannelPermissionsController.swift index 8a13ece357..47582a5102 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelPermissionsController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelPermissionsController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChannelPermissionsControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ChannelStatsController.swift b/submodules/TelegramUI/TelegramUI/ChannelStatsController.swift index 0ad6b1ac2f..4d1663f1ce 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelStatsController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelStatsController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class ChannelStatsController: ViewController { private var controllerNode: ChannelStatsControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChannelStatsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChannelStatsControllerNode.swift index 1a5075bbd9..947a6f280f 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelStatsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelStatsControllerNode.swift @@ -6,6 +6,7 @@ import WebKit import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData final class ChannelStatsControllerNode: ViewControllerTracingNode, WKNavigationDelegate { private var webView: WKWebView? diff --git a/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift b/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift index 6d63a414b9..02e771e0af 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelVisibilityController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChannelVisibilityControllerArguments { let account: Account @@ -36,6 +38,7 @@ private enum ChannelVisibilitySection: Int32 { case type case link case linkActions + case location } private enum ChannelVisibilityEntryTag: ItemListItemTag { @@ -57,9 +60,10 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { case typePrivate(PresentationTheme, String, Bool) case typeInfo(PresentationTheme, String) + case publicLinkHeader(PresentationTheme, String) case publicLinkAvailability(PresentationTheme, String, Bool) case privateLink(PresentationTheme, String, String?) - case editablePublicLink(PresentationTheme, String) + case editablePublicLink(PresentationTheme, String, String) case privateLinkInfo(PresentationTheme, String) case privateLinkCopy(PresentationTheme, String) case privateLinkRevoke(PresentationTheme, String) @@ -74,7 +78,7 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { switch self { case .typeHeader, .typePublic, .typePrivate, .typeInfo: return ChannelVisibilitySection.type.rawValue - case .publicLinkAvailability, .privateLink, .editablePublicLink, .privateLinkInfo, .publicLinkInfo, .publicLinkStatus: + case .publicLinkHeader, .publicLinkAvailability, .privateLink, .editablePublicLink, .privateLinkInfo, .publicLinkInfo, .publicLinkStatus: return ChannelVisibilitySection.link.rawValue case .privateLinkCopy, .privateLinkRevoke, .privateLinkShare: return ChannelVisibilitySection.linkActions.rawValue @@ -93,29 +97,30 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { return 2 case .typeInfo: return 3 - - case .publicLinkAvailability: + case .publicLinkHeader: return 4 - case .privateLink: + case .publicLinkAvailability: return 5 - case .editablePublicLink: + case .privateLink: return 6 - case .privateLinkInfo: + case .editablePublicLink: return 7 - case .privateLinkCopy: + case .privateLinkInfo: return 8 - case .privateLinkRevoke: + case .privateLinkCopy: return 9 - case .privateLinkShare: + case .privateLinkRevoke: return 10 - case .publicLinkStatus: + case .privateLinkShare: return 11 - case .publicLinkInfo: + case .publicLinkStatus: return 12 - case .existingLinksInfo: + case .publicLinkInfo: return 13 + case .existingLinksInfo: + return 14 case let .existingLinkPeerItem(index, _, _, _, _, _, _, _): - return 14 + index + return 15 + index } } @@ -145,6 +150,12 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { } else { return false } + case let .publicLinkHeader(lhsTheme, lhsTitle): + if case let .publicLinkHeader(rhsTheme, rhsTitle) = rhs, lhsTheme === rhsTheme, lhsTitle == rhsTitle { + return true + } else { + return false + } case let .publicLinkAvailability(lhsTheme, lhsText, lhsValue): if case let .publicLinkAvailability(rhsTheme, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue { return true @@ -157,8 +168,8 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { } else { return false } - case let .editablePublicLink(lhsTheme, lhsCurrentText): - if case let .editablePublicLink(rhsTheme, rhsCurrentText) = rhs, lhsTheme === rhsTheme, lhsCurrentText == rhsCurrentText { + case let .editablePublicLink(lhsTheme, lhsPlaceholder, lhsCurrentText): + if case let .editablePublicLink(rhsTheme, rhsPlaceholder, rhsCurrentText) = rhs, lhsTheme === rhsTheme, lhsPlaceholder == rhsPlaceholder, lhsCurrentText == rhsCurrentText { return true } else { return false @@ -256,6 +267,8 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { }) case let .typeInfo(theme, text): return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) + case let .publicLinkHeader(theme, title): + return ItemListSectionHeaderItem(theme: theme, text: title, sectionId: self.section) case let .publicLinkAvailability(theme, text, value): let attr = NSMutableAttributedString(string: text, textColor: value ? theme.list.freeTextColor : theme.list.freeTextErrorColor) attr.addAttribute(.font, value: Font.regular(13), range: NSMakeRange(0, attr.length)) @@ -266,8 +279,8 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { arguments.displayPrivateLinkMenu(value) } }, tag: ChannelVisibilityEntryTag.privateLink) - case let .editablePublicLink(theme, currentText): - return ItemListSingleLineInputItem(theme: theme, title: NSAttributedString(string: "t.me/", textColor: theme.list.itemPrimaryTextColor), text: currentText, placeholder: "", tag: ChannelVisibilityEntryTag.publicLink, sectionId: self.section, textUpdated: { updatedText in + case let .editablePublicLink(theme, placeholder, currentText): + return ItemListSingleLineInputItem(theme: theme, title: NSAttributedString(string: "t.me/", textColor: theme.list.itemPrimaryTextColor), text: currentText, placeholder: placeholder, tag: ChannelVisibilityEntryTag.publicLink, sectionId: self.section, textUpdated: { updatedText in arguments.updatePublicLinkText(currentText, updatedText) }, receivedFocus: { arguments.scrollToPublicLinkText() @@ -288,7 +301,7 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry { arguments.sharePrivateLink() }) case let .publicLinkInfo(theme, text): - return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) + return ItemListTextItem(theme: theme, text: .markdown(text), sectionId: self.section) case let .publicLinkStatus(theme, text, status): var displayActivity = false let color: UIColor @@ -330,6 +343,11 @@ private enum CurrentChannelType { case privateChannel } +private enum CurrentChannelLocation: Equatable { + case removed + case location(PeerGeoLocation) +} + private struct ChannelVisibilityControllerState: Equatable { let selectedType: CurrentChannelType? let editingPublicLinkText: String? @@ -381,7 +399,6 @@ private struct ChannelVisibilityControllerState: Equatable { if lhs.revokingPrivateLink != rhs.revokingPrivateLink { return false } - return true } @@ -432,6 +449,8 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa } else { if let addressName = peer.addressName, !addressName.isEmpty { selectedType = .publicChannel + } else if let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + selectedType = .publicChannel } else { selectedType = .privateChannel } @@ -449,30 +468,33 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa } } - switch mode { - case .privateLink: - break - case .initialSetup, .generic: - entries.append(.typeHeader(presentationData.theme, isGroup ? presentationData.strings.Group_Setup_TypeHeader : presentationData.strings.Channel_Edit_LinkItem)) - entries.append(.typePublic(presentationData.theme, presentationData.strings.Channel_Setup_TypePublic, selectedType == .publicChannel)) - entries.append(.typePrivate(presentationData.theme, presentationData.strings.Channel_Setup_TypePrivate, selectedType == .privateChannel)) - - switch selectedType { - case .publicChannel: - if isGroup { - entries.append(.typeInfo(presentationData.theme, presentationData.strings.Group_Setup_TypePublicHelp)) - } else { - entries.append(.typeInfo(presentationData.theme, presentationData.strings.Channel_Setup_TypePublicHelp)) - } - case .privateChannel: - if isGroup { - entries.append(.typeInfo(presentationData.theme, presentationData.strings.Group_Setup_TypePrivateHelp)) - } else { - entries.append(.typeInfo(presentationData.theme, presentationData.strings.Channel_Setup_TypePrivateHelp)) - } - } + if let _ = (view.cachedData as? CachedChannelData)?.peerGeoLocation { + } else { + switch mode { + case .privateLink: + break + case .initialSetup, .generic: + entries.append(.typeHeader(presentationData.theme, isGroup ? presentationData.strings.Group_Setup_TypeHeader : presentationData.strings.Channel_Edit_LinkItem)) + entries.append(.typePublic(presentationData.theme, presentationData.strings.Channel_Setup_TypePublic, selectedType == .publicChannel)) + entries.append(.typePrivate(presentationData.theme, presentationData.strings.Channel_Setup_TypePrivate, selectedType == .privateChannel)) + + switch selectedType { + case .publicChannel: + if isGroup { + entries.append(.typeInfo(presentationData.theme, presentationData.strings.Group_Setup_TypePublicHelp)) + } else { + entries.append(.typeInfo(presentationData.theme, presentationData.strings.Channel_Setup_TypePublicHelp)) + } + case .privateChannel: + if isGroup { + entries.append(.typeInfo(presentationData.theme, presentationData.strings.Group_Setup_TypePrivateHelp)) + } else { + entries.append(.typeInfo(presentationData.theme, presentationData.strings.Channel_Setup_TypePrivateHelp)) + } + } + } } - + switch selectedType { case .publicChannel: var displayAvailability = false @@ -502,7 +524,7 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa entries.append(.publicLinkAvailability(presentationData.theme, presentationData.strings.Group_Username_CreatePublicLinkHelp, true)) } } else { - entries.append(.editablePublicLink(presentationData.theme, currentAddressName)) + entries.append(.editablePublicLink(presentationData.theme, presentationData.strings.Group_PublicLink_Placeholder, currentAddressName)) if let status = state.addressNameValidationStatus { let text: String switch status { @@ -543,7 +565,11 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa entries.append(.publicLinkStatus(presentationData.theme, text, status)) } if isGroup { - entries.append(.publicLinkInfo(presentationData.theme, presentationData.strings.Group_Username_CreatePublicLinkHelp)) + if let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + entries.append(.publicLinkInfo(presentationData.theme, presentationData.strings.Group_PublicLink_Info)) + } else { + entries.append(.publicLinkInfo(presentationData.theme, presentationData.strings.Group_Username_CreatePublicLinkHelp)) + } } else { entries.append(.publicLinkInfo(presentationData.theme, presentationData.strings.Channel_Username_CreatePublicLinkHelp)) } @@ -640,7 +666,7 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa entries.append(.publicLinkAvailability(presentationData.theme, presentationData.strings.Group_Username_CreatePublicLinkHelp, true)) } } else { - entries.append(.editablePublicLink(presentationData.theme, currentAddressName)) + entries.append(.editablePublicLink(presentationData.theme, "", currentAddressName)) if let status = state.addressNameValidationStatus { let text: String switch status { @@ -672,6 +698,7 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa entries.append(.publicLinkStatus(presentationData.theme, text, status)) } + entries.append(.publicLinkInfo(presentationData.theme, presentationData.strings.Group_Username_CreatePublicLinkHelp)) } case .privateChannel: @@ -698,13 +725,16 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa return entries } -private func effectiveChannelType(state: ChannelVisibilityControllerState, peer: TelegramChannel) -> CurrentChannelType { + +private func effectiveChannelType(state: ChannelVisibilityControllerState, peer: TelegramChannel, cachedData: CachedPeerData?) -> CurrentChannelType { let selectedType: CurrentChannelType if let current = state.selectedType { selectedType = current } else { if let addressName = peer.addressName, !addressName.isEmpty { selectedType = .publicChannel + } else if let cachedChannelData = cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + selectedType = .publicChannel } else { selectedType = .privateChannel } @@ -712,9 +742,9 @@ private func effectiveChannelType(state: ChannelVisibilityControllerState, peer: return selectedType } -private func updatedAddressName(state: ChannelVisibilityControllerState, peer: Peer) -> String? { +private func updatedAddressName(state: ChannelVisibilityControllerState, peer: Peer, cachedData: CachedPeerData?) -> String? { if let peer = peer as? TelegramChannel { - let selectedType = effectiveChannelType(state: state, peer: peer) + let selectedType = effectiveChannelType(state: state, peer: peer, cachedData: cachedData) let currentAddressName: String @@ -772,18 +802,20 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, let peersDisablingAddressNameAssignment = Promise<[Peer]?>() peersDisablingAddressNameAssignment.set(.single(nil) |> then(channelAddressNameAssignmentAvailability(account: context.account, peerId: peerId.namespace == Namespaces.Peer.CloudChannel ? peerId : nil) |> mapToSignal { result -> Signal<[Peer]?, NoError> in if case .addressNameLimitReached = result { - return adminedPublicChannels(account: context.account) - |> map(Optional.init) + return adminedPublicChannels(account: context.account, location: false) + |> map(Optional.init) } else { return .single([]) } })) var dismissImpl: (() -> Void)? + var dismissInputImpl: (() -> Void)? var nextImpl: (() -> Void)? var displayPrivateLinkMenuImpl: ((String) -> Void)? var scrollToPublicLinkTextImpl: (() -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)? + var clearHighlightImpl: (() -> Void)? let actionsDisposable = DisposableSet() @@ -799,7 +831,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, let revokeLinkDisposable = MetaDisposable() actionsDisposable.add(revokeLinkDisposable) - actionsDisposable.add( (context.account.viewTracker.peerView(peerId) |> filter { $0.cachedData != nil } |> take(1) |> mapToSignal { view -> Signal in + actionsDisposable.add((context.account.viewTracker.peerView(peerId) |> filter { $0.cachedData != nil } |> take(1) |> mapToSignal { view -> Signal in return ensuredExistingPeerExportedInvitation(account: context.account, peerId: peerId) }).start()) @@ -824,11 +856,11 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, } checkAddressNameDisposable.set((validateAddressNameInteractive(account: context.account, domain: .peer(peerId), name: text) - |> deliverOnMainQueue).start(next: { result in - updateState { state in - return state.withUpdatedAddressNameValidationStatus(result) - } - })) + |> deliverOnMainQueue).start(next: { result in + updateState { state in + return state.withUpdatedAddressNameValidationStatus(result) + } + })) } }, scrollToPublicLinkText: { scrollToPublicLinkTextImpl?() @@ -926,7 +958,6 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, }) }) - let peerView = context.account.viewTracker.peerView(peerId) |> deliverOnMainQueue @@ -945,6 +976,11 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, case .privateChannel: break case .publicChannel: + var hasLocation = false + if let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + hasLocation = true + } + if let addressNameValidationStatus = state.addressNameValidationStatus { switch addressNameValidationStatus { case .availability(.available): @@ -953,7 +989,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, doneEnabled = false } } else { - doneEnabled = !(peer.addressName?.isEmpty ?? true) + doneEnabled = !(peer.addressName?.isEmpty ?? true) || hasLocation } } } @@ -961,7 +997,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, rightNavigationButton = ItemListNavigationButton(content: .text(mode == .initialSetup ? presentationData.strings.Common_Next : presentationData.strings.Common_Done), style: state.updatingAddressName ? .activity : .bold, enabled: doneEnabled, action: { var updatedAddressNameValue: String? updateState { state in - updatedAddressNameValue = updatedAddressName(state: state, peer: peer) + updatedAddressNameValue = updatedAddressName(state: state, peer: peer, cachedData: view.cachedData) return state } @@ -983,12 +1019,11 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, updateState { state in return state.withUpdatedUpdatingAddressName(false) } - switch mode { - case .initialSetup: - nextImpl?() - case .generic, .privateLink: - dismissImpl?() + case .initialSetup: + nextImpl?() + case .generic, .privateLink: + dismissImpl?() } })) @@ -1033,7 +1068,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: state.updatingAddressName ? .activity : .bold, enabled: doneEnabled, action: { var updatedAddressNameValue: String? updateState { state in - updatedAddressNameValue = updatedAddressName(state: state, peer: peer) + updatedAddressNameValue = updatedAddressName(state: state, peer: peer, cachedData: nil) return state } @@ -1135,6 +1170,8 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, } else { if let addressName = peer.addressName, !addressName.isEmpty { selectedType = .publicChannel + } else if let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + selectedType = .publicChannel } else { selectedType = .privateChannel } @@ -1150,10 +1187,22 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, if case .privateLink = mode { title = presentationData.strings.GroupInfo_InviteLink_Title } else { - title = isGroup ? presentationData.strings.GroupInfo_GroupType : presentationData.strings.Channel_TypeSetup_Title + if let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + title = presentationData.strings.Group_PublicLink_Title + } else { + title = isGroup ? presentationData.strings.GroupInfo_GroupType : presentationData.strings.Channel_TypeSetup_Title + } } + + let entries = channelVisibilityControllerEntries(presentationData: presentationData, mode: mode, view: view, publicChannelsToRevoke: publicChannelsToRevoke, state: state) + + var focusItemTag: ItemListItemTag? + if entries.count > 1, let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + focusItemTag = ChannelVisibilityEntryTag.publicLink + } + 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: channelVisibilityControllerEntries(presentationData: presentationData, mode: mode, view: view, publicChannelsToRevoke: publicChannelsToRevoke, state: state), style: .blocks, crossfadeState: crossfade, animateChanges: false) + let listState = ItemListNodeState(entries: entries, style: .blocks, focusItemTag: focusItemTag, crossfadeState: crossfade, animateChanges: false) return (controllerState, (listState, arguments)) } |> afterDisposed { @@ -1165,6 +1214,9 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, controller?.view.endEditing(true) controller?.dismiss() } + dismissInputImpl = { [weak controller] in + controller?.view.endEditing(true) + } nextImpl = { [weak controller] in if let controller = controller { if case .initialSetup = mode { @@ -1260,5 +1312,8 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, presentControllerImpl = { [weak controller] c, a in controller?.present(c, in: .window(.root), with: a) } + clearHighlightImpl = { [weak controller] in + controller?.clearItemNodesHighlight(animated: true) + } return controller } diff --git a/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift index 1d5c9d9e85..ca0adedbec 100644 --- a/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import Postbox import TelegramCore import Lottie +import TelegramPresentationData class ChatAnimationGalleryItem: GalleryItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChatBotStartInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatBotStartInputPanelNode.swift index c920f7bf1a..450c47aebe 100644 --- a/submodules/TelegramUI/TelegramUI/ChatBotStartInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatBotStartInputPanelNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData final class ChatBotStartInputPanelNode: ChatInputPanelNode { private let button: HighlightableButtonNode diff --git a/submodules/TelegramUI/TelegramUI/ChatBubbleInstantVideoDecoration.swift b/submodules/TelegramUI/TelegramUI/ChatBubbleInstantVideoDecoration.swift index 9e9da03b0d..d2820b6046 100644 --- a/submodules/TelegramUI/TelegramUI/ChatBubbleInstantVideoDecoration.swift +++ b/submodules/TelegramUI/TelegramUI/ChatBubbleInstantVideoDecoration.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import UniversalMediaPlayer final class ChatBubbleInstantVideoDecoration: UniversalVideoDecoration { let backgroundNode: ASDisplayNode? diff --git a/submodules/TelegramUI/TelegramUI/ChatBubbleVideoDecoration.swift b/submodules/TelegramUI/TelegramUI/ChatBubbleVideoDecoration.swift index d15f303b0f..165328cedb 100644 --- a/submodules/TelegramUI/TelegramUI/ChatBubbleVideoDecoration.swift +++ b/submodules/TelegramUI/TelegramUI/ChatBubbleVideoDecoration.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import UniversalMediaPlayer final class ChatBubbleVideoDecoration: UniversalVideoDecoration { private let nativeSize: CGSize diff --git a/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift index 793fdd7752..cff70ae640 100644 --- a/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatButtonKeyboardInputNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private final class ChatButtonKeyboardInputButtonNode: ASButtonNode { var button: ReplyMarkupButton? diff --git a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift index 2f20e7ea07..91caff52eb 100644 --- a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private enum SubscriberAction { case join @@ -135,7 +136,7 @@ final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { } else { text = presentationInterfaceState.strings.Group_ErrorAccessDenied } - strongSelf.interfaceInteraction?.presentController(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationInterfaceState.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationInterfaceState.strings.Common_OK, action: {})]), nil) + strongSelf.interfaceInteraction?.presentController(textAlertController(context: context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationInterfaceState.strings.Common_OK, action: {})]), nil) })) case .kicked: break diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index f1cb13049b..68acc137dc 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -9,6 +9,9 @@ import SafariServices import MobileCoreServices import Intents import LegacyComponents +import TelegramPresentationData +import TelegramUIPreferences +import DeviceAccess public enum ChatControllerPeekActions { case standard @@ -220,6 +223,10 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, private var screenCaptureEventsDisposable: Disposable? private let chatAdditionalDataDisposable = MetaDisposable() + private var reportIrrelvantGeoNoticePromise = Promise() + private var reportIrrelvantGeoNotice: Bool? + private var reportIrrelvantGeoDisposable: Disposable? + private var volumeButtonsListener: VolumeButtonsListener? private var beginMediaRecordingRequestId: Int = 0 @@ -227,10 +234,6 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, var purposefulAction: (() -> Void)? - public override var customData: Any? { - return self.chatLocation - } - public init(context: AccountContext, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, mode: ChatControllerPresentationMode = .standard(previewing: false)) { let _ = ChatControllerCount.modify { value in return value + 1 @@ -1250,7 +1253,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, guard let strongSelf = self else { return } - let _ = deleteMessagesInteractively(postbox: strongSelf.context.account.postbox, messageIds: messages.map({ $0.id }), type: .forLocalPeer).start() + 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 @@ -1450,17 +1453,32 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } 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 { + return true + } else { + return false + } + }) + } else { + self.reportIrrelvantGeoNoticePromise.set(.single(nil)) } - self.peerDisposable.set((combineLatest(queue: Queue.mainQueue(), peerView.get(), onlineMemberCount) - |> deliverOnMainQueue).start(next: { [weak self] peerView, onlineMemberCount in + + self.peerDisposable.set((combineLatest(queue: Queue.mainQueue(), peerView.get(), onlineMemberCount, self.reportIrrelvantGeoNoticePromise.get()) + |> deliverOnMainQueue).start(next: { [weak self] peerView, onlineMemberCount, peerReportNotice in if let strongSelf = self { if let peer = peerViewMainPeer(peerView) { strongSelf.chatTitleView?.titleContent = .peer(peerView: peerView, onlineMemberCount: onlineMemberCount) (strongSelf.chatInfoNavigationButton?.buttonItem.customDisplayNode as? ChatAvatarNavigationNode)?.avatarNode.setPeer(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, peer: peer, overrideImage: peer.isDeleted ? .deletedIcon : .none) } - if strongSelf.peerView === peerView { + + if strongSelf.peerView === peerView && strongSelf.reportIrrelvantGeoNotice == peerReportNotice { return } + + strongSelf.reportIrrelvantGeoNotice = peerReportNotice + var upgradedToPeerId: PeerId? if let previous = strongSelf.peerView, let group = previous.peers[previous.peerId] as? TelegramGroup, group.migrationReference == nil, let updatedGroup = peerView.peers[peerView.peerId] as? TelegramGroup, let migrationReference = updatedGroup.migrationReference { upgradedToPeerId = migrationReference.peerId @@ -1505,18 +1523,30 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } } var peerDiscussionId: PeerId? - if let peer = peerView.peers[peerView.peerId] as? TelegramChannel, case .broadcast = peer.info, let cachedData = peerView.cachedData as? CachedChannelData { - peerDiscussionId = cachedData.linkedDiscussionPeerId + var peerGeoLocation: PeerGeoLocation? + if let peer = peerView.peers[peerView.peerId] as? TelegramChannel, let cachedData = peerView.cachedData as? CachedChannelData { + if case .broadcast = peer.info { + peerDiscussionId = cachedData.linkedDiscussionPeerId + } else { + peerGeoLocation = cachedData.peerGeoLocation + } } var renderedPeer: RenderedPeer? var contactStatus: ChatContactStatus? if let peer = peerView.peers[peerView.peerId] { if let cachedData = peerView.cachedData as? CachedUserData { - contactStatus = ChatContactStatus(canAddContact: !peerView.peerIsContact, peerStatusSettings: cachedData.peerStatusSettings) + contactStatus = ChatContactStatus(canAddContact: !peerView.peerIsContact, canReportIrrelevantLocation: false, peerStatusSettings: cachedData.peerStatusSettings) } else if let cachedData = peerView.cachedData as? CachedGroupData { - contactStatus = ChatContactStatus(canAddContact: false, peerStatusSettings: cachedData.peerStatusSettings) + contactStatus = ChatContactStatus(canAddContact: false, canReportIrrelevantLocation: false, peerStatusSettings: cachedData.peerStatusSettings) } else if let cachedData = peerView.cachedData as? CachedChannelData { - contactStatus = ChatContactStatus(canAddContact: false, peerStatusSettings: cachedData.peerStatusSettings) + var canReportIrrelevantLocation = true + if let peer = peerView.peers[peerView.peerId] as? TelegramChannel, peer.participationStatus == .member { + canReportIrrelevantLocation = false + } + if let peerReportNotice = peerReportNotice, peerReportNotice { + canReportIrrelevantLocation = false + } + contactStatus = ChatContactStatus(canAddContact: false, canReportIrrelevantLocation: canReportIrrelevantLocation, peerStatusSettings: cachedData.peerStatusSettings) } var peers = SimpleDictionary() @@ -1569,7 +1599,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } var didDisplayActionsPanel = false - if let contactStatus = strongSelf.presentationInterfaceState.contactStatus, let peerStatusSettings = contactStatus.peerStatusSettings { + if let contactStatus = strongSelf.presentationInterfaceState.contactStatus, !contactStatus.isEmpty, let peerStatusSettings = contactStatus.peerStatusSettings { if !peerStatusSettings.isEmpty { if contactStatus.canAddContact && peerStatusSettings.contains(.canAddContact) { didDisplayActionsPanel = true @@ -1577,12 +1607,14 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, didDisplayActionsPanel = true } else if peerStatusSettings.contains(.canShareContact) { didDisplayActionsPanel = true + } else if contactStatus.canReportIrrelevantLocation && peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + didDisplayActionsPanel = true } } } var displayActionsPanel = false - if let contactStatus = contactStatus, let peerStatusSettings = contactStatus.peerStatusSettings { + if let contactStatus = contactStatus, !contactStatus.isEmpty, let peerStatusSettings = contactStatus.peerStatusSettings { if !peerStatusSettings.isEmpty { if contactStatus.canAddContact && peerStatusSettings.contains(.canAddContact) { displayActionsPanel = true @@ -1590,6 +1622,8 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, displayActionsPanel = true } else if peerStatusSettings.contains(.canShareContact) { displayActionsPanel = true + } else if contactStatus.canReportIrrelevantLocation && peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + displayActionsPanel = true } } } @@ -1609,7 +1643,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongSelf.updateChatPresentationInterfaceState(animated: animated, interactive: false, { return $0.updatedPeer { _ in return renderedPeer - }.updatedIsNotAccessible(isNotAccessible).updatedContactStatus(contactStatus).updatedHasBots(hasBots).updatedIsArchived(isArchived).updatedPeerIsMuted(peerIsMuted).updatedPeerDiscussionId(peerDiscussionId).updatedExplicitelyCanPinMessages(explicitelyCanPinMessages) + }.updatedIsNotAccessible(isNotAccessible).updatedContactStatus(contactStatus).updatedHasBots(hasBots).updatedIsArchived(isArchived).updatedPeerIsMuted(peerIsMuted).updatedPeerDiscussionId(peerDiscussionId).updatedPeerGeoLocation(peerGeoLocation).updatedExplicitelyCanPinMessages(explicitelyCanPinMessages) }) if !strongSelf.didSetChatLocationInfoReady { strongSelf.didSetChatLocationInfoReady = true @@ -1924,6 +1958,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, self.shareStatusDisposable?.dispose() self.context.sharedContext.mediaManager.galleryHiddenMediaManager.removeTarget(self) self.preloadHistoryPeerIdDisposable.dispose() + self.reportIrrelvantGeoDisposable?.dispose() } public func updatePresentationMode(_ mode: ChatControllerPresentationMode) { @@ -2250,7 +2285,10 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, insertItems.append(ListViewInsertItem(index: item.index, previousIndex: item.previousIndex, item: item.item, directionHint: item.directionHint == .Down ? .Up : nil)) } - let scrollToItem = ListViewScrollToItem(index: 0, position: .top(0.0), animated: true, curve: .Default(duration: 0.2), directionHint: .Up) + var scrollToItem: ListViewScrollToItem? + if transition.historyView.originalView.laterId == nil { + scrollToItem = ListViewScrollToItem(index: 0, position: .top(0.0), animated: true, curve: .Default(duration: 0.2), directionHint: .Up) + } var stationaryItemRange: (Int, Int)? if let maxInsertedItem = maxInsertedItem { @@ -2272,7 +2310,8 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, if let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation { strongSelf.commitPurposefulAction() - let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: strongSelf.transformEnqueueMessages(messages)) |> deliverOnMainQueue).start(next: { _ in + let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: strongSelf.transformEnqueueMessages(messages)) + |> deliverOnMainQueue).start(next: { _ in if let strongSelf = self { strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory() } @@ -2859,7 +2898,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } }) } - DeviceAccess.authorizeAccess(to: .microphone(isVideo ? .video : .audio), context: strongSelf.context, presentationData: strongSelf.presentationData, present: { c, a in + DeviceAccess.authorizeAccess(to: .microphone(isVideo ? .video : .audio), presentationData: strongSelf.presentationData, present: { c, a in self?.present(c, in: .window(.root), with: a) }, openSettings: { self?.context.sharedContext.applicationBindings.openSettings() @@ -2868,7 +2907,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return } if isVideo { - DeviceAccess.authorizeAccess(to: .camera, context: strongSelf.context, presentationData: strongSelf.presentationData, present: { c, a in + DeviceAccess.authorizeAccess(to: .camera, presentationData: strongSelf.presentationData, present: { c, a in self?.present(c, in: .window(.root), with: a) }, openSettings: { self?.context.sharedContext.applicationBindings.openSettings() @@ -3432,6 +3471,29 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: false, { $0.updatedInputMode({ _ in return .none }) }) } + }, reportPeerIrrelevantGeoLocation: { [weak self] in + guard let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation else { + return + } + + strongSelf.chatDisplayNode.dismissInput() + + let actions = [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: { + }), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.ReportGroupLocation_Report, action: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.reportIrrelvantGeoDisposable = (TelegramCore.reportPeer(account: strongSelf.context.account, peerId: peerId, reason: .irrelevantLocation) + |> deliverOnMainQueue).start(completed: { [weak self] in + if let strongSelf = self { + strongSelf.reportIrrelvantGeoNoticePromise.set(.single(true)) + let _ = ApplicationSpecificNotice.setIrrelevantPeerGeoReport(postbox: strongSelf.context.account.postbox, peerId: peerId).start() + + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.ReportPeer_AlertSuccess, actions: [TextAlertAction(type: TextAlertActionType.defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + } + }) + })] + strongSelf.present(textAlertController(context: strongSelf.context, title: strongSelf.presentationData.strings.ReportGroupLocation_Title, text: strongSelf.presentationData.strings.ReportGroupLocation_Text, actions: actions), in: .window(.root)) }, statuses: ChatPanelInterfaceInteractionStatuses(editingMessage: self.editingMessage.get(), startingBot: self.startingBot.get(), unblockingPeer: self.unblockingPeer.get(), searching: self.searching.get(), loadingMessage: self.loadingMessage.get())) switch self.chatLocation { @@ -4168,7 +4230,6 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, if updatedChatPresentationInterfaceState.interfaceState.selectionState != controllerInteraction.selectionState { controllerInteraction.selectionState = updatedChatPresentationInterfaceState.interfaceState.selectionState self.updateItemNodesSelectionStates(animated: transition.isAnimated) - (self.navigationController as? NavigationController)?.updateMasterDetailsBlackout(controllerInteraction.selectionState != nil ? .master : nil, transition: transition) } } @@ -4727,7 +4788,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } strongSelf.chatDisplayNode.dismissInput() - strongSelf.present(legacyLocationPickerController(context: strongSelf.context, selfPeer: selfPeer, peer: peer, sendLocation: { coordinate, venue in + strongSelf.present(legacyLocationPickerController(context: strongSelf.context, selfPeer: selfPeer, peer: peer, sendLocation: { coordinate, venue, _ in guard let strongSelf = self else { return } @@ -4780,7 +4841,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, guard let contact = contact as? TelegramUser, let phoneNumber = contact.phone else { return } - let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: contact.firstName ?? "", lastName: contact.lastName ?? "", phoneNumbers: [DeviceContactPhoneNumberData(label: "_$!!$_", value: phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) + let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: contact.firstName ?? "", lastName: contact.lastName ?? "", phoneNumbers: [DeviceContactPhoneNumberData(label: "_$!!$_", value: phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) let context = strongSelf.context dataSignal = (strongSelf.context.sharedContext.contactDataManager?.basicData() ?? .single([:])) |> take(1) @@ -5374,7 +5435,13 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, self.chatDisplayNode.historyNode.scrollToEndOfHistory() } - + func updateTextInputState(_ textInputState: ChatTextInputState) { + self.updateChatPresentationInterfaceState(interactive: false, { state in + state.updatedInterfaceState({ state in + state.withUpdatedComposeInputState(textInputState) + }) + }) + } public func navigateToMessage(messageLocation: NavigateToMessageLocation, animated: Bool, forceInCurrentChat: Bool = false, completion: (() -> Void)? = nil, customPresentProgress: ((ViewController, Any?) -> Void)? = nil) { self.navigateToMessage(from: nil, to: messageLocation, rememberInStack: false, forceInCurrentChat: forceInCurrentChat, animated: animated, completion: completion, customPresentProgress: customPresentProgress) @@ -5418,7 +5485,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, case .upperBound: searchLocation = .index(MessageIndex.upperBound(peerId: peerId)) } - let historyView = preloadedShatHistoryViewForLocation(ChatHistoryLocationInput(content: .InitialSearch(location: searchLocation, count: 50), id: 0), account: self.context.account, chatLocation: self.chatLocation, fixedCombinedReadStates: nil, tagMask: nil, additionalData: []) + let historyView = preloadedChatHistoryViewForLocation(ChatHistoryLocationInput(content: .InitialSearch(location: searchLocation, count: 50), id: 0), account: self.context.account, chatLocation: self.chatLocation, fixedCombinedReadStates: nil, tagMask: nil, additionalData: []) let signal = historyView |> mapToSignal { historyView -> Signal<(MessageIndex?, Bool), NoError> in switch historyView { @@ -5510,7 +5577,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, self.historyNavigationStack.add(fromIndex) } self.loadingMessage.set(true) - let historyView = preloadedShatHistoryViewForLocation(ChatHistoryLocationInput(content: .InitialSearch(location: searchLocation, count: 50), id: 0), account: self.context.account, chatLocation: self.chatLocation, fixedCombinedReadStates: nil, tagMask: nil, additionalData: []) + let historyView = preloadedChatHistoryViewForLocation(ChatHistoryLocationInput(content: .InitialSearch(location: searchLocation, count: 50), id: 0), account: self.context.account, chatLocation: self.chatLocation, fixedCombinedReadStates: nil, tagMask: nil, additionalData: []) let signal = historyView |> mapToSignal { historyView -> Signal in switch historyView { @@ -5683,8 +5750,8 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, }) }) |> deliverOnMainQueue).start(completed: { [weak self] in - if let strongSelf = self { - (strongSelf.navigationController as? NavigationController)?.pushViewController(ChatController(context: strongSelf.context, chatLocation: .peer(peerId), messageId: messageId)) + if let strongSelf = self, let navigationController = strongSelf.navigationController as? NavigationController { + navigateToChatController(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), messageId: messageId, updateTextInputState: textInputState) } }) } else { @@ -5841,90 +5908,102 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } private func reportPeer() { - if let peer = self.presentationInterfaceState.renderedPeer?.peer { - 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 - self?.present(c, in: .window(.root)) - }), in: .window(.root)) - } else if let _ = peer as? TelegramUser { - let presentationData = self.presentationData - let controller = ActionSheetController(presentationTheme: presentationData.theme) - let dismissAction: () -> Void = { [weak controller] in - controller?.dismissAnimated() - } - var reportSpam = true - var deleteChat = true - controller.setItemGroups([ - ActionSheetItemGroup(items: [ - ActionSheetTextItem(title: presentationData.strings.UserInfo_BlockConfirmationTitle(peer.compactDisplayTitle).0), - ActionSheetCheckboxItem(title: presentationData.strings.Conversation_Moderate_Report, label: "", value: reportSpam, action: { [weak controller] checkValue in - reportSpam = checkValue - controller?.updateItem(groupIndex: 0, itemIndex: 1, { item in - if let item = item as? ActionSheetCheckboxItem { - return ActionSheetCheckboxItem(title: item.title, label: item.label, value: !item.value, action: item.action) - } - return item - }) - }), - ActionSheetCheckboxItem(title: presentationData.strings.ReportSpam_DeleteThisChat, label: "", value: deleteChat, action: { [weak controller] checkValue in - deleteChat = checkValue - controller?.updateItem(groupIndex: 0, itemIndex: 2, { item in - if let item = item as? ActionSheetCheckboxItem { - return ActionSheetCheckboxItem(title: item.title, label: item.label, value: !item.value, action: item.action) - } - return item - }) - }), - ActionSheetButtonItem(title: presentationData.strings.UserInfo_BlockActionTitle(peer.compactDisplayTitle).0, color: .destructive, action: { [weak self] in - dismissAction() - guard let strongSelf = self else { - return - } - let _ = requestUpdatePeerIsBlocked(account: strongSelf.context.account, peerId: peer.id, isBlocked: true).start() - if deleteChat { - let _ = removePeerChat(account: strongSelf.context.account, peerId: peer.id, reportChatSpam: reportSpam).start() - (strongSelf.navigationController as? NavigationController)?.filterController(strongSelf, animated: true) - } else if reportSpam { - let _ = TelegramCore.reportPeer(account: strongSelf.context.account, peerId: peer.id, reason: .spam).start() - } - }) - ]), - ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })]) - ]) - self.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) - } else { - let title: String - var infoString: String? - if let _ = peer as? TelegramGroup { - title = self.presentationData.strings.Conversation_ReportSpam - } else if let _ = peer as? TelegramChannel { - title = self.presentationData.strings.Conversation_ReportSpam - } else { - title = self.presentationData.strings.Conversation_ReportSpam - infoString = self.presentationData.strings.Conversation_ReportSpamConfirmation - } - let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) - - var items: [ActionSheetItem] = [] - if let infoString = infoString { - items.append(ActionSheetTextItem(title: infoString)) - } - items.append(ActionSheetButtonItem(title: title, 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)) + guard let renderedPeer = self.presentationInterfaceState.renderedPeer, let peer = renderedPeer.chatMainPeer, let chatPeer = renderedPeer.peer else { + return + } + 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 + self?.present(c, in: .window(.root)) + }), in: .window(.root)) + } else if let _ = peer as? TelegramUser { + let presentationData = self.presentationData + let controller = ActionSheetController(presentationTheme: presentationData.theme) + let dismissAction: () -> Void = { [weak controller] in + controller?.dismissAnimated() } + var reportSpam = true + var deleteChat = true + controller.setItemGroups([ + ActionSheetItemGroup(items: [ + ActionSheetTextItem(title: presentationData.strings.UserInfo_BlockConfirmationTitle(peer.compactDisplayTitle).0), + ActionSheetCheckboxItem(title: presentationData.strings.Conversation_Moderate_Report, label: "", value: reportSpam, action: { [weak controller] checkValue in + reportSpam = checkValue + controller?.updateItem(groupIndex: 0, itemIndex: 1, { item in + if let item = item as? ActionSheetCheckboxItem { + return ActionSheetCheckboxItem(title: item.title, label: item.label, value: !item.value, action: item.action) + } + return item + }) + }), + ActionSheetCheckboxItem(title: presentationData.strings.ReportSpam_DeleteThisChat, label: "", value: deleteChat, action: { [weak controller] checkValue in + deleteChat = checkValue + controller?.updateItem(groupIndex: 0, itemIndex: 2, { item in + if let item = item as? ActionSheetCheckboxItem { + return ActionSheetCheckboxItem(title: item.title, label: item.label, value: !item.value, action: item.action) + } + return item + }) + }), + ActionSheetButtonItem(title: presentationData.strings.UserInfo_BlockActionTitle(peer.compactDisplayTitle).0, color: .destructive, action: { [weak self] in + dismissAction() + guard let strongSelf = self else { + return + } + let _ = requestUpdatePeerIsBlocked(account: strongSelf.context.account, peerId: peer.id, isBlocked: true).start() + if let _ = chatPeer as? TelegramSecretChat { + let _ = (strongSelf.context.account.postbox.transaction { transaction in + terminateSecretChat(transaction: transaction, peerId: chatPeer.id) + }).start() + } + if deleteChat { + let _ = removePeerChat(account: strongSelf.context.account, peerId: chatPeer.id, reportChatSpam: reportSpam).start() + (strongSelf.navigationController as? NavigationController)?.filterController(strongSelf, animated: true) + } else if reportSpam { + let _ = TelegramCore.reportPeer(account: strongSelf.context.account, peerId: peer.id, reason: .spam).start() + } + }) + ]), + ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })]) + ]) + self.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + } else { + let title: String + var infoString: String? + if let _ = peer as? TelegramGroup { + title = self.presentationData.strings.Conversation_ReportSpamAndLeave + infoString = self.presentationData.strings.Conversation_ReportSpamGroupConfirmation + } else if let channel = peer as? TelegramChannel { + title = self.presentationData.strings.Conversation_ReportSpamAndLeave + if case .group = channel.info { + infoString = self.presentationData.strings.Conversation_ReportSpamGroupConfirmation + } else { + infoString = self.presentationData.strings.Conversation_ReportSpamChannelConfirmation + } + } else { + title = self.presentationData.strings.Conversation_ReportSpam + infoString = self.presentationData.strings.Conversation_ReportSpamConfirmation + } + let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) + + var items: [ActionSheetItem] = [] + if let infoString = infoString { + items.append(ActionSheetTextItem(title: infoString)) + } + items.append(ActionSheetButtonItem(title: title, 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)) } } @@ -5934,31 +6013,48 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, guard let strongSelf = self else { return } - guard let _ = accountPeer as? TelegramUser else { + guard let user = accountPeer as? TelegramUser, let phoneNumber = user.phone else { return } guard let peer = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer as? TelegramUser else { return } - let _ = (acceptAndShareContact(account: strongSelf.context.account, peerId: peer.id) - |> deliverOnMainQueue).start(error: { _ in + let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme) + var items: [ActionSheetItem] = [] + items.append(ActionSheetTextItem(title: strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumberConfirmation(formatPhoneNumber(phoneNumber), peer.compactDisplayTitle).0)) + items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumber, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() guard let strongSelf = self else { return } - strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - }, completed: { - guard let strongSelf = self else { - return - } - strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .genericSuccess(strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumber_StatusSuccess(peer.compactDisplayTitle).0, true)), in: .window(.root)) - }) + let _ = (acceptAndShareContact(account: strongSelf.context.account, peerId: peer.id) + |> deliverOnMainQueue).start(error: { _ in + guard let strongSelf = self else { + return + } + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }, completed: { + guard let strongSelf = self else { + return + } + strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .genericSuccess(strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumber_StatusSuccess(peer.compactDisplayTitle).0, true)), in: .window(.root)) + }) + })) + + 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)) }) } private func addPeerContact() { - if let peer = self.presentationInterfaceState.renderedPeer?.chatMainPeer as? TelegramUser, let contactData = DeviceContactExtendedData(peer: peer) { - self.present(deviceContactInfoController(context: context, subject: .create(peer: peer, contactData: contactData, isSharing: true, completion: { [weak self] peer, stableId, contactData in + if let peer = self.presentationInterfaceState.renderedPeer?.chatMainPeer as? TelegramUser, let peerStatusSettings = self.presentationInterfaceState.contactStatus?.peerStatusSettings, let contactData = DeviceContactExtendedData(peer: peer) { + self.present(deviceContactInfoController(context: context, subject: .create(peer: peer, contactData: contactData, isSharing: true, shareViaException: peerStatusSettings.contains(.addExceptionWhenAddingContact), completion: { [weak self] peer, stableId, contactData in guard let strongSelf = self else { return } @@ -6673,7 +6769,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in return state.updatedInterfaceState { interfaceState in return interfaceState.withUpdatedEffectiveInputState(interfaceState.effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) }) } }), @@ -6684,7 +6780,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return state.updatedInterfaceState { interfaceState in let effectiveInputState = ChatTextInputState(inputText: NSAttributedString(string: "/")) return interfaceState.withUpdatedEffectiveInputState(effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) } else { return state } @@ -6698,7 +6794,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return state.updatedInterfaceState { interfaceState in let effectiveInputState = ChatTextInputState(inputText: NSAttributedString(string: "@")) return interfaceState.withUpdatedEffectiveInputState(effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) } else { return state } @@ -6712,7 +6808,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, return state.updatedInterfaceState { interfaceState in let effectiveInputState = ChatTextInputState(inputText: NSAttributedString(string: "#")) return interfaceState.withUpdatedEffectiveInputState(effectiveInputState) - }.updatedInputMode({ _ in ChatInputMode.text }) + }.updatedInputMode({ _ in .text }) } else { return state } @@ -6790,6 +6886,12 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } } + func activateInput() { + self.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in + return state.updatedInputMode({ _ in .text }) + }) + } + private func clearInputText() { self.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in if !state.interfaceState.effectiveInputState.inputText.string.isEmpty { @@ -6807,7 +6909,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, guard case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.CloudUser else { return } - if #available(iOSApplicationExtension 10.0, *) { + if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { let _ = (self.context.account.postbox.loadedPeerWithId(peerId) |> deliverOnMainQueue).start(next: { peer in if let peer = peer as? TelegramUser { diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift index 0e2bd8f68e..a177fafcac 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerBackgroundNode.swift @@ -8,7 +8,6 @@ import Postbox private var backgroundImageForWallpaper: (TelegramWallpaper, Bool, UIImage)? -private var serviceBackgroundColorForWallpaper: (TelegramWallpaper, UIColor)? func chatControllerBackgroundImage(wallpaper: TelegramWallpaper, mediaBox: MediaBox, composed: Bool = true) -> UIImage? { var backgroundImage: UIImage? @@ -70,103 +69,3 @@ func chatControllerBackgroundImage(wallpaper: TelegramWallpaper, mediaBox: Media } return backgroundImage } - -private func serviceColor(for data: Signal) -> Signal { - return data - |> mapToSignal { data -> Signal in - if data.complete, let image = UIImage(contentsOfFile: data.path) { - return serviceColor(from: .single(image)) - } - return .complete() - } -} - -func serviceColor(from image: Signal) -> Signal { - return image - |> mapToSignal { image -> Signal in - if let image = image { - let context = DrawingContext(size: CGSize(width: 1.0, height: 1.0), scale: 1.0, clear: false) - context.withFlippedContext({ context in - if let cgImage = image.cgImage { - context.draw(cgImage, in: CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)) - } - }) - return .single(serviceColor(with: context.colorAt(CGPoint()))) - } - return .complete() - } -} - -func serviceColor(with color: UIColor) -> UIColor { - var hue: CGFloat = 0.0 - var saturation: CGFloat = 0.0 - var brightness: CGFloat = 0.0 - var alpha: CGFloat = 0.0 - if color.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) { - if saturation > 0.0 { - saturation = min(1.0, saturation + 0.05 + 0.1 * (1.0 - saturation)) - } - brightness = max(0.0, brightness * 0.65) - alpha = 0.4 - return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha) - } - return color -} - -func chatServiceBackgroundColor(wallpaper: TelegramWallpaper, mediaBox: MediaBox) -> Signal { - if wallpaper == serviceBackgroundColorForWallpaper?.0, let color = serviceBackgroundColorForWallpaper?.1 { - return .single(color) - } else { - switch wallpaper { - case .builtin: - return .single(UIColor(rgb: 0x748391, alpha: 0.45)) - case let .color(color): - return .single(serviceColor(with: UIColor(rgb: UInt32(bitPattern: color)))) - case let .image(representations, _): - if let largest = largestImageRepresentation(representations) { - return Signal { subscriber in - let fetch = mediaBox.fetchedResource(largest.resource, parameters: nil).start() - let data = serviceColor(for: mediaBox.resourceData(largest.resource)).start(next: { next in - subscriber.putNext(next) - }, completed: { - subscriber.putCompletion() - }) - return ActionDisposable { - fetch.dispose() - data.dispose() - } - } - |> afterNext { color in - serviceBackgroundColorForWallpaper = (wallpaper, color) - } - } else { - return .single(UIColor(rgb: 0x000000, alpha: 0.3)) - } - case let .file(file): - if file.isPattern { - if let color = file.settings.color { - return .single(serviceColor(with: UIColor(rgb: UInt32(bitPattern: color)))) - } else { - return .single(UIColor(rgb: 0x000000, alpha: 0.3)) - } - } else { - return Signal { subscriber in - let fetch = mediaBox.fetchedResource(file.file.resource, parameters: nil).start() - let data = serviceColor(for: mediaBox.resourceData(file.file.resource)).start(next: { next in - subscriber.putNext(next) - }, completed: { - subscriber.putCompletion() - }) - return ActionDisposable { - fetch.dispose() - data.dispose() - } - } - |> afterNext { color in - serviceBackgroundColorForWallpaper = (wallpaper, color) - } - } - } - } -} - diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift index bfbd9af23d..8c522afb15 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift @@ -4,6 +4,7 @@ import Postbox import AsyncDisplayKit import TelegramCore import Display +import TelegramUIPreferences public enum ChatControllerInitialBotStartBehavior { case interactive diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 92408a4752..cb17105d3b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -5,6 +5,8 @@ import Postbox import SwiftSignalKit import Display import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChatControllerNodeView: UITracingLayerView, WindowInputAccessoryHeightProvider, PreviewingHostView { var inputAccessoryHeight: (() -> CGFloat)? diff --git a/submodules/TelegramUI/TelegramUI/ChatDateSelectionSheet.swift b/submodules/TelegramUI/TelegramUI/ChatDateSelectionSheet.swift index 92f32a89c3..46272dc641 100644 --- a/submodules/TelegramUI/TelegramUI/ChatDateSelectionSheet.swift +++ b/submodules/TelegramUI/TelegramUI/ChatDateSelectionSheet.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import UIKit import SwiftSignalKit import Photos +import TelegramPresentationData final class ChatDateSelectionSheet: ActionSheetController { private let strings: PresentationStrings diff --git a/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift index 6f857b854b..6349287120 100644 --- a/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift @@ -6,6 +6,7 @@ import Display import SwiftSignalKit import WebKit import TelegramCore +import TelegramPresentationData class ChatDocumentGalleryItem: GalleryItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift b/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift index 84420c8faa..cab99a016b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatEmptyNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private protocol ChatEmptyNodeContent { func updateLayout(interfaceState: ChatPresentationInterfaceState, size: CGSize, transition: ContainedViewLayoutTransition) -> CGSize diff --git a/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift index e5a70f8f95..31087e25ba 100644 --- a/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift @@ -6,6 +6,7 @@ import Display import SwiftSignalKit import WebKit import TelegramCore +import TelegramPresentationData class ChatExternalFileGalleryItem: GalleryItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChatFeedNavigationInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatFeedNavigationInputPanelNode.swift index 5d5c9eb12f..2002703f21 100644 --- a/submodules/TelegramUI/TelegramUI/ChatFeedNavigationInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatFeedNavigationInputPanelNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData final class ChatFeedNavigationInputPanelNode: ChatInputPanelNode { private let button: HighlightableButtonNode diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift index c86e136f8f..d1f765bfd7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryEntriesForView.swift @@ -21,15 +21,13 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView, var groupBucket: [(Message, Bool, ChatHistoryMessageSelection, ChatMessageEntryAttributes)] = [] loop: for entry in view.entries { - if entry.message.id.peerId.namespace == Namespaces.Peer.CloudChannel || entry.message.id.peerId.namespace == Namespaces.Peer.CloudUser { - for media in entry.message.media { - if let action = media as? TelegramMediaAction { - switch action.action { - case .channelMigratedFromGroup, .groupMigratedToChannel, .historyCleared: - continue loop - default: - break - } + for media in entry.message.media { + if let action = media as? TelegramMediaAction { + switch action.action { + case .channelMigratedFromGroup, .groupMigratedToChannel, .historyCleared: + continue loop + default: + break } } } @@ -82,7 +80,9 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView, let unreadEntry: ChatHistoryEntry = .UnreadEntry(maxReadIndex, presentationData) for entry in entries { if entry > unreadEntry { - entries.insert(unreadEntry, at: i) + if i != 0 { + entries.insert(unreadEntry, at: i) + } break } i += 1 @@ -100,38 +100,39 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView, } if let cachedPeerData = cachedPeerData as? CachedUserData, let botInfo = cachedPeerData.botInfo, !botInfo.description.isEmpty { entries.insert(.ChatInfoEntry(botInfo.description, presentationData), at: 0) - } - var isEmpty = true - if entries.count <= 3 { - loop: for entry in view.entries { - var isEmptyMedia = false - for media in entry.message.media { - if let action = media as? TelegramMediaAction { - switch action.action { - case .groupCreated, .photoUpdated, .channelMigratedFromGroup, .groupMigratedToChannel: - isEmptyMedia = true - default: - break + } else { + var isEmpty = true + if entries.count <= 3 { + loop: for entry in view.entries { + var isEmptyMedia = false + for media in entry.message.media { + if let action = media as? TelegramMediaAction { + switch action.action { + case .groupCreated, .photoUpdated, .channelMigratedFromGroup, .groupMigratedToChannel: + isEmptyMedia = true + default: + break + } } } + var isCreator = false + if let peer = entry.message.peers[entry.message.id.peerId] as? TelegramGroup, case .creator = peer.role { + isCreator = true + } else if let peer = entry.message.peers[entry.message.id.peerId] as? TelegramChannel, case .group = peer.info, peer.flags.contains(.isCreator) { + isCreator = true + } + if isEmptyMedia && isCreator { + } else { + isEmpty = false + break loop + } } - var isCreator = false - if let peer = entry.message.peers[entry.message.id.peerId] as? TelegramGroup, case .creator = peer.role { - isCreator = true - } else if let peer = entry.message.peers[entry.message.id.peerId] as? TelegramChannel, case .group = peer.info, peer.flags.contains(.isCreator) { - isCreator = true - } - if isEmptyMedia && isCreator { - } else { - isEmpty = false - break loop - } + } else { + isEmpty = false + } + if isEmpty { + entries.removeAll() } - } else { - isEmpty = false - } - if isEmpty { - entries.removeAll() } } } else if includeSearchEntry { diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift index 849691ae05..5056b39203 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryEntry.swift @@ -1,5 +1,6 @@ import Postbox import TelegramCore +import TelegramPresentationData public enum ChatHistoryMessageSelection: Equatable { case none diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift index f69f2c5f6a..72561af297 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryGridNode.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Display import AsyncDisplayKit import TelegramCore +import TelegramPresentationData private class ChatGridLiveSelectorRecognizer: UIPanGestureRecognizer { private let selectionGestureActivationThreshold: CGFloat = 2.0 @@ -262,7 +263,8 @@ public final class ChatHistoryGridNode: GridNode, ChatHistoryNode { let previousView = Atomic(value: nil) - let historyViewTransition = combineLatest(historyViewUpdate, self.chatPresentationDataPromise.get()) |> mapToQueue { [weak self] update, chatPresentationData -> Signal in + let historyViewTransition = combineLatest(queue: messageViewQueue, historyViewUpdate, self.chatPresentationDataPromise.get()) + |> mapToQueue { [weak self] update, chatPresentationData -> Signal in switch update { case .Loading: Queue.mainQueue().async { [weak self] in @@ -283,11 +285,9 @@ public final class ChatHistoryGridNode: GridNode, ChatHistoryNode { return .complete() case let .HistoryView(view, type, scrollPosition, flashIndicators, _, _, id): let reason: ChatHistoryViewTransitionReason - var prepareOnMainQueue = false switch type { case let .Initial(fadeIn): reason = ChatHistoryViewTransitionReason.Initial(fadeIn: fadeIn) - prepareOnMainQueue = !fadeIn case let .Generic(genericType): switch genericType { case .InitialUnread, .Initial: @@ -304,7 +304,9 @@ 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: ChatMessageItemAssociatedData(automaticDownloadPeerType: .channel, automaticDownloadNetworkType: .cellular, isRecentActions: false), id: id) let previous = previousView.swap(processedView) - return 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) |> map({ mappedChatHistoryViewListTransition(context: context, peerId: peerId, controllerInteraction: controllerInteraction, transition: $0, from: previous, presentationData: chatPresentationData) }) |> runOn(prepareOnMainQueue ? Queue.mainQueue() : messageViewQueue) + 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 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 3092885aab..5a6bc52794 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -5,6 +5,8 @@ import SwiftSignalKit import Display import AsyncDisplayKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private let historyMessageCount: Int = 100 @@ -323,7 +325,8 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { private let messageViewQueue = Queue(name: "ChatHistoryListNode processing") private var dequeuedInitialTransitionOnLayout = false - private var enqueuedHistoryViewTransition: (ChatHistoryListViewTransition, () -> Void)? + private var enqueuedHistoryViewTransitions: [ChatHistoryListViewTransition] = [] + private var hasActiveTransition = false var layoutActionOnViewTransition: ((ChatHistoryListViewTransition) -> (ChatHistoryListViewTransition, ListViewUpdateSizeAndInsets?))? public let historyState = ValuePromise() @@ -457,7 +460,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { } //self.snapToBottomInsetUntilFirstInteraction = true - let messageViewQueue = self.messageViewQueue + let messageViewQueue = Queue.mainQueue() //self.messageViewQueue let fixedCombinedReadStates = Atomic(value: nil) @@ -518,9 +521,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { let nextTransitionVersion = Atomic(value: 0) - let historyViewTransition = combineLatest(queue: messageViewQueue, historyViewUpdate, self.chatPresentationDataPromise.get(), selectedMessages, automaticDownloadNetworkType, self.historyAppearsClearedPromise.get()) - |> introduceError(Void.self) - |> mapToQueue { [weak self] update, chatPresentationData, selectedMessages, networkType, historyAppearsCleared -> Signal<(ChatHistoryListViewTransition, Int), Void> in + let historyViewTransitionDisposable = combineLatest(queue: messageViewQueue, historyViewUpdate, self.chatPresentationDataPromise.get(), selectedMessages, automaticDownloadNetworkType, self.historyAppearsClearedPromise.get()).start(next: { [weak self] update, chatPresentationData, selectedMessages, networkType, historyAppearsCleared in func applyHole() { Queue.mainQueue().async { if let strongSelf = self { @@ -529,12 +530,12 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { if let filteredEntries = historyView?.filteredEntries, let visibleRange = displayRange.visibleRange { let lastEntry = filteredEntries[filteredEntries.count - 1 - visibleRange.lastIndex] - strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .message(lastEntry.index), anchorIndex: .message(lastEntry.index), count: historyMessageCount), id: 0) + strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .message(lastEntry.index), anchorIndex: .message(lastEntry.index), count: historyMessageCount), id: (strongSelf.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0) } else { if let messageId = messageId { - strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .InitialSearch(location: .id(messageId), count: 60), id: 0) + strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .InitialSearch(location: .id(messageId), count: 60), id: (strongSelf.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0) } else { - strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Initial(count: 60), id: 0) + strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Initial(count: 60), id: (strongSelf.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0) } } } @@ -543,140 +544,115 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { let initialData: ChatHistoryCombinedInitialData? switch update.0 { - case let .Loading(combinedInitialData, type): - if case .Generic(.FillHole) = type { - applyHole() - return .fail(Void()) - } - - initialData = combinedInitialData - Queue.mainQueue().async { - if let strongSelf = self { - if !strongSelf.didSetInitialData { - strongSelf.didSetInitialData = true - strongSelf._initialData.set(.single(combinedInitialData)) - } - - strongSelf._cachedPeerDataAndMessages.set(.single((nil, nil))) - - let loadState: ChatHistoryNodeLoadState = .loading - if strongSelf.loadState != loadState { - strongSelf.loadState = loadState - strongSelf.loadStateUpdated?(loadState, false) - } - - let historyState: ChatHistoryNodeHistoryState = .loading - if strongSelf.currentHistoryState != historyState { - strongSelf.currentHistoryState = historyState - strongSelf.historyState.set(historyState) - } - } - } - return .complete() - case let .HistoryView(view, type, scrollPosition, flashIndicators, originalScrollPosition, data, id): - if case .Generic(.FillHole) = type { - applyHole() - return .fail(Void()) - } - - initialData = data - var updatedScrollPosition = scrollPosition - - var reverse = false - var includeSearchEntry = false - if case let .list(search, reverseValue) = mode { - includeSearchEntry = search - reverse = reverseValue - } - - let associatedData = extractAssociatedData(chatLocation: chatLocation, view: view, automaticDownloadNetworkType: networkType) - - 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, id: id) - let previousValueAndVersion = previousView.swap((processedView, update.1)) - let previous = previousValueAndVersion?.0 - - if let previousVersion = previousValueAndVersion?.1 { - if !GlobalExperimentalSettings.isAppStoreBuild { - precondition(update.1 >= previousVersion) - } - assert(update.1 >= previousVersion) - } - - if scrollPosition == nil, let originalScrollPosition = originalScrollPosition { - switch originalScrollPosition { - case let .index(index, position, _, _): - if case .upperBound = index { - if let previous = previous, previous.filteredEntries.isEmpty { - updatedScrollPosition = .index(index: index, position: position, directionHint: .Down, animated: false) - } - } - default: - break - } - } - - let reason: ChatHistoryViewTransitionReason - var prepareOnMainQueue = false - - let previousHistoryAppearsClearedValue = previousHistoryAppearsCleared.swap(historyAppearsCleared) - if previousHistoryAppearsClearedValue != nil && previousHistoryAppearsClearedValue != historyAppearsCleared && !historyAppearsCleared { - reason = ChatHistoryViewTransitionReason.Initial(fadeIn: !processedView.filteredEntries.isEmpty) - } else if let previous = previous, previous.id == processedView.id, previous.originalView.entries == processedView.originalView.entries { - reason = ChatHistoryViewTransitionReason.InteractiveChanges - updatedScrollPosition = nil - } else { - switch type { - case let .Initial(fadeIn): - reason = ChatHistoryViewTransitionReason.Initial(fadeIn: fadeIn) - prepareOnMainQueue = !fadeIn - case let .Generic(genericType): - switch genericType { - case .InitialUnread, .Initial: - reason = ChatHistoryViewTransitionReason.Initial(fadeIn: false) - case .Generic: - reason = ChatHistoryViewTransitionReason.InteractiveChanges - case .UpdateVisible: - reason = ChatHistoryViewTransitionReason.Reload - case .FillHole: - reason = ChatHistoryViewTransitionReason.HoleReload - } - } - } - let transitionVersion = nextTransitionVersion.modify { $0 + 1 } - return 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) - |> map({ - (mappedChatHistoryViewListTransition(context: context, chatLocation: chatLocation, associatedData: associatedData, controllerInteraction: controllerInteraction, mode: mode, transition: $0), transitionVersion) - }) - |> runOn(prepareOnMainQueue ? Queue.mainQueue() : messageViewQueue) - |> introduceError(Void.self) - } - } - - let appliedTransitionVersion = Atomic(value: nil) - - let appliedTransition = historyViewTransition - |> deliverOnMainQueue - |> mapToQueue { [weak self] (transition, version) -> Signal in - if let strongSelf = self { - let previousAppliedVersion = appliedTransitionVersion.swap(version) ?? 0 - if !GlobalExperimentalSettings.isAppStoreBuild { - precondition(version == previousAppliedVersion + 1) + case let .Loading(combinedInitialData, type): + if case .Generic(.FillHole) = type { + applyHole() + return + } + + initialData = combinedInitialData + Queue.mainQueue().async { + if let strongSelf = self { + if !strongSelf.didSetInitialData { + strongSelf.didSetInitialData = true + strongSelf._initialData.set(.single(combinedInitialData)) + } + + strongSelf._cachedPeerDataAndMessages.set(.single((nil, nil))) + + let loadState: ChatHistoryNodeLoadState = .loading + if strongSelf.loadState != loadState { + strongSelf.loadState = loadState + strongSelf.loadStateUpdated?(loadState, false) + } + + let historyState: ChatHistoryNodeHistoryState = .loading + if strongSelf.currentHistoryState != historyState { + strongSelf.currentHistoryState = historyState + strongSelf.historyState.set(historyState) + } + } + } + return + case let .HistoryView(view, type, scrollPosition, flashIndicators, originalScrollPosition, data, id): + if case .Generic(.FillHole) = type { + applyHole() + return + } + + initialData = data + var updatedScrollPosition = scrollPosition + + var reverse = false + var includeSearchEntry = false + if case let .list(search, reverseValue) = mode { + includeSearchEntry = search + reverse = reverseValue + } + + let associatedData = extractAssociatedData(chatLocation: chatLocation, view: view, automaticDownloadNetworkType: networkType) + + 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, id: id) + let previousValueAndVersion = previousView.swap((processedView, update.1)) + let previous = previousValueAndVersion?.0 + + if let previousVersion = previousValueAndVersion?.1 { + if !GlobalExperimentalSettings.isAppStoreBuild { + precondition(update.1 >= previousVersion) + } + assert(update.1 >= previousVersion) + } + + if scrollPosition == nil, let originalScrollPosition = originalScrollPosition { + switch originalScrollPosition { + case let .index(index, position, _, _): + if case .upperBound = index { + if let previous = previous, previous.filteredEntries.isEmpty { + updatedScrollPosition = .index(index: index, position: position, directionHint: .Down, animated: false) + } + } + default: + break + } + } + + let reason: ChatHistoryViewTransitionReason + + let previousHistoryAppearsClearedValue = previousHistoryAppearsCleared.swap(historyAppearsCleared) + if previousHistoryAppearsClearedValue != nil && previousHistoryAppearsClearedValue != historyAppearsCleared && !historyAppearsCleared { + reason = ChatHistoryViewTransitionReason.Initial(fadeIn: !processedView.filteredEntries.isEmpty) + } else if let previous = previous, previous.id == processedView.id, previous.originalView.entries == processedView.originalView.entries { + reason = ChatHistoryViewTransitionReason.InteractiveChanges + updatedScrollPosition = nil + } else { + switch type { + case let .Initial(fadeIn): + reason = ChatHistoryViewTransitionReason.Initial(fadeIn: fadeIn) + case let .Generic(genericType): + switch genericType { + case .InitialUnread, .Initial: + reason = ChatHistoryViewTransitionReason.Initial(fadeIn: false) + case .Generic: + reason = ChatHistoryViewTransitionReason.InteractiveChanges + case .UpdateVisible: + reason = ChatHistoryViewTransitionReason.Reload + case .FillHole: + reason = ChatHistoryViewTransitionReason.HoleReload + } + } + } + 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 mappedTransition = mappedChatHistoryViewListTransition(context: context, chatLocation: chatLocation, associatedData: associatedData, controllerInteraction: controllerInteraction, mode: mode, transition: rawTransition) + Queue.mainQueue().async { + guard let strongSelf = self else { + return + } + strongSelf.enqueueHistoryViewTransition(mappedTransition) } - assert(version == previousAppliedVersion + 1) - return strongSelf.enqueueHistoryViewTransition(transition) - |> introduceError(Void.self) } - return .complete() - } + }) - let restartedTransition = ( - appliedTransition - |> `catch` { _ -> Signal in - return .complete() - } - ) - |> restart - self.historyDisposable.set(restartedTransition.start()) + self.historyDisposable.set(historyViewTransitionDisposable) let previousMaxIncomingMessageIndexByNamespace = Atomic<[MessageId.Namespace: MessageIndex]>(value: [:]) let readHistory = combineLatest(self.maxVisibleIncomingMessageIndex.get(), self.canReadHistory.get()) @@ -743,7 +719,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { self.displayedItemRangeChanged = { [weak self] displayedRange, opaqueTransactionState in if let strongSelf = self, let transactionState = opaqueTransactionState as? ChatHistoryTransactionOpaqueState { - self?.processDisplayedItemRangeChanged(displayedRange: displayedRange, transactionState: transactionState) + strongSelf.processDisplayedItemRangeChanged(displayedRange: displayedRange, transactionState: transactionState) } } @@ -1017,11 +993,11 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { if let loaded = displayedRange.loadedRange, let firstEntry = historyView.filteredEntries.first, let lastEntry = historyView.filteredEntries.last { if loaded.firstIndex < 5 && historyView.originalView.laterId != nil { - self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .message(lastEntry.index), anchorIndex: .message(lastEntry.index), count: historyMessageCount), id: 0) + self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .message(lastEntry.index), anchorIndex: .message(lastEntry.index), count: historyMessageCount), id: (self.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0) } else if loaded.firstIndex < 5, historyView.originalView.laterId == nil, !historyView.originalView.holeLater, let chatHistoryLocationValue = self.chatHistoryLocationValue, !chatHistoryLocationValue.isAtUpperBound, historyView.originalView.anchorIndex != .upperBound { - self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .upperBound, anchorIndex: .upperBound, count: historyMessageCount), id: 0) + self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .upperBound, anchorIndex: .upperBound, count: historyMessageCount), id: (self.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0) } else if loaded.lastIndex >= historyView.filteredEntries.count - 5 && historyView.originalView.earlierId != nil { - self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .message(firstEntry.index), anchorIndex: .message(firstEntry.index), count: historyMessageCount), id: 0) + self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Navigation(index: .message(firstEntry.index), anchorIndex: .message(firstEntry.index), count: historyMessageCount), id: (self.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0) } } @@ -1204,143 +1180,132 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { self.maxVisibleIncomingMessageIndex.set(index) } - private func enqueueHistoryViewTransition(_ transition: ChatHistoryListViewTransition) -> Signal { - return Signal { [weak self] subscriber in + private func enqueueHistoryViewTransition(_ transition: ChatHistoryListViewTransition) { + self.enqueuedHistoryViewTransitions.append(transition) + self.prefetchManager.updateOptions(InChatPrefetchOptions(networkType: transition.networkType, peerType: transition.peerType)) + + if !self.didSetInitialData { + self.didSetInitialData = true + self._initialData.set(.single(ChatHistoryCombinedInitialData(initialData: transition.initialData, buttonKeyboardMessage: transition.keyboardButtonsMessage, cachedData: transition.cachedData, cachedDataMessages: transition.cachedDataMessages, readStateData: transition.readStateData))) + } + + if self.isNodeLoaded { + self.dequeueHistoryViewTransitions() + } else { + self._cachedPeerDataAndMessages.set(.single((transition.cachedData, transition.cachedDataMessages))) + + let loadState: ChatHistoryNodeLoadState + if transition.historyView.filteredEntries.isEmpty { + loadState = .empty + } else { + loadState = .messages + } + if self.loadState != loadState { + self.loadState = loadState + self.loadStateUpdated?(loadState, transition.options.contains(.AnimateInsertion)) + } + + let historyState: ChatHistoryNodeHistoryState = .loaded(isEmpty: transition.historyView.originalView.entries.isEmpty) + if self.currentHistoryState != historyState { + self.currentHistoryState = historyState + self.historyState.set(historyState) + } + } + } + + private func dequeueHistoryViewTransitions() { + if self.enqueuedHistoryViewTransitions.isEmpty || self.hasActiveTransition { + return + } + self.hasActiveTransition = true + let transition = self.enqueuedHistoryViewTransitions.removeFirst() + + let animated = transition.options.contains(.AnimateInsertion) + + let completion: (ListViewDisplayedItemRange) -> Void = { [weak self] visibleRange in if let strongSelf = self { - if let _ = strongSelf.enqueuedHistoryViewTransition { - preconditionFailure() - } + strongSelf.historyView = transition.historyView - strongSelf.prefetchManager.updateOptions(InChatPrefetchOptions(networkType: transition.networkType, peerType: transition.peerType)) - - if !strongSelf.didSetInitialData { - strongSelf.didSetInitialData = true - strongSelf._initialData.set(.single(ChatHistoryCombinedInitialData(initialData: transition.initialData, buttonKeyboardMessage: transition.keyboardButtonsMessage, cachedData: transition.cachedData, cachedDataMessages: transition.cachedDataMessages, readStateData: transition.readStateData))) - } - - strongSelf.enqueuedHistoryViewTransition = (transition, { - if let scrolledToIndex = transition.scrolledToIndex { - if let strongSelf = self { - strongSelf.scrolledToIndex?(scrolledToIndex) - } - } - subscriber.putCompletion() - }) - - if strongSelf.isNodeLoaded { - strongSelf.dequeueHistoryViewTransition() - } else { - strongSelf._cachedPeerDataAndMessages.set(.single((transition.cachedData, transition.cachedDataMessages))) - - let loadState: ChatHistoryNodeLoadState - if transition.historyView.filteredEntries.isEmpty { + let loadState: ChatHistoryNodeLoadState + if let historyView = strongSelf.historyView { + if historyView.filteredEntries.isEmpty { loadState = .empty } else { loadState = .messages } - if strongSelf.loadState != loadState { - strongSelf.loadState = loadState - strongSelf.loadStateUpdated?(loadState, transition.options.contains(.AnimateInsertion)) - } - - let historyState: ChatHistoryNodeHistoryState = .loaded(isEmpty: transition.historyView.originalView.entries.isEmpty) - if strongSelf.currentHistoryState != historyState { - strongSelf.currentHistoryState = historyState - strongSelf.historyState.set(historyState) - } + } else { + loadState = .loading } - } else { - subscriber.putCompletion() - } - - return EmptyDisposable - } |> runOn(Queue.mainQueue()) - } - - private func dequeueHistoryViewTransition() { - if let (transition, completion) = self.enqueuedHistoryViewTransition { - self.enqueuedHistoryViewTransition = nil - - let animated = transition.options.contains(.AnimateInsertion) - - let completion: (ListViewDisplayedItemRange) -> Void = { [weak self] visibleRange in - if let strongSelf = self { - strongSelf.historyView = transition.historyView - - let loadState: ChatHistoryNodeLoadState - if let historyView = strongSelf.historyView { - if historyView.filteredEntries.isEmpty { - loadState = .empty - } else { - loadState = .messages - } - } else { - loadState = .loading - } - - if strongSelf.loadState != loadState { - strongSelf.loadState = loadState - strongSelf.loadStateUpdated?(loadState, animated) - } - - if let range = visibleRange.loadedRange { - if let visible = visibleRange.visibleRange { - var visibleFirstIndex = visible.firstIndex - /*if !visible.firstIndexFullyVisible { - visibleFirstIndex += 1 - }*/ - if visibleFirstIndex <= visible.lastIndex { - let (messageIndex, _) = maxMessageIndexForEntries(transition.historyView, indexRange: (transition.historyView.filteredEntries.count - 1 - visible.lastIndex, transition.historyView.filteredEntries.count - 1 - visibleFirstIndex)) - if let messageIndex = messageIndex { - strongSelf.updateMaxVisibleReadIncomingMessageIndex(messageIndex) - } + + if strongSelf.loadState != loadState { + strongSelf.loadState = loadState + strongSelf.loadStateUpdated?(loadState, animated) + } + + if let range = visibleRange.loadedRange { + if let visible = visibleRange.visibleRange { + var visibleFirstIndex = visible.firstIndex + /*if !visible.firstIndexFullyVisible { + visibleFirstIndex += 1 + }*/ + if visibleFirstIndex <= visible.lastIndex { + let (messageIndex, _) = maxMessageIndexForEntries(transition.historyView, indexRange: (transition.historyView.filteredEntries.count - 1 - visible.lastIndex, transition.historyView.filteredEntries.count - 1 - visibleFirstIndex)) + if let messageIndex = messageIndex { + strongSelf.updateMaxVisibleReadIncomingMessageIndex(messageIndex) } } } - if !strongSelf.didSetInitialData { - strongSelf.didSetInitialData = true - strongSelf._initialData.set(.single(ChatHistoryCombinedInitialData(initialData: transition.initialData, buttonKeyboardMessage: transition.keyboardButtonsMessage, cachedData: transition.cachedData, cachedDataMessages: transition.cachedDataMessages, readStateData: transition.readStateData))) - } - strongSelf._cachedPeerDataAndMessages.set(.single((transition.cachedData, transition.cachedDataMessages))) - let historyState: ChatHistoryNodeHistoryState = .loaded(isEmpty: transition.historyView.originalView.entries.isEmpty) - if strongSelf.currentHistoryState != historyState { - strongSelf.currentHistoryState = historyState - strongSelf.historyState.set(historyState) - } - - var buttonKeyboardMessageUpdated = false - if let currentButtonKeyboardMessage = strongSelf.currentButtonKeyboardMessage, let buttonKeyboardMessage = transition.keyboardButtonsMessage { - if currentButtonKeyboardMessage.id != buttonKeyboardMessage.id || currentButtonKeyboardMessage.stableVersion != buttonKeyboardMessage.stableVersion { - buttonKeyboardMessageUpdated = true - } - } else if (strongSelf.currentButtonKeyboardMessage != nil) != (transition.keyboardButtonsMessage != nil) { + } + if !strongSelf.didSetInitialData { + strongSelf.didSetInitialData = true + strongSelf._initialData.set(.single(ChatHistoryCombinedInitialData(initialData: transition.initialData, buttonKeyboardMessage: transition.keyboardButtonsMessage, cachedData: transition.cachedData, cachedDataMessages: transition.cachedDataMessages, readStateData: transition.readStateData))) + } + strongSelf._cachedPeerDataAndMessages.set(.single((transition.cachedData, transition.cachedDataMessages))) + let historyState: ChatHistoryNodeHistoryState = .loaded(isEmpty: transition.historyView.originalView.entries.isEmpty) + if strongSelf.currentHistoryState != historyState { + strongSelf.currentHistoryState = historyState + strongSelf.historyState.set(historyState) + } + + var buttonKeyboardMessageUpdated = false + if let currentButtonKeyboardMessage = strongSelf.currentButtonKeyboardMessage, let buttonKeyboardMessage = transition.keyboardButtonsMessage { + if currentButtonKeyboardMessage.id != buttonKeyboardMessage.id || currentButtonKeyboardMessage.stableVersion != buttonKeyboardMessage.stableVersion { buttonKeyboardMessageUpdated = true } - if buttonKeyboardMessageUpdated { - strongSelf.currentButtonKeyboardMessage = transition.keyboardButtonsMessage - strongSelf._buttonKeyboardMessage.set(.single(transition.keyboardButtonsMessage)) - } - - if transition.animateIn { - strongSelf.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25) - } - - completion() + } else if (strongSelf.currentButtonKeyboardMessage != nil) != (transition.keyboardButtonsMessage != nil) { + buttonKeyboardMessageUpdated = true + } + if buttonKeyboardMessageUpdated { + strongSelf.currentButtonKeyboardMessage = transition.keyboardButtonsMessage + strongSelf._buttonKeyboardMessage.set(.single(transition.keyboardButtonsMessage)) } - } - - if let layoutActionOnViewTransition = self.layoutActionOnViewTransition { - self.layoutActionOnViewTransition = nil - let (mappedTransition, updateSizeAndInsets) = layoutActionOnViewTransition(transition) - self.transaction(deleteIndices: mappedTransition.deleteItems, insertIndicesAndItems: transition.insertItems, updateIndicesAndItems: transition.updateItems, options: mappedTransition.options, scrollToItem: mappedTransition.scrollToItem, updateSizeAndInsets: updateSizeAndInsets, stationaryItemRange: mappedTransition.stationaryItemRange, updateOpaqueState: ChatHistoryTransactionOpaqueState(historyView: transition.historyView), completion: completion) - } else { - self.transaction(deleteIndices: transition.deleteItems, insertIndicesAndItems: transition.insertItems, updateIndicesAndItems: transition.updateItems, options: transition.options, scrollToItem: transition.scrollToItem, stationaryItemRange: transition.stationaryItemRange, updateOpaqueState: ChatHistoryTransactionOpaqueState(historyView: transition.historyView), completion: completion) + if transition.animateIn { + strongSelf.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25) + } + + if let scrolledToIndex = transition.scrolledToIndex { + if let strongSelf = self { + strongSelf.scrolledToIndex?(scrolledToIndex) + } + } + + strongSelf.hasActiveTransition = false + strongSelf.dequeueHistoryViewTransitions() } + } + + if let layoutActionOnViewTransition = self.layoutActionOnViewTransition { + self.layoutActionOnViewTransition = nil + let (mappedTransition, updateSizeAndInsets) = layoutActionOnViewTransition(transition) - if transition.flashIndicators { - //self.flashHeaderItems() - } + self.transaction(deleteIndices: mappedTransition.deleteItems, insertIndicesAndItems: transition.insertItems, updateIndicesAndItems: transition.updateItems, options: mappedTransition.options, scrollToItem: mappedTransition.scrollToItem, updateSizeAndInsets: updateSizeAndInsets, stationaryItemRange: mappedTransition.stationaryItemRange, updateOpaqueState: ChatHistoryTransactionOpaqueState(historyView: transition.historyView), completion: completion) + } else { + self.transaction(deleteIndices: transition.deleteItems, insertIndicesAndItems: transition.insertItems, updateIndicesAndItems: transition.updateItems, options: transition.options, scrollToItem: transition.scrollToItem, stationaryItemRange: transition.stationaryItemRange, updateOpaqueState: ChatHistoryTransactionOpaqueState(historyView: transition.historyView), completion: completion) + } + + if transition.flashIndicators { + //self.flashHeaderItems() } } @@ -1357,7 +1322,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { if !self.dequeuedInitialTransitionOnLayout { self.dequeuedInitialTransitionOnLayout = true - self.dequeueHistoryViewTransition() + self.dequeueHistoryViewTransitions() } } diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtonNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtonNode.swift index bbdafa46ca..bfd2ef8051 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtonNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtonNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let badgeFont = Font.regular(13.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtons.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtons.swift index 0da74b8546..90103f08e3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtons.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryNavigationButtons.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData final class ChatHistoryNavigationButtons: ASDisplayNode { private var theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ChatHistorySearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistorySearchContainerNode.swift index 0e40ea6737..12f094df35 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistorySearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistorySearchContainerNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private enum ChatHistorySearchEntryStableId: Hashable { case messageId(MessageId) diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift index 44d6cec06b..77559fe27e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryViewForLocation.swift @@ -5,7 +5,7 @@ import TelegramCore import SwiftSignalKit import Display -func preloadedShatHistoryViewForLocation(_ location: ChatHistoryLocationInput, account: Account, chatLocation: ChatLocation, fixedCombinedReadStates: MessageHistoryViewReadState?, tagMask: MessageTags?, additionalData: [AdditionalMessageHistoryViewData], orderStatistics: MessageHistoryViewOrderStatistics = []) -> Signal { +func preloadedChatHistoryViewForLocation(_ location: ChatHistoryLocationInput, account: Account, chatLocation: ChatLocation, fixedCombinedReadStates: MessageHistoryViewReadState?, tagMask: MessageTags?, additionalData: [AdditionalMessageHistoryViewData], orderStatistics: MessageHistoryViewOrderStatistics = []) -> Signal { return chatHistoryViewForLocation(location, account: account, chatLocation: chatLocation, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, additionalData: additionalData, orderStatistics: orderStatistics) |> introduceError(Bool.self) |> mapToSignal { update -> Signal in diff --git a/submodules/TelegramUI/TelegramUI/ChatHoleItem.swift b/submodules/TelegramUI/TelegramUI/ChatHoleItem.swift index 5cc04def5b..92d6cf60cb 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHoleItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHoleItem.swift @@ -4,6 +4,7 @@ import Postbox import AsyncDisplayKit import Display import SwiftSignalKit +import TelegramPresentationData private let titleFont = UIFont.systemFont(ofSize: 13.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift index 4728533d5b..49e12bb097 100644 --- a/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData enum ChatMediaGalleryThumbnail: Equatable { case image(ImageMediaReference) diff --git a/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift index b3d00b72c5..047c31cfd3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInfoTitlePanelNode.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import Postbox import TelegramCore +import TelegramPresentationData private enum ChatInfoTitleButton { case search diff --git a/submodules/TelegramUI/TelegramUI/ChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatInputContextPanelNode.swift index 38bbb27dd4..6495540c26 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInputContextPanelNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData enum ChatInputContextPanelPlacement { case overPanels diff --git a/submodules/TelegramUI/TelegramUI/ChatInstantVideoMessageDurationNode.swift b/submodules/TelegramUI/TelegramUI/ChatInstantVideoMessageDurationNode.swift index e3793d239e..49b16264d4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInstantVideoMessageDurationNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInstantVideoMessageDurationNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import SwiftSignalKit import Display +import UniversalMediaPlayer private let textFont = Font.regular(11.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift index 80a05d36d7..cf47675dfb 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift @@ -6,6 +6,7 @@ import Display import UIKit import SwiftSignalKit import MobileCoreServices +import TelegramVoip private struct MessageContextMenuData { let starStatus: Bool? diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift index 770cd5150d..b357ecfa26 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextQueries.swift @@ -3,7 +3,7 @@ import UIKit import SwiftSignalKit import TelegramCore import Postbox - +import TelegramUIPreferences import TelegramUIPrivateModule import LegacyComponents @@ -83,7 +83,7 @@ private func updatedContextQueryResultStateForQuery(context: AccountContext, pee case .installed: scope = [.installed] } - return searchStickers(account: context.account, query: query, scope: scope) + return searchStickers(account: context.account, query: query.trimmedEmoji, scope: scope) } |> map { stickers -> (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult? in return { _ in @@ -264,7 +264,21 @@ private func updatedContextQueryResultStateForQuery(context: AccountContext, pee return signal |> then(contextBot) case let .emojiSearch(query, languageCode, range): - return searchEmojiKeywords(postbox: context.account.postbox, inputLanguageCode: languageCode, query: query, completeMatch: query.count < 3) + var signal = searchEmojiKeywords(postbox: context.account.postbox, inputLanguageCode: languageCode, query: query, completeMatch: query.count < 3) + if !languageCode.lowercased().hasPrefix("en") { + signal = signal + |> mapToSignal { keywords in + return .single(keywords) + |> then( + searchEmojiKeywords(postbox: context.account.postbox, inputLanguageCode: "en-US", query: query, completeMatch: query.count < 3) + |> map { englishKeywords in + return keywords + englishKeywords + } + ) + } + } + + return signal |> map { keywords -> [(String, String)] in var result: [(String, String)] = [] for keyword in keywords { diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift index 2a54350303..defa532eaf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateInputPanels.swift @@ -58,23 +58,6 @@ func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState var displayInputTextPanel = false - /*if case .group = chatPresentationInterfaceState.chatLocation { - if chatPresentationInterfaceState.interfaceState.editMessage != nil { - displayInputTextPanel = true - } else { - if let currentPanel = currentPanel as? ChatFeedNavigationInputPanelNode { - currentPanel.interfaceInteraction = interfaceInteraction - currentPanel.updateThemeAndStrings(theme: chatPresentationInterfaceState.theme, strings: chatPresentationInterfaceState.strings) - return currentPanel - } else { - let panel = ChatFeedNavigationInputPanelNode(theme: chatPresentationInterfaceState.theme, strings: chatPresentationInterfaceState.strings) - panel.context = context - panel.interfaceInteraction = interfaceInteraction - return panel - } - } - }*/ - if let peer = chatPresentationInterfaceState.renderedPeer?.peer { if let secretChat = peer as? TelegramSecretChat { switch secretChat.embeddedState { @@ -100,7 +83,24 @@ func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState break } } else if let channel = peer as? TelegramChannel { - if channel.hasBannedPermission(.banSendMessages) != nil { + var isMember: Bool = false + switch channel.participationStatus { + case .kicked: + if let currentPanel = currentPanel as? DeleteChatInputPanelNode { + return currentPanel + } else { + let panel = DeleteChatInputPanelNode() + panel.context = context + panel.interfaceInteraction = interfaceInteraction + return panel + } + case .member: + isMember = true + case .left: + break + } + + if isMember && channel.hasBannedPermission(.banSendMessages) != nil { if let currentPanel = currentPanel as? ChatRestrictedInputPanelNode { return currentPanel } else { @@ -111,61 +111,48 @@ func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState } } - switch channel.participationStatus { - case .kicked: - if let currentPanel = currentPanel as? DeleteChatInputPanelNode { + switch channel.info { + case .broadcast: + if chatPresentationInterfaceState.interfaceState.editMessage != nil, channel.hasPermission(.editAllMessages) { + displayInputTextPanel = true + } else if !channel.hasPermission(.sendMessages) { + if let currentPanel = currentPanel as? ChatChannelSubscriberInputPanelNode { return currentPanel } else { - let panel = DeleteChatInputPanelNode() - panel.context = context + let panel = ChatChannelSubscriberInputPanelNode() panel.interfaceInteraction = interfaceInteraction + panel.context = context return panel } - case .member, .left: + } + case .group: + switch channel.participationStatus { + case .kicked, .left: + if let currentPanel = currentPanel as? ChatChannelSubscriberInputPanelNode { + return currentPanel + } else { + let panel = ChatChannelSubscriberInputPanelNode() + panel.interfaceInteraction = interfaceInteraction + panel.context = context + return panel + } + case .member: break - } - switch channel.info { - case .broadcast: - if chatPresentationInterfaceState.interfaceState.editMessage != nil, channel.hasPermission(.editAllMessages) { - displayInputTextPanel = true - } else if !channel.hasPermission(.sendMessages) { - if let currentPanel = currentPanel as? ChatChannelSubscriberInputPanelNode { - return currentPanel - } else { - let panel = ChatChannelSubscriberInputPanelNode() - panel.interfaceInteraction = interfaceInteraction - panel.context = context - return panel - } - } - case .group: - switch channel.participationStatus { - case .kicked, .left: - if let currentPanel = currentPanel as? ChatChannelSubscriberInputPanelNode { - return currentPanel - } else { - let panel = ChatChannelSubscriberInputPanelNode() - panel.interfaceInteraction = interfaceInteraction - panel.context = context - return panel - } - case .member: - break - } + } } } else if let group = peer as? TelegramGroup { switch group.membership { - case .Removed, .Left: - if let currentPanel = currentPanel as? DeleteChatInputPanelNode { - return currentPanel - } else { - let panel = DeleteChatInputPanelNode() - panel.context = context - panel.interfaceInteraction = interfaceInteraction - return panel - } - case .Member: - break + case .Removed, .Left: + if let currentPanel = currentPanel as? DeleteChatInputPanelNode { + return currentPanel + } else { + let panel = DeleteChatInputPanelNode() + panel.context = context + panel.interfaceInteraction = interfaceInteraction + return panel + } + case .Member: + break } if group.hasBannedPermission(.banSendMessages) { diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift index fb7da36e23..dc03cf51a3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateNavigationButtons.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Postbox import TelegramCore +import TelegramPresentationData enum ChatNavigationButtonAction { case openChatInfo @@ -27,7 +28,7 @@ func leftNavigationButtonForChatInterfaceState(_ presentationInterfaceState: Cha let canClear: Bool if peer is TelegramUser || peer is TelegramGroup || peer is TelegramSecretChat { canClear = true - } else if let peer = peer as? TelegramChannel, case .group = peer.info, peer.addressName == nil { + } else if let peer = peer as? TelegramChannel, case .group = peer.info, peer.addressName == nil && presentationInterfaceState.peerGeoLocation == nil { canClear = true } else { canClear = false diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift index a1b0d1ec5d..6531f718e3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceTitlePanelNodes.swift @@ -29,7 +29,7 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat } var displayActionsPanel = false - if let contactStatus = chatPresentationInterfaceState.contactStatus, let peerStatusSettings = contactStatus.peerStatusSettings { + if !chatPresentationInterfaceState.peerIsBlocked, let contactStatus = chatPresentationInterfaceState.contactStatus, let peerStatusSettings = contactStatus.peerStatusSettings { if !peerStatusSettings.isEmpty { if contactStatus.canAddContact && peerStatusSettings.contains(.canAddContact) { displayActionsPanel = true @@ -37,6 +37,8 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat displayActionsPanel = true } else if peerStatusSettings.contains(.canShareContact) { displayActionsPanel = true + } else if contactStatus.canReportIrrelevantLocation && peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + displayActionsPanel = true } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift index 4c581c0b4c..7629d635e4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import Photos +import TelegramPresentationData private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white) diff --git a/submodules/TelegramUI/TelegramUI/ChatListArchiveInfoItem.swift b/submodules/TelegramUI/TelegramUI/ChatListArchiveInfoItem.swift index 9a5a963b35..69508d3d36 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListArchiveInfoItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListArchiveInfoItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import Display import SwiftSignalKit +import TelegramPresentationData class ChatListArchiveInfoItem: ListViewItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ChatListController.swift b/submodules/TelegramUI/TelegramUI/ChatListController.swift index 5ed2c70ba4..a12ba47557 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListController.swift @@ -4,6 +4,8 @@ import Postbox import SwiftSignalKit import Display import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences public func useSpecialTabBarIcons() -> Bool { return (Date(timeIntervalSince1970: 1545642000)...Date(timeIntervalSince1970: 1546387200)).contains(Date()) diff --git a/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift index 526d7cf5df..cabf08c318 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListControllerNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private final class ChatListControllerNodeView: UITracingLayerView, PreviewingHostView { var previewingDelegate: PreviewingHostViewDelegate? { diff --git a/submodules/TelegramUI/TelegramUI/ChatListEmptyNode.swift b/submodules/TelegramUI/TelegramUI/ChatListEmptyNode.swift index 1aa64af567..0bd08d0034 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListEmptyNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListEmptyNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class ChatListEmptyNode: ASDisplayNode { private let textNode: ImmediateTextNode diff --git a/submodules/TelegramUI/TelegramUI/ChatListHoleItem.swift b/submodules/TelegramUI/TelegramUI/ChatListHoleItem.swift index ba8de93444..ccce665a4c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListHoleItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListHoleItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import Display import SwiftSignalKit +import TelegramPresentationData private let titleFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatListItem.swift b/submodules/TelegramUI/TelegramUI/ChatListItem.swift index 1606f5bb74..b9e5e2f23a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListItem.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData enum ChatListItemContent { case peer(message: Message?, peer: RenderedPeer, combinedReadState: CombinedPeerReadState?, notificationSettings: PeerNotificationSettings?, presence: PeerPresence?, summaryInfo: ChatListMessageTagSummaryInfo, embeddedState: PeerChatListEmbeddedInterfaceState?, inputActivities: [(Peer, PeerInputActivity)]?, isAd: Bool, ignoreUnreadBadge: Bool) @@ -859,7 +860,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { statusState = .clock(PresentationResourcesChatList.clockFrameImage(item.presentationData.theme), PresentationResourcesChatList.clockMinImage(item.presentationData.theme)) } else if message.id.peerId != account.peerId { if message.flags.contains(.Failed) { - statusState = .none + statusState = .failed(item.presentationData.theme.chatList.failedFillColor, item.presentationData.theme.chatList.failedForegroundColor) } else { if let combinedReadState = combinedReadState, combinedReadState.isOutgoingMessageIndexRead(message.index) { statusState = .read(item.presentationData.theme.chatList.checkmarkColor) diff --git a/submodules/TelegramUI/TelegramUI/ChatListItemStrings.swift b/submodules/TelegramUI/TelegramUI/ChatListItemStrings.swift index 74faa5927f..736515be09 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListItemStrings.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListItemStrings.swift @@ -1,6 +1,8 @@ import Foundation import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences public func chatListItemStrings(strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, message: Message?, chatPeer: RenderedPeer, accountPeerId: PeerId, enableMediaEmoji: Bool = true) -> (peer: Peer?, hideAuthor: Bool, messageText: String) { let peer: Peer? diff --git a/submodules/TelegramUI/TelegramUI/ChatListNode.swift b/submodules/TelegramUI/TelegramUI/ChatListNode.swift index 73ab4e1451..f5cd776c5b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListNode.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramCore import Postbox +import TelegramPresentationData +import TelegramUIPreferences public struct ChatListNodePeersFilter: OptionSet { public var rawValue: Int32 diff --git a/submodules/TelegramUI/TelegramUI/ChatListNodeEntries.swift b/submodules/TelegramUI/TelegramUI/ChatListNodeEntries.swift index 4f8b0c9a7f..d206a38633 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListNodeEntries.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListNodeEntries.swift @@ -1,6 +1,7 @@ import Foundation import Postbox import TelegramCore +import TelegramPresentationData enum ChatListNodeEntryId: Hashable { case Hole(Int64) diff --git a/submodules/TelegramUI/TelegramUI/ChatListPresentationData.swift b/submodules/TelegramUI/TelegramUI/ChatListPresentationData.swift index fa9653ffa7..b333bc0027 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListPresentationData.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListPresentationData.swift @@ -1,5 +1,7 @@ import Foundation import UIKit +import TelegramPresentationData +import TelegramUIPreferences final class ChatListPresentationData { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ChatListRecentPeersListItem.swift b/submodules/TelegramUI/TelegramUI/ChatListRecentPeersListItem.swift index d8b3c22422..ab54168d86 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListRecentPeersListItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListRecentPeersListItem.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData class ChatListRecentPeersListItem: ListViewItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ChatListSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/ChatListSearchContainerNode.swift index 19edb42b95..5e40158776 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListSearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListSearchContainerNode.swift @@ -5,36 +5,12 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private enum ChatListRecentEntryStableId: Hashable { case topPeers case peerId(PeerId) - - static func ==(lhs: ChatListRecentEntryStableId, rhs: ChatListRecentEntryStableId) -> Bool { - switch lhs { - case .topPeers: - if case .topPeers = rhs { - return true - } else { - return false - } - case let .peerId(peerId): - if case .peerId(peerId) = rhs { - return true - } else { - return false - } - } - } - - var hashValue: Int { - switch self { - case .topPeers: - return 0 - case let .peerId(peerId): - return peerId.hashValue - } - } } private enum ChatListRecentEntry: Comparable, Identifiable { @@ -249,7 +225,7 @@ enum ChatListSearchEntryStableId: Hashable { enum ChatListSearchEntry: Comparable, Identifiable { case localPeer(Peer, Peer?, UnreadSearchBadge?, Int, PresentationTheme, PresentationStrings, PresentationPersonNameOrder, PresentationPersonNameOrder) case globalPeer(FoundPeer, UnreadSearchBadge?, Int, PresentationTheme, PresentationStrings, PresentationPersonNameOrder, PresentationPersonNameOrder) - case message(Message, CombinedPeerReadState?, ChatListPresentationData) + case message(Message, RenderedPeer, CombinedPeerReadState?, ChatListPresentationData) case addContact(String, PresentationTheme, PresentationStrings) var stableId: ChatListSearchEntryStableId { @@ -258,7 +234,7 @@ enum ChatListSearchEntry: Comparable, Identifiable { return .localPeerId(peer.id) case let .globalPeer(peer, _, _, _, _, _, _): return .globalPeerId(peer.peer.id) - case let .message(message, _, _): + case let .message(message, _, _, _): return .messageId(message.id) case .addContact: return .addContact @@ -279,14 +255,17 @@ enum ChatListSearchEntry: Comparable, Identifiable { } else { return false } - case let .message(lhsMessage, lhsCombinedPeerReadState, lhsPresentationData): - if case let .message(rhsMessage, rhsCombinedPeerReadState, rhsPresentationData) = rhs { + case let .message(lhsMessage, lhsPeer, lhsCombinedPeerReadState, lhsPresentationData): + if case let .message(rhsMessage, rhsPeer, rhsCombinedPeerReadState, rhsPresentationData) = rhs { if lhsMessage.id != rhsMessage.id { return false } if lhsMessage.stableVersion != rhsMessage.stableVersion { return false } + if lhsPeer != rhsPeer { + return false + } if lhsPresentationData !== rhsPresentationData { return false } @@ -332,8 +311,8 @@ enum ChatListSearchEntry: Comparable, Identifiable { case .message, .addContact: return true } - case let .message(lhsMessage, _, _): - if case let .message(rhsMessage, _, _) = rhs { + case let .message(lhsMessage, _, _, _): + if case let .message(rhsMessage, _, _, _) = rhs { return lhsMessage.index < rhsMessage.index } else if case .addContact = rhs { return true @@ -446,8 +425,8 @@ enum ChatListSearchEntry: Comparable, Identifiable { return ContactsPeerItem(theme: theme, strings: strings, sortOrder: nameSortOrder, displayOrder: nameDisplayOrder, account: context.account, peerMode: .generalSearch, peer: .peer(peer: peer.peer, chatPeer: peer.peer), status: .addressName(suffixString), badge: badge, enabled: enabled, selection: .none, editing: ContactsPeerItemEditing(editable: false, editing: false, revealed: false), index: nil, header: header, action: { _ in interaction.peerSelected(peer.peer) }) - case let .message(message, readState, presentationData): - return ChatListItem(presentationData: presentationData, context: context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: message.index), content: .peer(message: message, peer: RenderedPeer(message: message), combinedReadState: readState, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: true), editing: false, hasActiveRevealControls: false, selected: false, header: enableHeaders ? ChatListSearchItemHeader(type: .messages, theme: presentationData.theme, strings: presentationData.strings, actionTitle: nil, action: nil) : nil, enableContextActions: false, hiddenOffset: false, interaction: interaction) + case let .message(message, peer, readState, presentationData): + return ChatListItem(presentationData: presentationData, context: context, peerGroupId: .root, index: ChatListIndex(pinningIndex: nil, messageIndex: message.index), content: .peer(message: message, peer: peer, combinedReadState: readState, notificationSettings: nil, presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(), embeddedState: nil, inputActivities: nil, isAd: false, ignoreUnreadBadge: true), editing: false, hasActiveRevealControls: false, selected: false, header: enableHeaders ? ChatListSearchItemHeader(type: .messages, theme: presentationData.theme, strings: presentationData.strings, actionTitle: nil, action: nil) : nil, enableContextActions: false, hiddenOffset: false, interaction: interaction) case let .addContact(phoneNumber, theme, strings): return ContactsAddItem(theme: theme, strings: strings, phoneNumber: phoneNumber, header: ChatListSearchItemHeader(type: .phoneNumber, theme: theme, strings: strings, actionTitle: nil, action: nil), action: { interaction.addContact(phoneNumber) @@ -811,7 +790,13 @@ final class ChatListSearchContainerNode: SearchDisplayControllerContentNode { if !foundRemotePeers.2 { index = 0 for message in foundRemoteMessages.0.0 { - entries.append(.message(message, foundRemoteMessages.0.1[message.id.peerId], presentationData)) + var peer = RenderedPeer(message: message) + if let group = message.peers[message.id.peerId] as? TelegramGroup, let migrationReference = group.migrationReference { + if let channelPeer = message.peers[migrationReference.peerId] { + peer = RenderedPeer(peer: channelPeer) + } + } + entries.append(.message(message, peer, foundRemoteMessages.0.1[message.id.peerId], presentationData)) index += 1 } } diff --git a/submodules/TelegramUI/TelegramUI/ChatListSearchItem.swift b/submodules/TelegramUI/TelegramUI/ChatListSearchItem.swift index 64e2988b41..22472c0124 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListSearchItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListSearchItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import Display import SwiftSignalKit +import TelegramPresentationData private let searchBarFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatListSearchItemHeader.swift b/submodules/TelegramUI/TelegramUI/ChatListSearchItemHeader.swift index 986d8157fa..a581b2a08f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListSearchItemHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListSearchItemHeader.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import Display +import TelegramPresentationData enum ChatListSearchItemHeaderType: Int32 { case localPeers diff --git a/submodules/TelegramUI/TelegramUI/ChatListSearchRecentPeersNode.swift b/submodules/TelegramUI/TelegramUI/ChatListSearchRecentPeersNode.swift index 06017cc8ee..ef5079393a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListSearchRecentPeersNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListSearchRecentPeersNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private func calculateItemCustomWidth(width: CGFloat) -> CGFloat { let itemInsets = UIEdgeInsets(top: 0.0, left: 6.0, bottom: 0.0, right: 6.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatListStatusNode.swift b/submodules/TelegramUI/TelegramUI/ChatListStatusNode.swift index 1889d55493..4c67678f4c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListStatusNode.swift @@ -10,6 +10,7 @@ enum ChatListStatusNodeState: Equatable { case delivered(UIColor) case read(UIColor) case progress(UIColor, CGFloat) + case failed(UIColor, UIColor) func contentNode() -> ChatListStatusContentNode? { switch self { @@ -23,6 +24,8 @@ enum ChatListStatusNodeState: Equatable { return ChatListStatusChecksNode(color: color) case let .progress(color, progress): return ChatListStatusProgressNode(color: color, progress: progress) + case let .failed(fill, foreground): + return ChatListStatusFailedNode(fill: fill, foreground: foreground) } } } @@ -346,6 +349,84 @@ private class ChatListStatusChecksNode: ChatListStatusContentNode { } } +private final class ChatListStatusFailedNodeParameters: NSObject { + let fill: UIColor + let foreground: UIColor + + init(fill: UIColor, foreground: UIColor) { + self.fill = fill + self.foreground = foreground + + super.init() + } +} + +private class ChatListStatusFailedNode: ChatListStatusContentNode { + private var state: ChatListStatusNodeState? + + var fill: UIColor { + didSet { + self.setNeedsDisplay() + } + } + + var foreground: UIColor { + didSet { + self.setNeedsDisplay() + } + } + + init(fill: UIColor, foreground: UIColor) { + self.fill = fill + self.foreground = foreground + + super.init() + } + + override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { + return ChatListStatusFailedNodeParameters(fill: self.fill, foreground: self.foreground) + } + + @objc override class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled: () -> Bool, isRasterizing: Bool) { + let context = UIGraphicsGetCurrentContext()! + + if !isRasterizing { + context.setBlendMode(.copy) + context.setFillColor(UIColor.clear.cgColor) + context.fill(bounds) + } + + guard let parameters = parameters as? ChatListStatusFailedNodeParameters else { + return + } + + 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) + + context.setFillColor(parameters.fill.cgColor) + context.fillEllipse(in: rect) + context.setStrokeColor(parameters.foreground.cgColor) + + let string = NSAttributedString(string: "!", font: Font.medium(12.0), textColor: parameters.foreground) + 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))) + UIGraphicsPopContext() + } + + override func updateWithState(_ state: ChatListStatusNodeState, animated: Bool) { + switch state { + case let .failed(fill, foreground): + self.fill = fill + self.foreground = foreground + default: + break + } + self.state = state + } +} + private class ChatListStatusProgressNode: ChatListStatusContentNode { private let statusNode: RadialStatusNode diff --git a/submodules/TelegramUI/TelegramUI/ChatListTitleLockView.swift b/submodules/TelegramUI/TelegramUI/ChatListTitleLockView.swift index 1461607822..36a7ca93a3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListTitleLockView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListTitleLockView.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import Display +import TelegramPresentationData final class ChatListTitleLockView: UIView { private let topView: UIImageView diff --git a/submodules/TelegramUI/TelegramUI/ChatListTitleProxyNode.swift b/submodules/TelegramUI/TelegramUI/ChatListTitleProxyNode.swift index fe4efba840..453685717c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListTitleProxyNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListTitleProxyNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData enum ChatTitleProxyStatus { case connecting diff --git a/submodules/TelegramUI/TelegramUI/ChatListTitleView.swift b/submodules/TelegramUI/TelegramUI/ChatListTitleView.swift index c8a134eb57..534fa5a7d2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListTitleView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListTitleView.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData struct NetworkStatusTitle: Equatable { let text: String diff --git a/submodules/TelegramUI/TelegramUI/ChatListTypingNode.swift b/submodules/TelegramUI/TelegramUI/ChatListTypingNode.swift index 426bd8a3f6..0b1603b462 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListTypingNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListTypingNode.swift @@ -5,6 +5,7 @@ import Postbox import TelegramCore import Display import SwiftSignalKit +import TelegramPresentationData private let textFont = Font.regular(15.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatLoadingNode.swift b/submodules/TelegramUI/TelegramUI/ChatLoadingNode.swift index 1958625f56..4b7dd4fc48 100644 --- a/submodules/TelegramUI/TelegramUI/ChatLoadingNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatLoadingNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData final class ChatLoadingNode: ASDisplayNode { private let backgroundNode: ASImageNode diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift index 21ac941720..8602335d3e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputGifPane.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private func fixListScrolling(_ multiplexedNode: MultiplexedVideoNode) { let searchBarHeight: CGFloat = 56.0 diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputGridEntries.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputGridEntries.swift index c29c4e3e15..cf2927978b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputGridEntries.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputGridEntries.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import SwiftSignalKit import Display +import TelegramPresentationData enum ChatMediaInputGridEntryStableId: Equatable, Hashable { case search diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputMetaSectionItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputMetaSectionItemNode.swift index 7c74bd15ab..01c1f9b9ae 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputMetaSectionItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputMetaSectionItemNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData enum ChatMediaInputMetaSectionItemType { case savedStickers diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift index cd8c645e9e..d5958bb212 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private struct PeerSpecificPackData { let peer: Peer diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift index 57eb66b5cc..f1c8647566 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputPane.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData struct ChatMediaInputPaneScrollState { let absoluteOffset: CGFloat? diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputPanelEntries.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputPanelEntries.swift index eda73f0f4a..c2bd951dad 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputPanelEntries.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputPanelEntries.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import SwiftSignalKit import Display +import TelegramPresentationData enum ChatMediaInputPanelAuxiliaryNamespace: Int32 { case savedStickers = 2 diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift index b70bb349df..d4c0d125d5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputPeerSpecificItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class ChatMediaInputPeerSpecificItem: ListViewItem { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputRecentGifsItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputRecentGifsItem.swift index 66dd365941..2b2910cbde 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputRecentGifsItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputRecentGifsItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class ChatMediaInputRecentGifsItem: ListViewItem { let inputNodeInteraction: ChatMediaInputNodeInteraction diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputSettingsItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputSettingsItem.swift index 295252ccc2..c2ba57037b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputSettingsItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputSettingsItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class ChatMediaInputSettingsItem: ListViewItem { let inputNodeInteraction: ChatMediaInputNodeInteraction diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift index b9520236ac..b20e3336ca 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift @@ -5,6 +5,7 @@ import TelegramCore import SwiftSignalKit import AsyncDisplayKit import Postbox +import TelegramPresentationData enum ChatMediaInputStickerGridSectionAccessory { case none diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index 5afa8f16a6..f99086b19a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class ChatMediaInputStickerPackItem: ListViewItem { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift index 8f61c12618..6da49891d7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPane.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private func fixGridScrolling(_ gridNode: GridNode) { var searchItemNode: GridItemNode? diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift index a226c295e9..21cca6add2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class ChatMediaInputTrendingItem: ListViewItem { let inputNodeInteraction: ChatMediaInputNodeInteraction diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift index f11737cbca..9d7ea3e369 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class TrendingPaneInteraction { let installPack: (ItemCollectionInfo) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageActionButtonsNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageActionButtonsNode.swift index 7339ca65bf..edd3233fb2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageActionButtonsNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageActionButtonsNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import TelegramCore import Postbox import Display +import TelegramPresentationData private let titleFont = Font.medium(16.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift index dbba3bafcb..22006d08e7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private let titleFont = Font.regular(13.0) private let titleBoldFont = Font.bold(13.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetController.swift b/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetController.swift index eb45b523ed..17cc678bfe 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetController.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData final class ChatMessageActionSheetController: ViewController { var controllerNode: ChatMessageActionSheetControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetControllerNode.swift index 0f7ae57b75..7fdb64af4e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageActionSheetControllerNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData private let shadowInset: CGFloat = 8.0 diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift b/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift index 62ec5c593f..bd0be2c6d5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let textFont = Font.regular(13.0) private let boldTextFont = Font.semibold(13.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index c13da67e2a..0710b2bf90 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -5,48 +5,29 @@ import Display import SwiftSignalKit import Postbox import TelegramCore -import AVFoundation import CoreImage +import TelegramPresentationData +import Compression -private class AlphaFrameFilter: CIFilter { - static var kernel: CIColorKernel? = { - return CIColorKernel(source: """ -kernel vec4 alphaFrame(__sample s, __sample m) { - return vec4( s.rgb, 1.0 - m.r ); -} -""") - }() +private final class AnimationFrameCache { + private var cache: [Int: NSPurgeableData] = [:] - var inputImage: CIImage? - var maskImage: CIImage? - - override var outputImage: CIImage? { - let kernel = AlphaFrameFilter.kernel! - guard let inputImage = inputImage, let maskImage = maskImage else { - return nil + func get(index: Int, _ f: (NSPurgeableData?) -> Void) { + guard let data = self.cache[index] else { + f(nil) + return + } + if data.beginContentAccess() { + f(data) + data.endContentAccess() + } else { + self.cache.removeValue(forKey: index) + f(nil) } - let args = [inputImage as AnyObject, maskImage as AnyObject] - return kernel.apply(extent: inputImage.extent, arguments: args) } -} - -private func createVideoComposition(for playerItem: AVPlayerItem, ready: @escaping () -> Void) -> AVVideoComposition? { - let videoSize = CGSize(width: playerItem.presentationSize.width, height: playerItem.presentationSize.height / 2.0) - if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { - let composition = AVMutableVideoComposition(asset: playerItem.asset, applyingCIFiltersWithHandler: { request in - let sourceRect = CGRect(origin: .zero, size: videoSize) - let alphaRect = sourceRect.offsetBy(dx: 0, dy: sourceRect.height) - let filter = AlphaFrameFilter() - filter.inputImage = request.sourceImage.cropped(to: alphaRect) - .transformed(by: CGAffineTransform(translationX: 0, y: -sourceRect.height)) - filter.maskImage = request.sourceImage.cropped(to: sourceRect) - request.finish(with: filter.outputImage!, context: nil) - ready() - }) - composition.renderSize = videoSize - return composition - } else { - return nil + + func set(index: Int, bytes: UnsafeRawPointer, length: Int) { + self.cache[index] = NSPurgeableData(bytes: bytes, length: length) } } @@ -56,125 +37,234 @@ private final class StickerAnimationNode: ASDisplayNode { private let disposable = MetaDisposable() private let fetchDisposable = MetaDisposable() - var playerLayer: AVPlayerLayer { - return self.layer as! AVPlayerLayer - } - var started: () -> Void = {} + private var reportedStarted = false + + private var timer: SwiftSignalKit.Timer? + + private var data: Data? + private var frameCache = AnimationFrameCache() + + private var renderer: (AnimationRenderer & ASDisplayNode)? - var ready = false var visibility = false { didSet { if self.visibility { - if self.ready { - self.player?.play() - } + self.play() } else{ - self.player?.pause() + self.stop() } } } - var player: AVPlayer? { - get { - if self.isNodeLoaded { - return self.playerLayer.player - } else { - return nil - } - } - set { - self.playerLayer.player = newValue - } - } - - private var playerItem: AVPlayerItem? = nil { - willSet { - self.playerItem?.removeObserver(self, forKeyPath: #keyPath(AVPlayerItem.status)) - } - didSet { - self.playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: .new, context: nil) - self.setupLooping() - } - } - override init() { super.init() - - self.setLayerBlock({ - let layer = AVPlayerLayer() - layer.isHidden = true - layer.videoGravity = .resize - if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { - layer.pixelBufferAttributes = [(kCVPixelBufferPixelFormatTypeKey as String): kCVPixelFormatType_32BGRA] - } - return layer - }) } deinit { - NotificationCenter.default.removeObserver(self.didPlayToEndTimeObsever as Any) - self.playerItem?.removeObserver(self, forKeyPath: #keyPath(AVPlayerItem.status)) - self.player = nil - self.playerItem = nil self.disposable.dispose() self.fetchDisposable.dispose() + self.timer?.invalidate() + } + + override func didLoad() { + super.didLoad() + + #if targetEnvironment(simulator) + self.renderer = SoftwareAnimationRenderer() + #else + self.renderer = SoftwareAnimationRenderer() + //self.renderer = MetalAnimationRenderer() + #endif + self.renderer?.frame = CGRect(origin: CGPoint(), size: self.bounds.size) + self.addSubnode(self.renderer!) } func setup(account: Account, fileReference: FileMediaReference) { self.disposable.set(chatMessageAnimationData(postbox: account.postbox, fileReference: fileReference, synchronousLoad: false).start(next: { [weak self] data in if let strongSelf = self, data.complete { - let playerItem = AVPlayerItem(url: URL(fileURLWithPath: data.path)) - Queue.mainQueue().async { - strongSelf.player = AVPlayer(playerItem: playerItem) - strongSelf.player?.isMuted = true - strongSelf.playerItem = playerItem + strongSelf.data = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.mappedRead]) + if strongSelf.visibility { + strongSelf.play() } } })) self.fetchDisposable.set(fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) } - private func setupLooping() { - guard let playerItem = self.playerItem, let player = self.player else { + func reset() { + self.disposable.set(nil) + self.fetchDisposable.set(nil) + } + + func play() { + guard let data = self.data else { return } - - self.didPlayToEndTimeObsever = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: playerItem, queue: nil, using: { _ in - player.seek(to: kCMTimeZero) { _ in - player.play() + if #available(iOS 9.0, *) { + let dataCount = data.count + self.timer?.invalidate() + var scratchBuffer = Data(count: compression_decode_scratch_buffer_size(COMPRESSION_LZ4)) + + let width = 320 + let height = 320 + + var offset = 0 + + var fps: Int32 = 0 + data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in + memcpy(&fps, bytes, 4) + offset += 4 } - }) - } - - private var didPlayToEndTimeObsever: NSObjectProtocol? = nil { - willSet(newObserver) { - if let observer = self.didPlayToEndTimeObsever, self.didPlayToEndTimeObsever !== newObserver { - NotificationCenter.default.removeObserver(observer) - } - } - } - - override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { - if let playerItem = object as? AVPlayerItem, playerItem === self.playerItem { - if case .readyToPlay = playerItem.status, playerItem.videoComposition == nil { - playerItem.seekingWaitsForVideoCompositionRendering = true - let composition = createVideoComposition(for: playerItem, ready: { [weak self] in - Queue.mainQueue().async { - self?.playerLayer.isHidden = false - self?.started() - } - }) - playerItem.videoComposition = composition - ready = true - if self.visibility { - self.player?.play() + + if true { + var decodeBuffer = Data(count: width * 4 * height) + var frameBuffer = Data(count: width * 4 * height) + let decodeBufferLength = decodeBuffer.count + frameBuffer.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in + memset(bytes, 0, decodeBufferLength) } + + var frameIndex = 0 + let timer = SwiftSignalKit.Timer(timeout: 1.0 / Double(fps), repeat: true, completion: { [weak self] in + guard let strongSelf = self else { + return + } + data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in + var frameLength: Int32 = 0 + memcpy(&frameLength, bytes.advanced(by: offset), 4) + + var usedCache = false + strongSelf.frameCache.get(index: frameIndex, { data in + if let data = data { + usedCache = true + + strongSelf.renderer?.render(width: 320, height: 320, bytes: data.bytes, length: data.length) + + if !strongSelf.reportedStarted { + strongSelf.reportedStarted = true + strongSelf.started() + } + } + }) + + if !usedCache { + scratchBuffer.withUnsafeMutableBytes { (scratchBytes: UnsafeMutablePointer) -> Void in + decodeBuffer.withUnsafeMutableBytes { (decodeBytes: UnsafeMutablePointer) -> Void in + frameBuffer.withUnsafeMutableBytes { (frameBytes: UnsafeMutablePointer) -> Void in + compression_decode_buffer(decodeBytes, decodeBufferLength, bytes.advanced(by: offset + 4), Int(frameLength), UnsafeMutableRawPointer(scratchBytes), COMPRESSION_LZ4) + + var lhs = UnsafeMutableRawPointer(frameBytes).assumingMemoryBound(to: UInt64.self) + var rhs = UnsafeRawPointer(decodeBytes).assumingMemoryBound(to: UInt64.self) + for _ in 0 ..< decodeBufferLength / 8 { + lhs.pointee = lhs.pointee ^ rhs.pointee + lhs = lhs.advanced(by: 1) + rhs = rhs.advanced(by: 1) + } + + strongSelf.renderer?.render(width: 320, height: 320, bytes: frameBytes, length: decodeBufferLength) + + strongSelf.frameCache.set(index: frameIndex, bytes: frameBytes, length: decodeBufferLength) + } + } + } + + if !strongSelf.reportedStarted { + strongSelf.reportedStarted = true + strongSelf.started() + } + } + + offset += 4 + Int(frameLength) + frameIndex += 1 + if offset == dataCount { + offset = 4 + frameIndex = 0 + } + } + }, queue: Queue.mainQueue()) + self.timer = timer + timer.start() + } else { + var decodeBuffer = Data(count: width * 2 * height + width * height) + var frameBuffer = Data(count: width * 2 * height + width * height) + let decodeBufferLength = decodeBuffer.count + frameBuffer.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in + memset(bytes, 0, decodeBufferLength) + } + + var frameIndex = 0 + let timer = SwiftSignalKit.Timer(timeout: 1.0 / Double(offset), repeat: true, completion: { [weak self] in + guard let strongSelf = self else { + return + } + data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in + var frameLength: Int32 = 0 + memcpy(&frameLength, bytes.advanced(by: offset), 4) + + var usedCache = false + strongSelf.frameCache.get(index: frameIndex, { data in + if let data = data { + usedCache = true + + strongSelf.renderer?.render(width: 320, height: 320, bytes: data.bytes, length: data.length) + + if !strongSelf.reportedStarted { + strongSelf.reportedStarted = true + strongSelf.started() + } + } + }) + + if !usedCache { + scratchBuffer.withUnsafeMutableBytes { (scratchBytes: UnsafeMutablePointer) -> Void in + decodeBuffer.withUnsafeMutableBytes { (decodeBytes: UnsafeMutablePointer) -> Void in + frameBuffer.withUnsafeMutableBytes { (frameBytes: UnsafeMutablePointer) -> Void in + compression_decode_buffer(decodeBytes, decodeBufferLength, bytes.advanced(by: offset + 4), Int(frameLength), UnsafeMutableRawPointer(scratchBytes), COMPRESSION_LZ4) + + var lhs = UnsafeMutableRawPointer(frameBytes).assumingMemoryBound(to: UInt64.self) + var rhs = UnsafeRawPointer(decodeBytes).assumingMemoryBound(to: UInt64.self) + for _ in 0 ..< Int(decodeBufferLength) / 8 { + lhs.pointee = lhs.pointee ^ rhs.pointee + lhs = lhs.advanced(by: 1) + rhs = rhs.advanced(by: 1) + } + + strongSelf.renderer?.render(width: 320, height: 320, bytes: frameBytes, length: decodeBufferLength) + + strongSelf.frameCache.set(index: frameIndex, bytes: frameBytes, length: decodeBufferLength) + } + } + } + + if !strongSelf.reportedStarted { + strongSelf.reportedStarted = true + strongSelf.started() + } + } + + offset += 4 + Int(frameLength) + frameIndex += 1 + if offset == dataCount { + offset = 0 + frameIndex = 0 + } + } + }, queue: Queue.mainQueue()) + self.timer = timer + timer.start() } - } else { - return super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) } } + + func stop() { + self.timer?.invalidate() + self.timer = nil + } + + func updateLayout(size: CGSize) { + self.renderer?.frame = CGRect(origin: CGPoint(), size: size) + } } class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { @@ -188,6 +278,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { private var shareButtonNode: HighlightableButtonNode? var telegramFile: TelegramMediaFile? + private let disposable = MetaDisposable() private let dateAndStatusNode: ChatMessageDateAndStatusNode private var replyInfoNode: ChatMessageReplyInfoNode? @@ -214,6 +305,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { self.addSubnode(self.dateAndStatusNode) } + deinit { + self.disposable.dispose() + } + required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -245,14 +340,19 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { self.view.addGestureRecognizer(replyRecognizer) } + private var visibilityPromise = ValuePromise(false, ignoreRepeated: true) override var visibility: ListViewItemNodeVisibility { didSet { - if self.visibility != oldValue { - switch self.visibility { - case .visible: - self.animationNode.visibility = true - case .none: - self.animationNode.visibility = false + let wasVisible = oldValue != .none + let isVisible = self.visibility != .none + + if wasVisible != isVisible { + if isVisible { + self.animationNode.visibility = true + self.visibilityPromise.set(true) + } else { + self.animationNode.visibility = false + self.visibilityPromise.set(false) } } } @@ -287,14 +387,14 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { return { item, params, mergedTop, mergedBottom, dateHeaderAtBottom in let incoming = item.message.effectivelyIncoming(item.context.account.peerId) - var imageSize: CGSize = CGSize(width: 162.0, height: 162.0) - if let telegramFile = telegramFile { + var imageSize: CGSize = CGSize(width: 160.0, height: 160.0) + /*if let telegramFile = telegramFile { if let dimensions = telegramFile.dimensions { imageSize = dimensions.aspectFitted(displaySize) } else if let thumbnailSize = telegramFile.previewRepresentations.first?.dimensions { imageSize = thumbnailSize.aspectFitted(displaySize) } - } + }*/ let avatarInset: CGFloat var hasAvatar = false @@ -466,6 +566,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { strongSelf.imageNode.frame = updatedImageFrame strongSelf.animationNode.frame = updatedImageFrame.insetBy(dx: imageInset, dy: imageInset) + strongSelf.animationNode.updateLayout(size: updatedImageFrame.insetBy(dx: imageInset, dy: imageInset).size) imageApply() if let updatedShareButtonNode = updatedShareButtonNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift index d19ffbabc3..bf5cc8a42f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift @@ -6,6 +6,8 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramCore import Postbox +import TelegramPresentationData +import TelegramUIPreferences private let titleFont: UIFont = Font.semibold(15.0) private let textFont: UIFont = Font.regular(15.0) @@ -234,8 +236,8 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { var visibility: ListViewItemNodeVisibility = .none { didSet { - self.contentImageNode?.visibility = self.visibility - self.contentInstantVideoNode?.visibility = self.visibility + self.contentImageNode?.visibility = self.visibility != .none + self.contentInstantVideoNode?.visibility = self.visibility != .none } } @@ -782,7 +784,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { strongSelf.openMedia?(mode) } } - contentImageNode.visibility = strongSelf.visibility + contentImageNode.visibility = strongSelf.visibility != .none } let _ = contentImageApply(transition, synchronousLoads) let contentImageFrame: CGRect @@ -798,7 +800,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { adjustedStatusFrame = CGRect(origin: CGPoint(x: contentImageFrame.width - statusFrame.size.width - 2.0, y: contentImageFrame.height - statusFrame.size.height - 2.0), size: statusFrame.size) } } else if let contentImageNode = strongSelf.contentImageNode { - contentImageNode.visibility = .none + contentImageNode.visibility = false contentImageNode.removeFromSupernode() strongSelf.contentImageNode = nil } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAvatarAccessoryItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAvatarAccessoryItem.swift index 6c121eeca2..9aaed1628c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAvatarAccessoryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAvatarAccessoryItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import Display import TelegramCore +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 16.0)! diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentCalclulateImageCorners.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentCalclulateImageCorners.swift index 728a7da104..f3c7671062 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentCalclulateImageCorners.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentCalclulateImageCorners.swift @@ -1,5 +1,6 @@ import Foundation import UIKit +import Display func chatMessageBubbleImageContentCorners(relativeContentPosition position: ChatMessageBubbleContentPosition, normalRadius: CGFloat, mergedRadius: CGFloat, mergedWithAnotherContentRadius: CGFloat) -> ImageCorners { let topLeftCorner: ImageCorner diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift index cfd9ab40ca..cafc20c6b4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramUIPreferences enum ChatMessageBubbleContentBackgroundHiding { case never diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index f9db08ef00..0f6374c802 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -4,6 +4,8 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [(Message, AnyClass)] { var result: [(Message, AnyClass)] = [] @@ -1537,6 +1539,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { for (relativeFrame, _, apply) in contentNodeFramesPropertiesAndApply { apply(animation, synchronousLoads) + if contentNodeIndex >= strongSelf.contentNodes.count { + break + } + let contentNode = strongSelf.contentNodes[contentNodeIndex] let contentNodeFrame = relativeFrame.offsetBy(dx: contentOrigin.x, dy: contentOrigin.y) let previousContentNodeFrame = contentNode.frame diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageCallBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageCallBubbleContentNode.swift index a124f728fe..d6848f243d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageCallBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageCallBubbleContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import Postbox +import TelegramPresentationData private let titleFont: UIFont = Font.medium(16.0) private let labelFont: UIFont = Font.regular(13.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift index 7f24a54787..e923538017 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageContactBubbleContentNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 16.0)! diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift index 46ca3ca960..a828f11f2b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateAndStatusNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import Display import SwiftSignalKit +import TelegramPresentationData private let dateFont = UIFont.italicSystemFont(ofSize: 11.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift index 1690cf2c63..f4a9f54141 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDateHeader.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData private let timezoneOffset: Int32 = { let nowTimestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageDeliveryFailedNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageDeliveryFailedNode.swift index 3dda0a87b0..9a44437b6a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageDeliveryFailedNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageDeliveryFailedNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class ChatMessageDeliveryFailedNode: ASImageNode { private let tapped: () -> Void diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageFileBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageFileBubbleContentNode.swift index aab4e3b404..247690f3d7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageFileBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageFileBubbleContentNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences class ChatMessageFileBubbleContentNode: ChatMessageBubbleContentNode { private let interactiveFileNode: ChatMessageInteractiveFileNode diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageForwardInfoNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageForwardInfoNode.swift index b4e7e1829e..b0d729f1d9 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageForwardInfoNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageForwardInfoNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let prefixFont = Font.regular(13.0) private let peerFont = Font.medium(13.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift index 0f6fc5333c..48b900b27d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private let nameFont = Font.medium(14.0) @@ -37,8 +39,11 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { override var visibility: ListViewItemNodeVisibility { didSet { - if self.visibility != oldValue { - self.interactiveVideoNode.visibility = self.visibility + let wasVisible = oldValue != .none + let isVisible = self.visibility != .none + + if wasVisible != isVisible { + self.interactiveVideoNode.visibility = isVisible } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift index 045a09b24a..c698351387 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveFileNode.swift @@ -5,6 +5,8 @@ import Postbox import SwiftSignalKit import Display import TelegramCore +import UniversalMediaPlayer +import TelegramPresentationData private struct FetchControls { let fetch: () -> Void @@ -489,6 +491,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { if hasStreamingProgress { fittedLayoutSize.width += streamingProgressDiameter + 6.0 } + fittedLayoutSize.width = max(fittedLayoutSize.width, boundingWidth + 2.0) } else { streamingCacheStatusFrame = CGRect() } @@ -633,8 +636,6 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { } private func updateStatus(animated: Bool) { - - guard let resourceStatus = self.resourceStatus else { return } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift index cb13e8a214..49d6794ee0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import UniversalMediaPlayer +import TelegramPresentationData struct ChatMessageInstantVideoItemLayoutResult { let contentSize: CGSize @@ -59,14 +61,14 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { private let fetchedThumbnailDisposable = MetaDisposable() private var shouldAcquireVideoContext: Bool { - if case .visible = self.visibility { + if self.visibility { return true } else { return false } } - var visibility: ListViewItemNodeVisibility = .none { + var visibility: Bool = false { didSet { if self.visibility != oldValue { self.videoNode?.canAttachContent = self.shouldAcquireVideoContext diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaBadge.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaBadge.swift index 213e6c57ff..dcf1a72890 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaBadge.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaBadge.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData enum ChatMessageInteractiveMediaDownloadState: Equatable { case remote diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 3f3b9827ab..69fc8c3285 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -5,6 +5,9 @@ import Postbox import SwiftSignalKit import Display import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import UniversalMediaPlayer private struct FetchControls { let fetch: (Bool) -> Void @@ -83,26 +86,21 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode { private var secretTimer: SwiftSignalKit.Timer? var visibilityPromise = ValuePromise(false, ignoreRepeated: true) - var visibility: ListViewItemNodeVisibility = .none { + var visibility: Bool = false { didSet { if let videoNode = self.videoNode { - switch self.visibility { - case .visible: - if !videoNode.canAttachContent { - videoNode.canAttachContent = true - if videoNode.hasAttachedContext { - videoNode.play() - } + if self.visibility { + if !videoNode.canAttachContent { + videoNode.canAttachContent = true + if videoNode.hasAttachedContext { + videoNode.play() } - case .none: - videoNode.canAttachContent = false + } + } else { + videoNode.canAttachContent = false } } - var isVisible = false - if case .visible = self.visibility { - isVisible = true - } - self.visibilityPromise.set(isVisible) + self.visibilityPromise.set(self.visibility) } } @@ -635,7 +633,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode { videoNode.updateLayout(size: arguments.drawingSize, transition: .immediate) videoNode.frame = imageFrame - if case .visible = strongSelf.visibility { + if strongSelf.visibility { if !videoNode.canAttachContent { videoNode.canAttachContent = true if videoNode.hasAttachedContext { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInvoiceBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInvoiceBubbleContentNode.swift index 881b15b4d4..bd7c636445 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInvoiceBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInvoiceBubbleContentNode.swift @@ -5,6 +5,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramUIPreferences private let titleFont: UIFont = Font.semibold(15.0) private let textFont: UIFont = Font.regular(15.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift index 03a71dfa41..e5262ec77a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences public enum ChatMessageItemContent: Sequence { case message(message: Message, read: Bool, selection: ChatHistoryMessageSelection, attributes: ChatMessageEntryAttributes) @@ -358,7 +360,9 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible { for attribute in telegramFile.attributes { switch attribute { case .Sticker: - viewClassName = ChatMessageStickerItemNode.self + if let size = telegramFile.size, size > 0 && size <= 512 * 1024 { + viewClassName = ChatMessageStickerItemNode.self + } break loop case let .Video(_, _, flags): if flags.contains(.instantRoundVideo) { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationPositionNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationPositionNode.swift index 6822f4bd7c..0a275de1d7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationPositionNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationPositionNode.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import TelegramCore import Postbox +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 24.0)! private let avatarBackgroundImage = UIImage(bundleImageName: "Chat/Message/LocationPin")?.precomposed() diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTextNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTextNode.swift index e13ab120c2..4601f2b0ab 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTextNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTextNode.swift @@ -2,6 +2,8 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData +import TelegramUIPreferences private let textFont: UIFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTimerNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTimerNode.swift index 285be9b7b9..e061f23841 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTimerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageLiveLocationTimerNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let textFont: UIFont = UIFont(name: ".SFCompactRounded-Semibold", size: 13.0)! diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift index da5dc27e48..eef867b54a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { override var supportsMosaic: Bool { @@ -21,7 +22,7 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { override var visibility: ListViewItemNodeVisibility { didSet { - self.interactiveImageNode.visibility = self.visibility + self.interactiveImageNode.visibility = self.visibility != .none } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift index aa982e7a95..18d338bfa9 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageNotificationItem.swift @@ -5,6 +5,8 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences public final class ChatMessageNotificationItem: NotificationItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift index f0d153bac9..10cbff7388 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessagePhoneNumberRequestContentNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 16.0)! diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageReplyInfoNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageReplyInfoNode.swift index 9a03c8d695..07de96fd81 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageReplyInfoNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageReplyInfoNode.swift @@ -5,6 +5,7 @@ import Postbox import Display import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let titleFont = Font.medium(14.0) private let textFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageSelectionInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageSelectionInputPanelNode.swift index 6594ee1706..53df54d6e1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageSelectionInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageSelectionInputPanelNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class ChatMessageSelectionInputPanelNode: ChatInputPanelNode { private let deleteButton: HighlightableButtonNode diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageSelectionNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageSelectionNode.swift index ad7c52e985..5dccab0809 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageSelectionNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageSelectionNode.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import AsyncDisplayKit +import TelegramPresentationData final class ChatMessageSelectionNode: ASDisplayNode { private let toggle: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift index 04d83a8bd0..f1ff78b432 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private let nameFont = Font.medium(14.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageUnsupportedBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageUnsupportedBubbleContentNode.swift index 66ae1b616b..dde3ce0916 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageUnsupportedBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageUnsupportedBubbleContentNode.swift @@ -5,6 +5,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData final class ChatMessageUnsupportedBubbleContentNode: ChatMessageBubbleContentNode { private var buttonNode: ChatMessageAttachedContentButtonNode diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift index 53c7a5f99c..399b9d423f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageWebpageBubbleContentNode.swift @@ -5,6 +5,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramUIPreferences enum WebsiteType { case generic diff --git a/submodules/TelegramUI/TelegramUI/ChatMultipleAvatarsNavigationNode.swift b/submodules/TelegramUI/TelegramUI/ChatMultipleAvatarsNavigationNode.swift index a741bea4c3..cdaff6cf5f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMultipleAvatarsNavigationNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMultipleAvatarsNavigationNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import Postbox +import TelegramPresentationData final class ChatMultipleAvatarsNavigationNode: ASDisplayNode { private let multipleAvatarsNode: MultipleAvatarsNode diff --git a/submodules/TelegramUI/TelegramUI/ChatOverlayNavigationBar.swift b/submodules/TelegramUI/TelegramUI/ChatOverlayNavigationBar.swift index 87559c04ab..a4d474379a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatOverlayNavigationBar.swift +++ b/submodules/TelegramUI/TelegramUI/ChatOverlayNavigationBar.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let titleFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift index 848e3868a7..2366c0e45a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPanelInterfaceInteraction.swift @@ -99,9 +99,10 @@ final class ChatPanelInterfaceInteraction { let updateInputLanguage: (@escaping (String?) -> String?) -> Void let unarchiveChat: () -> Void let openLinkEditing: () -> Void + let reportPeerIrrelevantGeoLocation: () -> 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]) -> Void, deleteMessages: @escaping ([Message]) -> 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) -> Void, 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) -> Void, displayVideoUnmuteTip: @escaping (CGPoint?) -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (FileMediaReference) -> Void, 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, statuses: ChatPanelInterfaceInteractionStatuses?) { + init(setupReplyMessage: @escaping (MessageId) -> Void, setupEditMessage: @escaping (MessageId?) -> Void, beginMessageSelection: @escaping ([MessageId]) -> Void, deleteSelectedMessages: @escaping () -> Void, reportSelectedMessages: @escaping () -> Void, reportMessages: @escaping ([Message]) -> Void, deleteMessages: @escaping ([Message]) -> 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) -> Void, 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) -> Void, displayVideoUnmuteTip: @escaping (CGPoint?) -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (FileMediaReference) -> Void, 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, statuses: ChatPanelInterfaceInteractionStatuses?) { self.setupReplyMessage = setupReplyMessage self.setupEditMessage = setupEditMessage self.beginMessageSelection = beginMessageSelection @@ -163,6 +164,7 @@ final class ChatPanelInterfaceInteraction { self.updateInputLanguage = updateInputLanguage self.unarchiveChat = unarchiveChat self.openLinkEditing = openLinkEditing + self.reportPeerIrrelevantGeoLocation = reportPeerIrrelevantGeoLocation self.statuses = statuses } } diff --git a/submodules/TelegramUI/TelegramUI/ChatPinnedMessageTitlePanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatPinnedMessageTitlePanelNode.swift index 8c31cbdd54..42a034adcb 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPinnedMessageTitlePanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPinnedMessageTitlePanelNode.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift b/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift index a04534316d..9852172a21 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift @@ -1,6 +1,8 @@ import Foundation import UIKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences extension PresentationFontSize { var baseDisplaySize: CGFloat { diff --git a/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift b/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift index f23e159641..b87f3d3774 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPresentationInterfaceState.swift @@ -2,6 +2,8 @@ import Foundation import UIKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences enum ChatPresentationInputQueryKind: Int32 { case emoji @@ -320,7 +322,21 @@ final class ChatRecordedMediaPreview: Equatable { struct ChatContactStatus: Equatable { var canAddContact: Bool + var canReportIrrelevantLocation: Bool var peerStatusSettings: PeerStatusSettings? + + var isEmpty: Bool { + guard var peerStatusSettings = self.peerStatusSettings else { + return false + } + if !self.canAddContact { + peerStatusSettings.remove(.canAddContact) + } + if !self.canReportIrrelevantLocation { + peerStatusSettings.remove(.canReportIrrelevantGeoLocation) + } + return peerStatusSettings.isEmpty + } } final class ChatPresentationInterfaceState: Equatable { @@ -344,6 +360,7 @@ final class ChatPresentationInterfaceState: Equatable { let peerIsBlocked: Bool let peerIsMuted: Bool let peerDiscussionId: PeerId? + let peerGeoLocation: PeerGeoLocation? let callsAvailable: Bool let callsPrivate: Bool let chatHistoryState: ChatHistoryNodeHistoryState? @@ -383,6 +400,7 @@ final class ChatPresentationInterfaceState: Equatable { self.peerIsBlocked = false self.peerIsMuted = false self.peerDiscussionId = nil + self.peerGeoLocation = nil self.callsAvailable = false self.callsPrivate = false self.chatHistoryState = nil @@ -402,7 +420,7 @@ final class ChatPresentationInterfaceState: Equatable { self.mode = mode } - init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: Message?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, callsAvailable: Bool, callsPrivate: Bool, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, accountPeerId: PeerId, mode: ChatControllerPresentationMode) { + init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: Message?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, peerGeoLocation: PeerGeoLocation?, callsAvailable: Bool, callsPrivate: Bool, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, accountPeerId: PeerId, mode: ChatControllerPresentationMode) { self.interfaceState = interfaceState self.chatLocation = chatLocation self.renderedPeer = renderedPeer @@ -423,6 +441,7 @@ final class ChatPresentationInterfaceState: Equatable { self.peerIsBlocked = peerIsBlocked self.peerIsMuted = peerIsMuted self.peerDiscussionId = peerDiscussionId + self.peerGeoLocation = peerGeoLocation self.callsAvailable = callsAvailable self.callsPrivate = callsPrivate self.chatHistoryState = chatHistoryState @@ -464,31 +483,24 @@ final class ChatPresentationInterfaceState: Equatable { if lhs.isArchived != rhs.isArchived { return false } - if lhs.inputTextPanelState != rhs.inputTextPanelState { return false } - if lhs.editMessageState != rhs.editMessageState { return false } - if lhs.recordedMediaPreview != rhs.recordedMediaPreview { return false } - if lhs.inputQueryResults != rhs.inputQueryResults { return false } - if lhs.inputMode != rhs.inputMode { return false } - if lhs.titlePanelContexts != rhs.titlePanelContexts { return false } - if let lhsMessage = lhs.keyboardButtonsMessage, let rhsMessage = rhs.keyboardButtonsMessage { if lhsMessage.id != rhsMessage.id { return false @@ -499,11 +511,9 @@ final class ChatPresentationInterfaceState: Equatable { } else if (lhs.keyboardButtonsMessage != nil) != (rhs.keyboardButtonsMessage != nil) { return false } - if lhs.pinnedMessageId != rhs.pinnedMessageId { return false } - if let lhsMessage = lhs.pinnedMessage, let rhsMessage = rhs.pinnedMessage { if lhsMessage.id != rhsMessage.id { return false @@ -514,35 +524,30 @@ final class ChatPresentationInterfaceState: Equatable { } else if (lhs.pinnedMessage != nil) != (rhs.pinnedMessage != nil) { return false } - if lhs.callsAvailable != rhs.callsAvailable { return false } - if lhs.callsPrivate != rhs.callsPrivate { return false } - if lhs.peerIsBlocked != rhs.peerIsBlocked { return false } - if lhs.peerIsMuted != rhs.peerIsMuted { return false } - if lhs.peerDiscussionId != rhs.peerDiscussionId { return false } - + if lhs.peerGeoLocation != rhs.peerGeoLocation { + return false + } if lhs.chatHistoryState != rhs.chatHistoryState { return false } - if lhs.botStartPayload != rhs.botStartPayload { return false } - if let lhsUrlPreview = lhs.urlPreview, let rhsUrlPreview = rhs.urlPreview { if lhsUrlPreview.0 != rhsUrlPreview.0 { return false @@ -553,7 +558,6 @@ final class ChatPresentationInterfaceState: Equatable { } else if (lhs.urlPreview != nil) != (rhs.urlPreview != nil) { return false } - if let lhsEditingUrlPreview = lhs.editingUrlPreview, let rhsEditingUrlPreview = rhs.editingUrlPreview { if lhsEditingUrlPreview.0 != rhsEditingUrlPreview.0 { return false @@ -564,72 +568,62 @@ final class ChatPresentationInterfaceState: Equatable { } else if (lhs.editingUrlPreview != nil) != (rhs.editingUrlPreview != nil) { return false } - if lhs.search != rhs.search { return false } - if lhs.searchQuerySuggestionResult != rhs.searchQuerySuggestionResult { return false } - if lhs.chatWallpaper != rhs.chatWallpaper { return false } - if lhs.theme !== rhs.theme { return false } - if lhs.strings !== rhs.strings { return false } - if lhs.dateTimeFormat != rhs.dateTimeFormat { return false } - if lhs.fontSize != rhs.fontSize { return false } - if lhs.accountPeerId != rhs.accountPeerId { return false } - if lhs.mode != rhs.mode { return false } - return true } func updatedInterfaceState(_ f: (ChatInterfaceState) -> ChatInterfaceState) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: f(self.interfaceState), chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: f(self.interfaceState), chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedPeer(_ f: (RenderedPeer?) -> RenderedPeer?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: f(self.renderedPeer), isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: f(self.renderedPeer), isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedIsNotAccessible(_ isNotAccessible: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedExplicitelyCanPinMessages(_ explicitelyCanPinMessages: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedContactStatus(_ contactStatus: ChatContactStatus?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedHasBots(_ hasBots: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedIsArchived(_ isArchived: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedInputQueryResult(queryKind: ChatPresentationInputQueryKind, _ f: (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?) -> ChatPresentationInterfaceState { @@ -640,103 +634,107 @@ final class ChatPresentationInterfaceState: Equatable { } else { inputQueryResults.removeValue(forKey: queryKind) } - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedInputTextPanelState(_ f: (ChatTextInputPanelState) -> ChatTextInputPanelState) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: f(self.inputTextPanelState), editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: f(self.inputTextPanelState), editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedEditMessageState(_ editMessageState: ChatEditInterfaceMessageState?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedRecordedMediaPreview(_ recordedMediaPreview: ChatRecordedMediaPreview?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedInputMode(_ f: (ChatInputMode) -> ChatInputMode) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: f(self.inputMode), titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: f(self.inputMode), titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedTitlePanelContext(_ f: ([ChatTitlePanelContext]) -> [ChatTitlePanelContext]) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: f(self.titlePanelContexts), keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: f(self.titlePanelContexts), keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedKeyboardButtonsMessage(_ message: Message?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: message, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: message, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedPinnedMessage(_ pinnedMessage: Message?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedPeerIsBlocked(_ peerIsBlocked: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedPeerIsMuted(_ peerIsMuted: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedPeerDiscussionId(_ peerDiscussionId: PeerId?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + } + + func updatedPeerGeoLocation(_ peerGeoLocation: PeerGeoLocation?) -> ChatPresentationInterfaceState { + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedCallsAvailable(_ callsAvailable: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedCallsPrivate(_ callsPrivate: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedBotStartPayload(_ botStartPayload: String?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedChatHistoryState(_ chatHistoryState: ChatHistoryNodeHistoryState?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedUrlPreview(_ urlPreview: (String, TelegramMediaWebpage)?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedEditingUrlPreview(_ editingUrlPreview: (String, TelegramMediaWebpage)?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedSearch(_ search: ChatSearchData?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedSearchQuerySuggestionResult(_ f: (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: f(self.searchQuerySuggestionResult), chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: f(self.searchQuerySuggestionResult), chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedMode(_ mode: ChatControllerPresentationMode) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: mode) } func updatedTheme(_ theme: PresentationTheme) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedStrings(_ strings: PresentationStrings) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedDateTimeFormat(_ dateTimeFormat: PresentationDateTimeFormat) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } func updatedChatWallpaper(_ chatWallpaper: TelegramWallpaper) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: self.mode) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift index fe849e5a27..809879414c 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift @@ -4,6 +4,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData final class ChatRecentActionsController: TelegramController { private var controllerNode: ChatRecentActionsControllerNode { @@ -100,6 +101,7 @@ final class ChatRecentActionsController: TelegramController { }, updateInputLanguage: { _ in }, unarchiveChat: { }, openLinkEditing: { + }, reportPeerIrrelevantGeoLocation: { }, statuses: nil) self.navigationItem.titleView = self.titleView diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index d04f62acc2..71a6fcb284 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -5,7 +5,8 @@ import TelegramCore import Postbox import SwiftSignalKit import Display - +import TelegramPresentationData +import TelegramUIPreferences import SafariServices private final class ChatRecentActionsListOpaqueState { @@ -412,6 +413,14 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self.eventLogContext.loadMoreEntries() let historyViewUpdate = self.eventLogContext.get() + |> map { (entries, hasEarlier, type, hasEntries) in + return (entries.filter { entry in + if case let .participantToggleAdmin(prev, new) = entry.event.action, case .creator = prev.participant, case .member = new.participant { + return false + } + return true + }, hasEarlier, type, hasEntries) + } let previousView = Atomic<[ChatRecentActionsEntry]?>(value: nil) @@ -419,14 +428,6 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { |> mapToQueue { update, chatPresentationData -> Signal in let processedView = chatRecentActionsEntries(entries: update.0, presentationData: chatPresentationData) let previous = previousView.swap(processedView) - - var prepareOnMainQueue = false - - if let previous = previous, previous == processedView { - - } else { - - } return .single(chatRecentActionsHistoryPreparedTransition(from: previous ?? [], to: processedView, type: update.2, canLoadEarlier: update.1, displayingResults: update.3, context: context, peer: peer, controllerInteraction: controllerInteraction)) } @@ -452,7 +453,6 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { } } - //if controllerInteraction.hiddenMedia != messageIdAndMedia { controllerInteraction.hiddenMedia = messageIdAndMedia strongSelf.listNode.forEachItemNode { itemNode in @@ -460,15 +460,12 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { itemNode.updateHiddenMedia() } } - //} } })) self.presentationDataDisposable = (context.sharedContext.presentationData |> deliverOnMainQueue).start(next: { [weak self] presentationData in if let strongSelf = self { - let previousTheme = strongSelf.presentationData.theme - strongSelf.presentationData = presentationData strongSelf.chatPresentationDataPromise.set(.single(ChatPresentationData(theme: ChatPresentationThemeData(theme: presentationData.theme, wallpaper: presentationData.chatWallpaper), fontSize: presentationData.fontSize, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, disableAnimations: presentationData.disableAnimations, largeEmoji: presentationData.largeEmoji))) @@ -775,7 +772,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { strongSelf.openPeer(peerId: peerId, peer: nil) } case .inaccessiblePeer: - strongSelf.controllerInteraction.presentController(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Conversation_ErrorInaccessibleMessage, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), nil) + 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) @@ -807,7 +804,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, dismissInput: { self?.view.endEditing(true) }) - case let .wallpaper(slug): + case .wallpaper: break } } diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerState.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerState.swift index 8e575ecbe3..2aaff1ac9f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerState.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerState.swift @@ -1,6 +1,8 @@ import Foundation import UIKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences final class ChatRecentActionsControllerState: Equatable { let chatWallpaper: TelegramWallpaper diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsEmptyNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsEmptyNode.swift index d6beb11720..9d6921f857 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsEmptyNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsEmptyNode.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import TelegramCore +import TelegramPresentationData private let titleFont = Font.medium(16.0) private let textFont = Font.regular(15.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift index 1ef44476dc..983072c7b0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ChatRecentActionsFilterControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift index 4c84c08ab7..f55490ae2a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsHistoryTransition.swift @@ -631,54 +631,66 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { var text: String = "" var entities: [MessageTextEntity] = [] - appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessagePromotedName(new.peer.displayTitle) : self.presentationData.strings.Channel_AdminLog_MessagePromotedNameUsername(new.peer.displayTitle, "@" + new.peer.addressName!), generateEntities: { index in - var result: [MessageTextEntityType] = [] - if index == 0 { - result.append(.TextMention(peerId: new.peer.id)) - } else if index == 1 { - result.append(.Mention) - } - return result - }, to: &text, entities: &entities) - text += "\n" - - if case let .member(_, _, prevAdminRights, _) = prev.participant { - if case let .member(_, _, newAdminRights, _) = new.participant { - let prevFlags = prevAdminRights?.rights.flags ?? [] - let newFlags = newAdminRights?.rights.flags ?? [] - - let order: [(TelegramChatAdminRightsFlags, String)] - - if let peer = peer as? TelegramChannel, case .broadcast = peer.info { - order = [ - (.canChangeInfo, self.presentationData.strings.Channel_AdminLog_CanChangeInfo), - (.canPostMessages, self.presentationData.strings.Channel_AdminLog_CanSendMessages), - (.canDeleteMessages, self.presentationData.strings.Channel_AdminLog_CanDeleteMessages), - (.canEditMessages, self.presentationData.strings.Channel_AdminLog_CanEditMessages), - (.canInviteUsers, self.presentationData.strings.Channel_AdminLog_CanInviteUsers), - (.canPinMessages, self.presentationData.strings.Channel_AdminLog_CanPinMessages), - (.canAddAdmins, self.presentationData.strings.Channel_AdminLog_CanAddAdmins) - ] - } else { - order = [ - (.canChangeInfo, self.presentationData.strings.Channel_AdminLog_CanChangeInfo), - (.canDeleteMessages, self.presentationData.strings.Channel_AdminLog_CanDeleteMessages), - (.canBanUsers, self.presentationData.strings.Channel_AdminLog_CanBanUsers), - (.canInviteUsers, self.presentationData.strings.Channel_AdminLog_CanInviteUsers), - (.canPinMessages, self.presentationData.strings.Channel_AdminLog_CanPinMessages), - (.canAddAdmins, self.presentationData.strings.Channel_AdminLog_CanAddAdmins) - ] + if case .member = prev.participant, case .creator = new.participant { + appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessageTransferedName(new.peer.displayTitle) : self.presentationData.strings.Channel_AdminLog_MessageTransferedNameUsername(new.peer.displayTitle, "@" + new.peer.addressName!), generateEntities: { index in + var result: [MessageTextEntityType] = [] + if index == 0 { + result.append(.TextMention(peerId: new.peer.id)) + } else if index == 1 { + result.append(.Mention) } - - for (flag, string) in order { - if prevFlags.contains(flag) != newFlags.contains(flag) { - text += "\n" - if !prevFlags.contains(flag) { - text += "+" - } else { - text += "-" + return result + }, to: &text, entities: &entities) + } else { + appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessagePromotedName(new.peer.displayTitle) : self.presentationData.strings.Channel_AdminLog_MessagePromotedNameUsername(new.peer.displayTitle, "@" + new.peer.addressName!), generateEntities: { index in + var result: [MessageTextEntityType] = [] + if index == 0 { + result.append(.TextMention(peerId: new.peer.id)) + } else if index == 1 { + result.append(.Mention) + } + return result + }, to: &text, entities: &entities) + text += "\n" + + if case let .member(_, _, prevAdminRights, _) = prev.participant { + if case let .member(_, _, newAdminRights, _) = new.participant { + let prevFlags = prevAdminRights?.rights.flags ?? [] + let newFlags = newAdminRights?.rights.flags ?? [] + + let order: [(TelegramChatAdminRightsFlags, String)] + + if let peer = peer as? TelegramChannel, case .broadcast = peer.info { + order = [ + (.canChangeInfo, self.presentationData.strings.Channel_AdminLog_CanChangeInfo), + (.canPostMessages, self.presentationData.strings.Channel_AdminLog_CanSendMessages), + (.canDeleteMessages, self.presentationData.strings.Channel_AdminLog_CanDeleteMessages), + (.canEditMessages, self.presentationData.strings.Channel_AdminLog_CanEditMessages), + (.canInviteUsers, self.presentationData.strings.Channel_AdminLog_CanInviteUsers), + (.canPinMessages, self.presentationData.strings.Channel_AdminLog_CanPinMessages), + (.canAddAdmins, self.presentationData.strings.Channel_AdminLog_CanAddAdmins) + ] + } else { + order = [ + (.canChangeInfo, self.presentationData.strings.Channel_AdminLog_CanChangeInfo), + (.canDeleteMessages, self.presentationData.strings.Channel_AdminLog_CanDeleteMessages), + (.canBanUsers, self.presentationData.strings.Channel_AdminLog_CanBanUsers), + (.canInviteUsers, self.presentationData.strings.Channel_AdminLog_CanInviteUsers), + (.canPinMessages, self.presentationData.strings.Channel_AdminLog_CanPinMessages), + (.canAddAdmins, self.presentationData.strings.Channel_AdminLog_CanAddAdmins) + ] + } + + for (flag, string) in order { + if prevFlags.contains(flag) != newFlags.contains(flag) { + text += "\n" + if !prevFlags.contains(flag) { + text += "+" + } else { + text += "-" + } + appendAttributedText(text: string, withEntities: [.Italic], to: &text, entities: &entities) } - appendAttributedText(text: string, withEntities: [.Italic], to: &text, entities: &entities) } } } @@ -915,36 +927,34 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { let message = Message(stableId: self.entry.stableId, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: Int32(bitPattern: self.entry.stableId)), globallyUniqueId: self.entry.event.id, groupingKey: nil, groupInfo: nil, timestamp: self.entry.event.date, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: author, text: "", attributes: [], media: [TelegramMediaAction(action: action)], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) return ChatMessageItem(presentationData: self.presentationData, context: context, chatLocation: .peer(peer.id), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .channel, automaticDownloadNetworkType: .cellular, isRecentActions: true), controllerInteraction: controllerInteraction, content: .message(message: message, read: true, selection: .none, attributes: ChatMessageEntryAttributes(isAdmin: false, isContact: false))) - case let .togglePreHistoryHidden(value): - var peers = SimpleDictionary() - var author: Peer? - if let peer = self.entry.peers[self.entry.event.peerId] { - author = peer - peers[peer.id] = peer - } - - var text: String = "" - var entities: [MessageTextEntity] = [] - - if !value { - appendAttributedText(text: self.presentationData.strings.Channel_AdminLog_MessageGroupPreHistoryVisible(author?.displayTitle ?? ""), generateEntities: { index in - if index == 0, let author = author { - return [.TextMention(peerId: author.id)] - } - return [] - }, to: &text, entities: &entities) - } else { - appendAttributedText(text: self.presentationData.strings.Channel_AdminLog_MessageGroupPreHistoryHidden(author?.displayTitle ?? ""), generateEntities: { index in - if index == 0, let author = author { - return [.TextMention(peerId: author.id)] - } - return [] - }, to: &text, entities: &entities) - } - let action = TelegramMediaActionType.customText(text: text, entities: entities) - - let message = Message(stableId: self.entry.stableId, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: Int32(bitPattern: self.entry.stableId)), globallyUniqueId: self.entry.event.id, groupingKey: nil, groupInfo: nil, timestamp: self.entry.event.date, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: author, text: "", attributes: [], media: [TelegramMediaAction(action: action)], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) - return ChatMessageItem(presentationData: self.presentationData, context: context, chatLocation: .peer(peer.id), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .channel, automaticDownloadNetworkType: .cellular, isRecentActions: true), controllerInteraction: controllerInteraction, content: .message(message: message, read: true, selection: .none, attributes: ChatMessageEntryAttributes(isAdmin: false, isContact: false))) + case let .changeGeoLocation(_, updated): + var peers = SimpleDictionary() + var author: Peer? + if let peer = self.entry.peers[self.entry.event.peerId] { + author = peer + peers[peer.id] = peer + } + var text: String = "" + var entities: [MessageTextEntity] = [] + + if let updated = updated { + appendAttributedText(text: self.presentationData.strings.Channel_AdminLog_MessageChangedGroupGeoLocation(updated.address.replacingOccurrences(of: "\n", with: ", ")), generateEntities: { index in + if index == 0, let author = author { + return [.TextMention(peerId: author.id)] + } + return [] + }, to: &text, entities: &entities) + + let mediaMap = TelegramMediaMap(latitude: updated.latitude, longitude: updated.longitude, geoPlace: nil, venue: nil, liveBroadcastingTimeout: nil) + + let message = Message(stableId: self.entry.stableId, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: Int32(bitPattern: self.entry.stableId)), globallyUniqueId: self.entry.event.id, groupingKey: nil, groupInfo: nil, timestamp: self.entry.event.date, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: author, text: text, attributes: [], media: [mediaMap], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + return ChatMessageItem(presentationData: self.presentationData, context: context, chatLocation: .peer(peer.id), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .channel, automaticDownloadNetworkType: .cellular, isRecentActions: true), controllerInteraction: controllerInteraction, content: .message(message: message, read: true, selection: .none, attributes: ChatMessageEntryAttributes(isAdmin: false, isContact: false))) + } else { + let action = TelegramMediaActionType.customText(text: text, entities: entities) + + let message = Message(stableId: self.entry.stableId, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: Int32(bitPattern: self.entry.stableId)), globallyUniqueId: self.entry.event.id, groupingKey: nil, groupInfo: nil, timestamp: self.entry.event.date, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: author, text: "", attributes: [], media: [TelegramMediaAction(action: action)], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) + return ChatMessageItem(presentationData: self.presentationData, context: context, chatLocation: .peer(peer.id), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .channel, automaticDownloadNetworkType: .cellular, isRecentActions: true), controllerInteraction: controllerInteraction, content: .message(message: message, read: true, selection: .none, attributes: ChatMessageEntryAttributes(isAdmin: false, isContact: false))) + } } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsSearchNavigationContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsSearchNavigationContentNode.swift index ed9318f0ba..aafe16fc0e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsSearchNavigationContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsSearchNavigationContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let searchBarFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift index f498c60bbc..17f1008f73 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecordingPreviewInputPanelNode.swift @@ -5,6 +5,8 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData +import UniversalMediaPlayer private func generatePauseIcon(_ theme: PresentationTheme) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/MinimizedPause"), color: theme.chat.inputPanel.actionControlForegroundColor) diff --git a/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift index 6bd16f4bf6..a54f4e9ff5 100644 --- a/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatReportPeerTitlePanelNode.swift @@ -4,11 +4,14 @@ import Display import AsyncDisplayKit import Postbox import TelegramCore +import TelegramPresentationData private enum ChatReportPeerTitleButton: Equatable { case block case addContact(String?) case shareMyPhoneNumber + case reportSpam + case reportIrrelevantGeoLocation func title(strings: PresentationStrings) -> String { switch self { @@ -22,6 +25,10 @@ private enum ChatReportPeerTitleButton: Equatable { } case .shareMyPhoneNumber: return strings.Conversation_ShareMyPhoneNumber + case .reportSpam: + return strings.Conversation_ReportSpamAndLeave + case .reportIrrelevantGeoLocation: + return strings.Conversation_ReportGroupLocation } } } @@ -46,6 +53,12 @@ private func peerButtons(_ state: ChatPresentationInterfaceState) -> [ChatReport buttons.append(.shareMyPhoneNumber) } } + } else if let _ = state.renderedPeer?.chatMainPeer { + if let contactStatus = state.contactStatus, contactStatus.canReportIrrelevantLocation, let peerStatusSettings = contactStatus.peerStatusSettings, peerStatusSettings.contains(.canReportIrrelevantGeoLocation) { + buttons.append(.reportIrrelevantGeoLocation) + } else { + buttons.append(.reportSpam) + } } return buttons } @@ -118,11 +131,12 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode { let view = UIButton() view.setTitle(button.title(strings: interfaceState.strings), for: []) view.titleLabel?.font = Font.regular(16.0) - if case .block = button { + switch button { + case .block, .reportSpam: view.setTitleColor(interfaceState.theme.chat.inputPanel.panelControlDestructiveColor, for: []) view.setTitleColor(interfaceState.theme.chat.inputPanel.panelControlDestructiveColor.withAlphaComponent(0.7), for: [.highlighted]) - } else { - view.setTitleColor(interfaceState.theme.rootController.navigationBar.accentTextColor, for: []) + default: + view.setTitleColor(interfaceState.theme.rootController.navigationBar.accentTextColor, for: []) view.setTitleColor(interfaceState.theme.rootController.navigationBar.accentTextColor.withAlphaComponent(0.7), for: [.highlighted]) } view.addTarget(self, action: #selector(self.buttonPressed(_:)), for: [.touchUpInside]) @@ -141,7 +155,8 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode { nextButtonOrigin += buttonWidth } } else { - let areaWidth = width - maxInset * 2.0 + let additionalRightInset: CGFloat = 36.0 + let areaWidth = width - maxInset * 2.0 - additionalRightInset let maxButtonWidth = floor(areaWidth / CGFloat(self.buttons.count)) let buttonSizes = self.buttons.map { button -> CGFloat in return button.1.sizeThatFits(CGSize(width: maxButtonWidth, height: 100.0)).width @@ -171,10 +186,12 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode { switch button { case .shareMyPhoneNumber: self.interfaceInteraction?.shareAccountContact() - case .block: + case .block, .reportSpam: self.interfaceInteraction?.reportPeer() case .addContact: self.interfaceInteraction?.presentPeerContact() + case .reportIrrelevantGeoLocation: + self.interfaceInteraction?.reportPeerIrrelevantGeoLocation() } break } diff --git a/submodules/TelegramUI/TelegramUI/ChatRequestInProgressTitlePanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatRequestInProgressTitlePanelNode.swift index cd7d5cde90..040658ab6a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRequestInProgressTitlePanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRequestInProgressTitlePanelNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData final class ChatRequestInProgressTitlePanelNode: ChatTitleAccessoryPanelNode { private let separatorNode: ASDisplayNode diff --git a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift index fcdbc4b665..b336426a9f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private let labelFont = Font.regular(15.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatSearchNavigationContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatSearchNavigationContentNode.swift index 0ff00d2673..0990a86638 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSearchNavigationContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSearchNavigationContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let searchBarFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatSecretAutoremoveTimerActionSheet.swift b/submodules/TelegramUI/TelegramUI/ChatSecretAutoremoveTimerActionSheet.swift index 4f48451abf..d02e822920 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSecretAutoremoveTimerActionSheet.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSecretAutoremoveTimerActionSheet.swift @@ -6,6 +6,7 @@ import UIKit import TelegramCore import SwiftSignalKit import Photos +import TelegramPresentationData final class ChatSecretAutoremoveTimerActionSheetController: ActionSheetController { private var presentationDisposable: Disposable? diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift index 73f41fc131..1f34ac5241 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputActionButtonsNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class ChatTextInputActionButtonsNode: ASDisplayNode { let micButton: ChatTextInputMediaRecordingButton diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift index d7191e421c..58a4e337c8 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import Postbox +import TelegramPresentationData private let alphanumericCharacters = CharacterSet.alphanumerics @@ -10,6 +11,7 @@ struct ChatTextInputAttributes { static let bold = NSAttributedStringKey(rawValue: "Attribute__Bold") static let italic = NSAttributedStringKey(rawValue: "Attribute__Italic") static let monospace = NSAttributedStringKey(rawValue: "Attribute__Monospace") + static let strikethrough = NSAttributedStringKey(rawValue: "Attribute__Strikethrough") static let textMention = NSAttributedStringKey(rawValue: "Attribute__TextMention") static let textUrl = NSAttributedStringKey(rawValue: "Attribute__TextUrl") } @@ -22,7 +24,7 @@ func stateAttributedStringForText(_ text: NSAttributedString) -> NSAttributedStr for (key, value) in attributes { if key == ChatTextInputAttributes.textMention || key == ChatTextInputAttributes.textUrl { result.addAttribute(key, value: value, range: range) - } else if key == ChatTextInputAttributes.bold || key == ChatTextInputAttributes.italic || key == ChatTextInputAttributes.monospace { + } else if key == ChatTextInputAttributes.bold || key == ChatTextInputAttributes.italic || key == ChatTextInputAttributes.monospace || key == ChatTextInputAttributes.strikethrough { result.addAttribute(key, value: value, range: range) } } @@ -36,7 +38,6 @@ private struct FontAttributes: OptionSet { static let bold = FontAttributes(rawValue: 1 << 0) static let italic = FontAttributes(rawValue: 1 << 1) static let monospace = FontAttributes(rawValue: 1 << 2) - static let strikethrough = FontAttributes(rawValue: 1 << 3) } func textAttributedStringForStateText(_ stateText: NSAttributedString, fontSize: CGFloat, textColor: UIColor, accentTextColor: UIColor) -> NSAttributedString { @@ -65,13 +66,20 @@ func textAttributedStringForStateText(_ stateText: NSAttributedString, fontSize: } else if key == ChatTextInputAttributes.monospace { result.addAttribute(key, value: value, range: range) fontAttributes.insert(.monospace) + } else if key == ChatTextInputAttributes.strikethrough { + result.addAttribute(key, value: value, range: range) + result.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue as NSNumber, range: range) } } if !fontAttributes.isEmpty { var font: UIFont? if fontAttributes == [.bold, .italic, .monospace] { - + font = Font.semiboldItalicMonospace(fontSize) + } else if fontAttributes == [.bold, .monospace] { + font = Font.semiboldMonospace(fontSize) + } else if fontAttributes == [.italic, .monospace] { + font = Font.italicMonospace(fontSize) } else if fontAttributes == [.bold, .italic] { font = Font.semiboldItalic(fontSize) } else if fontAttributes == [.bold] { @@ -383,7 +391,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed } func refreshChatTextInputAttributes(_ textNode: ASEditableTextNode, theme: PresentationTheme, baseFontSize: CGFloat) { - guard var initialAttributedText = textNode.attributedText, initialAttributedText.length != 0 else { + guard let initialAttributedText = textNode.attributedText, initialAttributedText.length != 0 else { return } @@ -405,6 +413,7 @@ func refreshChatTextInputAttributes(_ textNode: ASEditableTextNode, theme: Prese textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.font, range: fullRange) textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.foregroundColor, range: fullRange) textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.underlineStyle, range: fullRange) + textNode.textView.textStorage.removeAttribute(NSAttributedStringKey.strikethroughStyle, range: fullRange) textNode.textView.textStorage.removeAttribute(ChatTextInputAttributes.textMention, range: fullRange) textNode.textView.textStorage.removeAttribute(ChatTextInputAttributes.textUrl, range: fullRange) @@ -431,6 +440,9 @@ func refreshChatTextInputAttributes(_ textNode: ASEditableTextNode, theme: Prese } else if key == ChatTextInputAttributes.monospace { textNode.textView.textStorage.addAttribute(key, value: value, range: range) fontAttributes.insert(.monospace) + } else if key == ChatTextInputAttributes.strikethrough { + textNode.textView.textStorage.addAttribute(key, value: value, range: range) + textNode.textView.textStorage.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue as NSNumber, range: range) } } @@ -491,8 +503,8 @@ func chatTextInputAddFormattingAttribute(_ state: ChatTextInputState, attribute: for (key, _) in attributes { if key == attribute && range == nsRange { addAttribute = false + attributesToRemove.append(key) } - attributesToRemove.append(key) } } @@ -633,7 +645,7 @@ func breakChatInputText(_ text: NSAttributedString) -> [NSAttributedString] { } } -private let markdownRegexFormat = "(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)" +private let markdownRegexFormat = "(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__|~~)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)" private let markdownRegex = try? NSRegularExpression(pattern: markdownRegexFormat, options: [.caseInsensitive, .anchorsMatchLines]) func convertMarkdownToAttributes(_ text: NSAttributedString) -> NSAttributedString { @@ -677,6 +689,9 @@ func convertMarkdownToAttributes(_ text: NSAttributedString) -> NSAttributedStri case "__": result.append(NSAttributedString(string: substring, attributes: [ChatTextInputAttributes.italic: true as NSNumber])) offsetRanges.append((NSMakeRange(matchIndex + match.range(at: 6).length, text.count), match.range(at: 6).length * 2)) + case "~~": + result.append(NSAttributedString(string: substring, attributes: [ChatTextInputAttributes.strikethrough: true as NSNumber])) + offsetRanges.append((NSMakeRange(matchIndex + match.range(at: 6).length, text.count), match.range(at: 6).length * 2)) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingCancelIndicator.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingCancelIndicator.swift index 005be4f111..c6c23367d0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingCancelIndicator.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingCancelIndicator.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let cancelFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingTimeNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingTimeNode.swift index ddb22572c3..4af1545a4f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingTimeNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputAudioRecordingTimeNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import TelegramPresentationData private final class ChatTextInputAudioRecordingTimeNodeParameters: NSObject { let timestamp: Double diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputMediaRecordingButton.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputMediaRecordingButton.swift index fc099ca1c6..8feb54bcc1 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputMediaRecordingButton.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputMediaRecordingButton.swift @@ -4,7 +4,7 @@ import Display import AsyncDisplayKit import TelegramCore import SwiftSignalKit - +import TelegramPresentationData import LegacyComponents private let offsetThreshold: CGFloat = 10.0 diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputMenu.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputMenu.swift index 67a97349f5..bc7eec059a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputMenu.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputMenu.swift @@ -1,5 +1,6 @@ import Foundation import UIKit +import TelegramPresentationData enum ChatTextInputMenuState { case inactive diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift index ac36f3ea91..ae04d17996 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import MobileCoreServices +import TelegramPresentationData private let searchLayoutProgressImage = generateImage(CGSize(width: 22.0, height: 22.0), contextGenerator: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) @@ -201,7 +202,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { let textInputContainer: ASDisplayNode var textInputNode: EditableTextNode? - let textInputBackgroundView: UIImageView + let textInputBackgroundNode: ASImageNode let actionButtons: ChatTextInputActionButtonsNode var mediaRecordingAccessibilityArea: AccessibilityAreaNode? @@ -321,7 +322,9 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { self.textInputContainer.clipsToBounds = true self.textInputContainer.backgroundColor = theme.chat.inputPanel.inputBackgroundColor - self.textInputBackgroundView = UIImageView() + self.textInputBackgroundNode = ASImageNode() + self.textInputBackgroundNode.displaysAsynchronously = false + self.textInputBackgroundNode.displayWithoutProcessing = true self.textPlaceholderNode = ImmediateTextNode() self.textPlaceholderNode.maximumNumberOfLines = 1 self.textPlaceholderNode.isUserInteractionEnabled = false @@ -406,21 +409,21 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { self.searchLayoutClearButton.addSubview(self.searchLayoutProgressView) self.addSubnode(self.textInputContainer) - self.view.addSubview(self.textInputBackgroundView) + self.addSubnode(self.textInputBackgroundNode) self.addSubnode(self.textPlaceholderNode) self.view.addSubview(self.searchLayoutClearButton) - self.textInputBackgroundView.clipsToBounds = true + self.textInputBackgroundNode.clipsToBounds = true let recognizer = TouchDownGestureRecognizer(target: self, action: #selector(self.textInputBackgroundViewTap(_:))) recognizer.touchDown = { [weak self] in if let strongSelf = self { strongSelf.ensureFocused() } } - self.textInputBackgroundView.addGestureRecognizer(recognizer) - self.textInputBackgroundView.isUserInteractionEnabled = true + self.textInputBackgroundNode.isUserInteractionEnabled = true + self.textInputBackgroundNode.view.addGestureRecognizer(recognizer) } required init?(coder aDecoder: NSCoder) { @@ -489,8 +492,8 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { textInputNode.frame = CGRect(origin: CGPoint(x: self.textInputViewInternalInsets.left, y: self.textInputViewInternalInsets.top), size: CGSize(width: textInputFrame.size.width - (self.textInputViewInternalInsets.left + self.textInputViewInternalInsets.right + accessoryButtonsWidth), height: textInputFrame.size.height - self.textInputViewInternalInsets.top - self.textInputViewInternalInsets.bottom)) } - self.textInputBackgroundView.isUserInteractionEnabled = false - self.textInputBackgroundView.removeGestureRecognizer(self.textInputBackgroundView.gestureRecognizers![0]) + self.textInputBackgroundNode.isUserInteractionEnabled = false + self.textInputBackgroundNode.view.removeGestureRecognizer(self.textInputBackgroundNode.view.gestureRecognizers![0]) let recognizer = TouchDownGestureRecognizer(target: self, action: #selector(self.textInputBackgroundViewTap(_:))) recognizer.touchDown = { [weak self] in @@ -646,7 +649,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { let textFieldMinHeight = calclulateTextFieldMinHeight(interfaceState, metrics: metrics) let minimalInputHeight: CGFloat = 2.0 + textFieldMinHeight - self.textInputBackgroundView.image = textInputBackgroundImage(backgroundColor: interfaceState.theme.chat.inputPanel.panelBackgroundColor, strokeColor: interfaceState.theme.chat.inputPanel.inputStrokeColor, diameter: minimalInputHeight) + self.textInputBackgroundNode.image = textInputBackgroundImage(backgroundColor: interfaceState.theme.chat.inputPanel.panelBackgroundColor, strokeColor: interfaceState.theme.chat.inputPanel.inputStrokeColor, diameter: minimalInputHeight) self.searchLayoutClearButton.setImage(PresentationResourcesChat.chatInputTextFieldClearImage(interfaceState.theme), for: []) @@ -798,7 +801,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { var audioRecordingItemsVerticalOffset: CGFloat = 0.0 if let mediaRecordingState = interfaceState.inputTextPanelState.mediaRecordingState { audioRecordingItemsVerticalOffset = panelHeight * 2.0 - transition.updateAlpha(layer: self.textInputBackgroundView.layer, alpha: 0.0) + transition.updateAlpha(layer: self.textInputBackgroundNode.layer, alpha: 0.0) if let textInputNode = self.textInputNode { transition.updateAlpha(node: textInputNode, alpha: 0.0) } @@ -907,7 +910,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } else { self.actionButtons.micButton.audioRecorder = nil self.actionButtons.micButton.videoRecordingStatus = nil - transition.updateAlpha(layer: self.textInputBackgroundView.layer, alpha: 1.0) + transition.updateAlpha(layer: self.textInputBackgroundNode.layer, alpha: 1.0) if let textInputNode = self.textInputNode { transition.updateAlpha(node: textInputNode, alpha: 1.0) } @@ -1055,7 +1058,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { transition.updateFrame(node: self.textPlaceholderNode, frame: CGRect(origin: CGPoint(x: leftInset + textFieldInsets.left + self.textInputViewInternalInsets.left, y: textFieldInsets.top + self.textInputViewInternalInsets.top + self.textInputViewRealInsets.top + audioRecordingItemsVerticalOffset + UIScreenPixel), size: self.textPlaceholderNode.frame.size)) - transition.updateFrame(layer: self.textInputBackgroundView.layer, frame: CGRect(x: leftInset + textFieldInsets.left, y: textFieldInsets.top + audioRecordingItemsVerticalOffset, width: baseWidth - textFieldInsets.left - textFieldInsets.right + textInputBackgroundWidthOffset, height: panelHeight - textFieldInsets.top - textFieldInsets.bottom)) + transition.updateFrame(layer: self.textInputBackgroundNode.layer, frame: CGRect(x: leftInset + textFieldInsets.left, y: textFieldInsets.top + audioRecordingItemsVerticalOffset, width: baseWidth - textFieldInsets.left - textFieldInsets.right + textInputBackgroundWidthOffset, height: panelHeight - textFieldInsets.top - textFieldInsets.bottom)) var nextButtonTopRight = CGPoint(x: width - rightInset - textFieldInsets.right - accessoryButtonInset, y: panelHeight - textFieldInsets.bottom - minimalInputHeight + audioRecordingItemsVerticalOffset) for (_, button) in self.accessoryItemButtons.reversed() { diff --git a/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift b/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift index f622c9f2c1..f05257ea61 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextLinkEditController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private final class ChatTextLinkEditInputFieldNode: ASDisplayNode, ASEditableTextNodeDelegate { private var theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ChatTitleView.swift b/submodules/TelegramUI/TelegramUI/ChatTitleView.swift index 7935220d2b..8b4522bea0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTitleView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTitleView.swift @@ -6,6 +6,8 @@ import Postbox import TelegramCore import SwiftSignalKit import LegacyComponents +import TelegramPresentationData +import TelegramUIPreferences enum ChatTitleContent { case peer(peerView: PeerView, onlineMemberCount: Int32?) @@ -178,7 +180,7 @@ final class ChatTitleView: UIView, NavigationBarTitleView { if peerView.peerId == self.account.peerId { string = NSAttributedString(string: self.strings.Conversation_SavedMessages, font: Font.medium(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor) } else { - if !peerView.peerIsContact, let user = peer as? TelegramUser, let phone = user.phone, !phone.isEmpty { + if !peerView.peerIsContact, let user = peer as? TelegramUser, !user.flags.contains(.isSupport), user.botInfo == nil, let phone = user.phone, !phone.isEmpty { string = NSAttributedString(string: formatPhoneNumber(phone), font: Font.medium(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor) } else { string = NSAttributedString(string: peer.displayTitle(strings: self.strings, displayOrder: self.nameDisplayOrder), font: Font.medium(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor) diff --git a/submodules/TelegramUI/TelegramUI/ChatUnblockInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatUnblockInputPanelNode.swift index 8854d3f847..4561f5b873 100644 --- a/submodules/TelegramUI/TelegramUI/ChatUnblockInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatUnblockInputPanelNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData final class ChatUnblockInputPanelNode: ChatInputPanelNode { private let button: HighlightableButtonNode diff --git a/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift b/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift index 49fcfa2ad7..1da9b686b4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift @@ -5,6 +5,8 @@ import SwiftSignalKit import TelegramCore import Postbox import Display +import UniversalMediaPlayer +import TelegramPresentationData private let textFont = Font.regular(13.0) diff --git a/Telegram-iOS/ClearNotificationsManager.swift b/submodules/TelegramUI/TelegramUI/ClearNotificationsManager.swift similarity index 86% rename from Telegram-iOS/ClearNotificationsManager.swift rename to submodules/TelegramUI/TelegramUI/ClearNotificationsManager.swift index 51434242f8..bcc43996e6 100644 --- a/Telegram-iOS/ClearNotificationsManager.swift +++ b/submodules/TelegramUI/TelegramUI/ClearNotificationsManager.swift @@ -4,11 +4,11 @@ import Postbox private let messageNotificationKeyExpr = try? NSRegularExpression(pattern: "m([-\\d]+):([-\\d]+):([-\\d]+)_?", options: []) -enum NotificationManagedNotificationRequestId: Hashable { +public enum NotificationManagedNotificationRequestId: Hashable { case messageId(MessageId) case globallyUniqueId(Int64, PeerId?) - init?(string: String) { + public init?(string: String) { if string.hasPrefix("m") { let matches = messageNotificationKeyExpr!.matches(in: string, options: [], range: NSRange(location: 0, length: string.count)) if let match = matches.first { @@ -34,15 +34,15 @@ enum NotificationManagedNotificationRequestId: Hashable { } } -final class ClearNotificationIdsCompletion { - let f: ([(String, NotificationManagedNotificationRequestId)]) -> Void +public final class ClearNotificationIdsCompletion { + public let f: ([(String, NotificationManagedNotificationRequestId)]) -> Void - init(f: @escaping ([(String, NotificationManagedNotificationRequestId)]) -> Void) { + public init(f: @escaping ([(String, NotificationManagedNotificationRequestId)]) -> Void) { self.f = f } } -final class ClearNotificationsManager { +public final class ClearNotificationsManager { private let getNotificationIds: (ClearNotificationIdsCompletion) -> Void private let getPendingNotificationIds: (ClearNotificationIdsCompletion) -> Void private let removeNotificationIds: ([String]) -> Void @@ -52,7 +52,7 @@ final class ClearNotificationsManager { private var timer: SwiftSignalKit.Timer? - init(getNotificationIds: @escaping (ClearNotificationIdsCompletion) -> Void, removeNotificationIds: @escaping ([String]) -> Void, getPendingNotificationIds: @escaping (ClearNotificationIdsCompletion) -> Void, removePendingNotificationIds: @escaping ([String]) -> Void) { + public init(getNotificationIds: @escaping (ClearNotificationIdsCompletion) -> Void, removeNotificationIds: @escaping ([String]) -> Void, getPendingNotificationIds: @escaping (ClearNotificationIdsCompletion) -> Void, removePendingNotificationIds: @escaping ([String]) -> Void) { self.getNotificationIds = getNotificationIds self.removeNotificationIds = removeNotificationIds self.getPendingNotificationIds = getPendingNotificationIds @@ -63,7 +63,7 @@ final class ClearNotificationsManager { self.timer?.invalidate() } - func clearAll() { + public func clearAll() { self.getNotificationIds(ClearNotificationIdsCompletion { [weak self] result in Queue.mainQueue().async { var removeKeys: [String] = [] @@ -91,7 +91,7 @@ final class ClearNotificationsManager { }) } - func append(_ id: MessageId) { + public func append(_ id: MessageId) { if let current = self.ids[id.peerId] { if current < id { self.ids[id.peerId] = id @@ -107,7 +107,7 @@ final class ClearNotificationsManager { timer.start() } - func commitNow() { + public func commitNow() { self.timer?.invalidate() self.timer = nil diff --git a/submodules/TelegramUI/TelegramUI/CommandChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/CommandChatInputContextPanelNode.swift index f320d0c073..0509ef89ae 100644 --- a/submodules/TelegramUI/TelegramUI/CommandChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/CommandChatInputContextPanelNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import Display +import TelegramPresentationData private struct CommandChatInputContextPanelEntryStableId: Hashable { let command: PeerCommand diff --git a/submodules/TelegramUI/TelegramUI/CommandChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/CommandChatInputPanelItem.swift index 5e88e673b0..f66a30bcb4 100644 --- a/submodules/TelegramUI/TelegramUI/CommandChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/CommandChatInputPanelItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class CommandChatInputPanelItem: ListViewItem { fileprivate let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ComposeController.swift b/submodules/TelegramUI/TelegramUI/ComposeController.swift index de12a4de9b..62f69f2e32 100644 --- a/submodules/TelegramUI/TelegramUI/ComposeController.swift +++ b/submodules/TelegramUI/TelegramUI/ComposeController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import SwiftSignalKit import TelegramCore +import TelegramPresentationData public class ComposeController: ViewController { private let context: AccountContext @@ -168,7 +169,15 @@ public class ComposeController: ViewController { self.contactsNode.openCreateNewChannel = { [weak self] in if let strongSelf = self { - (strongSelf.navigationController as? NavigationController)?.pushViewController(legacyChannelIntroController(context: strongSelf.context, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings), completion: { [weak self] in + let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } + let controller = PermissionController(context: strongSelf.context, splashScreen: true) + controller.setState(.custom(icon: PermissionControllerCustomIcon(light: UIImage(bundleImageName: "Chat/Intro/ChannelIntro"), dark: nil), title: presentationData.strings.ChannelIntro_Title, subtitle: nil, text: presentationData.strings.ChannelIntro_Text, buttonTitle: presentationData.strings.ChannelIntro_CreateChannel, footerText: nil), animated: false) + controller.proceed = { [weak self] result in + if let strongSelf = self { + (strongSelf.navigationController as? NavigationController)?.replaceTopController(createChannelController(context: strongSelf.context), animated: true) + } + } + (strongSelf.navigationController as? NavigationController)?.pushViewController(controller, completion: { [weak self] in if let strongSelf = self { strongSelf.contactsNode.contactListNode.listNode.clearHighlightAnimated(true) } diff --git a/submodules/TelegramUI/TelegramUI/ComposeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ComposeControllerNode.swift index 3ebd13dffe..8b2410f596 100644 --- a/submodules/TelegramUI/TelegramUI/ComposeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ComposeControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class ComposeControllerNode: ASDisplayNode { let contactListNode: ContactListNode diff --git a/submodules/TelegramUI/TelegramUI/ConfirmPhoneNumberController.swift b/submodules/TelegramUI/TelegramUI/ConfirmPhoneNumberController.swift index a2d0d13dec..d77a774870 100644 --- a/submodules/TelegramUI/TelegramUI/ConfirmPhoneNumberController.swift +++ b/submodules/TelegramUI/TelegramUI/ConfirmPhoneNumberController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ConfirmPhoneNumberCodeControllerArguments { let updateEntryText: (String) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ContactAddItem.swift b/submodules/TelegramUI/TelegramUI/ContactAddItem.swift index 474bf18121..6fae0c5ab6 100644 --- a/submodules/TelegramUI/TelegramUI/ContactAddItem.swift +++ b/submodules/TelegramUI/TelegramUI/ContactAddItem.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData private let titleFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/ContactInfoStrings.swift b/submodules/TelegramUI/TelegramUI/ContactInfoStrings.swift index 9ac61e4803..e9d3c7e292 100644 --- a/submodules/TelegramUI/TelegramUI/ContactInfoStrings.swift +++ b/submodules/TelegramUI/TelegramUI/ContactInfoStrings.swift @@ -1,6 +1,7 @@ import Foundation import Contacts import AddressBook +import TelegramPresentationData func localizedPhoneNumberLabel(label: String, strings: PresentationStrings) -> String { if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { diff --git a/submodules/TelegramUI/TelegramUI/ContactListActionItem.swift b/submodules/TelegramUI/TelegramUI/ContactListActionItem.swift index a4d35a1774..9b1e6a81ad 100644 --- a/submodules/TelegramUI/TelegramUI/ContactListActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/ContactListActionItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData public enum ContactListActionItemInlineIconPosition { case left @@ -59,15 +60,17 @@ class ContactListActionItem: ListViewItem { let title: String let icon: ContactListActionItemIcon let highlight: ContactListActionItemHighlight + let clearHighlightAutomatically: Bool let action: () -> Void let header: ListViewItemHeader? - init(theme: PresentationTheme, title: String, icon: ContactListActionItemIcon, highlight: ContactListActionItemHighlight = .cell, header: ListViewItemHeader?, action: @escaping () -> Void) { + init(theme: PresentationTheme, title: String, icon: ContactListActionItemIcon, highlight: ContactListActionItemHighlight = .cell, clearHighlightAutomatically: Bool = true, header: ListViewItemHeader?, action: @escaping () -> Void) { self.theme = theme self.title = title self.icon = icon self.highlight = highlight self.header = header + self.clearHighlightAutomatically = clearHighlightAutomatically self.action = action } @@ -110,6 +113,9 @@ class ContactListActionItem: ListViewItem { func selected(listView: ListView){ self.action() + if self.clearHighlightAutomatically { + listView.clearHighlightAnimated(true) + } } static func mergeType(item: ContactListActionItem, previousItem: ListViewItem?, nextItem: ListViewItem?) -> (first: Bool, last: Bool, firstWithHeader: Bool) { diff --git a/submodules/TelegramUI/TelegramUI/ContactListNameIndexHeader.swift b/submodules/TelegramUI/TelegramUI/ContactListNameIndexHeader.swift index 157280447e..e641f2788b 100644 --- a/submodules/TelegramUI/TelegramUI/ContactListNameIndexHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ContactListNameIndexHeader.swift @@ -1,6 +1,7 @@ import Foundation import Display import UIKit +import TelegramPresentationData final class ContactListNameIndexHeader: Equatable, ListViewItemHeader { let id: Int64 diff --git a/submodules/TelegramUI/TelegramUI/ContactListNode.swift b/submodules/TelegramUI/TelegramUI/ContactListNode.swift index b58280f980..d5f0235e41 100644 --- a/submodules/TelegramUI/TelegramUI/ContactListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactListNode.swift @@ -5,6 +5,9 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import DeviceAccess private let dropDownIcon = { () -> UIImage in UIGraphicsBeginImageContextWithOptions(CGSize(width: 12.0, height: 12.0), false, 0.0) @@ -225,7 +228,7 @@ private enum ContactListNodeEntry: Comparable, Identifiable { interaction.authorize() }) case let .option(_, option, header, theme, _): - return ContactListActionItem(theme: theme, title: option.title, icon: option.icon, header: header, action: option.action) + return ContactListActionItem(theme: theme, title: option.title, icon: option.icon, clearHighlightAutomatically: false, header: header, action: option.action) case let .peer(_, peer, presence, header, selection, theme, strings, dateTimeFormat, nameSortOrder, nameDisplayOrder, enabled): let status: ContactsPeerItemStatus let itemPeer: ContactsPeerItemPeer @@ -841,7 +844,7 @@ final class ContactListNode: ASDisplayNode { let contactsAuthorization = Promise() contactsAuthorization.set(.single(.allowed) - |> then(DeviceAccess.authorizationStatus(context: context, subject: .contacts))) + |> then(DeviceAccess.authorizationStatus(subject: .contacts))) let contactsWarningSuppressed = Promise<(Bool, Bool)>() contactsWarningSuppressed.set(.single((false, false)) @@ -864,7 +867,7 @@ final class ContactListNode: ASDisplayNode { var authorizeImpl: (() -> Void)? var openPrivacyPolicyImpl: (() -> Void)? - self.authorizationNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: .contacts, icon: UIImage(bundleImageName: "Settings/Permissions/Contacts"), title: self.presentationData.strings.Contacts_PermissionsTitle, text: self.presentationData.strings.Contacts_PermissionsText, buttonTitle: self.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { + self.authorizationNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: PermissionKind.contacts.rawValue, icon: .image(UIImage(bundleImageName: "Settings/Permissions/Contacts")), title: self.presentationData.strings.Contacts_PermissionsTitle, text: self.presentationData.strings.Contacts_PermissionsText, buttonTitle: self.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { authorizeImpl?() }, openPrivacyPolicy: { openPrivacyPolicyImpl?() @@ -1020,7 +1023,7 @@ final class ContactListNode: ASDisplayNode { |> map { ($0.0, $0.1) } |> delay(0.2, queue: Queue.concurrentDefaultQueue()) ) - let foundDeviceContacts: Signal<[DeviceContactStableId: DeviceContactBasicData], NoError> + let foundDeviceContacts: Signal<[DeviceContactStableId: (DeviceContactBasicData, PeerId?)], NoError> if searchDeviceContacts { foundDeviceContacts = context.sharedContext.contactDataManager?.search(query: query) ?? .single([:]) } else { @@ -1117,13 +1120,18 @@ final class ContactListNode: ASDisplayNode { } outer: for (stableId, contact) in deviceContacts { - inner: for phoneNumber in contact.phoneNumbers { + inner: for phoneNumber in contact.0.phoneNumbers { let normalizedNumber = DeviceContactNormalizedPhoneNumber(rawValue: formatPhoneNumber(phoneNumber.value)) if existingNormalizedPhoneNumbers.contains(normalizedNumber) { continue outer } } - peers.append(.deviceContact(stableId, contact)) + if let peerId = contact.1 { + if existingPeerIds.contains(peerId) { + continue outer + } + } + peers.append(.deviceContact(stableId, contact.0)) } let entries = contactListNodeEntries(accountPeer: nil, peers: peers, presences: localPeersAndStatuses.1, presentation: presentation, selectionState: selectionState, theme: themeAndStrings.0, strings: themeAndStrings.1, dateTimeFormat: themeAndStrings.2, sortOrder: themeAndStrings.3, displayOrder: themeAndStrings.4, disabledPeerIds: disabledPeerIds, authorizationStatus: .allowed, warningSuppressed: (true, true), displaySortOptions: false) @@ -1267,7 +1275,7 @@ final class ContactListNode: ASDisplayNode { let authorizationPreviousHidden = strongSelf.authorizationNode.isHidden strongSelf.authorizationNode.removeFromSupernode() - strongSelf.authorizationNode = PermissionContentNode(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, kind: .contacts, icon: UIImage(bundleImageName: "Settings/Permissions/Contacts"), title: strongSelf.presentationData.strings.Contacts_PermissionsTitle, text: strongSelf.presentationData.strings.Contacts_PermissionsText, buttonTitle: strongSelf.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { + strongSelf.authorizationNode = PermissionContentNode(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, kind: PermissionKind.contacts.rawValue, icon: .image(UIImage(bundleImageName: "Settings/Permissions/Contacts")), title: strongSelf.presentationData.strings.Contacts_PermissionsTitle, text: strongSelf.presentationData.strings.Contacts_PermissionsText, buttonTitle: strongSelf.presentationData.strings.Contacts_PermissionsAllow, buttonAction: { authorizeImpl?() }, openPrivacyPolicy: { openPrivacyPolicyImpl?() @@ -1311,12 +1319,12 @@ final class ContactListNode: ASDisplayNode { } authorizeImpl = { - let _ = (DeviceAccess.authorizationStatus(context: context, subject: .contacts) + let _ = (DeviceAccess.authorizationStatus(subject: .contacts) |> take(1) |> deliverOnMainQueue).start(next: { status in switch status { case .notDetermined: - DeviceAccess.authorizeAccess(to: .contacts, context: context) + DeviceAccess.authorizeAccess(to: .contacts) case .denied, .restricted: context.sharedContext.applicationBindings.openSettings() default: diff --git a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift index cad3e01bdd..dbbce95e0a 100644 --- a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift +++ b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import SwiftSignalKit import TelegramCore +import TelegramPresentationData enum ContactMultiselectionControllerMode { case groupCreation diff --git a/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift index ff213d46df..29a4d1f781 100644 --- a/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactMultiselectionControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private struct SearchResultEntry: Identifiable { let index: Int diff --git a/submodules/TelegramUI/TelegramUI/ContactSelectionController.swift b/submodules/TelegramUI/TelegramUI/ContactSelectionController.swift index bf803b7d8a..b3e68147c5 100644 --- a/submodules/TelegramUI/TelegramUI/ContactSelectionController.swift +++ b/submodules/TelegramUI/TelegramUI/ContactSelectionController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import SwiftSignalKit import TelegramCore +import TelegramPresentationData class ContactSelectionController: ViewController, PresentableController { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ContactSelectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/ContactSelectionControllerNode.swift index 74aca7a0c9..5729187d40 100644 --- a/submodules/TelegramUI/TelegramUI/ContactSelectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactSelectionControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class ContactSelectionControllerNode: ASDisplayNode { var displayProgress: Bool = false { diff --git a/submodules/TelegramUI/TelegramUI/ContactsController.swift b/submodules/TelegramUI/TelegramUI/ContactsController.swift index a211b96b86..3d1ef9b025 100644 --- a/submodules/TelegramUI/TelegramUI/ContactsController.swift +++ b/submodules/TelegramUI/TelegramUI/ContactsController.swift @@ -5,6 +5,9 @@ import AsyncDisplayKit import Postbox import SwiftSignalKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import DeviceAccess private func fixListNodeScrolling(_ listNode: ListView, searchNode: NavigationBarSearchContentNode) -> Bool { if searchNode.expansionProgress > 0.0 && searchNode.expansionProgress < 1.0 { @@ -129,7 +132,7 @@ public class ContactsController: ViewController { }) if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { - self.authorizationDisposable = (combineLatest(DeviceAccess.authorizationStatus(context: context, subject: .contacts), combineLatest(context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.contactsPermissionWarningKey()), context.account.postbox.preferencesView(keys: [PreferencesKeys.contactsSettings]), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings])) + self.authorizationDisposable = (combineLatest(DeviceAccess.authorizationStatus(subject: .contacts), combineLatest(context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.contactsPermissionWarningKey()), context.account.postbox.preferencesView(keys: [PreferencesKeys.contactsSettings]), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings])) |> map { noticeView, preferences, sharedData -> (Bool, ContactsSortOrder) in let settings: ContactsSettings = preferences.values[PreferencesKeys.contactsSettings] as? ContactsSettings ?? ContactsSettings.defaultSettings let synchronizeDeviceContacts: Bool = settings.synchronizeContacts @@ -268,14 +271,41 @@ public class ContactsController: ViewController { } self.contactsNode.openPeopleNearby = { [weak self] in - if let strongSelf = self { - let controller = peopleNearbyController(context: strongSelf.context) - (strongSelf.navigationController as? NavigationController)?.pushViewController(controller, completion: { [weak self] in - if let strongSelf = self { - strongSelf.contactsNode.contactListNode.listNode.clearHighlightAnimated(true) - } - }) - } + let _ = (DeviceAccess.authorizationStatus(subject: .location(.tracking)) + |> take(1) + |> deliverOnMainQueue).start(next: { [weak self] status in + guard let strongSelf = self else { + return + } + let presentPeersNearby = { + let controller = peersNearbyController(context: strongSelf.context) + (strongSelf.navigationController as? NavigationController)?.replaceAllButRootController(controller, animated: true, completion: { [weak self] in + if let strongSelf = self { + strongSelf.contactsNode.contactListNode.listNode.clearHighlightAnimated(true) + } + }) + } + + switch status { + case .allowed: + presentPeersNearby() + default: + let controller = PermissionController(context: strongSelf.context, splashScreen: false) + controller.setState(.permission(.nearbyLocation(status: PermissionRequestStatus(accessType: status))), animated: false) + controller.proceed = { result in + if result { + presentPeersNearby() + } else { + let _ = (strongSelf.navigationController as? NavigationController)?.popViewController(animated: true) + } + } + (strongSelf.navigationController as? NavigationController)?.pushViewController(controller, completion: { [weak self] in + if let strongSelf = self { + strongSelf.contactsNode.contactListNode.listNode.clearHighlightAnimated(true) + } + }) + } + }) } self.contactsNode.openInvite = { [weak self] in @@ -386,7 +416,7 @@ public class ContactsController: ViewController { } @objc func addPressed() { - let _ = (DeviceAccess.authorizationStatus(context: self.context, subject: .contacts) + let _ = (DeviceAccess.authorizationStatus(subject: .contacts) |> take(1) |> deliverOnMainQueue).start(next: { [weak self] status in guard let strongSelf = self else { @@ -395,8 +425,8 @@ public class ContactsController: ViewController { switch status { case .allowed: - let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: "", lastName: "", phoneNumbers: [DeviceContactPhoneNumberData(label: "_$!!$_", value: "")]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) - strongSelf.present(deviceContactInfoController(context: strongSelf.context, subject: .create(peer: nil, contactData: contactData, isSharing: false, completion: { peer, stableId, contactData in + let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: "", lastName: "", phoneNumbers: [DeviceContactPhoneNumberData(label: "_$!!$_", value: "+")]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) + strongSelf.present(deviceContactInfoController(context: strongSelf.context, subject: .create(peer: nil, contactData: contactData, isSharing: false, shareViaException: false, completion: { peer, stableId, contactData in guard let strongSelf = self else { return } @@ -409,7 +439,7 @@ public class ContactsController: ViewController { } })), in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) case .notDetermined: - DeviceAccess.authorizeAccess(to: .contacts, context: strongSelf.context) + DeviceAccess.authorizeAccess(to: .contacts) default: let presentationData = strongSelf.presentationData strongSelf.present(textAlertController(context: strongSelf.context, title: presentationData.strings.AccessDenied_Title, text: presentationData.strings.Contacts_AccessDeniedError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_NotNow, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.AccessDenied_Settings, action: { diff --git a/submodules/TelegramUI/TelegramUI/ContactsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ContactsControllerNode.swift index a8438f6b98..d203fd4c09 100644 --- a/submodules/TelegramUI/TelegramUI/ContactsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactsControllerNode.swift @@ -5,6 +5,9 @@ import UIKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences +import DeviceAccess final class ContactsControllerNode: ASDisplayNode { let contactListNode: ContactListNode @@ -80,7 +83,7 @@ final class ContactsControllerNode: ASDisplayNode { } inviteImpl = { [weak self] in - let _ = (DeviceAccess.authorizationStatus(context: context, subject: .contacts) + let _ = (DeviceAccess.authorizationStatus(subject: .contacts) |> take(1) |> deliverOnMainQueue).start(next: { value in guard let strongSelf = self else { @@ -91,7 +94,7 @@ final class ContactsControllerNode: ASDisplayNode { case .allowed: strongSelf.openInvite?() case .notDetermined: - DeviceAccess.authorizeAccess(to: .contacts, context: strongSelf.context) + DeviceAccess.authorizeAccess(to: .contacts) default: let presentationData = strongSelf.presentationData present(textAlertController(context: strongSelf.context, title: presentationData.strings.AccessDenied_Title, text: presentationData.strings.Contacts_AccessDeniedError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_NotNow, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.AccessDenied_Settings, action: { diff --git a/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift b/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift index 29d1fafdc9..a8b238adeb 100644 --- a/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift +++ b/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift @@ -5,6 +5,8 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private let titleFont = Font.regular(17.0) private let titleBoldFont = Font.medium(17.0) diff --git a/submodules/TelegramUI/TelegramUI/ContactsSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/ContactsSearchContainerNode.swift index fde03cd3db..198fb22bea 100644 --- a/submodules/TelegramUI/TelegramUI/ContactsSearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactsSearchContainerNode.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private enum ContactListSearchGroup { case contacts @@ -186,7 +188,7 @@ final class ContactsSearchContainerNode: SearchDisplayControllerContentNode { foundRemoteContacts = .single(([], [])) } let searchDeviceContacts = categories.contains(.deviceContacts) - let foundDeviceContacts: Signal<[DeviceContactStableId: DeviceContactBasicData]?, NoError> + let foundDeviceContacts: Signal<[DeviceContactStableId: (DeviceContactBasicData, PeerId?)]?, NoError> if searchDeviceContacts, let contactDataManager = context.sharedContext.contactDataManager { foundDeviceContacts = contactDataManager.search(query: query) |> map(Optional.init) @@ -269,13 +271,18 @@ final class ContactsSearchContainerNode: SearchDisplayControllerContentNode { } if let _ = remotePeers, let deviceContacts = deviceContacts { outer: for (stableId, contact) in deviceContacts { - inner: for phoneNumber in contact.phoneNumbers { + inner: for phoneNumber in contact.0.phoneNumbers { let normalizedNumber = DeviceContactNormalizedPhoneNumber(rawValue: formatPhoneNumber(phoneNumber.value)) if existingNormalizedPhoneNumbers.contains(normalizedNumber) { continue outer } } - entries.append(ContactListSearchEntry(index: index, theme: themeAndStrings.0, strings: themeAndStrings.1, peer: .deviceContact(stableId, contact), presence: nil, group: .deviceContacts, enabled: true)) + if let peerId = contact.1 { + if existingPeerIds.contains(peerId) { + continue outer + } + } + entries.append(ContactListSearchEntry(index: index, theme: themeAndStrings.0, strings: themeAndStrings.1, peer: .deviceContact(stableId, contact.0), presence: nil, group: .deviceContacts, enabled: true)) index += 1 } } diff --git a/submodules/TelegramUI/TelegramUI/ContactsSectionHeaderAccessoryItem.swift b/submodules/TelegramUI/TelegramUI/ContactsSectionHeaderAccessoryItem.swift index 4de1b22fbd..7726fbef2f 100644 --- a/submodules/TelegramUI/TelegramUI/ContactsSectionHeaderAccessoryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ContactsSectionHeaderAccessoryItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData enum ContactsSectionHeader: Equatable { case letter(String) diff --git a/submodules/TelegramUI/TelegramUI/ConvertToSupergroupController.swift b/submodules/TelegramUI/TelegramUI/ConvertToSupergroupController.swift index 327679fef4..4abeca8742 100644 --- a/submodules/TelegramUI/TelegramUI/ConvertToSupergroupController.swift +++ b/submodules/TelegramUI/TelegramUI/ConvertToSupergroupController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ConvertToSupergroupArguments { let convert: () -> Void diff --git a/submodules/TelegramUI/TelegramUI/CounterContollerTitleView.swift b/submodules/TelegramUI/TelegramUI/CounterContollerTitleView.swift index 7997ddb029..c87181729a 100644 --- a/submodules/TelegramUI/TelegramUI/CounterContollerTitleView.swift +++ b/submodules/TelegramUI/TelegramUI/CounterContollerTitleView.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData struct CounterContollerTitle: Equatable { let title: String diff --git a/submodules/TelegramUI/TelegramUI/CreateChannelController.swift b/submodules/TelegramUI/TelegramUI/CreateChannelController.swift index 1afe122ea0..cb9e30b61c 100644 --- a/submodules/TelegramUI/TelegramUI/CreateChannelController.swift +++ b/submodules/TelegramUI/TelegramUI/CreateChannelController.swift @@ -4,7 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore - +import TelegramPresentationData import LegacyComponents private struct CreateChannelArguments { @@ -127,7 +127,7 @@ private enum CreateChannelEntry: ItemListNodeEntry { func item(_ arguments: CreateChannelArguments) -> ListViewItem { switch self { case let .channelInfo(theme, strings, dateTimeFormat, peer, state, avatar): - return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: nil, cachedData: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false), editingNameUpdated: { editingName in + return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: nil, cachedData: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, avatarTapped: { }, updatingImage: avatar, tag: CreateChannelEntryTag.info) @@ -260,7 +260,7 @@ public func createChannelController(context: AccountContext) -> ViewController { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let text: String switch error { - case .generic: + case .generic, .tooMuchLocationBasedGroups: text = presentationData.strings.Login_UnknownError case .restricted: text = presentationData.strings.Common_ActionNotAllowedError diff --git a/submodules/TelegramUI/TelegramUI/CreateGroupController.swift b/submodules/TelegramUI/TelegramUI/CreateGroupController.swift index d282a4f2ae..b2309751b0 100644 --- a/submodules/TelegramUI/TelegramUI/CreateGroupController.swift +++ b/submodules/TelegramUI/TelegramUI/CreateGroupController.swift @@ -4,20 +4,29 @@ import Display import SwiftSignalKit import Postbox import TelegramCore - +import TelegramPresentationData +import TelegramUIPreferences import LegacyComponents +public enum CreateGroupMode { + case generic + case supergroup + case locatedGroup(latitude: Double, longitude: Double, address: String?) +} + private struct CreateGroupArguments { let account: Account let updateEditingName: (ItemListAvatarAndNameInfoItemName) -> Void let done: () -> Void let changeProfilePhoto: () -> Void + let changeLocation: () -> Void } private enum CreateGroupSection: Int32 { case info case members + case location } private enum CreateGroupEntryTag: ItemListItemTag { @@ -42,8 +51,11 @@ private enum CreateGroupEntryTag: ItemListItemTag { private enum CreateGroupEntry: ItemListNodeEntry { case groupInfo(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, Peer?, ItemListAvatarAndNameInfoItemState, ItemListAvatarAndNameInfoItemUpdatingAvatar?) case setProfilePhoto(PresentationTheme, String) - case member(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, Peer, PeerPresence?) + case locationHeader(PresentationTheme, String) + case location(PresentationTheme, PeerGeoLocation) + case changeLocation(PresentationTheme, String) + case locationInfo(PresentationTheme, String) var section: ItemListSectionId { switch self { @@ -51,6 +63,8 @@ private enum CreateGroupEntry: ItemListNodeEntry { return CreateGroupSection.info.rawValue case .member: return CreateGroupSection.members.rawValue + case .locationHeader, .location, .changeLocation, .locationInfo: + return CreateGroupSection.location.rawValue } } @@ -62,6 +76,14 @@ private enum CreateGroupEntry: ItemListNodeEntry { return 1 case let .member(index, _, _, _, _, _, _): return 2 + index + case .locationHeader: + return 10000 + case .location: + return 10001 + case .changeLocation: + return 10002 + case .locationInfo: + return 10003 } } @@ -132,6 +154,30 @@ private enum CreateGroupEntry: ItemListNodeEntry { } else { return false } + case let .locationHeader(lhsTheme, lhsTitle): + if case let .locationHeader(rhsTheme, rhsTitle) = rhs, lhsTheme === rhsTheme, lhsTitle == rhsTitle { + return true + } else { + return false + } + case let .location(lhsTheme, lhsLocation): + if case let .location(rhsTheme, rhsLocation) = rhs, lhsTheme === rhsTheme, lhsLocation == rhsLocation { + return true + } else { + return false + } + case let .changeLocation(lhsTheme, lhsTitle): + if case let .changeLocation(rhsTheme, rhsTitle) = rhs, lhsTheme === rhsTheme, lhsTitle == rhsTitle { + return true + } else { + return false + } + case let .locationInfo(lhsTheme, lhsText): + if case let .locationInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } } } @@ -142,7 +188,7 @@ private enum CreateGroupEntry: ItemListNodeEntry { func item(_ arguments: CreateGroupArguments) -> ListViewItem { switch self { case let .groupInfo(theme, strings, dateTimeFormat, peer, state, avatar): - return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: nil, cachedData: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false), editingNameUpdated: { editingName in + return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: nil, cachedData: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, avatarTapped: { }, updatingImage: avatar, tag: CreateGroupEntryTag.info) @@ -152,6 +198,17 @@ private enum CreateGroupEntry: ItemListNodeEntry { }) case let .member(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer, presence): return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.account, peer: peer, presence: presence, text: .presence, label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: nil, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }) + case let .locationHeader(theme, title): + return ItemListSectionHeaderItem(theme: theme, text: title, sectionId: self.section) + case let .location(theme, location): + let imageSignal = chatMapSnapshotImage(account: arguments.account, resource: MapSnapshotMediaResource(latitude: location.latitude, longitude: location.longitude, width: 90, height: 90)) + return ItemListAddressItem(theme: theme, label: "", text: location.address.replacingOccurrences(of: ", ", with: "\n"), imageSignal: imageSignal, selected: nil, sectionId: self.section, style: .blocks, action: nil) + case let .changeLocation(theme, text): + return ItemListActionItem(theme: theme, title: text, kind: .generic, alignment: .natural, sectionId: ItemListSectionId(self.section), style: .blocks, action: { + arguments.changeLocation() + }, clearHighlightAutomatically: false) + case let .locationInfo(theme, text): + return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) } } } @@ -160,6 +217,7 @@ private struct CreateGroupState: Equatable { var creating: Bool var editingName: ItemListAvatarAndNameInfoItemName var avatar: ItemListAvatarAndNameInfoItemUpdatingAvatar? + var location: PeerGeoLocation? static func ==(lhs: CreateGroupState, rhs: CreateGroupState) -> Bool { if lhs.creating != rhs.creating { @@ -171,7 +229,9 @@ private struct CreateGroupState: Equatable { if lhs.avatar != rhs.avatar { return false } - + if lhs.location != rhs.location { + return false + } return true } } @@ -217,11 +277,23 @@ private func createGroupEntries(presentationData: PresentationData, state: Creat entries.append(.member(Int32(i), presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, peers[i], view.presences[peers[i].id])) } + if let location = state.location { + entries.append(.locationHeader(presentationData.theme, presentationData.strings.Group_Location_Title.uppercased())) + entries.append(.location(presentationData.theme, location)) + entries.append(.changeLocation(presentationData.theme, presentationData.strings.Group_Location_ChangeLocation)) + entries.append(.locationInfo(presentationData.theme, presentationData.strings.Group_Location_Info)) + } + return entries } -public func createGroupController(context: AccountContext, peerIds: [PeerId], initialTitle: String? = nil, supergroup: Bool = false, completion: ((PeerId, @escaping () -> Void) -> Void)? = nil) -> ViewController { - let initialState = CreateGroupState(creating: false, editingName: .title(title: initialTitle ?? "", type: .group), avatar: nil) +public func createGroupController(context: AccountContext, peerIds: [PeerId], initialTitle: String? = nil, mode: CreateGroupMode = .generic, completion: ((PeerId, @escaping () -> Void) -> Void)? = nil) -> ViewController { + var location: PeerGeoLocation? + if case let .locatedGroup(latitude, longitude, address) = mode { + location = PeerGeoLocation(latitude: latitude, longitude: longitude, address: address ?? "") + } + + let initialState = CreateGroupState(creating: false, editingName: .title(title: initialTitle ?? "", type: .group), avatar: nil, location: location) let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) let updateState: ((CreateGroupState) -> CreateGroupState) -> Void = { f in @@ -232,6 +304,7 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in var dismissImpl: (() -> Void)? var presentControllerImpl: ((ViewController, Any?) -> Void)? var endEditingImpl: (() -> Void)? + var clearHighlightImpl: (() -> Void)? let actionsDisposable = DisposableSet() @@ -239,6 +312,18 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in let uploadedAvatar = Promise() + let addressPromise = Promise(nil) + if case let .locatedGroup(latitude, longitude, address) = mode { + if let address = address { + addressPromise.set(.single(address)) + } else { + addressPromise.set(reverseGeocodeLocation(latitude: latitude, longitude: longitude) + |> map { placemark in + return placemark?.fullAddress ?? "\(latitude), \(longitude)" + }) + } + } + let arguments = CreateGroupArguments(account: context.account, updateEditingName: { editingName in updateState { current in var current = current @@ -246,8 +331,8 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in return current } }, done: { - let (creating, title) = stateValue.with { state -> (Bool, String) in - return (state.creating, state.editingName.composedTitle) + let (creating, title, location) = stateValue.with { state -> (Bool, String, PeerGeoLocation?) in + return (state.creating, state.editingName.composedTitle, state.location) } if !creating && !title.isEmpty { @@ -259,19 +344,46 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in endEditingImpl?() let createSignal: Signal - if supergroup { - createSignal = createSupergroup(account: context.account, title: title, description: nil) - |> map(Optional.init) - |> mapError { error -> CreateGroupError in - switch error { - case .generic: - return .generic - case .restricted: - return .restricted + switch mode { + case .generic: + createSignal = createGroup(account: context.account, title: title, peerIds: peerIds) + case .supergroup: + createSignal = createSupergroup(account: context.account, title: title, description: nil) + |> map(Optional.init) + |> mapError { error -> CreateGroupError in + switch error { + case .generic: + return .generic + case .restricted: + return .restricted + case .tooMuchLocationBasedGroups: + return .tooMuchLocationBasedGroups + } + } + case .locatedGroup: + guard let location = location else { + return + } + + createSignal = addressPromise.get() + |> introduceError(CreateGroupError.self) + |> mapToSignal { address -> Signal in + guard let address = address else { + return .complete() + } + return createSupergroup(account: context.account, title: title, description: nil, location: (location.latitude, location.longitude, address)) + |> map(Optional.init) + |> mapError { error -> CreateGroupError in + switch error { + case .generic: + return .generic + case .restricted: + return .restricted + case .tooMuchLocationBasedGroups: + return .tooMuchLocationBasedGroups + } + } } - } - } else { - createSignal = createGroup(account: context.account, title: title, peerIds: peerIds) } actionsDisposable.add((createSignal @@ -328,8 +440,10 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in text = presentationData.strings.Login_UnknownError case .restricted: text = presentationData.strings.Common_ActionNotAllowedError + case .tooMuchLocationBasedGroups: + text = presentationData.strings.CreateGroup_ErrorLocatedGroupsTooMuch } - presentControllerImpl?(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + presentControllerImpl?(textAlertController(context: context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) })) } }, changeProfilePhoto: { @@ -407,10 +521,43 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in } } }) + }, changeLocation: { + endEditingImpl?() + + let peer = TelegramChannel(id: PeerId(0), accessHash: nil, title: "", username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(TelegramChannelGroupInfo(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil) + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let controller = legacyLocationPickerController(context: context, selfPeer: peer, peer: peer, sendLocation: { coordinate, _, address in + let addressSignal: Signal + if let address = address { + addressSignal = .single(address) + } else { + addressSignal = reverseGeocodeLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) + |> map { placemark in + if let placemark = placemark { + return placemark.fullAddress + } else { + return "\(coordinate.latitude), \(coordinate.longitude)" + } + } + } + + let _ = (addressSignal + |> deliverOnMainQueue).start(next: { address in + addressPromise.set(.single(address)) + updateState { current in + var current = current + current.location = PeerGeoLocation(latitude: coordinate.latitude, longitude: coordinate.longitude, address: address) + return current + } + }) + }, sendLiveLocation: { _, _ in }, theme: presentationData.theme, customLocationPicker: true, presentationCompleted: { + clearHighlightImpl?() + }) + presentControllerImpl?(controller, nil) }) - let signal = combineLatest(context.sharedContext.presentationData, statePromise.get(), context.account.postbox.multiplePeersView(peerIds)) - |> map { presentationData, state, view -> (ItemListControllerState, (ItemListNodeState, CreateGroupEntry.ItemGenerationArguments)) in + let signal = combineLatest(context.sharedContext.presentationData, statePromise.get(), context.account.postbox.multiplePeersView(peerIds), .single(nil) |> then(addressPromise.get())) + |> map { presentationData, state, view, address -> (ItemListControllerState, (ItemListNodeState, CreateGroupEntry.ItemGenerationArguments)) in let rightNavigationButton: ItemListNavigationButton if state.creating { @@ -449,5 +596,8 @@ public func createGroupController(context: AccountContext, peerIds: [PeerId], in [weak controller] in controller?.view.endEditing(true) } + clearHighlightImpl = { [weak controller] in + controller?.clearItemNodesHighlight(animated: true) + } return controller } diff --git a/submodules/TelegramUI/TelegramUI/CreatePasswordController.swift b/submodules/TelegramUI/TelegramUI/CreatePasswordController.swift index 18a9fb2f66..7c79181c65 100644 --- a/submodules/TelegramUI/TelegramUI/CreatePasswordController.swift +++ b/submodules/TelegramUI/TelegramUI/CreatePasswordController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private enum CreatePasswordField { case password diff --git a/submodules/TelegramUI/TelegramUI/CreatePollController.swift b/submodules/TelegramUI/TelegramUI/CreatePollController.swift index 8ecae9d4c6..40ee40e5ea 100644 --- a/submodules/TelegramUI/TelegramUI/CreatePollController.swift +++ b/submodules/TelegramUI/TelegramUI/CreatePollController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private let maxTextLength = 255 private let maxOptionLength = 100 diff --git a/submodules/TelegramUI/TelegramUI/CreatePollOptionActionItem.swift b/submodules/TelegramUI/TelegramUI/CreatePollOptionActionItem.swift index 0edae0182c..81b582ce08 100644 --- a/submodules/TelegramUI/TelegramUI/CreatePollOptionActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/CreatePollOptionActionItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class CreatePollOptionActionItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/CreatePollOptionItem.swift b/submodules/TelegramUI/TelegramUI/CreatePollOptionItem.swift index 883971ae86..72711de6e5 100644 --- a/submodules/TelegramUI/TelegramUI/CreatePollOptionItem.swift +++ b/submodules/TelegramUI/TelegramUI/CreatePollOptionItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData struct CreatePollOptionItemEditing { let editable: Bool diff --git a/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift b/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift index e3b425a214..749935bd96 100644 --- a/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift +++ b/submodules/TelegramUI/TelegramUI/CustomWallpaperPicker.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents +import TelegramUIPreferences func presentCustomWallpaperPicker(context: AccountContext, present: @escaping (ViewController) -> Void) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } diff --git a/submodules/TelegramUI/TelegramUI/DataAndStorageSettingsController.swift b/submodules/TelegramUI/TelegramUI/DataAndStorageSettingsController.swift index 859300552c..e671154668 100644 --- a/submodules/TelegramUI/TelegramUI/DataAndStorageSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/DataAndStorageSettingsController.swift @@ -5,6 +5,8 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents +import TelegramPresentationData +import TelegramUIPreferences private final class DataAndStorageControllerArguments { let openStorageUsage: () -> Void diff --git a/submodules/TelegramUI/TelegramUI/DataPrivacySettingsController.swift b/submodules/TelegramUI/TelegramUI/DataPrivacySettingsController.swift index 6b84ba277b..262f84e013 100644 --- a/submodules/TelegramUI/TelegramUI/DataPrivacySettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/DataPrivacySettingsController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class DataPrivacyControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/DateFormat.swift b/submodules/TelegramUI/TelegramUI/DateFormat.swift index 3e033661e2..f7ace2b5de 100644 --- a/submodules/TelegramUI/TelegramUI/DateFormat.swift +++ b/submodules/TelegramUI/TelegramUI/DateFormat.swift @@ -1,4 +1,6 @@ import Foundation +import TelegramPresentationData +import TelegramUIPreferences func stringForShortTimestamp(hours: Int32, minutes: Int32, dateTimeFormat: PresentationDateTimeFormat) -> String { switch dateTimeFormat.timeFormat { diff --git a/submodules/TelegramUI/TelegramUI/DateSelectionActionSheetController.swift b/submodules/TelegramUI/TelegramUI/DateSelectionActionSheetController.swift index e3bf5529c0..bf3ac5818a 100644 --- a/submodules/TelegramUI/TelegramUI/DateSelectionActionSheetController.swift +++ b/submodules/TelegramUI/TelegramUI/DateSelectionActionSheetController.swift @@ -6,6 +6,7 @@ import UIKit import SwiftSignalKit import TelegramCore import Photos +import TelegramPresentationData final class DateSelectionActionSheetController: ActionSheetController { private var presentationDisposable: Disposable? diff --git a/submodules/TelegramUI/TelegramUI/DebugAccountsController.swift b/submodules/TelegramUI/TelegramUI/DebugAccountsController.swift index 3b94a8d2db..47627f2b23 100644 --- a/submodules/TelegramUI/TelegramUI/DebugAccountsController.swift +++ b/submodules/TelegramUI/TelegramUI/DebugAccountsController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class DebugAccountsControllerArguments { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/DebugController.swift b/submodules/TelegramUI/TelegramUI/DebugController.swift index 4ad1c2d6de..aa2b0ce6b6 100644 --- a/submodules/TelegramUI/TelegramUI/DebugController.swift +++ b/submodules/TelegramUI/TelegramUI/DebugController.swift @@ -10,6 +10,8 @@ import MtProtoKit import MtProtoKitDynamic #endif import MessageUI +import TelegramPresentationData +import TelegramUIPreferences private final class DebugControllerArguments { let sharedContext: SharedAccountContext diff --git a/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift b/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift index 9757bcf736..37b88e9ffd 100644 --- a/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift +++ b/submodules/TelegramUI/TelegramUI/DeclareEncodables.swift @@ -1,5 +1,7 @@ import Postbox +import TelegramUIPreferences + private var telegramUIDeclaredEncodables: Void = { declareEncodable(InAppNotificationSettings.self, f: { InAppNotificationSettings(decoder: $0) }) declareEncodable(ChatInterfaceState.self, f: { ChatInterfaceState(decoder: $0) }) diff --git a/submodules/TelegramUI/TelegramUI/DeleteChatPeerActionSheetItem.swift b/submodules/TelegramUI/TelegramUI/DeleteChatPeerActionSheetItem.swift index 488fb3be21..7b5c5b03c7 100644 --- a/submodules/TelegramUI/TelegramUI/DeleteChatPeerActionSheetItem.swift +++ b/submodules/TelegramUI/TelegramUI/DeleteChatPeerActionSheetItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import Postbox import TelegramCore +import TelegramPresentationData enum DeleteChatPeerAction { case delete diff --git a/submodules/TelegramUI/TelegramUI/DeviceContactData.swift b/submodules/TelegramUI/TelegramUI/DeviceContactData.swift index 5d1b0fc240..09fd35ca80 100644 --- a/submodules/TelegramUI/TelegramUI/DeviceContactData.swift +++ b/submodules/TelegramUI/TelegramUI/DeviceContactData.swift @@ -192,17 +192,20 @@ public final class DeviceContactInstantMessagingProfileData: Equatable, Hashable } } -public extension DeviceContactInstantMessagingProfileData { +public let phonebookUsernamePathPrefix = "@id" +private let phonebookUsernamePrefix = "https://t.me/" + phonebookUsernamePathPrefix + +public extension DeviceContactUrlData { convenience init(appProfile: PeerId) { - self.init(label: "mobile", service: "Telegram", username: "@id\(appProfile.id)") + self.init(label: "Telegram", value: "\(phonebookUsernamePrefix)\(appProfile.id)") } } func parseAppSpecificContactReference(_ value: String) -> PeerId? { - if !value.hasPrefix("@id") { + if !value.hasPrefix(phonebookUsernamePrefix) { return nil } - let idString = String(value[value.index(value.startIndex, offsetBy: 3)...]) + let idString = String(value[value.index(value.startIndex, offsetBy: phonebookUsernamePrefix.count)...]) if let id = Int32(idString) { return PeerId(namespace: Namespaces.Peer.CloudUser, id: id) } @@ -467,7 +470,7 @@ extension DeviceContactExtendedData { } var phoneNumbers: [DeviceContactPhoneNumberData] = [] if let phone = user.phone, !phone.isEmpty { - phoneNumbers.append(DeviceContactPhoneNumberData(label: "_$!!$_", value: phone)) + phoneNumbers.append(DeviceContactPhoneNumberData(label: "_$!!$_", value: phone)) } self.init(basicData: DeviceContactBasicData(firstName: user.firstName ?? "", lastName: user.lastName ?? "", phoneNumbers: phoneNumbers), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) } diff --git a/submodules/TelegramUI/TelegramUI/DeviceContactDataManager.swift b/submodules/TelegramUI/TelegramUI/DeviceContactDataManager.swift index d8ca2db7b0..4e9ac999e2 100644 --- a/submodules/TelegramUI/TelegramUI/DeviceContactDataManager.swift +++ b/submodules/TelegramUI/TelegramUI/DeviceContactDataManager.swift @@ -4,6 +4,8 @@ import Postbox import TelegramCore import Contacts import AddressBook +import TelegramUIPreferences +import DeviceAccess public typealias DeviceContactStableId = String @@ -55,7 +57,7 @@ private final class DeviceContactDataModernContext: DeviceContactDataContext { } private func retrieveContacts() -> ([DeviceContactStableId: DeviceContactBasicData], [PeerId: DeviceContactBasicDataWithReference]) { - let keysToFetch: [CNKeyDescriptor] = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactInstantMessageAddressesKey as CNKeyDescriptor] + let keysToFetch: [CNKeyDescriptor] = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactUrlAddressesKey as CNKeyDescriptor] let request = CNContactFetchRequest(keysToFetch: keysToFetch) request.unifyResults = true @@ -65,8 +67,8 @@ private final class DeviceContactDataModernContext: DeviceContactDataContext { let _ = try? self.store.enumerateContacts(with: request, usingBlock: { contact, _ in let stableIdAndContact = DeviceContactDataModernContext.parseContact(contact) result[stableIdAndContact.0] = stableIdAndContact.1 - for address in contact.instantMessageAddresses { - if address.value.service == "Telegram", let peerId = parseAppSpecificContactReference(address.value.username) { + for address in contact.urlAddresses { + if address.label == "Telegram", let peerId = parseAppSpecificContactReference(address.value as String) { references[peerId] = DeviceContactBasicDataWithReference(stableId: stableIdAndContact.0, basicData: stableIdAndContact.1) } } @@ -483,6 +485,7 @@ private final class DeviceContactDataManagerImpl { private var stableIdToBasicContactData: [DeviceContactStableId: DeviceContactBasicData] = [:] private var normalizedPhoneNumberToStableId: [DeviceContactNormalizedPhoneNumber: [DeviceContactStableId]] = [:] private var appSpecificReferences: [PeerId: DeviceContactBasicDataWithReference] = [:] + private var stableIdToAppSpecificReference: [DeviceContactStableId: PeerId] = [:] private var importableContacts: [DeviceContactNormalizedPhoneNumber: ImportableDeviceContactData] = [:] @@ -614,6 +617,11 @@ private final class DeviceContactDataManagerImpl { private func updateAppSpecificReferences(appSpecificReferences: [PeerId: DeviceContactBasicDataWithReference]) { self.appSpecificReferences = appSpecificReferences + var stableIdToAppSpecificReference: [DeviceContactStableId: PeerId] = [:] + for (peerId, value) in appSpecificReferences { + stableIdToAppSpecificReference[value.stableId] = peerId + } + self.stableIdToAppSpecificReference = stableIdToAppSpecificReference for f in self.appSpecificReferencesSubscribers.copyItems() { f(appSpecificReferences) } @@ -719,12 +727,12 @@ private final class DeviceContactDataManagerImpl { } } - func search(query: String, updated: @escaping ([DeviceContactStableId: DeviceContactBasicData]) -> Void) -> Disposable { + func search(query: String, updated: @escaping ([DeviceContactStableId: (DeviceContactBasicData, PeerId?)]) -> Void) -> Disposable { let normalizedQuery = query.lowercased() - var result: [DeviceContactStableId: DeviceContactBasicData] = [:] + var result: [DeviceContactStableId: (DeviceContactBasicData, PeerId?)] = [:] for (stableId, basicData) in self.stableIdToBasicContactData { if basicData.firstName.lowercased().hasPrefix(normalizedQuery) || basicData.lastName.lowercased().hasPrefix(normalizedQuery) { - result[stableId] = basicData + result[stableId] = (basicData, self.stableIdToAppSpecificReference[stableId]) } } updated(result) @@ -835,7 +843,7 @@ public final class DeviceContactDataManager { } } - public func search(query: String) -> Signal<[DeviceContactStableId: DeviceContactBasicData], NoError> { + public func search(query: String) -> Signal<[DeviceContactStableId: (DeviceContactBasicData, PeerId?)], NoError> { return Signal { subscriber in let disposable = MetaDisposable() self.impl.with({ impl in diff --git a/submodules/TelegramUI/TelegramUI/DeviceContactInfoController.swift b/submodules/TelegramUI/TelegramUI/DeviceContactInfoController.swift index 1a8312fc89..bfecc5f606 100644 --- a/submodules/TelegramUI/TelegramUI/DeviceContactInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/DeviceContactInfoController.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Postbox import TelegramCore import MessageUI +import TelegramPresentationData private enum DeviceContactInfoAction { case sendMessage @@ -15,6 +16,7 @@ private enum DeviceContactInfoAction { private final class DeviceContactInfoControllerArguments { let account: Account + let isPlain: Bool let updateEditingName: (ItemListAvatarAndNameInfoItemName) -> Void let updatePhone: (Int64, String) -> Void let updatePhoneLabel: (Int64, String) -> Void @@ -27,9 +29,11 @@ private final class DeviceContactInfoControllerArguments { let openUrl: (String) -> Void let openAddress: (DeviceContactAddressData) -> Void let displayCopyContextMenu: (DeviceContactInfoEntryTag, String) -> Void + let updateShareViaException: (Bool) -> Void - init(account: Account, updateEditingName: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, updatePhone: @escaping (Int64, String) -> Void, updatePhoneLabel: @escaping (Int64, String) -> Void, deletePhone: @escaping (Int64) -> Void, setPhoneIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, addPhoneNumber: @escaping () -> Void, performAction: @escaping (DeviceContactInfoAction) -> Void, toggleSelection: @escaping (DeviceContactInfoDataId) -> Void, callPhone: @escaping (String) -> Void, openUrl: @escaping (String) -> Void, openAddress: @escaping (DeviceContactAddressData) -> Void, displayCopyContextMenu: @escaping (DeviceContactInfoEntryTag, String) -> Void) { + init(account: Account, isPlain: Bool, updateEditingName: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, updatePhone: @escaping (Int64, String) -> Void, updatePhoneLabel: @escaping (Int64, String) -> Void, deletePhone: @escaping (Int64) -> Void, setPhoneIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, addPhoneNumber: @escaping () -> Void, performAction: @escaping (DeviceContactInfoAction) -> Void, toggleSelection: @escaping (DeviceContactInfoDataId) -> Void, callPhone: @escaping (String) -> Void, openUrl: @escaping (String) -> Void, openAddress: @escaping (DeviceContactAddressData) -> Void, displayCopyContextMenu: @escaping (DeviceContactInfoEntryTag, String) -> Void, updateShareViaException: @escaping (Bool) -> Void) { self.account = account + self.isPlain = isPlain self.updateEditingName = updateEditingName self.updatePhone = updatePhone self.updatePhoneLabel = updatePhoneLabel @@ -42,6 +46,7 @@ private final class DeviceContactInfoControllerArguments { self.openUrl = openUrl self.openAddress = openAddress self.displayCopyContextMenu = displayCopyContextMenu + self.updateShareViaException = updateShareViaException } } @@ -49,6 +54,7 @@ private enum DeviceContactInfoSection: ItemListSectionId { case info case editing case data + case share } private enum DeviceContactInfoEntryTag: Equatable, ItemListItemTag { @@ -82,6 +88,8 @@ private enum DeviceContactInfoConstantEntryId: Hashable { case birthday case addPhoneNumber case phoneNumberSharingInfo + case phoneNumberShareViaException + case phoneNumberShareViaExceptionInfo } private enum DeviceContactInfoEntryId: Hashable { @@ -96,7 +104,7 @@ private enum DeviceContactInfoEntryId: Hashable { } private enum DeviceContactInfoEntry: ItemListNodeEntry { - case info(Int, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, peer: Peer, state: ItemListAvatarAndNameInfoItemState, job: String?) + case info(Int, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, peer: Peer, state: ItemListAvatarAndNameInfoItemState, job: String?, isPlain: Bool) case invite(Int, PresentationTheme, String) case sendMessage(Int, PresentationTheme, String) @@ -107,6 +115,8 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { case phoneNumber(Int, Int, PresentationTheme, String, String, String, Bool?, Bool) case editingPhoneNumber(Int, PresentationTheme, PresentationStrings, Int64, String, String, String, Bool) case phoneNumberSharingInfo(Int, PresentationTheme, String) + case phoneNumberShareViaException(Int, PresentationTheme, String, Bool) + case phoneNumberShareViaExceptionInfo(Int, PresentationTheme, String) case addPhoneNumber(Int, PresentationTheme, String) case email(Int, Int, PresentationTheme, String, String, String, Bool?) case url(Int, Int, PresentationTheme, String, String, String, Bool?) @@ -123,6 +133,8 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { return DeviceContactInfoSection.editing.rawValue case .invite, .sendMessage, .createContact, .addToExisting: return DeviceContactInfoSection.info.rawValue + case .phoneNumberShareViaException, .phoneNumberShareViaExceptionInfo: + return DeviceContactInfoSection.share.rawValue default: return DeviceContactInfoSection.data.rawValue } @@ -146,6 +158,10 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { return .phoneNumber(catIndex) case .phoneNumberSharingInfo: return .constant(.phoneNumberSharingInfo) + case .phoneNumberShareViaException: + return .constant(.phoneNumberShareViaException) + case .phoneNumberShareViaExceptionInfo: + return .constant(.phoneNumberShareViaExceptionInfo) case let .editingPhoneNumber(_, _, _, id, _, _, _, _): return .editingPhoneNumber(id) case .addPhoneNumber: @@ -167,8 +183,8 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { static func ==(lhs: DeviceContactInfoEntry, rhs: DeviceContactInfoEntry) -> Bool { switch lhs { - case let .info(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsPeer, lhsState, lhsJobSummary): - if case let .info(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsPeer, rhsState, rhsJobSummary) = rhs { + case let .info(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsPeer, lhsState, lhsJobSummary, lhsIsPlain): + if case let .info(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsPeer, rhsState, rhsJobSummary, rhsIsPlain) = rhs { if lhsIndex != rhsIndex { return false } @@ -190,6 +206,9 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { if lhsJobSummary != rhsJobSummary { return false } + if lhsIsPlain != rhsIsPlain { + return false + } return true } else { return false @@ -236,6 +255,18 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { } else { return false } + case let .phoneNumberShareViaException(lhsIndex, lhsTheme, lhsText, lhsValue): + if case let .phoneNumberShareViaException(rhsIndex, rhsTheme, rhsText, rhsValue) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue { + return true + } else { + return false + } + case let .phoneNumberShareViaExceptionInfo(lhsIndex, lhsTheme, lhsText): + if case let .phoneNumberShareViaExceptionInfo(rhsIndex, rhsTheme, rhsText) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } case let .editingPhoneNumber(lhsIndex, lhsTheme, lhsStrings, lhsId, lhsTitle, lhsLabel, lhsValue, lhsSelected): if case let .editingPhoneNumber(rhsIndex, rhsTheme, rhsStrings, rhsId, rhsTitle, rhsLabel, rhsValue, rhsSelected) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsId == rhsId, lhsTitle == rhsTitle, lhsLabel == rhsLabel, lhsValue == rhsValue, lhsSelected == rhsSelected { return true @@ -289,7 +320,7 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { private var sortIndex: Int { switch self { - case let .info(index, _, _, _, _, _, _): + case let .info(index, _, _, _, _, _, _, _): return index case let .sendMessage(index, _, _): return index @@ -305,6 +336,10 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { return index case let .phoneNumberSharingInfo(index, _, _): return index + case let .phoneNumberShareViaException(index, _, _, _): + return index + case let .phoneNumberShareViaExceptionInfo(index, _, _): + return index case let .editingPhoneNumber(index, _, _, _, _, _, _, _): return index case let .addPhoneNumber(index, _, _): @@ -330,52 +365,58 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { func item(_ arguments: DeviceContactInfoControllerArguments) -> ListViewItem { switch self { - case let .info(_, theme, strings, dateTimeFormat, peer, state, jobSummary): - return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .contact, peer: peer, presence: nil, label: jobSummary, cachedData: nil, state: state, sectionId: self.section, style: .plain, editingNameUpdated: { editingName in + case let .info(_, theme, strings, dateTimeFormat, peer, state, jobSummary, isPlain): + return ItemListAvatarAndNameInfoItem(account: arguments.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .contact, peer: peer, presence: nil, label: jobSummary, cachedData: nil, state: state, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks(withTopInset: false, withExtendedBottomInset: true), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, avatarTapped: { }, context: nil, call: nil) case let .sendMessage(_, theme, title): - return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: .plain, action: { + return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks, action: { arguments.performAction(.sendMessage) }) case let .invite(_, theme, title): - return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: .plain, action: { + return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks, action: { arguments.performAction(.invite) }) case let .createContact(_, theme, title): - return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: .plain, action: { + return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks, action: { arguments.performAction(.createContact) }) case let .addToExisting(_, theme, title): - return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: .plain, action: { + return ItemListActionItem(theme: theme, title: title, kind: .generic, alignment: .natural, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks, action: { arguments.performAction(.addToExisting) }) case let .company(_, theme, title, value, selected): - return ItemListTextWithLabelItem(theme: theme, label: title, text: value, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { + return ItemListTextWithLabelItem(theme: theme, label: title, text: value, style: arguments.isPlain ? .plain : .blocks, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { }, tag: nil) case let .phoneNumber(_, index, theme, title, label, value, selected, isInteractionEnabled): - return ItemListTextWithLabelItem(theme: theme, label: title, text: value, textColor: .accent, enabledEntitiyTypes: [], multiline: false, selected: selected, sectionId: self.section, action: isInteractionEnabled ? { + return ItemListTextWithLabelItem(theme: theme, label: title, text: value, style: arguments.isPlain ? .plain : .blocks, textColor: .accent, enabledEntitiyTypes: [], multiline: false, selected: selected, sectionId: self.section, action: isInteractionEnabled ? { if selected != nil { arguments.toggleSelection(.phoneNumber(label, value)) } else { arguments.callPhone(value) } - } : nil, longTapAction: { + } : nil, longTapAction: isInteractionEnabled ? { if selected == nil { arguments.displayCopyContextMenu(.info(index), value) } - }, tag: DeviceContactInfoEntryTag.info(index)) + } : nil, tag: DeviceContactInfoEntryTag.info(index)) case let .phoneNumberSharingInfo(_, theme, text): return ItemListTextItem(theme: theme, text: .markdown(text), sectionId: self.section) + case let .phoneNumberShareViaException(_, theme, text, value): + return ItemListSwitchItem(theme: theme, title: text, value: value, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks, updated: { value in + arguments.updateShareViaException(value) + }) + case let .phoneNumberShareViaExceptionInfo(_, theme, text): + return ItemListTextItem(theme: theme, text: .markdown(text), sectionId: self.section) case let .editingPhoneNumber(_, theme, strings, id, title, label, value, hasActiveRevealControls): return UserInfoEditingPhoneItem(theme: theme, strings: strings, id: id, label: title, value: value, editing: UserInfoEditingPhoneItemEditing(editable: true, hasActiveRevealControls: hasActiveRevealControls), sectionId: self.section, setPhoneIdWithRevealedOptions: { lhs, rhs in arguments.setPhoneIdWithRevealedOptions(lhs, rhs) }, updated: { value in arguments.updatePhone(id, value) - }, selectLabel: { + }, selectLabel: nil /*{ arguments.updatePhoneLabel(id, label) - }, delete: { + }*/, delete: { arguments.deletePhone(id) }, tag: DeviceContactInfoEntryTag.editingPhone(id)) case let .addPhoneNumber(_, theme, title): @@ -383,7 +424,7 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { arguments.addPhoneNumber() }) case let .email(_, index, theme, title, label, value, selected): - return ItemListTextWithLabelItem(theme: theme, label: title, text: value, textColor: .accent, enabledEntitiyTypes: [], multiline: false, selected: selected, sectionId: self.section, action: { + return ItemListTextWithLabelItem(theme: theme, label: title, text: value, style: arguments.isPlain ? .plain : .blocks, textColor: .accent, enabledEntitiyTypes: [], multiline: false, selected: selected, sectionId: self.section, action: { if selected != nil { arguments.toggleSelection(.email(label, value)) } else { @@ -395,7 +436,7 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { } }, tag: DeviceContactInfoEntryTag.info(index)) case let .url(_, index, theme, title, label, value, selected): - return ItemListTextWithLabelItem(theme: theme, label: title, text: value, textColor: .accent, enabledEntitiyTypes: [], multiline: false, selected: selected, sectionId: self.section, action: { + return ItemListTextWithLabelItem(theme: theme, label: title, text: value, style: arguments.isPlain ? .plain : .blocks, textColor: .accent, enabledEntitiyTypes: [], multiline: false, selected: selected, sectionId: self.section, action: { if selected != nil { arguments.toggleSelection(.url(label, value)) } else { @@ -422,7 +463,7 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { combineComponent(string: &string, component: value.city) combineComponent(string: &string, component: value.country) combineComponent(string: &string, component: value.postcode) - return ItemListAddressItem(theme: theme, label: title, text: string, imageSignal: imageSignal, selected: selected, sectionId: self.section, action: { + return ItemListAddressItem(theme: theme, label: title, text: string, imageSignal: imageSignal, selected: selected, sectionId: self.section, style: .plain, action: { if selected != nil { arguments.toggleSelection(.address(value)) } else { @@ -434,7 +475,7 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { } }, tag: DeviceContactInfoEntryTag.info(index)) case let .birthday(_, theme, title, value, text, selected): - return ItemListTextWithLabelItem(theme: theme, label: title, text: text, textColor: .accent, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { + return ItemListTextWithLabelItem(theme: theme, label: title, text: text, style: arguments.isPlain ? .plain : .blocks, textColor: .accent, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { if selected != nil { arguments.toggleSelection(.birthday) } else { @@ -463,7 +504,7 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { } }, tag: DeviceContactInfoEntryTag.birthday) case let .socialProfile(_, index, theme, title, value, text, selected): - return ItemListTextWithLabelItem(theme: theme, label: title, text: text, textColor: .accent, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { + return ItemListTextWithLabelItem(theme: theme, label: title, text: text, style: arguments.isPlain ? .plain : .blocks, textColor: .accent, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { if selected != nil { arguments.toggleSelection(.socialProfile(value)) } else if value.url.count > 0 { @@ -475,7 +516,7 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { } }, tag: DeviceContactInfoEntryTag.info(index)) case let .instantMessenger(_, index, theme, title, value, text, selected): - return ItemListTextWithLabelItem(theme: theme, label: title, text: text, textColor: .accent, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { + return ItemListTextWithLabelItem(theme: theme, label: title, text: text, style: arguments.isPlain ? .plain : .blocks, textColor: .accent, enabledEntitiyTypes: [], multiline: true, selected: selected, sectionId: self.section, action: { if selected != nil { arguments.toggleSelection(.instantMessenger(value)) } @@ -500,6 +541,7 @@ private struct EditingPhoneNumber: Equatable { private struct DeviceContactInfoState: Equatable { var savingData: Bool = false + var addToPrivacyExceptions: Bool = true var editingState: DeviceContactInfoEditingState? = nil var excludedComponents = Set() var phoneNumbers: [EditingPhoneNumber] = [] @@ -532,7 +574,7 @@ private func filteredContactData(contactData: DeviceContactExtendedData, exclude return DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: contactData.basicData.firstName, lastName: contactData.basicData.lastName, phoneNumbers: phoneNumbers), middleName: contactData.middleName, prefix: contactData.prefix, suffix: contactData.suffix, organization: includeJob ? contactData.organization : "", jobTitle: includeJob ? contactData.jobTitle : "", department: includeJob ? contactData.department : "", emailAddresses: emailAddresses, urls: urls, addresses: addresses, birthdayDate: includeBirthday ? contactData.birthdayDate : nil, socialProfiles: socialProfiles, instantMessagingProfiles: instantMessagingProfiles) } -private func deviceContactInfoEntries(account: Account, presentationData: PresentationData, peer: Peer?, isShare: Bool, contactData: DeviceContactExtendedData, isContact: Bool, state: DeviceContactInfoState, selecting: Bool, editingPhoneNumbers: Bool) -> [DeviceContactInfoEntry] { +private func deviceContactInfoEntries(account: Account, presentationData: PresentationData, peer: Peer?, isShare: Bool, shareViaException: Bool, contactData: DeviceContactExtendedData, isContact: Bool, state: DeviceContactInfoState, selecting: Bool, editingPhoneNumbers: Bool) -> [DeviceContactInfoEntry] { var entries: [DeviceContactInfoEntry] = [] var editingName: ItemListAvatarAndNameInfoItemName? @@ -565,7 +607,7 @@ private func deviceContactInfoEntries(account: Account, presentationData: Presen let isOrganization = personName.0.isEmpty && personName.1.isEmpty && !contactData.organization.isEmpty - entries.append(.info(entries.count, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, peer: peer ?? TelegramUser(id: PeerId(namespace: -1, id: 0), accessHash: nil, firstName: isOrganization ? contactData.organization : personName.0, lastName: isOrganization ? nil : personName.1, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []), state: ItemListAvatarAndNameInfoItemState(editingName: editingName, updatingName: nil), job: isOrganization ? nil : jobSummary)) + entries.append(.info(entries.count, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, peer: peer ?? TelegramUser(id: PeerId(namespace: -1, id: 0), accessHash: nil, firstName: isOrganization ? contactData.organization : personName.0, lastName: isOrganization ? nil : personName.1, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []), state: ItemListAvatarAndNameInfoItemState(editingName: editingName, updatingName: nil), job: isOrganization ? nil : jobSummary, isPlain: !isShare)) if !selecting { if let _ = peer { @@ -592,10 +634,21 @@ private func deviceContactInfoEntries(account: Account, presentationData: Presen numberIndex += 1 } if let peer = peer { - if contactData.basicData.phoneNumbers.isEmpty { - entries.append(.phoneNumberSharingInfo(entries.count, presentationData.theme, presentationData.strings.AddContact_ContactWillBeSharedAfterMutual(peer.compactDisplayTitle).0)) + let personCompactName: String + if !personName.0.isEmpty { + personCompactName = personName.0 + } else if !personName.1.isEmpty { + personCompactName = personName.1 } else { - entries.append(.phoneNumberSharingInfo(entries.count, presentationData.theme, presentationData.strings.AddContact_ContactWillBeSharedNow(peer.compactDisplayTitle).0)) + personCompactName = peer.compactDisplayTitle + } + + if contactData.basicData.phoneNumbers.isEmpty { + entries.append(.phoneNumberSharingInfo(entries.count, presentationData.theme, presentationData.strings.AddContact_ContactWillBeSharedAfterMutual(personCompactName).0)) + } + if shareViaException { + entries.append(.phoneNumberShareViaException(entries.count, presentationData.theme, presentationData.strings.AddContact_SharedContactException, state.addToPrivacyExceptions)) + entries.append(.phoneNumberShareViaExceptionInfo(entries.count, presentationData.theme, presentationData.strings.AddContact_SharedContactExceptionInfo(personCompactName).0)) } } } else { @@ -691,7 +744,7 @@ private func deviceContactInfoEntries(account: Account, presentationData: Presen public enum DeviceContactInfoSubject { case vcard(Peer?, DeviceContactStableId?, DeviceContactExtendedData) case filter(peer: Peer?, contactId: DeviceContactStableId?, contactData: DeviceContactExtendedData, completion: (Peer?, DeviceContactExtendedData) -> Void) - case create(peer: Peer?, contactData: DeviceContactExtendedData, isSharing: Bool, completion: (Peer?, DeviceContactStableId, DeviceContactExtendedData) -> Void) + case create(peer: Peer?, contactData: DeviceContactExtendedData, isSharing: Bool, shareViaException: Bool, completion: (Peer?, DeviceContactStableId, DeviceContactExtendedData) -> Void) var peer: Peer? { switch self { @@ -710,7 +763,7 @@ public enum DeviceContactInfoSubject { return data case let .filter(_, _, data, _): return data - case let .create(_, data, _, _): + case let .create(_, data, _, _, _): return data } } @@ -746,7 +799,7 @@ private final class DeviceContactInfoController: ItemListController Void)? = nil, cancelled: (() -> Void)? = nil) -> ViewController { var initialState = DeviceContactInfoState() - if case let .create(peer, contactData, _, _) = subject { + if case let .create(peer, contactData, _, _, _) = subject { var peerPhoneNumber: String? var firstName = contactData.basicData.firstName var lastName = contactData.basicData.lastName @@ -840,7 +893,21 @@ public func deviceContactInfoController(context: AccountContext, subject: Device }) } - let arguments = DeviceContactInfoControllerArguments(account: context.account, updateEditingName: { editingName in + let contactData: Signal<(Peer?, DeviceContactStableId?, DeviceContactExtendedData), NoError> + var isShare = false + var shareViaException = false + switch subject { + case let .vcard(peer, id, data): + contactData = .single((peer, id, data)) + case let .filter(peer, id, data, _): + contactData = .single((peer, id, data)) + case let .create(peer, data, share, shareViaExceptionValue, _): + contactData = .single((peer, nil, data)) + isShare = share + shareViaException = shareViaExceptionValue + } + + let arguments = DeviceContactInfoControllerArguments(account: context.account, isPlain: !isShare, updateEditingName: { editingName in updateState { state in var state = state if let _ = state.editingState { @@ -917,7 +984,7 @@ public func deviceContactInfoController(context: AccountContext, subject: Device presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) } case .createContact: - presentControllerImpl?(deviceContactInfoController(context: context, subject: .create(peer: subject.peer, contactData: subject.contactData, isSharing: false, completion: { peer, stableId, contactData in + presentControllerImpl?(deviceContactInfoController(context: context, subject: .create(peer: subject.peer, contactData: subject.contactData, isSharing: false, shareViaException: false, completion: { peer, stableId, contactData in dismissImpl?(false) if let peer = peer { @@ -950,20 +1017,14 @@ public func deviceContactInfoController(context: AccountContext, subject: Device openAddressImpl?(address) }, displayCopyContextMenu: { tag, value in displayCopyContextMenuImpl?(tag, value) + }, updateShareViaException: { value in + updateState { state in + var state = state + state.addToPrivacyExceptions = value + return state + } }) - let contactData: Signal<(Peer?, DeviceContactStableId?, DeviceContactExtendedData), NoError> - var isShare = false - switch subject { - case let .vcard(peer, id, data): - contactData = .single((peer, id, data)) - case let .filter(peer, id, data, _): - contactData = .single((peer, id, data)) - case let .create(peer, data, share, _): - contactData = .single((peer, nil, data)) - isShare = share - } - let previousEditingPhoneIds = Atomic?>(value: nil) let signal = combineLatest(context.sharedContext.presentationData, statePromise.get(), contactData) |> map { presentationData, state, peerAndContactData -> (ItemListControllerState, (ItemListNodeState, DeviceContactInfoEntry.ItemGenerationArguments)) in @@ -987,7 +1048,7 @@ public func deviceContactInfoController(context: AccountContext, subject: Device completion(peerAndContactData.0, filteredData) dismissImpl?(true) }) - } else if case let .create(createForPeer, _, _, completion) = subject { + } else if case let .create(createForPeer, _, _, _, completion) = subject { let filteredData = filteredContactData(contactData: peerAndContactData.2, excludedComponents: state.excludedComponents) var filteredPhoneNumbers: [DeviceContactPhoneNumberData] = [] for phoneNumber in state.phoneNumbers { @@ -997,34 +1058,36 @@ public func deviceContactInfoController(context: AccountContext, subject: Device } var composedContactData: DeviceContactExtendedData? if let editingName = state.editingState?.editingName, case let .personName(firstName, lastName) = editingName, (!firstName.isEmpty || !lastName.isEmpty) { - var instantMessagingProfiles = filteredData.instantMessagingProfiles + var urls = filteredData.urls if let createForPeer = createForPeer { - let appProfile = DeviceContactInstantMessagingProfileData(appProfile: createForPeer.id) + let appProfile = DeviceContactUrlData(appProfile: createForPeer.id) var found = false - for profile in instantMessagingProfiles { - if profile.service == appProfile.service && profile.username == appProfile.username { + for url in urls { + if url.label == appProfile.label && url.value == appProfile.value { found = true break } } if !found { - instantMessagingProfiles.append(appProfile) + urls.append(appProfile) } } - composedContactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: firstName, lastName: lastName, phoneNumbers: filteredPhoneNumbers), middleName: filteredData.middleName, prefix: filteredData.prefix, suffix: filteredData.suffix, organization: filteredData.organization, jobTitle: filteredData.jobTitle, department: filteredData.department, emailAddresses: filteredData.emailAddresses, urls: filteredData.urls, addresses: filteredData.addresses, birthdayDate: filteredData.birthdayDate, socialProfiles: filteredData.socialProfiles, instantMessagingProfiles: instantMessagingProfiles) + composedContactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: firstName, lastName: lastName, phoneNumbers: filteredPhoneNumbers), middleName: filteredData.middleName, prefix: filteredData.prefix, suffix: filteredData.suffix, organization: filteredData.organization, jobTitle: filteredData.jobTitle, department: filteredData.department, emailAddresses: filteredData.emailAddresses, urls: urls, addresses: filteredData.addresses, birthdayDate: filteredData.birthdayDate, socialProfiles: filteredData.socialProfiles, instantMessagingProfiles: filteredData.instantMessagingProfiles) } rightNavigationButton = ItemListNavigationButton(content: .text(isShare ? presentationData.strings.Common_Done : presentationData.strings.Compose_Create), style: .bold, enabled: (isShare || !filteredPhoneNumbers.isEmpty) && composedContactData != nil, action: { if let composedContactData = composedContactData { + var addToPrivacyExceptions = false updateState { state in var state = state state.savingData = true + addToPrivacyExceptions = state.addToPrivacyExceptions return state } if let contactDataManager = context.sharedContext.contactDataManager { switch subject { - case let .create(peer, _, share, _): + case let .create(peer, _, share, shareViaException, _): if share, filteredPhoneNumbers.count <= 1, let peer = peer { - addContactDisposable.set((addContactInteractively(account: context.account, peerId: peer.id, firstName: composedContactData.basicData.firstName, lastName: composedContactData.basicData.lastName, phoneNumber: filteredPhoneNumbers.first?.value ?? "") + addContactDisposable.set((addContactInteractively(account: context.account, peerId: peer.id, firstName: composedContactData.basicData.firstName, lastName: composedContactData.basicData.lastName, phoneNumber: filteredPhoneNumbers.first?.value ?? "", addToPrivacyExceptions: shareViaException && addToPrivacyExceptions) |> deliverOnMainQueue).start(error: { _ in presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) }, completed: { @@ -1056,9 +1119,9 @@ public func deviceContactInfoController(context: AccountContext, subject: Device } if filteredPhoneNumbers.count <= 1 { switch subject { - case let .create(peer, _, share, _): + case let .create(peer, _, share, shareViaException, _): if share, let peer = peer { - return addContactInteractively(account: context.account, peerId: peer.id, firstName: composedContactData.basicData.firstName, lastName: composedContactData.basicData.lastName, phoneNumber: filteredPhoneNumbers.first?.value ?? "") + return addContactInteractively(account: context.account, peerId: peer.id, firstName: composedContactData.basicData.firstName, lastName: composedContactData.basicData.lastName, phoneNumber: filteredPhoneNumbers.first?.value ?? "", addToPrivacyExceptions: shareViaException && addToPrivacyExceptions) |> mapToSignal { _ -> Signal<(DeviceContactStableId, DeviceContactExtendedData, Peer?)?, AddContactError> in return .complete() } @@ -1146,7 +1209,7 @@ public func deviceContactInfoController(context: AccountContext, subject: Device focusItemTag = DeviceContactInfoEntryTag.editingPhone(insertedPhoneId) } - let listState = ItemListNodeState(entries: deviceContactInfoEntries(account: context.account, presentationData: presentationData, peer: peerAndContactData.0, isShare: isShare, contactData: peerAndContactData.2, isContact: peerAndContactData.1 != nil, state: state, selecting: selecting, editingPhoneNumbers: editingPhones), style: .plain, focusItemTag: focusItemTag) + let listState = ItemListNodeState(entries: deviceContactInfoEntries(account: context.account, presentationData: presentationData, peer: peerAndContactData.0, isShare: isShare, shareViaException: shareViaException, contactData: peerAndContactData.2, isContact: peerAndContactData.1 != nil, state: state, selecting: selecting, editingPhoneNumbers: editingPhones), style: isShare ? .blocks : .plain, focusItemTag: focusItemTag) return (controllerState, (listState, arguments)) } @@ -1269,7 +1332,7 @@ private func addContactToExisting(context: AccountContext, parentController: Vie let _ = (dataSignal |> deliverOnMainQueue).start(next: { peer, stableId in guard let stableId = stableId else { - parentController.present(deviceContactInfoController(context: context, subject: .create(peer: peer, contactData: contactData, isSharing: false, completion: { peer, stableId, contactData in + parentController.present(deviceContactInfoController(context: context, subject: .create(peer: peer, contactData: contactData, isSharing: false, shareViaException: false, completion: { peer, stableId, contactData in })), in: .window(.root)) return @@ -1315,7 +1378,7 @@ func addContactOptionsController(context: AccountContext, peer: Peer?, contactDa controller.setItemGroups([ ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Profile_CreateNewContact, action: { [weak controller] in - controller?.present(deviceContactInfoController(context: context, subject: .create(peer: peer, contactData: contactData, isSharing: peer != nil, completion: { peer, stableId, contactData in + controller?.present(deviceContactInfoController(context: context, subject: .create(peer: peer, contactData: contactData, isSharing: peer != nil, shareViaException: false, completion: { peer, stableId, contactData in if let peer = peer { } else { diff --git a/submodules/TelegramUI/TelegramUI/DisabledContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/DisabledContextResultsChatInputContextPanelNode.swift index d8cc4532ba..e17ad63bf8 100644 --- a/submodules/TelegramUI/TelegramUI/DisabledContextResultsChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/DisabledContextResultsChatInputContextPanelNode.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import AsyncDisplayKit import Display +import TelegramPresentationData final class DisabledContextResultsChatInputContextPanelNode: ChatInputContextPanelNode { private let containerNode: ASDisplayNode diff --git a/submodules/TelegramUI/TelegramUI/DocumentPreviewController.swift b/submodules/TelegramUI/TelegramUI/DocumentPreviewController.swift index 814d5ec6fc..8c2be1e099 100644 --- a/submodules/TelegramUI/TelegramUI/DocumentPreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/DocumentPreviewController.swift @@ -5,6 +5,7 @@ import Postbox import TelegramCore import QuickLook import Display +import TelegramPresentationData private final class DocumentPreviewItem: NSObject, QLPreviewItem { private let url: URL diff --git a/submodules/TelegramUI/TelegramUI/EditAccessoryPanelNode.swift b/submodules/TelegramUI/TelegramUI/EditAccessoryPanelNode.swift index 48dc4cf809..3efe488a5f 100644 --- a/submodules/TelegramUI/TelegramUI/EditAccessoryPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/EditAccessoryPanelNode.swift @@ -5,6 +5,8 @@ import TelegramCore import Postbox import SwiftSignalKit import Display +import TelegramPresentationData +import TelegramUIPreferences final class EditAccessoryPanelNode: AccessoryPanelNode { let messageId: MessageId diff --git a/submodules/TelegramUI/TelegramUI/EditSettingsController.swift b/submodules/TelegramUI/TelegramUI/EditSettingsController.swift index e2533d993b..a2da800fce 100644 --- a/submodules/TelegramUI/TelegramUI/EditSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/EditSettingsController.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents +import TelegramPresentationData private struct EditSettingsItemArguments { let context: AccountContext @@ -182,7 +183,7 @@ private enum SettingsEntry: ItemListNodeEntry { func item(_ arguments: EditSettingsItemArguments) -> ListViewItem { switch self { case let .userInfo(theme, strings, dateTimeFormat, peer, cachedData, state, updatingImage): - return ItemListAvatarAndNameInfoItem(account: arguments.context.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer, presence: TelegramUserPresence(status: .present(until: Int32.max), lastActivity: 0), cachedData: cachedData, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false), editingNameUpdated: { editingName in + return ItemListAvatarAndNameInfoItem(account: arguments.context.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer, presence: TelegramUserPresence(status: .present(until: Int32.max), lastActivity: 0), cachedData: cachedData, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, avatarTapped: { arguments.avatarTapAction() diff --git a/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift b/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift index 82c0847514..9d0317019e 100644 --- a/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift +++ b/submodules/TelegramUI/TelegramUI/EditableTokenListNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData struct EditableTokenListToken { let id: AnyHashable diff --git a/submodules/TelegramUI/TelegramUI/EmojiUtils.swift b/submodules/TelegramUI/TelegramUI/EmojiUtils.swift index 628ae1fed9..6cd4d4144a 100644 --- a/submodules/TelegramUI/TelegramUI/EmojiUtils.swift +++ b/submodules/TelegramUI/TelegramUI/EmojiUtils.swift @@ -135,4 +135,12 @@ extension String { } return string } + + var trimmedEmoji: String { + if self.unicodeScalars.count > 1, self.unicodeScalars.first?.value == 0x2764 { + return String(self.unicodeScalars.prefix(self.unicodeScalars.count - 1)) + } else { + return self + } + } } diff --git a/submodules/TelegramUI/TelegramUI/EmojisChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/EmojisChatInputContextPanelNode.swift index 9f619357cd..bb17fdeeb9 100644 --- a/submodules/TelegramUI/TelegramUI/EmojisChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/EmojisChatInputContextPanelNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import Display +import TelegramPresentationData private struct EmojisChatInputContextPanelEntryStableId: Hashable, Equatable { let symbol: String diff --git a/submodules/TelegramUI/TelegramUI/EmojisChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/EmojisChatInputPanelItem.swift index 551bb7fb6c..7fdb8192a5 100644 --- a/submodules/TelegramUI/TelegramUI/EmojisChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/EmojisChatInputPanelItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class EmojisChatInputPanelItem: ListViewItem { fileprivate let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift b/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift index 73086a2342..51088e34d9 100644 --- a/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift +++ b/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class FeaturedStickerPacksControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift index 67eb14d664..95a094b3b5 100644 --- a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift +++ b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift @@ -888,10 +888,14 @@ private func fetchEmojiRepresentation(account: Account, resource: MediaResource, private func fetchAnimatedStickerRepresentation(account: Account, resource: MediaResource, resourceData: MediaResourceData, representation: CachedAnimatedStickerRepresentation) -> Signal { return Signal({ subscriber in if let data = try? Data(contentsOf: URL(fileURLWithPath: resourceData.path), options: [.mappedIfSafe]) { - return convertCompressedLottieToCombinedMp4(data: data, size: CGSize(width: 400.0, height: 400.0)).start(next: { path in - subscriber.putNext(CachedMediaResourceRepresentationResult(temporaryPath: path)) - subscriber.putCompletion() - }) + if #available(iOS 9.0, *) { + return experimentalConvertCompressedLottieToCombinedMp4(data: data, size: CGSize(width: 320.0, height: 320.0)).start(next: { path in + subscriber.putNext(CachedMediaResourceRepresentationResult(temporaryPath: path)) + subscriber.putCompletion() + }) + } else { + return EmptyDisposable + } } else { return EmptyDisposable } diff --git a/submodules/TelegramUI/TelegramUI/FetchManager.swift b/submodules/TelegramUI/TelegramUI/FetchManager.swift index 4a776e786e..8ad30c60c5 100644 --- a/submodules/TelegramUI/TelegramUI/FetchManager.swift +++ b/submodules/TelegramUI/TelegramUI/FetchManager.swift @@ -3,6 +3,7 @@ import Postbox import TelegramCore import SwiftSignalKit import Postbox +import TelegramUIPreferences private struct FetchManagerLocationEntryId: Hashable { let location: FetchManagerLocation diff --git a/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift b/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift index 477861d2b0..6062d9860f 100644 --- a/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift +++ b/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import Postbox import SwiftSignalKit +import TelegramUIPreferences public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal { return fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)) diff --git a/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift b/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift index 9ba3040ca2..f332af0ba0 100644 --- a/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift +++ b/submodules/TelegramUI/TelegramUI/FileMediaResourceStatus.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import Postbox import SwiftSignalKit +import UniversalMediaPlayer enum FileMediaResourcePlaybackStatus { case playing diff --git a/submodules/TelegramUI/TelegramUI/FormBlockItemNode.swift b/submodules/TelegramUI/TelegramUI/FormBlockItemNode.swift index 9a51f81e07..2728b220e7 100644 --- a/submodules/TelegramUI/TelegramUI/FormBlockItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/FormBlockItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData protocol FormBlockItemNodeProto { diff --git a/submodules/TelegramUI/TelegramUI/FormController.swift b/submodules/TelegramUI/TelegramUI/FormController.swift index bfdadc4432..a2adc8eaa3 100644 --- a/submodules/TelegramUI/TelegramUI/FormController.swift +++ b/submodules/TelegramUI/TelegramUI/FormController.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData class FormController>: ViewController { var controllerNode: Node { diff --git a/submodules/TelegramUI/TelegramUI/FormControllerActionItem.swift b/submodules/TelegramUI/TelegramUI/FormControllerActionItem.swift index 5261854046..3c73efae7f 100644 --- a/submodules/TelegramUI/TelegramUI/FormControllerActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/FormControllerActionItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let textFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/FormControllerDetailActionItem.swift b/submodules/TelegramUI/TelegramUI/FormControllerDetailActionItem.swift index 7658e35b8c..0b059e891e 100644 --- a/submodules/TelegramUI/TelegramUI/FormControllerDetailActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/FormControllerDetailActionItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let textFont = Font.regular(17.0) private let errorFont = Font.regular(13.0) diff --git a/submodules/TelegramUI/TelegramUI/FormControllerHeaderItem.swift b/submodules/TelegramUI/TelegramUI/FormControllerHeaderItem.swift index db055aca64..e658723673 100644 --- a/submodules/TelegramUI/TelegramUI/FormControllerHeaderItem.swift +++ b/submodules/TelegramUI/TelegramUI/FormControllerHeaderItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/FormControllerItem.swift b/submodules/TelegramUI/TelegramUI/FormControllerItem.swift index fd2f18c052..38b9c7ca98 100644 --- a/submodules/TelegramUI/TelegramUI/FormControllerItem.swift +++ b/submodules/TelegramUI/TelegramUI/FormControllerItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData protocol FormControllerEntry: Identifiable { associatedtype ItemParams diff --git a/submodules/TelegramUI/TelegramUI/FormControllerNode.swift b/submodules/TelegramUI/TelegramUI/FormControllerNode.swift index 46937a46af..f920e29d47 100644 --- a/submodules/TelegramUI/TelegramUI/FormControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/FormControllerNode.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData private func hasFirstResponder(_ view: UIView) -> Bool { if view.isFirstResponder { diff --git a/submodules/TelegramUI/TelegramUI/FormControllerTextInputItem.swift b/submodules/TelegramUI/TelegramUI/FormControllerTextInputItem.swift index 26bc160674..62157b05c9 100644 --- a/submodules/TelegramUI/TelegramUI/FormControllerTextInputItem.swift +++ b/submodules/TelegramUI/TelegramUI/FormControllerTextInputItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let textFont = Font.regular(17.0) private let errorFont = Font.regular(13.0) diff --git a/submodules/TelegramUI/TelegramUI/FormControllerTextItem.swift b/submodules/TelegramUI/TelegramUI/FormControllerTextItem.swift index c905e4539d..f0ad9c077e 100644 --- a/submodules/TelegramUI/TelegramUI/FormControllerTextItem.swift +++ b/submodules/TelegramUI/TelegramUI/FormControllerTextItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/FormEditableBlockItemNode.swift b/submodules/TelegramUI/TelegramUI/FormEditableBlockItemNode.swift index 25dbb5a944..ce8e3d65e3 100644 --- a/submodules/TelegramUI/TelegramUI/FormEditableBlockItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/FormEditableBlockItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData class FormEditableBlockItemNode: ASDisplayNode, FormControllerItemNode, FormBlockItemNodeProto, UIGestureRecognizerDelegate { private let topSeparatorInset: FormBlockItemInset diff --git a/submodules/TelegramUI/TelegramUI/ForwardAccessoryPanelNode.swift b/submodules/TelegramUI/TelegramUI/ForwardAccessoryPanelNode.swift index 161fc087b7..f9073cbedf 100644 --- a/submodules/TelegramUI/TelegramUI/ForwardAccessoryPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ForwardAccessoryPanelNode.swift @@ -5,6 +5,7 @@ import TelegramCore import Postbox import SwiftSignalKit import Display +import TelegramPresentationData func textStringForForwardedMessage(_ message: Message, strings: PresentationStrings) -> (String, Bool) { for media in message.media { diff --git a/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift b/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift index 3c3caccf1f..eb1911c800 100644 --- a/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift +++ b/submodules/TelegramUI/TelegramUI/ForwardPrivacyChatPreviewItem.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramCore import Postbox +import TelegramPresentationData +import TelegramUIPreferences class ForwardPrivacyChatPreviewItem: ListViewItem, ItemListItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/GalleryController.swift b/submodules/TelegramUI/TelegramUI/GalleryController.swift index 34b8b64f14..26ecf9301c 100644 --- a/submodules/TelegramUI/TelegramUI/GalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/GalleryController.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import AsyncDisplayKit import TelegramCore import SafariServices +import TelegramPresentationData private func tagsForMessage(_ message: Message) -> MessageTags? { for media in message.media { diff --git a/submodules/TelegramUI/TelegramUI/GalleryNavigationCheckNode.swift b/submodules/TelegramUI/TelegramUI/GalleryNavigationCheckNode.swift index 31bc0961c7..183af1eac9 100644 --- a/submodules/TelegramUI/TelegramUI/GalleryNavigationCheckNode.swift +++ b/submodules/TelegramUI/TelegramUI/GalleryNavigationCheckNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class GalleryNavigationCheckNode: ASDisplayNode, NavigationButtonCustomDisplayNode { private var checkNode: CheckNode diff --git a/submodules/TelegramUI/TelegramUI/GalleryVideoDecoration.swift b/submodules/TelegramUI/TelegramUI/GalleryVideoDecoration.swift index 4606c08e0f..db3f3722d6 100644 --- a/submodules/TelegramUI/TelegramUI/GalleryVideoDecoration.swift +++ b/submodules/TelegramUI/TelegramUI/GalleryVideoDecoration.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import UniversalMediaPlayer final class GalleryVideoDecoration: UniversalVideoDecoration { let backgroundNode: ASDisplayNode? = nil diff --git a/submodules/TelegramUI/TelegramUI/GameController.swift b/submodules/TelegramUI/TelegramUI/GameController.swift index 4c5fdeed23..bed2e1cd1b 100644 --- a/submodules/TelegramUI/TelegramUI/GameController.swift +++ b/submodules/TelegramUI/TelegramUI/GameController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class GameController: ViewController { private var controllerNode: GameControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/GameControllerNode.swift b/submodules/TelegramUI/TelegramUI/GameControllerNode.swift index 9d9714a65c..8275332938 100644 --- a/submodules/TelegramUI/TelegramUI/GameControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/GameControllerNode.swift @@ -6,6 +6,7 @@ import WebKit import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private class WeakGameScriptMessageHandler: NSObject, WKScriptMessageHandler { private let f: (WKScriptMessage) -> () diff --git a/submodules/TelegramUI/TelegramUI/GameControllerTitleView.swift b/submodules/TelegramUI/TelegramUI/GameControllerTitleView.swift index d24649f3ec..d8fe704e93 100644 --- a/submodules/TelegramUI/TelegramUI/GameControllerTitleView.swift +++ b/submodules/TelegramUI/TelegramUI/GameControllerTitleView.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import LegacyComponents +import TelegramPresentationData final class GameControllerTitleView: UIView { private var theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift b/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift index e3fee8d72a..a1ef209e47 100644 --- a/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift +++ b/submodules/TelegramUI/TelegramUI/GenerateTextEntities.swift @@ -132,6 +132,8 @@ func generateChatInputTextEntities(_ text: NSAttributedString) -> [MessageTextEn entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .Italic)) } else if key == ChatTextInputAttributes.monospace { entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .Code)) + } else if key == ChatTextInputAttributes.strikethrough { + entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .Strikethrough)) } else if key == ChatTextInputAttributes.textMention, let value = value as? ChatTextInputTextMentionAttribute { entities.append(MessageTextEntity(range: range.lowerBound ..< range.upperBound, type: .TextMention(peerId: value.peerId))) } else if key == ChatTextInputAttributes.textUrl, let value = value as? ChatTextInputTextUrlAttribute { diff --git a/submodules/TelegramUI/TelegramUI/GenericEmbedImplementation.swift b/submodules/TelegramUI/TelegramUI/GenericEmbedImplementation.swift index c7084308bc..e214d9b366 100644 --- a/submodules/TelegramUI/TelegramUI/GenericEmbedImplementation.swift +++ b/submodules/TelegramUI/TelegramUI/GenericEmbedImplementation.swift @@ -1,6 +1,7 @@ import Foundation import WebKit import SwiftSignalKit +import UniversalMediaPlayer final class GenericEmbedImplementation: WebEmbedImplementation { private var evalImpl: ((String) -> Void)? diff --git a/submodules/TelegramUI/TelegramUI/Geocoding.swift b/submodules/TelegramUI/TelegramUI/Geocoding.swift index 828b7ba6b4..9a39958f09 100644 --- a/submodules/TelegramUI/TelegramUI/Geocoding.swift +++ b/submodules/TelegramUI/TelegramUI/Geocoding.swift @@ -19,12 +19,37 @@ func geocodeLocation(dictionary: [String: String]) -> Signal<(Double, Double)?, } } -func reverseGeocodeLocation(latitude: Double, longitude: Double) -> Signal { +struct ReverseGeocodedPlacemark { + let street: String? + let city: String? + let country: String? + + var fullAddress: String { + var components: [String] = [] + if let street = self.street { + components.append(street) + } + if let city = self.city { + components.append(city) + } + if let country = self.country { + components.append(country) + } + + return components.joined(separator: ", ") + } +} + +func reverseGeocodeLocation(latitude: Double, longitude: Double) -> Signal { return Signal { subscriber in let geocoder = CLGeocoder() geocoder.reverseGeocodeLocation(CLLocation(latitude: latitude, longitude: longitude), completionHandler: { placemarks, _ in - if let placemarks = placemarks, let locality = placemarks.first?.locality { - subscriber.putNext(locality) + if let placemarks = placemarks, let placemark = placemarks.first { + let result = ReverseGeocodedPlacemark(street: placemark.thoroughfare, city: placemark.locality, country: placemark.country) + subscriber.putNext(result) + subscriber.putCompletion() + } else { + subscriber.putNext(nil) subscriber.putCompletion() } }) diff --git a/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift index 6e7170574c..ad404e9d5b 100644 --- a/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData func paneGifSearchForQuery(account: Account, query: String, updateActivity: ((Bool) -> Void)?) -> Signal<[FileMediaReference]?, NoError> { let delayRequest = true diff --git a/submodules/TelegramUI/TelegramUI/GridMessageItem.swift b/submodules/TelegramUI/TelegramUI/GridMessageItem.swift index 8092c49486..89f0e6f6f8 100644 --- a/submodules/TelegramUI/TelegramUI/GridMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/GridMessageItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private func mediaForMessage(_ message: Message) -> Media? { for media in message.media { diff --git a/submodules/TelegramUI/TelegramUI/GridMessageSelectionNode.swift b/submodules/TelegramUI/TelegramUI/GridMessageSelectionNode.swift index d29d2319b7..714696b7b5 100644 --- a/submodules/TelegramUI/TelegramUI/GridMessageSelectionNode.swift +++ b/submodules/TelegramUI/TelegramUI/GridMessageSelectionNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class GridMessageSelectionNode: ASDisplayNode { private let toggle: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/GroupInfoController.swift b/submodules/TelegramUI/TelegramUI/GroupInfoController.swift index f40ad66029..17aff0ee26 100644 --- a/submodules/TelegramUI/TelegramUI/GroupInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/GroupInfoController.swift @@ -6,8 +6,9 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents - +import TelegramPresentationData import SafariServices +import TelegramUIPreferences private final class GroupInfoArguments { let context: AccountContext @@ -37,8 +38,11 @@ private final class GroupInfoArguments { let openStickerPackSetup: () -> Void let openGroupTypeSetup: () -> Void let openLinkedChannelSetup: () -> Void + let openLocation: (PeerGeoLocation) -> Void + let changeLocation: () -> Void + let displayLocationContextMenu: (String) -> Void - init(context: AccountContext, avatarAndNameInfoContext: ItemListAvatarAndNameInfoItemContext, tapAvatarAction: @escaping () -> Void, changeProfilePhoto: @escaping () -> Void, pushController: @escaping (ViewController) -> Void, presentController: @escaping (ViewController, ViewControllerPresentationArguments) -> Void, changeNotificationMuteSettings: @escaping () -> Void, openPreHistory: @escaping () -> Void, openSharedMedia: @escaping () -> Void, openAdministrators: @escaping () -> Void, openPermissions: @escaping () -> Void, updateEditingName: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, updateEditingDescriptionText: @escaping (String) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, addMember: @escaping () -> Void, promotePeer: @escaping (RenderedChannelParticipant) -> Void, restrictPeer: @escaping (RenderedChannelParticipant) -> Void, removePeer: @escaping (PeerId) -> Void, leave: @escaping () -> Void, displayUsernameShareMenu: @escaping (String) -> Void, displayUsernameContextMenu: @escaping (String) -> Void, displayAboutContextMenu: @escaping (String) -> Void, aboutLinkAction: @escaping (TextLinkItemActionType, TextLinkItem) -> Void, openStickerPackSetup: @escaping () -> Void, openGroupTypeSetup: @escaping () -> Void, openLinkedChannelSetup: @escaping () -> Void) { + init(context: AccountContext, avatarAndNameInfoContext: ItemListAvatarAndNameInfoItemContext, tapAvatarAction: @escaping () -> Void, changeProfilePhoto: @escaping () -> Void, pushController: @escaping (ViewController) -> Void, presentController: @escaping (ViewController, ViewControllerPresentationArguments) -> Void, changeNotificationMuteSettings: @escaping () -> Void, openPreHistory: @escaping () -> Void, openSharedMedia: @escaping () -> Void, openAdministrators: @escaping () -> Void, openPermissions: @escaping () -> Void, updateEditingName: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, updateEditingDescriptionText: @escaping (String) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, addMember: @escaping () -> Void, promotePeer: @escaping (RenderedChannelParticipant) -> Void, restrictPeer: @escaping (RenderedChannelParticipant) -> Void, removePeer: @escaping (PeerId) -> Void, leave: @escaping () -> Void, displayUsernameShareMenu: @escaping (String) -> Void, displayUsernameContextMenu: @escaping (String) -> Void, displayAboutContextMenu: @escaping (String) -> Void, aboutLinkAction: @escaping (TextLinkItemActionType, TextLinkItem) -> Void, openStickerPackSetup: @escaping () -> Void, openGroupTypeSetup: @escaping () -> Void, openLinkedChannelSetup: @escaping () -> Void, openLocation: @escaping (PeerGeoLocation) -> Void, changeLocation: @escaping () -> Void, displayLocationContextMenu: @escaping (String) -> Void) { self.context = context self.avatarAndNameInfoContext = avatarAndNameInfoContext self.tapAvatarAction = tapAvatarAction @@ -65,6 +69,9 @@ private final class GroupInfoArguments { self.openStickerPackSetup = openStickerPackSetup self.openGroupTypeSetup = openGroupTypeSetup self.openLinkedChannelSetup = openLinkedChannelSetup + self.openLocation = openLocation + self.changeLocation = changeLocation + self.displayLocationContextMenu = displayLocationContextMenu } } @@ -81,11 +88,13 @@ private enum GroupInfoSection: ItemListSectionId { private enum GroupInfoEntryTag { case about case link + case location } private enum GroupInfoMemberStatus { case member case admin + case owner } private enum GroupEntryStableId: Hashable, Equatable { @@ -135,8 +144,10 @@ private enum GroupInfoEntry: ItemListNodeEntry { case info(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, peer: Peer?, cachedData: CachedPeerData?, state: ItemListAvatarAndNameInfoItemState, updatingAvatar: ItemListAvatarAndNameInfoItemUpdatingAvatar?) case setGroupPhoto(PresentationTheme, String) case groupDescriptionSetup(PresentationTheme, String, String) - case aboutHeader(PresentationTheme, String) case about(PresentationTheme, String) + case locationHeader(PresentationTheme, String) + case location(PresentationTheme, PeerGeoLocation) + case changeLocation(PresentationTheme, String) case link(PresentationTheme, String) case sharedMedia(PresentationTheme, String) case notifications(PresentationTheme, String, String) @@ -152,9 +163,9 @@ private enum GroupInfoEntry: ItemListNodeEntry { var section: ItemListSectionId { switch self { - case .info, .setGroupPhoto, .groupDescriptionSetup: + case .info, .setGroupPhoto, .groupDescriptionSetup, .about: return GroupInfoSection.info.rawValue - case .aboutHeader, .about, .link: + case .locationHeader, .location, .changeLocation, .link: return GroupInfoSection.about.rawValue case .groupTypeSetup, .linkedChannelSetup, .preHistory, .stickerPack: return GroupInfoSection.infoManagement.rawValue @@ -230,14 +241,26 @@ private enum GroupInfoEntry: ItemListNodeEntry { } else { return false } - case let .aboutHeader(lhsTheme, lhsText): - if case let .aboutHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + case let .about(lhsTheme, lhsText): + if case let .about(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { return true } else { return false } - case let .about(lhsTheme, lhsText): - if case let .about(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + case let .locationHeader(lhsTheme, lhsText): + if case let .locationHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .location(lhsTheme, lhsLocation): + if case let .location(rhsTheme, rhsLocation) = rhs, lhsTheme === rhsTheme, lhsLocation == rhsLocation { + return true + } else { + return false + } + case let .changeLocation(lhsTheme, lhsText): + if case let .changeLocation(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { return true } else { return false @@ -386,12 +409,16 @@ private enum GroupInfoEntry: ItemListNodeEntry { return 1 case .groupDescriptionSetup: return 2 - case .aboutHeader: - return 4 case .about: + return 3 + case .locationHeader: + return 4 + case .location: return 5 - case .link: + case .changeLocation: return 6 + case .link: + return 7 case .groupTypeSetup: return 8 case .linkedChannelSetup: @@ -409,11 +436,11 @@ private enum GroupInfoEntry: ItemListNodeEntry { case .administrators: return 15 case .addMember: - return 17 + return 16 case let .member(_, _, _, _, index, _, _, _, _, _, _, _, _, _): return 20 + index case .leave: - return 100000 + 1 + return 200000 + 1 } } @@ -424,7 +451,7 @@ private enum GroupInfoEntry: ItemListNodeEntry { func item(_ arguments: GroupInfoArguments) -> ListViewItem { switch self { case let .info(theme, strings, dateTimeFormat, peer, cachedData, state, updatingAvatar): - return ItemListAvatarAndNameInfoItem(account: arguments.context.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: nil, cachedData: cachedData, state: state, sectionId: self.section, style: .blocks(withTopInset: false), editingNameUpdated: { editingName in + return ItemListAvatarAndNameInfoItem(account: arguments.context.account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: nil, cachedData: cachedData, state: state, sectionId: self.section, style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, avatarTapped: { arguments.tapAvatarAction() @@ -433,16 +460,27 @@ private enum GroupInfoEntry: ItemListNodeEntry { return ItemListActionItem(theme: theme, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { arguments.changeProfilePhoto() }) - case let .aboutHeader(theme, text): - return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .about(theme, text): return ItemListMultilineTextItem(theme: theme, text: foldMultipleLineBreaks(text), enabledEntitiyTypes: [.url, .mention, .hashtag], sectionId: self.section, style: .blocks, longTapAction: { arguments.displayAboutContextMenu(text) }, linkItemAction: { action, itemLink in arguments.aboutLinkAction(action, itemLink) }, tag: GroupInfoEntryTag.about) + case let .locationHeader(theme, text): + return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .location(theme, location): + let imageSignal = chatMapSnapshotImage(account: arguments.context.account, resource: MapSnapshotMediaResource(latitude: location.latitude, longitude: location.longitude, width: 90, height: 90)) + return ItemListAddressItem(theme: theme, label: "", text: location.address.replacingOccurrences(of: ", ", with: "\n"), imageSignal: imageSignal, selected: nil, sectionId: self.section, style: .blocks, action: { + arguments.openLocation(location) + }, longTapAction: { + arguments.displayLocationContextMenu(location.address.replacingOccurrences(of: "\n", with: ", ")) + }, tag: GroupInfoEntryTag.location) + case let .changeLocation(theme, text): + return ItemListActionItem(theme: theme, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { + arguments.changeLocation() + }, clearHighlightAutomatically: false) case let .link(theme, url): - return ItemListActionItem(theme: theme, title: url, kind: .neutral, alignment: .natural, sectionId: self.section, style: .blocks, action: { + return ItemListActionItem(theme: theme, title: url, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { arguments.displayUsernameShareMenu(url) }, longTapAction: { arguments.displayUsernameContextMenu(url) @@ -492,6 +530,8 @@ private enum GroupInfoEntry: ItemListNodeEntry { case let .member(theme, strings, dateTimeFormat, nameDisplayOrder, _, _, peer, participant, presence, memberStatus, editing, actions, enabled, selectable): let label: String? switch memberStatus { + case .owner: + label = strings.GroupInfo_LabelOwner case .admin: label = strings.GroupInfo_LabelAdmin case .member: @@ -720,6 +760,10 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa } } else if let channel = view.peers[view.peerId] as? TelegramChannel { isPublic = channel.username != nil + if !isPublic, let cachedChannelData = view.cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil { + isPublic = true + } + isCreator = channel.flags.contains(.isCreator) if channel.hasPermission(.changeInfo) { canEditGroupInfo = true @@ -780,21 +824,35 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa entries.append(.administrators(presentationData.theme, presentationData.strings.GroupInfo_Administrators, "")) } } else if let channel = view.peers[view.peerId] as? TelegramChannel, let cachedChannelData = view.cachedData as? CachedChannelData { - if isCreator || (channel.adminRights != nil && channel.hasPermission(.pinMessages)) { - if cachedChannelData.flags.contains(.canChangeUsername) { - entries.append(GroupInfoEntry.groupTypeSetup(presentationData.theme, presentationData.strings.GroupInfo_GroupType, isPublic ? presentationData.strings.Channel_Setup_TypePublic : presentationData.strings.Channel_Setup_TypePrivate)) - if let linkedDiscussionPeerId = cachedChannelData.linkedDiscussionPeerId, let peer = view.peers[linkedDiscussionPeerId] { - let peerTitle: String - if let addressName = peer.addressName, !addressName.isEmpty { - peerTitle = "@\(addressName)" - } else { - peerTitle = peer.displayTitle - } - entries.append(GroupInfoEntry.linkedChannelSetup(presentationData.theme, presentationData.strings.Group_LinkedChannel, peerTitle)) - } + if isCreator, let location = cachedChannelData.peerGeoLocation { + entries.append(.locationHeader(presentationData.theme, presentationData.strings.GroupInfo_Location.uppercased())) + entries.append(.location(presentationData.theme, location)) + if cachedChannelData.flags.contains(.canChangePeerGeoLocation) { + entries.append(.changeLocation(presentationData.theme, presentationData.strings.Group_Location_ChangeLocation)) } - if !isPublic && cachedChannelData.linkedDiscussionPeerId == nil { - entries.append(GroupInfoEntry.preHistory(presentationData.theme, presentationData.strings.GroupInfo_GroupHistory, cachedChannelData.flags.contains(.preHistoryEnabled) ? presentationData.strings.GroupInfo_GroupHistoryVisible : presentationData.strings.GroupInfo_GroupHistoryHidden)) + } + + if isCreator || (channel.adminRights != nil && channel.hasPermission(.pinMessages)) { + if cachedChannelData.peerGeoLocation != nil { + if isCreator { + entries.append(GroupInfoEntry.groupTypeSetup(presentationData.theme, presentationData.strings.GroupInfo_PublicLink, channel.addressName ?? presentationData.strings.GroupInfo_PublicLinkAdd)) + } + } else { + if cachedChannelData.flags.contains(.canChangeUsername) { + entries.append(GroupInfoEntry.groupTypeSetup(presentationData.theme, presentationData.strings.GroupInfo_GroupType, isPublic ? presentationData.strings.Channel_Setup_TypePublic : presentationData.strings.Channel_Setup_TypePrivate)) + if let linkedDiscussionPeerId = cachedChannelData.linkedDiscussionPeerId, let peer = view.peers[linkedDiscussionPeerId] { + let peerTitle: String + if let addressName = peer.addressName, !addressName.isEmpty { + peerTitle = "@\(addressName)" + } else { + peerTitle = peer.displayTitle + } + entries.append(GroupInfoEntry.linkedChannelSetup(presentationData.theme, presentationData.strings.Group_LinkedChannel, peerTitle)) + } + } + if !isPublic && cachedChannelData.linkedDiscussionPeerId == nil { + entries.append(GroupInfoEntry.preHistory(presentationData.theme, presentationData.strings.GroupInfo_GroupHistory, cachedChannelData.flags.contains(.preHistoryEnabled) ? presentationData.strings.GroupInfo_GroupHistoryVisible : presentationData.strings.GroupInfo_GroupHistoryHidden)) + } } } @@ -829,20 +887,23 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa } } else { if let peer = peerViewMainPeer(view), peer.isScam { - entries.append(.aboutHeader(presentationData.theme, presentationData.strings.Channel_About_Title.uppercased())) entries.append(.about(presentationData.theme, presentationData.strings.GroupInfo_ScamGroupWarning)) } else if let cachedChannelData = view.cachedData as? CachedChannelData { if let about = cachedChannelData.about, !about.isEmpty { - entries.append(.aboutHeader(presentationData.theme, presentationData.strings.Channel_About_Title.uppercased())) entries.append(.about(presentationData.theme, about)) } - if let peer = view.peers[view.peerId] as? TelegramChannel, let username = peer.username, !username.isEmpty { - entries.append(.link(presentationData.theme, "t.me/" + username)) + if let peer = view.peers[view.peerId] as? TelegramChannel { + if let location = cachedChannelData.peerGeoLocation { + entries.append(.locationHeader(presentationData.theme, presentationData.strings.GroupInfo_Location.uppercased())) + entries.append(.location(presentationData.theme, location)) + } + if let username = peer.username, !username.isEmpty { + entries.append(.link(presentationData.theme, "t.me/" + username)) + } } } else if let cachedGroupData = view.cachedData as? CachedGroupData { if let about = cachedGroupData.about, !about.isEmpty { - entries.append(.aboutHeader(presentationData.theme, presentationData.strings.Channel_About_Title.uppercased())) entries.append(.about(presentationData.theme, about)) } } @@ -1072,7 +1133,7 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa let memberStatus: GroupInfoMemberStatus switch participant.participant { case .creator: - memberStatus = .admin + memberStatus = .owner case let .member(_, _, adminInfo, _): if adminInfo != nil { memberStatus = .admin @@ -1209,6 +1270,7 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: var endEditingImpl: (() -> Void)? var removePeerChatImpl: ((Peer, Bool) -> Void)? var errorImpl: (() -> Void)? + var clearHighlightImpl: (() -> Void)? let actionsDisposable = DisposableSet() @@ -1506,7 +1568,7 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: } } else if let channel = groupPeer as? TelegramChannel { if channel.hasPermission(.inviteMembers) { - if channel.adminRights != nil { + if channel.flags.contains(.isCreator) || (channel.adminRights != nil && channel.username == nil) { canCreateInviteLink = true } } @@ -1715,8 +1777,13 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: inviteByLinkImpl = { [weak contactsController] in contactsController?.dismiss() - - presentControllerImpl?(channelVisibilityController(context: context, peerId: peerView.peerId, mode: .privateLink, upgradedToSupergroup: { updatedPeerId, f in + let mode: ChannelVisibilityControllerMode + if groupPeer.addressName != nil { + mode = .generic + } else { + mode = .privateLink + } + presentControllerImpl?(channelVisibilityController(context: context, peerId: peerView.peerId, mode: mode, upgradedToSupergroup: { updatedPeerId, f in upgradedToSupergroupImpl?(updatedPeerId, f) }), ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet)) } @@ -1926,6 +1993,55 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: |> deliverOnMainQueue).start(next: { peerView in pushControllerImpl?(channelDiscussionGroupSetupController(context: context, peerId: peerView.peerId)) }) + }, openLocation: { location in + let _ = (peerView.get() + |> take(1) + |> deliverOnMainQueue).start(next: { peerView in + guard let peer = peerView.peers[peerView.peerId] else { + return + } + let mapMedia = TelegramMediaMap(latitude: location.latitude, longitude: location.longitude, geoPlace: nil, venue: MapVenue(title: peer.displayTitle, address: location.address, provider: nil, id: nil, type: nil), liveBroadcastingTimeout: nil) + let controller = legacyLocationController(message: nil, mapMedia: mapMedia, context: context, isModal: false, openPeer: { _ in }, sendLiveLocation: { _, _ in }, stopLiveLocation: {}, openUrl: { _ in }) + pushControllerImpl?(controller) + }) + }, changeLocation: { + let _ = (peerView.get() + |> take(1) + |> deliverOnMainQueue).start(next: { peerView in + guard let peer = peerView.peers[peerView.peerId] else { + return + } + + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let controller = legacyLocationPickerController(context: context, selfPeer: peer, peer: peer, sendLocation: { coordinate, _, address in + let addressSignal: Signal + if let address = address { + addressSignal = .single(address) + } else { + addressSignal = reverseGeocodeLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) + |> map { placemark in + if let placemark = placemark { + return placemark.fullAddress + } else { + return "\(coordinate.latitude), \(coordinate.longitude)" + } + } + } + + let _ = (addressSignal + |> mapToSignal { address -> Signal in + return updateChannelGeoLocation(postbox: context.account.postbox, network: context.account.network, channelId: peer.id, coordinate: (coordinate.latitude, coordinate.longitude), address: address) + } + |> deliverOnMainQueue).start(error: { errror in + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {})]), nil) + }) + }, sendLiveLocation: { _, _ in }, theme: presentationData.theme, customLocationPicker: true, presentationCompleted: { + clearHighlightImpl?() + }) + presentControllerImpl?(controller, nil) + }) + }, displayLocationContextMenu: { text in + displayCopyContextMenuImpl?(text, .location) }) let loadMoreControl = Atomic<(PeerId, PeerChannelMemberCategoryControl)?>(value: nil) @@ -2212,6 +2328,11 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: itemTag = tag } } + else if let itemNode = itemNode as? ItemListAddressItemNode { + if let tag = itemNode.tag as? GroupInfoEntryTag { + itemTag = tag + } + } if itemTag == tag { resultItemNode = itemNode return true @@ -2272,6 +2393,9 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId: [weak controller] in controller?.view.endEditing(true) } + clearHighlightImpl = { [weak controller] in + controller?.clearItemNodesHighlight(animated: true) + } let hapticFeedback = HapticFeedback() errorImpl = { [weak controller] in diff --git a/submodules/TelegramUI/TelegramUI/GroupInfoSearchNavigationContentNode.swift b/submodules/TelegramUI/TelegramUI/GroupInfoSearchNavigationContentNode.swift index 6bc3be6431..1ccf00de29 100644 --- a/submodules/TelegramUI/TelegramUI/GroupInfoSearchNavigationContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/GroupInfoSearchNavigationContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let searchBarFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/GroupPreHistorySetupController.swift b/submodules/TelegramUI/TelegramUI/GroupPreHistorySetupController.swift index 60d9c1f3f6..1d8856cc28 100644 --- a/submodules/TelegramUI/TelegramUI/GroupPreHistorySetupController.swift +++ b/submodules/TelegramUI/TelegramUI/GroupPreHistorySetupController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class GroupPreHistorySetupArguments { let toggle: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift b/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift index e444a077d6..2be4966113 100644 --- a/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift +++ b/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData enum GroupStickerPackCurrentItemContent: Equatable { case notFound diff --git a/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift b/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift index cc9c9decfa..0cb5ec6d30 100644 --- a/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift +++ b/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class GroupStickerPackSetupControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/GroupsInCommonController.swift b/submodules/TelegramUI/TelegramUI/GroupsInCommonController.swift index 7a533fbb18..27ff7ee61d 100644 --- a/submodules/TelegramUI/TelegramUI/GroupsInCommonController.swift +++ b/submodules/TelegramUI/TelegramUI/GroupsInCommonController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class GroupsInCommonControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/HashtagChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/HashtagChatInputContextPanelNode.swift index 9b9189d8b4..cff69c33c4 100644 --- a/submodules/TelegramUI/TelegramUI/HashtagChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/HashtagChatInputContextPanelNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import Display +import TelegramPresentationData private struct HashtagChatInputContextPanelEntryStableId: Hashable { let text: String diff --git a/submodules/TelegramUI/TelegramUI/HashtagChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/HashtagChatInputPanelItem.swift index 9df7b005d2..3f1869e979 100644 --- a/submodules/TelegramUI/TelegramUI/HashtagChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/HashtagChatInputPanelItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class HashtagChatInputPanelItem: ListViewItem { fileprivate let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/HashtagSearchController.swift b/submodules/TelegramUI/TelegramUI/HashtagSearchController.swift index 5977ce5356..df88518908 100644 --- a/submodules/TelegramUI/TelegramUI/HashtagSearchController.swift +++ b/submodules/TelegramUI/TelegramUI/HashtagSearchController.swift @@ -4,6 +4,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData final class HashtagSearchController: TelegramController { private let queue = Queue() @@ -40,7 +41,7 @@ final class HashtagSearchController: TelegramController { let search = searchMessages(account: context.account, location: location, query: query, state: nil) let foundMessages: Signal<[ChatListSearchEntry], NoError> = search |> map { result, _ in - return result.messages.map({ .message($0, result.readStates[$0.id.peerId], chatListPresentationData) }) + return result.messages.map({ .message($0, RenderedPeer(message: $0), result.readStates[$0.id.peerId], chatListPresentationData) }) } let interaction = ChatListNodeInteraction(activateSearch: { }, peerSelected: { peer in diff --git a/submodules/TelegramUI/TelegramUI/HashtagSearchControllerNode.swift b/submodules/TelegramUI/TelegramUI/HashtagSearchControllerNode.swift index 4c55c4a2b7..ef0de12e0a 100644 --- a/submodules/TelegramUI/TelegramUI/HashtagSearchControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/HashtagSearchControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Postbox import TelegramCore +import TelegramPresentationData final class HashtagSearchControllerNode: ASDisplayNode { private let toolbarBackgroundNode: ASDisplayNode diff --git a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputContextPanelNode.swift index de1fd3d76d..45ae79f531 100644 --- a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputContextPanelNode.swift @@ -5,6 +5,7 @@ import Postbox import TelegramCore import Display import SwiftSignalKit +import TelegramPresentationData private struct ChatContextResultStableId: Hashable { let result: ChatContextResult diff --git a/submodules/TelegramUI/TelegramUI/HorizontalPeerItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalPeerItem.swift index 1fa20b3871..8b06486c62 100644 --- a/submodules/TelegramUI/TelegramUI/HorizontalPeerItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalPeerItem.swift @@ -5,6 +5,7 @@ import Postbox import AsyncDisplayKit import TelegramCore import SwiftSignalKit +import TelegramPresentationData enum HorizontalPeerItemMode { case list diff --git a/submodules/TelegramUI/TelegramUI/HorizontalStickersChatContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/HorizontalStickersChatContextPanelNode.swift index 193f76d463..2232b9eae9 100755 --- a/submodules/TelegramUI/TelegramUI/HorizontalStickersChatContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalStickersChatContextPanelNode.swift @@ -5,6 +5,7 @@ import Postbox import TelegramCore import Display import SwiftSignalKit +import TelegramPresentationData final class HorizontalStickersChatContextPanelInteraction { var previewedStickerItem: StickerPackItem? diff --git a/submodules/TelegramUI/TelegramUI/InChatPrefetchManager.swift b/submodules/TelegramUI/TelegramUI/InChatPrefetchManager.swift index 0fbe3c6ee7..01fe5e1059 100644 --- a/submodules/TelegramUI/TelegramUI/InChatPrefetchManager.swift +++ b/submodules/TelegramUI/TelegramUI/InChatPrefetchManager.swift @@ -2,6 +2,8 @@ import Foundation import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences +import TelegramUIPreferences private final class PrefetchMediaContext { let fetchDisposable = MetaDisposable() diff --git a/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift b/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift index 6f1ca00e22..c2f6745deb 100644 --- a/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift +++ b/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class InstalledStickerPacksControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift index be2765a296..b44d45f0ff 100644 --- a/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private struct InstantImageGalleryThumbnailItem: GalleryThumbnailItem { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/InstantPageAnchorItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageAnchorItem.swift index d132d32b9f..4620a145e1 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageAnchorItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageAnchorItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPageAnchorItem: InstantPageItem { let wantsNode: Bool = false diff --git a/submodules/TelegramUI/TelegramUI/InstantPageArticleItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageArticleItem.swift index b49a49ae13..7b44506e6c 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageArticleItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageArticleItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPageArticleItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPageArticleNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageArticleNode.swift index a067b161c7..49a2fb4831 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageArticleNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageArticleNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class InstantPageArticleNode: ASDisplayNode, InstantPageNode { let item: InstantPageArticleItem diff --git a/submodules/TelegramUI/TelegramUI/InstantPageAudioItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageAudioItem.swift index 1a23febbf5..a053a80e4f 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageAudioItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageAudioItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPageAudioItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPageAudioNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageAudioNode.swift index 06fd06827f..014b7c8f64 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageAudioNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageAudioNode.swift @@ -5,6 +5,8 @@ import Postbox import SwiftSignalKit import AsyncDisplayKit import Display +import TelegramPresentationData +import UniversalMediaPlayer private func generatePlayButton(color: UIColor) -> UIImage? { return generateImage(CGSize(width: 48.0, height: 48.0), rotatedContext: { size, context in diff --git a/submodules/TelegramUI/TelegramUI/InstantPageContentNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageContentNode.swift index 91b1e57dee..bcef539cde 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageContentNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class InstantPageContentNode : ASDisplayNode { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/InstantPageController.swift b/submodules/TelegramUI/TelegramUI/InstantPageController.swift index 1019f8ec04..156e9e56c1 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageController.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageController.swift @@ -4,6 +4,8 @@ import TelegramCore import Postbox import SwiftSignalKit import Display +import TelegramPresentationData +import TelegramUIPreferences final class InstantPageController: ViewController { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/InstantPageControllerNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageControllerNode.swift index 0f2b5200c9..32a15ba75b 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageControllerNode.swift @@ -6,6 +6,8 @@ import SwiftSignalKit import AsyncDisplayKit import Display import SafariServices +import TelegramPresentationData +import TelegramUIPreferences final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/InstantPageDetailsItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageDetailsItem.swift index fb91e2748d..8fb6383e13 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageDetailsItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageDetailsItem.swift @@ -4,6 +4,7 @@ import Postbox import TelegramCore import AsyncDisplayKit import Display +import TelegramPresentationData final class InstantPageDetailsItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPageDetailsNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageDetailsNode.swift index 994c3e30a1..4d4dac96cd 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageDetailsNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageDetailsNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let detailsInset: CGFloat = 17.0 private let titleInset: CGFloat = 22.0 diff --git a/submodules/TelegramUI/TelegramUI/InstantPageFeedbackItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageFeedbackItem.swift index 6bcc947100..57072965f2 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageFeedbackItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageFeedbackItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPageFeedbackItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPageFeedbackNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageFeedbackNode.swift index c6171edbba..d64014b437 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageFeedbackNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageFeedbackNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class InstantPageFeedbackNode: ASDisplayNode, InstantPageNode { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/InstantPageGalleryController.swift b/submodules/TelegramUI/TelegramUI/InstantPageGalleryController.swift index bb8574cac9..e21028f11a 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageGalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageGalleryController.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import AsyncDisplayKit import TelegramCore import SafariServices +import TelegramPresentationData struct InstantPageGalleryEntryLocation: Equatable { let position: Int32 diff --git a/submodules/TelegramUI/TelegramUI/InstantPageGalleryFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageGalleryFooterContentNode.swift index 2bbef9dc3d..6ae2224d43 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageGalleryFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageGalleryFooterContentNode.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import Photos +import TelegramPresentationData private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white) diff --git a/submodules/TelegramUI/TelegramUI/InstantPageImageItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageImageItem.swift index 356e30d358..07ae7288f1 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageImageItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageImageItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData protocol InstantPageImageAttribute { } diff --git a/submodules/TelegramUI/TelegramUI/InstantPageImageNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageImageNode.swift index 929784878d..b553633486 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageImageNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageImageNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private struct FetchControls { let fetch: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/InstantPageItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageItem.swift index 21fbae4c58..8f6266aa20 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData protocol InstantPageItem { var frame: CGRect { get set } diff --git a/submodules/TelegramUI/TelegramUI/InstantPageLayout.swift b/submodules/TelegramUI/TelegramUI/InstantPageLayout.swift index 2615b00722..7df78329d1 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageLayout.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageLayout.swift @@ -3,6 +3,8 @@ import UIKit import TelegramCore import Postbox import Display +import TelegramPresentationData +import TelegramUIPreferences final class InstantPageLayout { let origin: CGPoint diff --git a/submodules/TelegramUI/TelegramUI/InstantPageMediaPlaylist.swift b/submodules/TelegramUI/TelegramUI/InstantPageMediaPlaylist.swift index 2798cd1e1d..2aa3926791 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageMediaPlaylist.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageMediaPlaylist.swift @@ -3,6 +3,7 @@ import UIKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences struct InstantPageMediaPlaylistItemId: SharedMediaPlaylistItemId { let index: Int diff --git a/submodules/TelegramUI/TelegramUI/InstantPageNavigationBar.swift b/submodules/TelegramUI/TelegramUI/InstantPageNavigationBar.swift index 19cd4acb30..886077b6bf 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageNavigationBar.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageNavigationBar.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData private let backArrowImage = NavigationBarTheme.generateBackArrowImage(color: .white) private let moreImage = generateTintedImage(image: UIImage(bundleImageName: "Instant View/MoreIcon"), color: .white) diff --git a/submodules/TelegramUI/TelegramUI/InstantPageNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageNode.swift index c1e945e63d..6d1745963b 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData protocol InstantPageNode { func updateIsVisible(_ isVisible: Bool) diff --git a/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceItem.swift b/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceItem.swift index fe7b5785f6..0da2123e97 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPagePeerReferenceItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceNode.swift b/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceNode.swift index 45833d2ad3..b8638410de 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPagePeerReferenceNode.swift @@ -5,6 +5,7 @@ import Postbox import SwiftSignalKit import AsyncDisplayKit import Display +import TelegramPresentationData private enum JoinState: Equatable { case none diff --git a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoItem.swift b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoItem.swift index d12e2eb76f..6327c3bbc6 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPagePlayableVideoItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift index 931444eda6..4a1f95d6b8 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private struct FetchControls { let fetch: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/InstantPageReferenceControllerNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageReferenceControllerNode.swift index cb889d644c..f297d34ca0 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageReferenceControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageReferenceControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SafariServices +import TelegramPresentationData class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollViewDelegate { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/InstantPageScrollableNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageScrollableNode.swift index 72844559aa..3b7ebaee04 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageScrollableNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageScrollableNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import TelegramCore import Postbox import Display +import TelegramPresentationData protocol InstantPageScrollableItem: class, InstantPageItem { var contentSize: CGSize { get } diff --git a/submodules/TelegramUI/TelegramUI/InstantPageSettingsItemTheme.swift b/submodules/TelegramUI/TelegramUI/InstantPageSettingsItemTheme.swift index 633c413031..21205497d2 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageSettingsItemTheme.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageSettingsItemTheme.swift @@ -1,6 +1,8 @@ import Foundation import UIKit import Display +import TelegramPresentationData +import TelegramUIPreferences final class InstantPageSettingsItemTheme: Equatable { let listBackgroundColor: UIColor diff --git a/submodules/TelegramUI/TelegramUI/InstantPageSettingsNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageSettingsNode.swift index 17ede0d08b..8e2df91941 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageSettingsNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageSettingsNode.swift @@ -4,6 +4,8 @@ import Display import AsyncDisplayKit import Postbox import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences private func generateArrowImage(color: UIColor) -> UIImage? { let smallRadius: CGFloat = 5.0 diff --git a/submodules/TelegramUI/TelegramUI/InstantPageSettingsThemeItemNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageSettingsThemeItemNode.swift index dd00adba64..3530f61cf1 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageSettingsThemeItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageSettingsThemeItemNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramUIPreferences private final class InstantPageSettingsThemeSelectorNode: ASDisplayNode { private let selectionNode: ASImageNode diff --git a/submodules/TelegramUI/TelegramUI/InstantPageShapeItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageShapeItem.swift index 470d7e9b30..521a97b162 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageShapeItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageShapeItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData enum InstantPageShape { case rect diff --git a/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItem.swift index 9b9534b74a..93f07a1b10 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPageSlideshowItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItemNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItemNode.swift index 1a094385e7..441ae8391e 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageSlideshowItemNode.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import AsyncDisplayKit import Display +import TelegramPresentationData private final class InstantPageSlideshowItemNode: ASDisplayNode { private var _index: Int? diff --git a/submodules/TelegramUI/TelegramUI/InstantPageStoredState.swift b/submodules/TelegramUI/TelegramUI/InstantPageStoredState.swift index cfdb1c1272..cfe84c104b 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageStoredState.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageStoredState.swift @@ -3,6 +3,7 @@ import UIKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences final class InstantPageStoredDetailsState: PostboxCoding { let index: Int32 diff --git a/submodules/TelegramUI/TelegramUI/InstantPageTableItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageTableItem.swift index ab6806b49c..edb73dd1d0 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageTableItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageTableItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import TelegramCore import Postbox import Display +import TelegramPresentationData private struct TableSide: OptionSet { var rawValue: Int32 = 0 diff --git a/submodules/TelegramUI/TelegramUI/InstantPageTextItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageTextItem.swift index 494ada50ca..048d3732e9 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageTextItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageTextItem.swift @@ -4,6 +4,7 @@ import TelegramCore import Display import Postbox import AsyncDisplayKit +import TelegramPresentationData final class InstantPageUrlItem: Equatable { let url: String diff --git a/submodules/TelegramUI/TelegramUI/InstantPageTheme.swift b/submodules/TelegramUI/TelegramUI/InstantPageTheme.swift index 515205b6ca..124925ab41 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageTheme.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageTheme.swift @@ -2,6 +2,8 @@ import Foundation import UIKit import Postbox import Display +import TelegramPresentationData +import TelegramUIPreferences enum InstantPageFontStyle { case sans diff --git a/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedItem.swift b/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedItem.swift index e28a29e09f..c528c15b14 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedItem.swift @@ -3,6 +3,7 @@ import UIKit import Postbox import TelegramCore import AsyncDisplayKit +import TelegramPresentationData final class InstantPageWebEmbedItem: InstantPageItem { var frame: CGRect diff --git a/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedNode.swift b/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedNode.swift index a8ec2afaae..beed035c1c 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPageWebEmbedNode.swift @@ -4,6 +4,7 @@ import TelegramCore import WebKit import AsyncDisplayKit import Display +import TelegramPresentationData private class WeakInstantPageWebEmbedNodeMessageHandler: NSObject, WKScriptMessageHandler { private let f: (WKScriptMessage) -> () diff --git a/submodules/TelegramUI/TelegramUI/InstantVideoRadialStatusNode.swift b/submodules/TelegramUI/TelegramUI/InstantVideoRadialStatusNode.swift index e328a16e1b..293bb32b7f 100644 --- a/submodules/TelegramUI/TelegramUI/InstantVideoRadialStatusNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantVideoRadialStatusNode.swift @@ -3,7 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit - +import UniversalMediaPlayer import LegacyComponents private final class InstantVideoRadialStatusNodeParameters: NSObject { diff --git a/submodules/TelegramUI/TelegramUI/InviteContactsController.swift b/submodules/TelegramUI/TelegramUI/InviteContactsController.swift index ccb5c75c1a..7a043f5ecb 100644 --- a/submodules/TelegramUI/TelegramUI/InviteContactsController.swift +++ b/submodules/TelegramUI/TelegramUI/InviteContactsController.swift @@ -6,6 +6,7 @@ import Postbox import SwiftSignalKit import TelegramCore import MessageUI +import TelegramPresentationData public class InviteContactsController: ViewController, MFMessageComposeViewControllerDelegate, UINavigationControllerDelegate { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/InviteContactsControllerNode.swift b/submodules/TelegramUI/TelegramUI/InviteContactsControllerNode.swift index 92f1845e50..fd9df9f1e4 100644 --- a/submodules/TelegramUI/TelegramUI/InviteContactsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/InviteContactsControllerNode.swift @@ -5,6 +5,8 @@ import UIKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences private enum InviteContactsEntryId: Hashable { case option(index: Int) @@ -349,20 +351,22 @@ final class InviteContactsControllerNode: ASDisplayNode { self?.requestShareTelegram?() }) - let existingNumbers: Signal, NoError> = account.postbox.contactPeersView(accountPeerId: nil, includePresences: false) - |> map { view -> Set in + let existingNumbers: Signal<(Set, Set), NoError> = account.postbox.contactPeersView(accountPeerId: nil, includePresences: false) + |> map { view -> (Set, Set) in var existingNumbers = Set() + var existingPeerIds = Set() for peer in view.peers { if let peer = peer as? TelegramUser, let phone = peer.phone { existingNumbers.insert(formatPhoneNumber(phone)) } + existingPeerIds.insert(peer.id) } - return existingNumbers + return (existingNumbers, existingPeerIds) } let currentSortedContacts = self.currentSortedContacts let sortedContacts: Signal<[(DeviceContactStableId, DeviceContactBasicData, Int32)], NoError> = combineLatest(existingNumbers, (context.sharedContext.contactDataManager?.basicData() ?? .single([:])) |> take(1)) - |> mapToSignal { existingNumbers, contacts -> Signal<[(DeviceContactStableId, DeviceContactBasicData, Int32)], NoError> in + |> mapToSignal { existingNumbersAndPeerIds, contacts -> Signal<[(DeviceContactStableId, DeviceContactBasicData, Int32)], NoError> in var mappedContacts: [(String, [DeviceContactNormalizedPhoneNumber])] = [] for (id, basicData) in contacts { mappedContacts.append((id: id, basicData.phoneNumbers.map({ phoneNumber in @@ -376,7 +380,7 @@ final class InviteContactsControllerNode: ASDisplayNode { for (id, basicData) in contacts { var found = false for number in basicData.phoneNumbers { - if existingNumbers.contains(formatPhoneNumber(number.value)) { + if existingNumbersAndPeerIds.0.contains(formatPhoneNumber(number.value)) { found = true } } diff --git a/submodules/TelegramUI/TelegramUI/InviteContactsCountPanelNode.swift b/submodules/TelegramUI/TelegramUI/InviteContactsCountPanelNode.swift index 32ba156924..be9ee6247c 100644 --- a/submodules/TelegramUI/TelegramUI/InviteContactsCountPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/InviteContactsCountPanelNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class InviteContactsCountPanelNode: ASDisplayNode { private let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ItemListActionItem.swift b/submodules/TelegramUI/TelegramUI/ItemListActionItem.swift index fa0df050a6..398d3e3d05 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListActionItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListActionKind { case generic @@ -25,9 +26,10 @@ class ItemListActionItem: ListViewItem, ItemListItem { let style: ItemListStyle let action: () -> Void let longTapAction: (() -> Void)? + let clearHighlightAutomatically: Bool let tag: Any? - init(theme: PresentationTheme, title: String, kind: ItemListActionKind, alignment: ItemListActionAlignment, sectionId: ItemListSectionId, style: ItemListStyle, action: @escaping () -> Void, longTapAction: (() -> Void)? = nil, tag: Any? = nil) { + init(theme: PresentationTheme, title: String, kind: ItemListActionKind, alignment: ItemListActionAlignment, sectionId: ItemListSectionId, style: ItemListStyle, action: @escaping () -> Void, longTapAction: (() -> Void)? = nil, clearHighlightAutomatically: Bool = true, tag: Any? = nil) { self.theme = theme self.title = title self.kind = kind @@ -36,6 +38,7 @@ class ItemListActionItem: ListViewItem, ItemListItem { self.style = style self.action = action self.longTapAction = longTapAction + self.clearHighlightAutomatically = clearHighlightAutomatically self.tag = tag } @@ -75,7 +78,9 @@ class ItemListActionItem: ListViewItem, ItemListItem { var selectable: Bool = true func selected(listView: ListView){ - listView.clearHighlightAnimated(true) + if self.clearHighlightAutomatically { + listView.clearHighlightAnimated(true) + } self.action() } } diff --git a/submodules/TelegramUI/TelegramUI/ItemListActivityTextItem.swift b/submodules/TelegramUI/TelegramUI/ItemListActivityTextItem.swift index 3b516a7347..360e1f4a1c 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListActivityTextItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListActivityTextItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class ItemListActivityTextItem: ListViewItem, ItemListItem { let displayActivity: Bool diff --git a/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift b/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift index 4bc277e32e..a85983d0bd 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData final class ItemListAddressItem: ListViewItem, ItemListItem { let theme: PresentationTheme @@ -11,19 +12,21 @@ final class ItemListAddressItem: ListViewItem, ItemListItem { let imageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? let selected: Bool? let sectionId: ItemListSectionId + let style: ItemListStyle let action: (() -> Void)? let longTapAction: (() -> Void)? let linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? let tag: Any? - init(theme: PresentationTheme, label: String, text: String, imageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?, selected: Bool? = nil, sectionId: ItemListSectionId, action: (() -> Void)?, longTapAction: (() -> Void)? = nil, linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? = nil, tag: Any? = nil) { + init(theme: PresentationTheme, label: String, text: String, imageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?, selected: Bool? = nil, sectionId: ItemListSectionId, style: ItemListStyle, action: (() -> Void)?, longTapAction: (() -> Void)? = nil, linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? = nil, tag: Any? = nil) { self.theme = theme self.label = label self.text = text self.imageSignal = imageSignal self.selected = selected self.sectionId = sectionId + self.style = style self.action = action self.longTapAction = longTapAction self.linkItemAction = linkItemAction @@ -88,6 +91,7 @@ class ItemListAddressItemNode: ListViewItemNode { private let bottomStripeNode: ASDisplayNode private let highlightedBackgroundNode: ASDisplayNode private let imageNode: TransformImageNode + private let iconNode: ASImageNode private var selectionNode: ItemListSelectableControlNode? var item: ItemListAddressItem? @@ -122,11 +126,14 @@ class ItemListAddressItemNode: ListViewItemNode { self.imageNode = TransformImageNode() self.imageNode.contentAnimations = [.firstUpdate, .subsequentUpdates] + self.iconNode = ASImageNode() + super.init(layerBacked: false, dynamicBounce: false) self.addSubnode(self.labelNode) self.addSubnode(self.textNode) self.addSubnode(self.imageNode) + self.addSubnode(self.iconNode) } func asyncLayout() -> (_ item: ItemListAddressItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation) -> Void) { @@ -144,11 +151,24 @@ class ItemListAddressItemNode: ListViewItemNode { updatedTheme = item.theme } - let insets = itemListNeighborsPlainInsets(neighbors) + let insets: UIEdgeInsets let leftInset: CGFloat = 16.0 + params.leftInset let rightInset: CGFloat = 8.0 + params.rightInset let separatorHeight = UIScreenPixel + let itemBackgroundColor: UIColor + let itemSeparatorColor: UIColor + switch item.style { + case .plain: + itemBackgroundColor = item.theme.list.plainBackgroundColor + itemSeparatorColor = item.theme.list.itemPlainSeparatorColor + insets = itemListNeighborsPlainInsets(neighbors) + case .blocks: + itemBackgroundColor = item.theme.list.itemBlocksBackgroundColor + itemSeparatorColor = item.theme.list.itemBlocksSeparatorColor + insets = itemListNeighborsGroupedInsets(neighbors) + } + var leftOffset: CGFloat = 0.0 var selectionNodeWidthAndApply: (CGFloat, (CGSize, Bool) -> ItemListSelectableControlNode)? if let selected = item.selected { @@ -164,12 +184,14 @@ class ItemListAddressItemNode: ListViewItemNode { let string = stringWithAppliedEntities(item.text, entities: [], baseColor: baseColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, fixedFont: textFixedFont) let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - leftOffset - leftInset - rightInset - 98.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) - let contentSize = CGSize(width: params.width, height: textLayout.size.height + 39.0) + let padding: CGFloat = !item.label.isEmpty ? 39.0 : 20.0 - let imageSide = min(90.0, contentSize.height - 18.0) + let imageSide = min(90.0, max(46.0, textLayout.size.height + padding - 18.0)) let imageSize = CGSize(width: imageSide, height: imageSide) let imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(radius: 4.0), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets())) + let contentSize = CGSize(width: params.width, height: max(textLayout.size.height + padding, imageSize.height + 18.0)) + let nodeLayout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) return (nodeLayout, { [weak self] animation in if let strongSelf = self { @@ -187,10 +209,14 @@ class ItemListAddressItemNode: ListViewItemNode { strongSelf.imageNode.clearContents() } + if strongSelf.iconNode.image == nil { + strongSelf.iconNode.image = UIImage(bundleImageName: "Peer Info/LocationIcon") + } + if let _ = updatedTheme { - strongSelf.topStripeNode.backgroundColor = item.theme.list.itemPlainSeparatorColor - strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemPlainSeparatorColor - strongSelf.backgroundNode.backgroundColor = item.theme.list.plainBackgroundColor + strongSelf.topStripeNode.backgroundColor = itemSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor + strongSelf.backgroundNode.backgroundColor = itemBackgroundColor strongSelf.highlightedBackgroundNode.backgroundColor = item.theme.list.itemHighlightedBackgroundColor } @@ -219,12 +245,18 @@ class ItemListAddressItemNode: ListViewItemNode { } strongSelf.labelNode.frame = CGRect(origin: CGPoint(x: leftOffset + leftInset, y: 11.0), size: labelLayout.size) - strongSelf.textNode.frame = CGRect(origin: CGPoint(x: leftOffset + leftInset, y: 31.0), size: textLayout.size) - strongSelf.imageNode.frame = CGRect(origin: CGPoint(x: params.width - imageSize.width - rightInset, y: floorToScreenPixels((contentSize.height - imageSize.height) / 2.0)), size: imageSize) + strongSelf.textNode.frame = CGRect(origin: CGPoint(x: leftOffset + leftInset, y: item.label.isEmpty ? 11.0 : 31.0), size: textLayout.size) + + let imageFrame = CGRect(origin: CGPoint(x: params.width - imageSize.width - rightInset, y: floorToScreenPixels((contentSize.height - imageSize.height) / 2.0)), size: imageSize) + strongSelf.imageNode.frame = imageFrame + + if let icon = strongSelf.iconNode.image { + strongSelf.iconNode.frame = CGRect(origin: CGPoint(x: imageFrame.minX + floorToScreenPixels((imageFrame.width - icon.size.width) / 2.0), y: imageFrame.minY + floorToScreenPixels((imageFrame.height - icon.size.height) / 2.0) - 7.0), size: icon.size) + strongSelf.iconNode.isHidden = imageSize.height < 50.0 + } let leftInset: CGFloat - let style = ItemListStyle.plain - switch style { + switch item.style { case .plain: leftInset = 16.0 + params.leftInset + leftOffset diff --git a/submodules/TelegramUI/TelegramUI/ItemListAvatarAndNameItem.swift b/submodules/TelegramUI/TelegramUI/ItemListAvatarAndNameItem.swift index ef451d0188..f265a1e277 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListAvatarAndNameItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListAvatarAndNameItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let updatingAvatarOverlayImage = generateFilledCircleImage(diameter: 66.0, color: UIColor(white: 0.0, alpha: 0.4), backgroundColor: nil) @@ -117,7 +118,7 @@ final class ItemListAvatarAndNameInfoItemContext { enum ItemListAvatarAndNameInfoItemStyle { case plain - case blocks(withTopInset: Bool) + case blocks(withTopInset: Bool, withExtendedBottomInset: Bool) } enum ItemListAvatarAndNameInfoItemUpdatingAvatar: Equatable { @@ -489,7 +490,7 @@ class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNode, Ite let separatorHeight = UIScreenPixel let contentSize: CGSize - let insets: UIEdgeInsets + var insets: UIEdgeInsets let itemBackgroundColor: UIColor let itemSeparatorColor: UIColor switch item.style { @@ -498,7 +499,7 @@ class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNode, Ite itemSeparatorColor = item.theme.list.itemPlainSeparatorColor contentSize = CGSize(width: params.width, height: 96.0) insets = itemListNeighborsPlainInsets(neighbors) - case let .blocks(withTopInset): + case let .blocks(withTopInset, withExtendedBottomInset): itemBackgroundColor = item.theme.list.itemBlocksBackgroundColor itemSeparatorColor = item.theme.list.itemBlocksSeparatorColor contentSize = CGSize(width: params.width, height: 92.0) @@ -513,6 +514,9 @@ class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNode, Ite topInset = separatorHeight + 35.0 } insets = UIEdgeInsets(top: topInset, left: 0.0, bottom: separatorHeight, right: 0.0) + if withExtendedBottomInset { + insets.bottom += 12.0 + } } } @@ -623,7 +627,7 @@ class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNode, Ite strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: params.width, height: contentSize.height)) strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: contentSize.height + UIScreenPixel)) strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: layoutSize.width, height: separatorHeight)) - strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: layoutSize.height - insets.top - separatorHeight), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: layoutSize.height - insets.top - insets.bottom), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight)) } let _ = nameNodeApply() diff --git a/submodules/TelegramUI/TelegramUI/ItemListCallListItem.swift b/submodules/TelegramUI/TelegramUI/ItemListCallListItem.swift index 2aff826fc6..285eef3010 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListCallListItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListCallListItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData class ItemListCallListItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ItemListCheckboxItem.swift b/submodules/TelegramUI/TelegramUI/ItemListCheckboxItem.swift index 39a02cefe1..bf2627c198 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListCheckboxItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListCheckboxItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListCheckboxItemStyle { case left diff --git a/submodules/TelegramUI/TelegramUI/ItemListController.swift b/submodules/TelegramUI/TelegramUI/ItemListController.swift index fe298379ae..dafed098ee 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListController.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListController.swift @@ -3,6 +3,7 @@ import UIKit import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData enum ItemListNavigationButtonStyle { case regular @@ -589,9 +590,14 @@ class ItemListController: ViewController, KeyShortcutR } } + func clearItemNodesHighlight(animated: Bool = false) { + (self.displayNode as! ItemListControllerNode).listNode.clearHighlightAnimated(animated) + } + func previewingCommit(_ viewControllerToCommit: UIViewController) { self.commitPreview?(viewControllerToCommit) } + public var keyShortcuts: [KeyShortcut] { return [KeyShortcut(input: UIKeyInputEscape, action: { [weak self] in if !(self?.navigationController?.topViewController is TabBarController) { diff --git a/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift b/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift index a37e7ff8fa..c24b1601ee 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData typealias ItemListSectionId = Int32 diff --git a/submodules/TelegramUI/TelegramUI/ItemListDisclosureItem.swift b/submodules/TelegramUI/TelegramUI/ItemListDisclosureItem.swift index 9cc4a1a5a6..b5ef0e3c4d 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListDisclosureItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListDisclosureItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListDisclosureItemTitleColor { case primary @@ -34,9 +35,10 @@ class ItemListDisclosureItem: ListViewItem, ItemListItem { let style: ItemListStyle let disclosureStyle: ItemListDisclosureStyle let action: (() -> Void)? + let clearHighlightAutomatically: Bool let tag: ItemListItemTag? - init(theme: PresentationTheme, icon: UIImage? = nil, title: String, enabled: Bool = true, titleColor: ItemListDisclosureItemTitleColor = .primary, label: String, labelStyle: ItemListDisclosureLabelStyle = .text, sectionId: ItemListSectionId, style: ItemListStyle, disclosureStyle: ItemListDisclosureStyle = .arrow, action: (() -> Void)?, tag: ItemListItemTag? = nil) { + init(theme: PresentationTheme, icon: UIImage? = nil, title: String, enabled: Bool = true, titleColor: ItemListDisclosureItemTitleColor = .primary, label: String, labelStyle: ItemListDisclosureLabelStyle = .text, sectionId: ItemListSectionId, style: ItemListStyle, disclosureStyle: ItemListDisclosureStyle = .arrow, action: (() -> Void)?, clearHighlightAutomatically: Bool = true, tag: ItemListItemTag? = nil) { self.theme = theme self.icon = icon self.title = title @@ -48,6 +50,7 @@ class ItemListDisclosureItem: ListViewItem, ItemListItem { self.style = style self.disclosureStyle = disclosureStyle self.action = action + self.clearHighlightAutomatically = clearHighlightAutomatically self.tag = tag } @@ -87,7 +90,9 @@ class ItemListDisclosureItem: ListViewItem, ItemListItem { var selectable: Bool = true func selected(listView: ListView){ - listView.clearHighlightAnimated(true) + if self.clearHighlightAutomatically { + listView.clearHighlightAnimated(true) + } if self.enabled { self.action?() } diff --git a/submodules/TelegramUI/TelegramUI/ItemListEditableDeleteControlNode.swift b/submodules/TelegramUI/TelegramUI/ItemListEditableDeleteControlNode.swift index 42fe5fe96d..1cb87549f5 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListEditableDeleteControlNode.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListEditableDeleteControlNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class ItemListEditableControlNode: ASDisplayNode { var tapped: (() -> Void)? diff --git a/submodules/TelegramUI/TelegramUI/ItemListEditableReorderControlNode.swift b/submodules/TelegramUI/TelegramUI/ItemListEditableReorderControlNode.swift index d9acb4e85e..ac8ff6ed17 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListEditableReorderControlNode.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListEditableReorderControlNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class ItemListEditableReorderControlNode: ASDisplayNode { var tapped: (() -> Void)? diff --git a/submodules/TelegramUI/TelegramUI/ItemListInfoItem.swift b/submodules/TelegramUI/TelegramUI/ItemListInfoItem.swift index 4f96d8e761..d8bf3a574e 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListInfoItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListInfoItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum InfoListItemText { case plain(String) diff --git a/submodules/TelegramUI/TelegramUI/ItemListItem.swift b/submodules/TelegramUI/TelegramUI/ItemListItem.swift index 6e0efcd790..6ace1c8d6d 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListItem.swift @@ -35,9 +35,15 @@ protocol ItemListItemFocusableNode { func focus() } +enum ItemListInsetWithOtherSection { + case none + case full + case reduced +} + enum ItemListNeighbor { case none - case otherSection(requestsNoInset: Bool) + case otherSection(ItemListInsetWithOtherSection) case sameSection(alwaysPlain: Bool) } @@ -50,7 +56,17 @@ func itemListNeighbors(item: ItemListItem, topItem: ItemListItem?, bottomItem: I let topNeighbor: ItemListNeighbor if let topItem = topItem { if topItem.sectionId != item.sectionId { - topNeighbor = .otherSection(requestsNoInset: topItem.requestsNoInset) + let topInset: ItemListInsetWithOtherSection + if topItem.requestsNoInset { + topInset = .none + } else { + if topItem is ItemListTextItem { + topInset = .reduced + } else { + topInset = .full + } + } + topNeighbor = .otherSection(topInset) } else { topNeighbor = .sameSection(alwaysPlain: topItem.isAlwaysPlain) } @@ -61,7 +77,13 @@ func itemListNeighbors(item: ItemListItem, topItem: ItemListItem?, bottomItem: I let bottomNeighbor: ItemListNeighbor if let bottomItem = bottomItem { if bottomItem.sectionId != item.sectionId { - bottomNeighbor = .otherSection(requestsNoInset: bottomItem.requestsNoInset) + let bottomInset: ItemListInsetWithOtherSection + if bottomItem.requestsNoInset { + bottomInset = .none + } else { + bottomInset = .full + } + bottomNeighbor = .otherSection(bottomInset) } else { bottomNeighbor = .sameSection(alwaysPlain: bottomItem.isAlwaysPlain) } @@ -96,11 +118,14 @@ func itemListNeighborsGroupedInsets(_ neighbors: ItemListNeighbors) -> UIEdgeIns topInset = UIScreenPixel + 35.0 case .sameSection: topInset = 0.0 - case let .otherSection(requestsNoInset): - if requestsNoInset { - topInset = 0.0 - } else { - topInset = UIScreenPixel + 35.0 + case let .otherSection(otherInset): + switch otherInset { + case .none: + topInset = 0.0 + case .full: + topInset = UIScreenPixel + 35.0 + case .reduced: + topInset = UIScreenPixel + 16.0 } } let bottomInset: CGFloat diff --git a/submodules/TelegramUI/TelegramUI/ItemListLoadingIndicatorEmptyStateItem.swift b/submodules/TelegramUI/TelegramUI/ItemListLoadingIndicatorEmptyStateItem.swift index 944bba183a..0d2cadb157 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListLoadingIndicatorEmptyStateItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListLoadingIndicatorEmptyStateItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class ItemListLoadingIndicatorEmptyStateItem: ItemListControllerEmptyStateItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ItemListMultilineInputItem.swift b/submodules/TelegramUI/TelegramUI/ItemListMultilineInputItem.swift index 1101f64714..4d9673d82e 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListMultilineInputItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListMultilineInputItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData struct ItemListMultilineInputItemTextLimit { let value: Int diff --git a/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift b/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift index 16d04c2a4c..e63bbd7017 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum TextLinkItemActionType { case tap diff --git a/submodules/TelegramUI/TelegramUI/ItemListPeerActionItem.swift b/submodules/TelegramUI/TelegramUI/ItemListPeerActionItem.swift index 66df4ef2bf..f7997746d5 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListPeerActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListPeerActionItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class ItemListPeerActionItem: ListViewItem, ItemListItem { let theme: PresentationTheme @@ -145,7 +146,7 @@ class ItemListPeerActionItemNode: ListViewItemNode { let separatorHeight = UIScreenPixel let insets = itemListNeighborsGroupedInsets(neighbors) - let contentSize = CGSize(width: params.width, height: 44.0) + let contentSize = CGSize(width: params.width, height: 50.0) let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) let layoutSize = layout.size @@ -166,7 +167,6 @@ class ItemListPeerActionItemNode: ListViewItemNode { let _ = titleApply() - let transition: ContainedViewLayoutTransition if animated { transition = ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring) @@ -209,9 +209,9 @@ class ItemListPeerActionItemNode: ListViewItemNode { strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight)) transition.updateFrame(node: strongSelf.bottomStripeNode, frame: CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height + bottomStripeOffset), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight))) - transition.updateFrame(node: strongSelf.titleNode, frame: CGRect(origin: CGPoint(x: leftInset + editingOffset, y: 11.0), size: titleLayout.size)) + transition.updateFrame(node: strongSelf.titleNode, frame: CGRect(origin: CGPoint(x: leftInset + editingOffset, y: 14.0), size: titleLayout.size)) - strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: 44.0 + UIScreenPixel + UIScreenPixel)) + strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: 50.0 + UIScreenPixel + UIScreenPixel)) } }) } diff --git a/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift b/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift index ebb91f4be8..cf3e0da28b 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListPeerItem.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences struct ItemListPeerItemEditing: Equatable { let editable: Bool diff --git a/submodules/TelegramUI/TelegramUI/ItemListPlaceholderItem.swift b/submodules/TelegramUI/TelegramUI/ItemListPlaceholderItem.swift index fa54d296dc..9f8ebed1b0 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListPlaceholderItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListPlaceholderItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class ItemListPlaceholderItem: ListViewItem, ItemListItem { let theme: PresentationTheme @@ -186,7 +187,7 @@ class ItemListPlaceholderItemNode: ListViewItemNode, ItemListItemNode { strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight)) } - strongSelf.textNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 17.0), size: textLayout.size) + strongSelf.textNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((params.width - textLayout.size.width) / 2.0), y: 17.0), size: textLayout.size) } }) } diff --git a/submodules/TelegramUI/TelegramUI/ItemListRecentSessionItem.swift b/submodules/TelegramUI/TelegramUI/ItemListRecentSessionItem.swift index 98391f7e79..213c6cbc76 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListRecentSessionItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListRecentSessionItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData struct ItemListRecentSessionItemEditing: Equatable { let editable: Bool diff --git a/submodules/TelegramUI/TelegramUI/ItemListSecretChatKeyItem.swift b/submodules/TelegramUI/TelegramUI/ItemListSecretChatKeyItem.swift index 181ef0b0d6..ff37b41d8b 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListSecretChatKeyItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListSecretChatKeyItem.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData class ItemListSecretChatKeyItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift b/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift index 609ab8d9ec..2c729af3c2 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListSectionHeaderItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListSectionHeaderAccessoryTextColor { case generic @@ -18,15 +19,17 @@ class ItemListSectionHeaderItem: ListViewItem, ItemListItem { let theme: PresentationTheme let text: String let multiline: Bool + let activityIndicator: Bool let accessoryText: ItemListSectionHeaderAccessoryText? let sectionId: ItemListSectionId let isAlwaysPlain: Bool = true - init(theme: PresentationTheme, text: String, multiline: Bool = false, accessoryText: ItemListSectionHeaderAccessoryText? = nil, sectionId: ItemListSectionId) { + init(theme: PresentationTheme, text: String, multiline: Bool = false, activityIndicator: Bool = false, accessoryText: ItemListSectionHeaderAccessoryText? = nil, sectionId: ItemListSectionId) { self.theme = theme self.text = text self.multiline = multiline + self.activityIndicator = activityIndicator self.accessoryText = accessoryText self.sectionId = sectionId } @@ -71,8 +74,11 @@ class ItemListSectionHeaderItem: ListViewItem, ItemListItem { private let titleFont = Font.regular(14.0) class ItemListSectionHeaderItemNode: ListViewItemNode { + private var item: ItemListSectionHeaderItem? + private let titleNode: TextNode private let accessoryTextNode: TextNode + private var activityIndicator: ActivityIndicator? private let activateArea: AccessibilityAreaNode @@ -101,6 +107,8 @@ class ItemListSectionHeaderItemNode: ListViewItemNode { let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeAccessoryTextLayout = TextNode.asyncLayout(self.accessoryTextNode) + let previousItem = self.item + return { item, params, neighbors in let leftInset: CGFloat = 15.0 + params.leftInset @@ -135,6 +143,8 @@ class ItemListSectionHeaderItemNode: ListViewItemNode { return (layout, { [weak self] in if let strongSelf = self { + strongSelf.item = item + let _ = titleApply() let _ = accessoryApply() @@ -143,6 +153,31 @@ class ItemListSectionHeaderItemNode: ListViewItemNode { strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 7.0), size: titleLayout.size) strongSelf.accessoryTextNode.frame = CGRect(origin: CGPoint(x: params.width - leftInset - accessoryLayout.size.width, y: 7.0), size: accessoryLayout.size) + + if previousItem?.activityIndicator != item.activityIndicator { + if item.activityIndicator { + let activityIndicator: ActivityIndicator + if let currentActivityIndicator = strongSelf.activityIndicator { + activityIndicator = currentActivityIndicator + } else { + activityIndicator = ActivityIndicator(type: .custom(item.theme.list.sectionHeaderTextColor, 18.0, 1.0, false)) + strongSelf.addSubnode(activityIndicator) + strongSelf.activityIndicator = activityIndicator + } + activityIndicator.isHidden = false + if previousItem != nil { + activityIndicator.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, removeOnCompletion: false) + } + } else if let activityIndicator = strongSelf.activityIndicator { + activityIndicator.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { finished in + if finished { + activityIndicator.isHidden = true + } + }) + } + } + + strongSelf.activityIndicator?.frame = CGRect(origin: CGPoint(x: strongSelf.titleNode.frame.maxX + 6.0, y: 7.0 - UIScreenPixel), size: CGSize(width: 18.0, height: 18.0)) } }) } diff --git a/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift b/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift index 95aa435779..f90676f947 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListSingleLineInputItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListSingleLineInputItemType: Equatable { case regular(capitalization: Bool, autocorrection: Bool) diff --git a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift index b9f38c0283..3c42a2f593 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData struct ItemListStickerPackItemEditing: Equatable { let editable: Bool diff --git a/submodules/TelegramUI/TelegramUI/ItemListSwitchItem.swift b/submodules/TelegramUI/TelegramUI/ItemListSwitchItem.swift index 8c6db97482..0684e96d6e 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListSwitchItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListSwitchItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListSwitchItemNodeType { case regular diff --git a/submodules/TelegramUI/TelegramUI/ItemListTextItem.swift b/submodules/TelegramUI/TelegramUI/ItemListTextItem.swift index e12cbce4d4..50a7802d77 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListTextItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListTextItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListTextItemText { case plain(String) diff --git a/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift b/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift index 229d897f3f..14fb93fac4 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ItemListTextWithLabelItemTextColor { case primary @@ -14,6 +15,7 @@ final class ItemListTextWithLabelItem: ListViewItem, ItemListItem { let theme: PresentationTheme let label: String let text: String + let style: ItemListStyle let labelColor: ItemListTextWithLabelItemTextColor let textColor: ItemListTextWithLabelItemTextColor let enabledEntitiyTypes: EnabledEntityTypes @@ -26,10 +28,11 @@ final class ItemListTextWithLabelItem: ListViewItem, ItemListItem { let tag: Any? - init(theme: PresentationTheme, label: String, text: String, labelColor: ItemListTextWithLabelItemTextColor = .primary, textColor: ItemListTextWithLabelItemTextColor = .primary, enabledEntitiyTypes: EnabledEntityTypes, multiline: Bool, selected: Bool? = nil, sectionId: ItemListSectionId, action: (() -> Void)?, longTapAction: (() -> Void)? = nil, linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? = nil, tag: Any? = nil) { + init(theme: PresentationTheme, label: String, text: String, style: ItemListStyle = .plain, labelColor: ItemListTextWithLabelItemTextColor = .primary, textColor: ItemListTextWithLabelItemTextColor = .primary, enabledEntitiyTypes: EnabledEntityTypes, multiline: Bool, selected: Bool? = nil, sectionId: ItemListSectionId, action: (() -> Void)?, longTapAction: (() -> Void)? = nil, linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? = nil, tag: Any? = nil) { self.theme = theme self.label = label self.text = text + self.style = style self.labelColor = labelColor self.textColor = textColor self.enabledEntitiyTypes = enabledEntitiyTypes @@ -225,9 +228,16 @@ class ItemListTextWithLabelItemNode: ListViewItemNode { strongSelf.accessibilityValue = item.text if let _ = updatedTheme { - strongSelf.topStripeNode.backgroundColor = item.theme.list.itemPlainSeparatorColor - strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemPlainSeparatorColor - strongSelf.backgroundNode.backgroundColor = item.theme.list.plainBackgroundColor + switch item.style { + case .plain: + strongSelf.topStripeNode.backgroundColor = item.theme.list.itemPlainSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemPlainSeparatorColor + strongSelf.backgroundNode.backgroundColor = item.theme.list.plainBackgroundColor + case .blocks: + strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor + strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor + } strongSelf.highlightedBackgroundNode.backgroundColor = item.theme.list.itemHighlightedBackgroundColor } @@ -258,8 +268,7 @@ class ItemListTextWithLabelItemNode: ListViewItemNode { strongSelf.textNode.frame = CGRect(origin: CGPoint(x: leftOffset + leftInset, y: 31.0), size: textLayout.size) let leftInset: CGFloat - let style = ItemListStyle.plain - switch style { + switch item.style { case .plain: leftInset = 16.0 + params.leftInset + leftOffset diff --git a/submodules/TelegramUI/TelegramUI/ItemListWebsiteItem.swift b/submodules/TelegramUI/TelegramUI/ItemListWebsiteItem.swift index 1e1d3a98a2..c2174102be 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListWebsiteItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListWebsiteItem.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences struct ItemListWebsiteItemEditing: Equatable { let editing: Bool diff --git a/submodules/TelegramUI/TelegramUI/JoinLinkPreviewController.swift b/submodules/TelegramUI/TelegramUI/JoinLinkPreviewController.swift index 79ffca558e..9c33b501fd 100644 --- a/submodules/TelegramUI/TelegramUI/JoinLinkPreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/JoinLinkPreviewController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData public final class JoinLinkPreviewController: ViewController { private var controllerNode: JoinLinkPreviewControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/JoinLinkPreviewControllerNode.swift b/submodules/TelegramUI/TelegramUI/JoinLinkPreviewControllerNode.swift index 2cc3f2992d..b2139000ea 100644 --- a/submodules/TelegramUI/TelegramUI/JoinLinkPreviewControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/JoinLinkPreviewControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData struct JoinLinkPreviewData { let isGroup: Bool diff --git a/submodules/TelegramUI/TelegramUI/JoinLinkPreviewPeerContentNode.swift b/submodules/TelegramUI/TelegramUI/JoinLinkPreviewPeerContentNode.swift index efa90e1148..bb7c77f4c1 100644 --- a/submodules/TelegramUI/TelegramUI/JoinLinkPreviewPeerContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/JoinLinkPreviewPeerContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 26.0)! diff --git a/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewContentNode.swift b/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewContentNode.swift index 77fc88522a..7ea90ec23f 100644 --- a/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData final class LanguageLinkPreviewContentNode: ASDisplayNode, ShareContentContainerNode { private var contentOffsetUpdated: ((CGFloat, ContainedViewLayoutTransition) -> Void)? diff --git a/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewController.swift b/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewController.swift index e6931edb30..da5709819e 100644 --- a/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData public final class LanguageLinkPreviewController: ViewController { private var controllerNode: LanguageLinkPreviewControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewControllerNode.swift b/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewControllerNode.swift index 98771656dc..9fcc8e9847 100644 --- a/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/LanguageLinkPreviewControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData final class LanguageLinkPreviewControllerNode: ViewControllerTracingNode, UIScrollViewDelegate { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/LanguageSuggestionController.swift b/submodules/TelegramUI/TelegramUI/LanguageSuggestionController.swift index 8aa8404278..f57f0a9572 100644 --- a/submodules/TelegramUI/TelegramUI/LanguageSuggestionController.swift +++ b/submodules/TelegramUI/TelegramUI/LanguageSuggestionController.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData struct LanguageSuggestionControllerStrings { let ChooseLanguage: String diff --git a/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift b/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift index 31771f1f4f..2f07df9558 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyAttachmentMenu.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import DeviceAccess func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: MessageMediaEditingOptions?, 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, sendMessagesWithSignals: @escaping ([Any]?) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController { let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat diff --git a/submodules/TelegramUI/TelegramUI/LegacyAvatarPicker.swift b/submodules/TelegramUI/TelegramUI/LegacyAvatarPicker.swift index 7ad23d3f0f..51f508e795 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyAvatarPicker.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyAvatarPicker.swift @@ -3,6 +3,7 @@ import UIKit import Display import SwiftSignalKit import LegacyComponents +import TelegramPresentationData func presentLegacyAvatarPicker(holder: Atomic, signup: Bool, theme: PresentationTheme, present: (ViewController, Any?) -> Void, openCurrent: (() -> Void)?, completion: @escaping (UIImage) -> Void) { let legacyController = LegacyController(presentation: .custom, theme: theme) diff --git a/submodules/TelegramUI/TelegramUI/LegacyBuffer.swift b/submodules/TelegramUI/TelegramUI/LegacyBuffer.swift new file mode 100644 index 0000000000..edafb9bbea --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/LegacyBuffer.swift @@ -0,0 +1,194 @@ +import Foundation + +class LegacyBuffer: CustomStringConvertible { + var data: UnsafeMutableRawPointer? + var _size: UInt = 0 + private var capacity: UInt = 0 + private let freeWhenDone: Bool + + var size: Int { + return Int(self._size) + } + + deinit { + if self.freeWhenDone { + free(self.data) + } + } + + init(memory: UnsafeMutableRawPointer?, size: Int, capacity: Int, freeWhenDone: Bool) { + self.data = memory + self._size = UInt(size) + self.capacity = UInt(capacity) + self.freeWhenDone = freeWhenDone + } + + init() { + self.data = nil + self._size = 0 + self.capacity = 0 + self.freeWhenDone = true + } + + convenience init(data: Data?) { + self.init() + + if let data = data { + data.withUnsafeBytes { bytes in + self.appendBytes(bytes, length: UInt(data.count)) + } + } + } + + func makeData() -> 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: LegacyBuffer) { + 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 LegacyBufferReader { + private let buffer: LegacyBuffer + private(set) var offset: UInt = 0 + + init(_ buffer: LegacyBuffer) { + 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) -> LegacyBuffer? { + if count >= 0 && self.offset + UInt(count) <= self.buffer._size { + let buffer = LegacyBuffer() + 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: (LegacyBuffer) -> T) -> T? { + if count >= 0 && self.offset + UInt(count) <= self.buffer._size { + return f(LegacyBuffer(memory: self.buffer.data!.advanced(by: Int(self.offset)), size: count, capacity: count, freeWhenDone: false)) + } + return nil + } +} diff --git a/submodules/TelegramUI/TelegramUI/LegacyChannelIntroController.swift b/submodules/TelegramUI/TelegramUI/LegacyChannelIntroController.swift deleted file mode 100644 index cc2ee52ab1..0000000000 --- a/submodules/TelegramUI/TelegramUI/LegacyChannelIntroController.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation -import TelegramCore -import Display - -import TelegramUIPrivateModule - -func legacyChannelIntroController(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings) -> ViewController { - let controller = LegacyController(presentation: .custom, theme: theme) - controller.bind(controller: TGChannelIntroController(context: controller.context, getLocalizedString: { string in - guard let string = string else { - return nil - } - if let value = strings.primaryComponent.dict[string] { - return value - } else if let value = strings.secondaryComponent?.dict[string] { - return value - } else { - return string - } - }, theme: TGChannelIntroControllerTheme(backgroundColor: theme.list.plainBackgroundColor, primaryColor: theme.list.itemPrimaryTextColor, secondaryColor: theme.list.itemSecondaryTextColor, accentColor: theme.list.itemAccentColor, backArrowImage: NavigationBarTheme.generateBackArrowImage(color: theme.list.itemAccentColor), introImage: UIImage(bundleImageName: "Chat/Intro/ChannelIntro")), dismiss: { [weak controller] in - if let navigationController = controller?.navigationController as? NavigationController { - _ = navigationController.popViewController(animated: true) - } - }, completion: { [weak controller] in - if let navigationController = controller?.navigationController as? NavigationController { - navigationController.replaceTopController(createChannelController(context: context), animated: true) - } - })!) - return controller -} diff --git a/Telegram-iOS/LegacyChatImport.swift b/submodules/TelegramUI/TelegramUI/LegacyChatImport.swift similarity index 99% rename from Telegram-iOS/LegacyChatImport.swift rename to submodules/TelegramUI/TelegramUI/LegacyChatImport.swift index bdede4debd..772ee99c0b 100644 --- a/Telegram-iOS/LegacyChatImport.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyChatImport.swift @@ -68,7 +68,7 @@ private struct SecretChatData { } private func readSecretChatParticipantData(accountPeerId: PeerId, data: Data) -> (SecretChatRole, PeerId)? { - let reader = BufferReader(Buffer(data: data)) + let reader = LegacyBufferReader(LegacyBuffer(data: data)) guard reader.readInt32() == Int32(bitPattern: 0xabcdef12) else { return nil @@ -101,7 +101,7 @@ private func readSecretChatParticipantData(accountPeerId: PeerId, data: Data) -> return (adminId == accountPeerId.id ? .creator : .participant, PeerId(namespace: Namespaces.Peer.CloudUser, id: otherPeerId)) } -private func readSecretChatData(reader: BufferReader) -> SecretChatData? { +private func readSecretChatData(reader: LegacyBufferReader) -> SecretChatData? { guard let version = reader.readBytesAsInt32(1) else { return nil } @@ -196,7 +196,7 @@ let registeredAttachmentParsers: Bool = { }() private func parseSecretChatData(peerId: PeerId, data: Data, unreadCount: Int32) -> (SecretChatData, [MessageId.Namespace: PeerReadState], Int32)? { - let reader = BufferReader(Buffer(data: data)) + let reader = LegacyBufferReader(LegacyBuffer(data: data)) guard let magic = reader.readInt32() else { return nil } @@ -271,7 +271,7 @@ private func loadLegacyPeerCustomProperyData(database: SqliteInterface, peerId: case let .hash(hash): keyHash = hash } - let reader = BufferReader(Buffer(data: propertiesData)) + let reader = LegacyBufferReader(LegacyBuffer(data: propertiesData)) guard let _ = reader.readInt32() else { return nil @@ -607,7 +607,7 @@ private func importChannelBroadcastPreferences(account: TemporaryAccount, basePa var peerIdsWithMutedMessages: [Int64] = [] for peerId in peerIds { if let data = loadLegacyPeerCustomProperyData(database: database, peerId: peerId, key: .hash(0x374BF349)), !data.isEmpty { - let reader = BufferReader(Buffer(data: data)) + let reader = LegacyBufferReader(LegacyBuffer(data: data)) guard let version = reader.readBytesAsInt32(1) else { continue } diff --git a/submodules/TelegramUI/TelegramUI/LegacyComponentsStickers.swift b/submodules/TelegramUI/TelegramUI/LegacyComponentsStickers.swift index dbaf554abe..07c2de8cb1 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyComponentsStickers.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyComponentsStickers.swift @@ -4,6 +4,7 @@ import LegacyComponents import Postbox import TelegramCore import SwiftSignalKit +import Display func stickerFromLegacyDocument(_ documentAttachment: TGDocumentMediaAttachment) -> TelegramMediaFile? { if documentAttachment.isSticker() { diff --git a/submodules/TelegramUI/TelegramUI/LegacyController.swift b/submodules/TelegramUI/TelegramUI/LegacyController.swift index 8e8466516b..99f7c3e5ab 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyController.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyController.swift @@ -3,6 +3,7 @@ import UIKit import Display import SwiftSignalKit import LegacyComponents +import TelegramPresentationData public enum LegacyControllerPresentation { case custom diff --git a/Telegram-iOS/LegacyDataImport.swift b/submodules/TelegramUI/TelegramUI/LegacyDataImport.swift similarity index 100% rename from Telegram-iOS/LegacyDataImport.swift rename to submodules/TelegramUI/TelegramUI/LegacyDataImport.swift diff --git a/Telegram-iOS/LegacyDataImportSplash.swift b/submodules/TelegramUI/TelegramUI/LegacyDataImportSplash.swift similarity index 99% rename from Telegram-iOS/LegacyDataImportSplash.swift rename to submodules/TelegramUI/TelegramUI/LegacyDataImportSplash.swift index 2f349190d5..1b1cf3642c 100644 --- a/Telegram-iOS/LegacyDataImportSplash.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyDataImportSplash.swift @@ -1,7 +1,7 @@ import Foundation import Display import AsyncDisplayKit -import TelegramUI +import TelegramPresentationData final class LegacyDataImportSplash: WindowCoveringView { private let theme: PresentationTheme? diff --git a/Telegram-iOS/LegacyFileImport.swift b/submodules/TelegramUI/TelegramUI/LegacyFileImport.swift similarity index 99% rename from Telegram-iOS/LegacyFileImport.swift rename to submodules/TelegramUI/TelegramUI/LegacyFileImport.swift index bf0a914b14..ebc8e6d67c 100644 --- a/Telegram-iOS/LegacyFileImport.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyFileImport.swift @@ -126,7 +126,7 @@ func loadLegacyFiles(account: TemporaryAccount, basePath: String, accountPeerId: for type in mediaTypes { database.select("SELECT mids FROM media_cache_v29 WHERE media_type=\(type) ORDER BY date DESC LIMIT 32000", { cursor in let midsData = cursor.getData(at: 0) - let reader = BufferReader(Buffer(data: midsData)) + let reader = LegacyBufferReader(LegacyBuffer(data: midsData)) while true { if let mid = reader.readInt32() { chatMessageIds.append(mid) diff --git a/submodules/TelegramUI/TelegramUI/LegacyICloudFileController.swift b/submodules/TelegramUI/TelegramUI/LegacyICloudFileController.swift index 94b43b979a..c3a37eecac 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyICloudFileController.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyICloudFileController.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import Display +import TelegramPresentationData private final class LegacyICloudFileController: LegacyController, UIDocumentPickerDelegate { let completion: ([URL]) -> Void diff --git a/submodules/TelegramUI/TelegramUI/LegacyImagePicker.swift b/submodules/TelegramUI/TelegramUI/LegacyImagePicker.swift index c565a0869f..ac7c3e4303 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyImagePicker.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyImagePicker.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import LegacyComponents +import TelegramPresentationData private final class LegacyImagePickerController: LegacyController, TGLegacyCameraControllerDelegate, TGImagePickerControllerDelegate { private let completion: (UIImage?) -> Void diff --git a/submodules/TelegramUI/TelegramUI/LegacyInstantVideoController.swift b/submodules/TelegramUI/TelegramUI/LegacyInstantVideoController.swift index 4e1cbeebb5..72fde23d43 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyInstantVideoController.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyInstantVideoController.swift @@ -4,6 +4,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData import LegacyComponents diff --git a/submodules/TelegramUI/TelegramUI/LegacyLocationController.swift b/submodules/TelegramUI/TelegramUI/LegacyLocationController.swift index 5d4c2410ab..400775f304 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyLocationController.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyLocationController.swift @@ -4,6 +4,7 @@ import Display import LegacyComponents import TelegramCore import Postbox +import TelegramPresentationData private func generateClearIcon(color: UIColor) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Clear"), color: color) diff --git a/submodules/TelegramUI/TelegramUI/LegacyLocationPicker.swift b/submodules/TelegramUI/TelegramUI/LegacyLocationPicker.swift index c72cc85e90..760bc75a6d 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyLocationPicker.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyLocationPicker.swift @@ -5,14 +5,18 @@ import LegacyComponents import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private func generateClearIcon(color: UIColor) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Clear"), color: color) } -func legacyLocationPickerController(context: AccountContext, selfPeer: Peer, peer: Peer, sendLocation: @escaping (CLLocationCoordinate2D, MapVenue?) -> Void, sendLiveLocation: @escaping (CLLocationCoordinate2D, Int32) -> Void, theme: PresentationTheme) -> ViewController { +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 { let legacyController = LegacyController(presentation: .modal(animateIn: true), theme: theme) - let controller = TGLocationPickerController(context: legacyController.context, intent: TGLocationPickerControllerDefaultIntent)! + legacyController.presentationCompleted = { + presentationCompleted() + } + let controller = TGLocationPickerController(context: legacyController.context, intent: customLocationPicker ? TGLocationPickerControllerCustomLocationIntent : TGLocationPickerControllerDefaultIntent)! controller.peer = makeLegacyPeer(selfPeer) controller.receivingPeer = makeLegacyPeer(peer) controller.pallete = legacyLocationPalette(from: theme) @@ -21,7 +25,7 @@ func legacyLocationPickerController(context: AccountContext, selfPeer: Peer, pee Namespaces.Peer.CloudGroup, Namespaces.Peer.CloudUser ]) - if namespacesWithEnabledLiveLocation.contains(peer.id.namespace) { + if namespacesWithEnabledLiveLocation.contains(peer.id.namespace) && !customLocationPicker { controller.allowLiveLocationSharing = true } let navigationController = TGNavigationController(controllers: [controller])! @@ -30,10 +34,10 @@ func legacyLocationPickerController(context: AccountContext, selfPeer: Peer, pee }, rootController: nil) legacyController.bind(controller: navigationController) legacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) - controller.locationPicked = { [weak legacyController] coordinate, venue in + controller.locationPicked = { [weak legacyController] coordinate, venue, address in sendLocation(coordinate, venue.flatMap { venue in return MapVenue(title: venue.title, address: venue.address, provider: venue.provider, id: venue.venueId, type: venue.type) - }) + }, address) legacyController?.dismiss() } controller.liveLocationStarted = { [weak legacyController] coordinate, period in diff --git a/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift b/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift index af3cfaa967..0fae122c24 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyMediaPickers.swift @@ -6,8 +6,9 @@ import TelegramCore import Postbox import SSignalKit import Display - +import TelegramPresentationData import TelegramUIPrivateModule +import DeviceAccess func guessMimeTypeByFileExtension(_ ext: String) -> String { return TGMimeTypeMap.mimeType(forExtension: ext) ?? "application/binary" @@ -36,7 +37,7 @@ func legacyAssetPicker(context: AccountContext, presentationData: PresentationDa return Signal { subscriber in let intent = fileMode ? TGMediaAssetsControllerSendFileIntent : TGMediaAssetsControllerSendMediaIntent - DeviceAccess.authorizeAccess(to: .mediaLibrary(.send), context: context, presentationData: presentationData, present: context.sharedContext.presentGlobalController, openSettings: context.sharedContext.applicationBindings.openSettings, { value in + DeviceAccess.authorizeAccess(to: .mediaLibrary(.send), presentationData: presentationData, present: context.sharedContext.presentGlobalController, openSettings: context.sharedContext.applicationBindings.openSettings, { value in if !value { subscriber.putError(Void()) return diff --git a/Telegram-iOS/LegacyPreferencesImport.swift b/submodules/TelegramUI/TelegramUI/LegacyPreferencesImport.swift similarity index 99% rename from Telegram-iOS/LegacyPreferencesImport.swift rename to submodules/TelegramUI/TelegramUI/LegacyPreferencesImport.swift index f0902124ab..3ddb5f2e46 100644 --- a/Telegram-iOS/LegacyPreferencesImport.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyPreferencesImport.swift @@ -8,12 +8,12 @@ import MtProtoKit #else import MtProtoKitDynamic #endif -import TelegramUI +import TelegramUIPreferences #if BUCK import AppBinaryPrivate #endif - +import TelegramUIPrivateModule import LegacyComponents @objc(TGPresentationState) private final class TGPresentationState: NSObject, NSCoding { @@ -149,7 +149,7 @@ func importLegacyPreferences(accountManager: AccountManager, account: TemporaryA var passcodeChallenge: PostboxAccessChallengeData? if let data = try? Data(contentsOf: URL(fileURLWithPath: documentsPath + "/x.y")) { - let reader = BufferReader(Buffer(data: data)) + let reader = LegacyBufferReader(LegacyBuffer(data: data)) if let mode = reader.readBytesAsInt32(1), let length = reader.readInt32(), let passwordData = reader.readBuffer(Int(length))?.makeData(), let passwordText = String(data: passwordData, encoding: .utf8) { var lockTimeout: Int32? if let value = UserDefaults.standard.object(forKey: "Passcode_lockTimeout") as? Int { diff --git a/Telegram-iOS/LegacyResourceImport.swift b/submodules/TelegramUI/TelegramUI/LegacyResourceImport.swift similarity index 100% rename from Telegram-iOS/LegacyResourceImport.swift rename to submodules/TelegramUI/TelegramUI/LegacyResourceImport.swift diff --git a/submodules/TelegramUI/TelegramUI/LegacySecureIdScanController.swift b/submodules/TelegramUI/TelegramUI/LegacySecureIdScanController.swift index 3ee169c92e..a4675b66a3 100644 --- a/submodules/TelegramUI/TelegramUI/LegacySecureIdScanController.swift +++ b/submodules/TelegramUI/TelegramUI/LegacySecureIdScanController.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import LegacyComponents +import TelegramPresentationData func legacySecureIdScanController(theme: PresentationTheme, strings: PresentationStrings, finished: @escaping (SecureIdRecognizedDocumentData?) -> Void) -> ViewController { let legacyController = LegacyController(presentation: .modal(animateIn: true), theme: theme, strings: strings) diff --git a/Telegram-iOS/LegacyUserDataImport.swift b/submodules/TelegramUI/TelegramUI/LegacyUserDataImport.swift similarity index 87% rename from Telegram-iOS/LegacyUserDataImport.swift rename to submodules/TelegramUI/TelegramUI/LegacyUserDataImport.swift index e734efb6d0..e4019e944c 100644 --- a/Telegram-iOS/LegacyUserDataImport.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyUserDataImport.swift @@ -23,7 +23,7 @@ func loadLegacyUser(database: SqliteInterface, id: Int32) -> (TelegramUser, Tele photo.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 600.0, height: 600.0), resource: resource)) } - let user = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: cursor.getInt32(at: 0)), accessHash: accessHash == 0 ? nil : accessHash, firstName: firstName.isEmpty ? nil : firstName, lastName: lastName.isEmpty ? nil : lastName, username: username.isEmpty ? nil : username, phone: phone.isEmpty ? nil : phone, photo: photo, botInfo: nil, restrictionInfo: nil, flags: []) + let user = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: cursor.getInt32(at: 0)), accessHash: accessHash == 0 ? nil : .personal(accessHash), firstName: firstName.isEmpty ? nil : firstName, lastName: lastName.isEmpty ? nil : lastName, username: username.isEmpty ? nil : username, phone: phone.isEmpty ? nil : phone, photo: photo, botInfo: nil, restrictionInfo: nil, flags: []) let status: UserPresenceStatus let lastSeen = cursor.getInt32(at: 7) diff --git a/submodules/TelegramUI/TelegramUI/LegacyWallpaperEditor.swift b/submodules/TelegramUI/TelegramUI/LegacyWallpaperEditor.swift index f10125ae28..a98541296d 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyWallpaperEditor.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyWallpaperEditor.swift @@ -3,6 +3,8 @@ import UIKit import Display import SwiftSignalKit import LegacyComponents +import TelegramPresentationData +import DeviceAccess private final class LegacyWallpaperEditorController: LegacyController, TGWallpaperControllerDelegate { private let completion: (UIImage?) -> Void @@ -53,7 +55,7 @@ func legacyWallpaperPicker(context: AccountContext, presentationData: Presentati return Signal { subscriber in let intent = TGMediaAssetsControllerSetCustomWallpaperIntent - DeviceAccess.authorizeAccess(to: .mediaLibrary(.wallpaper), context: context, presentationData: presentationData, present: context.sharedContext.presentGlobalController, openSettings: context.sharedContext.applicationBindings.openSettings, { value in + DeviceAccess.authorizeAccess(to: .mediaLibrary(.wallpaper), presentationData: presentationData, present: context.sharedContext.presentGlobalController, openSettings: context.sharedContext.applicationBindings.openSettings, { value in if !value { subscriber.putError(Void()) return diff --git a/submodules/TelegramUI/TelegramUI/LegacyWebSearchEditor.swift b/submodules/TelegramUI/TelegramUI/LegacyWebSearchEditor.swift index 4174296f53..2d361d6c65 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyWebSearchEditor.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyWebSearchEditor.swift @@ -6,6 +6,7 @@ import TelegramCore import Postbox import SSignalKit import Display +import TelegramPresentationData func presentLegacyWebSearchEditor(context: AccountContext, theme: PresentationTheme, result: ChatContextResult, initialLayout: ContainerViewLayout?, updateHiddenMedia: @escaping (String?) -> Void, transitionHostView: @escaping () -> UIView?, transitionView: @escaping (ChatContextResult) -> UIView?, completed: @escaping (UIImage) -> Void, present: @escaping (ViewController, Any?) -> Void) { guard let item = legacyWebSearchItem(account: context.account, result: result) else { diff --git a/submodules/TelegramUI/TelegramUI/LegacyWebSearchGallery.swift b/submodules/TelegramUI/TelegramUI/LegacyWebSearchGallery.swift index f5f0ccede7..d302c49ee4 100644 --- a/submodules/TelegramUI/TelegramUI/LegacyWebSearchGallery.swift +++ b/submodules/TelegramUI/TelegramUI/LegacyWebSearchGallery.swift @@ -7,6 +7,7 @@ import Postbox import SSignalKit import UIKit import Display +import TelegramPresentationData class LegacyWebSearchItem: NSObject, TGMediaEditableItem, TGMediaSelectableItem { var isVideo: Bool { diff --git a/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift b/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift index 1599d71689..22b75af6f9 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData private let timezoneOffset: Int32 = { let nowTimestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) diff --git a/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift b/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift index 070325494d..82d6464ed2 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let extensionImageCache = Atomic<[UInt32: UIImage]>(value: [:]) diff --git a/submodules/TelegramUI/TelegramUI/ListMessageItem.swift b/submodules/TelegramUI/TelegramUI/ListMessageItem.swift index 31a8929526..84e34aa529 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class ListMessageItem: ListViewItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift b/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift index 8e82eea0b7..89cc1f653f 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let titleFont = Font.medium(16.0) private let descriptionFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/ListSectionHeaderNode.swift b/submodules/TelegramUI/TelegramUI/ListSectionHeaderNode.swift index cb6555d4ee..2a80960520 100644 --- a/submodules/TelegramUI/TelegramUI/ListSectionHeaderNode.swift +++ b/submodules/TelegramUI/TelegramUI/ListSectionHeaderNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.bold(13.0) private let actionFont = Font.medium(13.0) diff --git a/submodules/TelegramUI/TelegramUI/Locale.swift b/submodules/TelegramUI/TelegramUI/Locale.swift index b3da528516..c8d6425612 100644 --- a/submodules/TelegramUI/TelegramUI/Locale.swift +++ b/submodules/TelegramUI/TelegramUI/Locale.swift @@ -1,4 +1,5 @@ import Foundation +import TelegramPresentationData private let systemLocaleRegionSuffix: String = { let identifier = Locale.current.identifier diff --git a/submodules/TelegramUI/TelegramUI/LocalizationListController.swift b/submodules/TelegramUI/TelegramUI/LocalizationListController.swift index cdd9a6360d..6aafe2a3d5 100644 --- a/submodules/TelegramUI/TelegramUI/LocalizationListController.swift +++ b/submodules/TelegramUI/TelegramUI/LocalizationListController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import SwiftSignalKit import TelegramCore +import TelegramPresentationData public class LocalizationListController: ViewController { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/LocalizationListControllerNode.swift b/submodules/TelegramUI/TelegramUI/LocalizationListControllerNode.swift index b2c287e008..5f55acc0ed 100644 --- a/submodules/TelegramUI/TelegramUI/LocalizationListControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/LocalizationListControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private enum LanguageListSection: ItemListSectionId { case official diff --git a/submodules/TelegramUI/TelegramUI/LocalizationListItem.swift b/submodules/TelegramUI/TelegramUI/LocalizationListItem.swift index 93580c74f3..435259b752 100644 --- a/submodules/TelegramUI/TelegramUI/LocalizationListItem.swift +++ b/submodules/TelegramUI/TelegramUI/LocalizationListItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData struct LocalizationListItemEditing: Equatable { let editable: Bool diff --git a/submodules/TelegramUI/TelegramUI/LocationBroadcastActionSheetItem.swift b/submodules/TelegramUI/TelegramUI/LocationBroadcastActionSheetItem.swift index feeb2783ff..3641e27fcc 100644 --- a/submodules/TelegramUI/TelegramUI/LocationBroadcastActionSheetItem.swift +++ b/submodules/TelegramUI/TelegramUI/LocationBroadcastActionSheetItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import Postbox +import TelegramPresentationData public class LocationBroadcastActionSheetItem: ActionSheetItem { public let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/LocationBroadcastNavigationAccessoryPanel.swift b/submodules/TelegramUI/TelegramUI/LocationBroadcastNavigationAccessoryPanel.swift index 19df869126..6a170aae68 100644 --- a/submodules/TelegramUI/TelegramUI/LocationBroadcastNavigationAccessoryPanel.swift +++ b/submodules/TelegramUI/TelegramUI/LocationBroadcastNavigationAccessoryPanel.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramCore import Postbox +import TelegramPresentationData private let titleFont = Font.regular(12.0) private let subtitleFont = Font.regular(10.0) diff --git a/Telegram-iOS/LockedWindowCoveringView.swift b/submodules/TelegramUI/TelegramUI/LockedWindowCoveringView.swift similarity index 96% rename from Telegram-iOS/LockedWindowCoveringView.swift rename to submodules/TelegramUI/TelegramUI/LockedWindowCoveringView.swift index 08c55a58a2..6da82ea64e 100644 --- a/Telegram-iOS/LockedWindowCoveringView.swift +++ b/submodules/TelegramUI/TelegramUI/LockedWindowCoveringView.swift @@ -1,6 +1,6 @@ import Foundation import Display -import TelegramUI +import TelegramPresentationData import AsyncDisplayKit final class LockedWindowCoveringView: WindowCoveringView { diff --git a/submodules/TelegramUI/TelegramUI/LogoutOptionsController.swift b/submodules/TelegramUI/TelegramUI/LogoutOptionsController.swift index acce0af0c2..ff6099968a 100644 --- a/submodules/TelegramUI/TelegramUI/LogoutOptionsController.swift +++ b/submodules/TelegramUI/TelegramUI/LogoutOptionsController.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents +import TelegramPresentationData private struct LogoutOptionsItemArguments { let addAccount: () -> Void diff --git a/Telegram-iOS/ManageSharedAccountInfo.swift b/submodules/TelegramUI/TelegramUI/ManageSharedAccountInfo.swift similarity index 99% rename from Telegram-iOS/ManageSharedAccountInfo.swift rename to submodules/TelegramUI/TelegramUI/ManageSharedAccountInfo.swift index 9a533b63cf..7593e987f2 100644 --- a/Telegram-iOS/ManageSharedAccountInfo.swift +++ b/submodules/TelegramUI/TelegramUI/ManageSharedAccountInfo.swift @@ -2,6 +2,7 @@ import Foundation import SwiftSignalKit import TelegramCore import Postbox +import LightweightAccountData private func accountInfo(account: Account) -> Signal { let peerName = account.postbox.transaction { transaction -> String in diff --git a/submodules/TelegramUI/TelegramUI/ManagedAudioRecorder.swift b/submodules/TelegramUI/TelegramUI/ManagedAudioRecorder.swift index 7ffac34d92..556320ad5e 100644 --- a/submodules/TelegramUI/TelegramUI/ManagedAudioRecorder.swift +++ b/submodules/TelegramUI/TelegramUI/ManagedAudioRecorder.swift @@ -4,6 +4,8 @@ import TelegramUIPrivateModule import CoreMedia import AVFoundation import TelegramCore +import TelegramAudio +import UniversalMediaPlayer private let kOutputBus: UInt32 = 0 private let kInputBus: UInt32 = 1 diff --git a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift index 1c88751823..6f6a552ae6 100644 --- a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift +++ b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData class MediaInputPaneTrendingItem: ListViewItem { let account: Account @@ -104,8 +105,11 @@ class MediaInputPaneTrendingItemNode: ListViewItemNode { override var visibility: ListViewItemNodeVisibility { didSet { - if self.visibility != oldValue { - if case .visible = self.visibility { + let wasVisible = oldValue != .none + let isVisible = self.visibility != .none + + if isVisible != wasVisible { + if isVisible { if let item = self.item, item.unread { self.readDisposable.set(( markFeaturedStickerPacksAsSeenInteractively(postbox: item.account.postbox, ids: [item.info.id]) diff --git a/submodules/TelegramUI/TelegramUI/MediaManager.swift b/submodules/TelegramUI/TelegramUI/MediaManager.swift index 63d812e04a..d69694d8c0 100644 --- a/submodules/TelegramUI/TelegramUI/MediaManager.swift +++ b/submodules/TelegramUI/TelegramUI/MediaManager.swift @@ -5,8 +5,10 @@ import MobileCoreServices import Postbox import TelegramCore import MediaPlayer - +import TelegramAudio import TelegramUIPrivateModule +import UniversalMediaPlayer +import TelegramUIPreferences enum SharedMediaPlayerGroup: Int { case music = 0 diff --git a/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryContainerNode.swift b/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryContainerNode.swift index f7387bf132..9b296a10cd 100644 --- a/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryContainerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData final class MediaNavigationAccessoryContainerNode: ASDisplayNode, UIGestureRecognizerDelegate { let backgroundNode: ASDisplayNode diff --git a/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryHeaderNode.swift b/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryHeaderNode.swift index f076f85d6f..8c63ed03a2 100644 --- a/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryHeaderNode.swift +++ b/submodules/TelegramUI/TelegramUI/MediaNavigationAccessoryHeaderNode.swift @@ -4,6 +4,9 @@ import AsyncDisplayKit import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import UniversalMediaPlayer private let titleFont = Font.regular(12.0) private let subtitleFont = Font.regular(10.0) diff --git a/submodules/TelegramUI/TelegramUI/MediaTrackDecodableFrame.swift b/submodules/TelegramUI/TelegramUI/MediaTrackDecodableFrame.swift deleted file mode 100644 index d3c0991667..0000000000 --- a/submodules/TelegramUI/TelegramUI/MediaTrackDecodableFrame.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import CoreMedia -import FFMpeg - -enum MediaTrackFrameType { - case video - case audio -} - -final class MediaTrackDecodableFrame { - let type: MediaTrackFrameType - let packet: FFMpegPacket - let pts: CMTime - let dts: CMTime - let duration: CMTime - - init(type: MediaTrackFrameType, packet: FFMpegPacket, pts: CMTime, dts: CMTime, duration: CMTime) { - self.type = type - - self.pts = pts - self.dts = dts - self.duration = duration - - self.packet = packet - } -} diff --git a/submodules/TelegramUI/TelegramUI/MediaTrackFrame.swift b/submodules/TelegramUI/TelegramUI/MediaTrackFrame.swift deleted file mode 100644 index 7dd8f0b19d..0000000000 --- a/submodules/TelegramUI/TelegramUI/MediaTrackFrame.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import CoreMedia - -final class MediaTrackFrame { - let type: MediaTrackFrameType - let sampleBuffer: CMSampleBuffer - let resetDecoder: Bool - let decoded: Bool - let rotationAngle: Double - - init(type: MediaTrackFrameType, sampleBuffer: CMSampleBuffer, resetDecoder: Bool, decoded: Bool, rotationAngle: Double = 0.0) { - self.type = type - self.sampleBuffer = sampleBuffer - self.resetDecoder = resetDecoder - self.decoded = decoded - self.rotationAngle = rotationAngle - } - - var position: CMTime { - return CMSampleBufferGetPresentationTimeStamp(self.sampleBuffer) - } - - var duration: CMTime { - return CMSampleBufferGetDuration(self.sampleBuffer) - } -} diff --git a/submodules/TelegramUI/TelegramUI/MentionChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/MentionChatInputContextPanelNode.swift index 4f8352541b..4359741458 100644 --- a/submodules/TelegramUI/TelegramUI/MentionChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/MentionChatInputContextPanelNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import Display +import TelegramPresentationData private struct MentionChatInputContextPanelEntry: Comparable, Identifiable { let index: Int diff --git a/submodules/TelegramUI/TelegramUI/MentionChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/MentionChatInputPanelItem.swift index 1b2814a4a9..4e8dd1177c 100644 --- a/submodules/TelegramUI/TelegramUI/MentionChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/MentionChatInputPanelItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class MentionChatInputPanelItem: ListViewItem { fileprivate let account: Account diff --git a/submodules/TelegramUI/TelegramUI/MessageContentKind.swift b/submodules/TelegramUI/TelegramUI/MessageContentKind.swift index 8ebddf9308..6922a0da7c 100644 --- a/submodules/TelegramUI/TelegramUI/MessageContentKind.swift +++ b/submodules/TelegramUI/TelegramUI/MessageContentKind.swift @@ -1,6 +1,8 @@ import Foundation import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences public enum MessageContentKindKey { case text diff --git a/submodules/TelegramUI/TelegramUI/MetalAnimationRenderer.swift b/submodules/TelegramUI/TelegramUI/MetalAnimationRenderer.swift new file mode 100644 index 0000000000..7251e4eb19 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/MetalAnimationRenderer.swift @@ -0,0 +1,177 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Metal + +#if !targetEnvironment(simulator) + +final class MetalAnimationRenderer: ASDisplayNode, AnimationRenderer { + private let device: MTLDevice + private let pipelineState: MTLRenderPipelineState + private let commandQueue: MTLCommandQueue + private let vertexBuffer: MTLBuffer + private let colorTexture: MTLTexture + private let alphaTexture: MTLTexture + private let samplerColor: MTLSamplerState + private let samplerAlpha: MTLSamplerState + + private var metalLayer: CAMetalLayer { + return self.layer as! CAMetalLayer + } + + override init() { + let device = MTLCreateSystemDefaultDevice()! + + self.device = device + + do { + let library = try device.makeLibrary(source: + """ +using namespace metal; + +struct VertexIn { + packed_float3 position; + packed_float2 texCoord; +}; + +struct VertexOut { + float4 position [[position]]; + float2 texCoord; +}; + +vertex VertexOut basic_vertex( + const device VertexIn* vertex_array [[ buffer(0) ]], + unsigned int vid [[ vertex_id ]] +) { + VertexIn VertexIn = vertex_array[vid]; + + VertexOut VertexOut; + VertexOut.position = float4(VertexIn.position, 1.0); + VertexOut.texCoord = VertexIn.texCoord; + + return VertexOut; +} + +fragment float4 basic_fragment( + VertexOut interpolated [[stage_in]], + texture2d texColor [[ texture(0) ]], + sampler samplerColor [[ sampler(0) ]], + texture2d texA [[ texture(1) ]], + sampler samplerA [[ sampler(1) ]] +) { + float4 color = texColor.sample(samplerColor, interpolated.texCoord); + float4 alpha = texA.sample(samplerA, interpolated.texCoord); + return float4(color.r * alpha.a, color.g * alpha.a, color.b * alpha.a, alpha.a); +} +""", options: nil) + + let fragmentProgram = library.makeFunction(name: "basic_fragment") + let vertexProgram = library.makeFunction(name: "basic_vertex") + + let pipelineStateDescriptor = MTLRenderPipelineDescriptor() + pipelineStateDescriptor.vertexFunction = vertexProgram + pipelineStateDescriptor.fragmentFunction = fragmentProgram + pipelineStateDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm + + self.pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineStateDescriptor) + + self.commandQueue = device.makeCommandQueue()! + + let vertexData: [Float] = [ + -1.0, -1.0, 0.0, 0.0, 1.0, + -1.0, 1.0, 0.0, 0.0, 0.0, + 1.0, -1.0, 0.0, 1.0, 1.0, + 1.0, -1.0, 0.0, 1.0, 1.0, + -1.0, 1.0, 0.0, 0.0, 0.0, + 1.0, 1.0, 0.0, 1.0, 0.0 + ] + + let dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0]) + self.vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: [])! + + let colorTextureDesc: MTLTextureDescriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: .bgrg422, width: 320, height: 320, mipmapped: false) + colorTextureDesc.sampleCount = 1 + if #available(iOS 9.0, *) { + colorTextureDesc.storageMode = .private + colorTextureDesc.usage = .shaderRead + } + colorTextureDesc.textureType = .type2D + + self.colorTexture = device.makeTexture(descriptor: colorTextureDesc)! + + let alphaTextureDesc: MTLTextureDescriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: .a8Unorm, width: 320, height: 320, mipmapped: false) + alphaTextureDesc.sampleCount = 1 + if #available(iOS 9.0, *) { + alphaTextureDesc.storageMode = .private + alphaTextureDesc.usage = .shaderRead + } + alphaTextureDesc.textureType = .type2D + + self.alphaTexture = device.makeTexture(descriptor: alphaTextureDesc)! + + let sampler = MTLSamplerDescriptor() + sampler.minFilter = MTLSamplerMinMagFilter.nearest + sampler.magFilter = MTLSamplerMinMagFilter.nearest + sampler.mipFilter = MTLSamplerMipFilter.nearest + sampler.maxAnisotropy = 1 + sampler.sAddressMode = MTLSamplerAddressMode.clampToEdge + sampler.tAddressMode = MTLSamplerAddressMode.clampToEdge + sampler.rAddressMode = MTLSamplerAddressMode.clampToEdge + sampler.normalizedCoordinates = true + sampler.lodMinClamp = 0.0 + sampler.lodMaxClamp = .greatestFiniteMagnitude + self.samplerColor = device.makeSamplerState(descriptor: sampler)! + self.samplerAlpha = device.makeSamplerState(descriptor: sampler)! + } catch let e { + print(e) + preconditionFailure() + } + + super.init() + + self.setLayerBlock { () -> CALayer in + return CAMetalLayer() + } + + self.metalLayer.device = self.device + self.metalLayer.pixelFormat = .bgra8Unorm + self.metalLayer.framebufferOnly = true + self.metalLayer.isOpaque = false + self.metalLayer.contentsScale = 2.0 + } + + func render(width: Int, height: Int, bytes: UnsafeRawPointer, length: Int) { + if self.metalLayer.bounds.width.isZero { + return + } + + let bgrgLength = width * 2 * height + let alphaLength = width * height + + self.colorTexture.replace(region: MTLRegionMake2D(0, 0, width, height), mipmapLevel: 0, withBytes: bytes.assumingMemoryBound(to: UInt8.self), bytesPerRow: width * 2) + self.alphaTexture.replace(region: MTLRegionMake2D(0, 0, width, height), mipmapLevel: 0, withBytes: bytes.assumingMemoryBound(to: UInt8.self).advanced(by: bgrgLength), bytesPerRow: width) + + let renderPassDescriptor = MTLRenderPassDescriptor() + let drawable = self.metalLayer.nextDrawable()! + renderPassDescriptor.colorAttachments[0].texture = drawable.texture + renderPassDescriptor.colorAttachments[0].loadAction = .clear + renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0) + + let commandBuffer = commandQueue.makeCommandBuffer()! + + let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)! + renderEncoder.setRenderPipelineState(self.pipelineState) + renderEncoder.setVertexBuffer(self.vertexBuffer, offset: 0, index: 0) + renderEncoder.setFragmentTexture(self.colorTexture, index: 0) + renderEncoder.setFragmentSamplerState(self.samplerColor, index: 0) + renderEncoder.setFragmentTexture(self.alphaTexture, index: 1) + renderEncoder.setFragmentSamplerState(self.samplerAlpha, index: 1) + renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 6, instanceCount: 1) + renderEncoder.endEncoding() + + commandBuffer.present(drawable) + commandBuffer.commit() + } +} + +#endif diff --git a/submodules/TelegramUI/TelegramUI/MultipleAvatarsNode.swift b/submodules/TelegramUI/TelegramUI/MultipleAvatarsNode.swift index f507adbc23..3caabf364e 100644 --- a/submodules/TelegramUI/TelegramUI/MultipleAvatarsNode.swift +++ b/submodules/TelegramUI/TelegramUI/MultipleAvatarsNode.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import Postbox import TelegramCore +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 13.0)! diff --git a/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift b/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift index 41734ef0a7..61f789fb89 100644 --- a/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift +++ b/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift @@ -4,6 +4,7 @@ import Postbox import TelegramCore import SwiftSignalKit import CoreMedia +import UniversalMediaPlayer private final class RunningSoftwareVideoSource { let fetchDisposable: Disposable diff --git a/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift b/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift index f16296b1ff..db75e8cb04 100644 --- a/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift +++ b/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift @@ -5,6 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramAudio +import UniversalMediaPlayer enum NativeVideoContentId: Hashable { case message(MessageId, UInt32, MediaId) diff --git a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift index 50471249d7..8480dff453 100644 --- a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift +++ b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift @@ -10,11 +10,15 @@ public enum NavigateToChatKeepStack { case never } -public func navigateToChatController(navigationController: NavigationController, chatController: ChatController? = nil, context: AccountContext, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, keepStack: NavigateToChatKeepStack = .default, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: Bool = false, animated: Bool = true, options: NavigationAnimationOptions = [], parentGroupId: PeerGroupId? = nil, completion: @escaping () -> Void = {}) { +public func navigateToChatController(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 = {}) { + var found = false var isFirst = true for controller in navigationController.viewControllers.reversed() { if let controller = controller as? ChatController, controller.chatLocation == chatLocation { + if let updateTextInputState = updateTextInputState { + controller.updateTextInputState(updateTextInputState) + } if let messageId = messageId { controller.navigateToMessage(messageLocation: .id(messageId), animated: isFirst, completion: { [weak navigationController, weak controller] in if let navigationController = navigationController, let controller = controller { @@ -32,6 +36,9 @@ public func navigateToChatController(navigationController: NavigationController, completion() } controller.purposefulAction = purposefulAction + if activateInput { + controller.activateInput() + } found = true break } @@ -77,6 +84,9 @@ public func navigateToChatController(navigationController: NavigationController, navigationController.replaceControllersAndPush(controllers: viewControllers, controller: controller, animated: animated, options: options, completion: completion) } } + if activateInput { + controller.activateInput() + } } navigationController.currentWindow?.forEachController { controller in diff --git a/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift index d204d47021..a03c382fc5 100644 --- a/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/NavigationBarSearchContentNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let searchBarFont = Font.regular(17.0) let navigationBarSearchContentHeight: CGFloat = 54.0 diff --git a/submodules/TelegramUI/TelegramUI/NetworkUsageStatsController.swift b/submodules/TelegramUI/TelegramUI/NetworkUsageStatsController.swift index 656c4c1731..5cf874e97c 100644 --- a/submodules/TelegramUI/TelegramUI/NetworkUsageStatsController.swift +++ b/submodules/TelegramUI/TelegramUI/NetworkUsageStatsController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private enum NetworkUsageControllerSection { case cellular diff --git a/submodules/TelegramUI/TelegramUI/Notices.swift b/submodules/TelegramUI/TelegramUI/Notices.swift index d0d60b1308..dec9318aa2 100644 --- a/submodules/TelegramUI/TelegramUI/Notices.swift +++ b/submodules/TelegramUI/TelegramUI/Notices.swift @@ -141,11 +141,16 @@ private struct ApplicationSpecificNoticeKeys { private static let botPaymentLiabilityNamespace: Int32 = 1 private static let globalNamespace: Int32 = 2 private static let permissionsNamespace: Int32 = 3 + private static let peerReportNamespace: Int32 = 4 static func botPaymentLiabilityNotice(peerId: PeerId) -> NoticeEntryKey { return NoticeEntryKey(namespace: noticeNamespace(namespace: botPaymentLiabilityNamespace), key: noticeKey(peerId: peerId, key: 0)) } + static func irrelevantPeerGeoNotice(peerId: PeerId) -> NoticeEntryKey { + return NoticeEntryKey(namespace: noticeNamespace(namespace: peerReportNamespace), key: noticeKey(peerId: peerId, key: 0)) + } + static func secretChatInlineBotUsage() -> NoticeEntryKey { return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.secretChatInlineBotUsage.key) } @@ -200,6 +205,16 @@ private struct ApplicationSpecificNoticeKeys { } public struct ApplicationSpecificNotice { + static func irrelevantPeerGeoReportKey(peerId: PeerId) -> NoticeEntryKey { + return ApplicationSpecificNoticeKeys.irrelevantPeerGeoNotice(peerId: peerId) + } + + static func setIrrelevantPeerGeoReport(postbox: Postbox, peerId: PeerId) -> Signal { + return postbox.transaction { transaction -> Void in + transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.irrelevantPeerGeoNotice(peerId: peerId), value: ApplicationSpecificBoolNotice()) + } + } + static func getBotPaymentLiability(accountManager: AccountManager, peerId: PeerId) -> Signal { return accountManager.transaction { transaction -> Bool in if let _ = transaction.getNotice(ApplicationSpecificNoticeKeys.botPaymentLiabilityNotice(peerId: peerId)) as? ApplicationSpecificBoolNotice { diff --git a/submodules/TelegramUI/TelegramUI/NotificationContainerController.swift b/submodules/TelegramUI/TelegramUI/NotificationContainerController.swift index a41dde7edf..e2ffbef98e 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationContainerController.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationContainerController.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import TelegramCore import SwiftSignalKit +import TelegramPresentationData public final class NotificationContainerController: ViewController { private var controllerNode: NotificationContainerControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/NotificationContainerControllerNode.swift b/submodules/TelegramUI/TelegramUI/NotificationContainerControllerNode.swift index b0f53e6b81..3fa4ed39c7 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationContainerControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationContainerControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData private final class NotificationContainerControllerNodeView: UITracingLayerView { var hitTestImpl: ((CGPoint, UIEvent?) -> UIView?)? diff --git a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift new file mode 100644 index 0000000000..86fa222473 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift @@ -0,0 +1,293 @@ +import UIKit +import UserNotifications +import UserNotificationsUI +import Display +import TelegramCore +import SwiftSignalKit +import Postbox +import TelegramPresentationData +import TelegramUIPreferences +import TelegramUIPrivateModule + +private enum NotificationContentAuthorizationError { + case unauthorized +} + +private var sharedAccountContext: SharedAccountContext? + +private var installedSharedLogger = false + +private func setupSharedLogger(_ path: String) { + if !installedSharedLogger { + installedSharedLogger = true + Logger.setSharedLogger(Logger(basePath: path)) + } +} + +private func parseFileLocationResource(_ dict: [AnyHashable: Any]) -> TelegramMediaResource? { + guard let datacenterId = dict["datacenterId"] as? Int32 else { + return nil + } + guard let volumeId = dict["volumeId"] as? Int64 else { + return nil + } + guard let localId = dict["localId"] as? Int32 else { + return nil + } + guard let secret = dict["secret"] as? Int64 else { + return nil + } + var fileReference: Data? + if let fileReferenceString = dict["fileReference"] as? String { + fileReference = dataWithHexString(fileReferenceString) + } + return CloudFileMediaResource(datacenterId: Int(datacenterId), volumeId: volumeId, localId: localId, secret: secret, size: nil, fileReference: fileReference) +} + +public struct NotificationViewControllerInitializationData { + public let appGroupPath: String + public let apiId: Int32 + public let languagesCategory: String + public let encryptionParameters: (Data, Data) + public let appVersion: String + public let bundleData: Data? + + public init(appGroupPath: String, apiId: Int32, languagesCategory: String, encryptionParameters: (Data, Data), appVersion: String, bundleData: Data?) { + self.appGroupPath = appGroupPath + self.apiId = apiId + self.languagesCategory = languagesCategory + self.encryptionParameters = encryptionParameters + self.appVersion = appVersion + self.bundleData = bundleData + } +} + +@available(iOSApplicationExtension 10.0, iOS 10.0, *) +public final class NotificationViewControllerImpl { + private let initializationData: NotificationViewControllerInitializationData + private let setPreferredContentSize: (CGSize) -> Void + + private let imageNode = TransformImageNode() + private var imageInfo: (isSticker: Bool, dimensions: CGSize)? + + private let applyDisposable = MetaDisposable() + private let fetchedDisposable = MetaDisposable() + + private var accountsPath: String? + + public init(initializationData: NotificationViewControllerInitializationData, setPreferredContentSize: @escaping (CGSize) -> Void) { + self.initializationData = initializationData + self.setPreferredContentSize = setPreferredContentSize + } + + deinit { + self.applyDisposable.dispose() + self.fetchedDisposable.dispose() + } + + public func viewDidLoad(view: UIView) { + view.addSubnode(self.imageNode) + + let rootPath = rootPathForBasePath(self.initializationData.appGroupPath) + performAppGroupUpgrades(appGroupPath: self.initializationData.appGroupPath, rootPath: rootPath) + + TempBox.initializeShared(basePath: rootPath, processType: "notification-content", launchSpecificId: arc4random64()) + + let logsPath = rootPath + "/notificationcontent-logs" + let _ = try? FileManager.default.createDirectory(atPath: logsPath, withIntermediateDirectories: true, attributes: nil) + + setupSharedLogger(logsPath) + + accountsPath = rootPath + + if sharedAccountContext == nil { + initializeAccountManagement() + let accountManager = AccountManager(basePath: rootPath + "/accounts-metadata") + + var initialPresentationDataAndSettings: InitialPresentationDataAndSettings? + let semaphore = DispatchSemaphore(value: 0) + let _ = currentPresentationDataAndSettings(accountManager: accountManager).start(next: { value in + initialPresentationDataAndSettings = value + semaphore.signal() + }) + semaphore.wait() + + let applicationBindings = TelegramApplicationBindings(isMainApp: false, containerPath: self.initializationData.appGroupPath, appSpecificScheme: "tgapp", openUrl: { _ in + }, openUniversalUrl: { _, completion in + completion.completion(false) + return + }, canOpenUrl: { _ in + return false + }, getTopWindow: { + return nil + }, displayNotification: { _ in + + }, applicationInForeground: .single(false), applicationIsActive: .single(false), clearMessageNotifications: { _ in + }, pushIdleTimerExtension: { + return EmptyDisposable + }, openSettings: {}, openAppStorePage: {}, registerForNotifications: { _ in }, requestSiriAuthorization: { _ in }, siriAuthorization: { return .notDetermined }, getWindowHost: { + return nil + }, presentNativeController: { _ in + }, dismissNativeController: { + }, getAvailableAlternateIcons: { + return [] + }, getAlternateIconName: { + return nil + }, requestSetAlternateIconName: { _, f in + f(false) + }) + + sharedAccountContext = SharedAccountContext(mainWindow: nil, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, appData: self.initializationData.bundleData), rootPath: rootPath, legacyBasePath: nil, legacyCache: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) + } + } + + public func didReceive(_ notification: UNNotification, view: UIView) { + guard let accountsPath = self.accountsPath else { + 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) + + 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((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((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) + |> 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] accountAndImage in + guard let strongSelf = self else { + return + } + if let fileReference = accountAndImage.1 { + if file.isSticker { + 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()) + } + } + })) + } + } + } + + public func viewWillTransition(to size: CGSize) { + self.updateImageLayout(boundingSize: size) + } + + private func updateImageLayout(boundingSize: CGSize) { + if let (isSticker, dimensions) = self.imageInfo { + let makeLayout = self.imageNode.asyncLayout() + let fittedSize: CGSize + if isSticker { + fittedSize = dimensions.fitted(CGSize(width: min(256.0, boundingSize.width), height: 256.0)) + } else { + fittedSize = dimensions.fitted(CGSize(width: boundingSize.width, height: 1000.0)) + } + let apply = makeLayout(TransformImageArguments(corners: ImageCorners(radius: 0.0), imageSize: fittedSize, boundingSize: fittedSize, intrinsicInsets: UIEdgeInsets())) + apply() + let displaySize = isSticker ? fittedSize : boundingSize + self.imageNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - displaySize.width) / 2.0), y: 0.0), size: displaySize) + } + } +} diff --git a/submodules/TelegramUI/TelegramUI/NotificationExceptionControllerNode.swift b/submodules/TelegramUI/TelegramUI/NotificationExceptionControllerNode.swift index 3e434c8667..f5fd6a1e1b 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationExceptionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationExceptionControllerNode.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences private final class NotificationExceptionState : Equatable { let mode:NotificationExceptionMode @@ -752,7 +754,9 @@ final class NotificationExceptionsControllerNode: ViewControllerTracingNode { requestActivateSearch() } - let presentPeerSettings: (PeerId, @escaping () -> Void) -> Void = { peerId, completion in + let presentPeerSettings: (PeerId, @escaping () -> Void) -> Void = { [weak self] peerId, completion in + (self?.searchDisplayController?.contentNode as? NotificationExceptionsSearchContainerNode)?.listNode.clearHighlightAnimated(true) + let _ = (context.account.postbox.transaction { transaction -> Peer? in return transaction.getPeer(peerId) } @@ -763,6 +767,8 @@ final class NotificationExceptionsControllerNode: ViewControllerTracingNode { return } + let mode = stateValue.with { $0.mode } + dismissInputImpl?() presentControllerImpl?(notificationPeerExceptionController(context: context, peer: peer, mode: mode, updatePeerSound: { peerId, sound in _ = updatePeerSound(peer.id, sound).start(next: { _ in @@ -877,6 +883,7 @@ final class NotificationExceptionsControllerNode: ViewControllerTracingNode { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) actionSheet.setItemGroups([ActionSheetItemGroup(items: [ + ActionSheetTextItem(title: presentationData.strings.Notification_Exceptions_DeleteAllConfirmation), ActionSheetButtonItem(title: presentationData.strings.Notification_Exceptions_DeleteAll, color: .destructive, action: { [weak actionSheet] in actionSheet?.dismissAnimated() @@ -1115,7 +1122,7 @@ private func preparedNotificationExceptionsSearchContainerTransition(theme: Pres private final class NotificationExceptionsSearchContainerNode: SearchDisplayControllerContentNode { private let dimNode: ASDisplayNode - private let listNode: ListView + let listNode: ListView private var enqueuedTransitions: [NotificationExceptionsSearchContainerTransition] = [] private var hasValidLayout = false diff --git a/submodules/TelegramUI/TelegramUI/NotificationExceptionSettingsController.swift b/submodules/TelegramUI/TelegramUI/NotificationExceptionSettingsController.swift index 3adc8cc048..d3b68f54e4 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationExceptionSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationExceptionSettingsController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private enum NotificationPeerExceptionSection: Int32 { case remove @@ -267,11 +268,9 @@ private struct NotificationExceptionPeerState : Equatable { if let notifications = notifications { self.selectedSound = notifications.messageSound switch notifications.muteState { - case .muted: + case let .muted(until) where until >= Int32.max - 1: self.mode = .alwaysOff - case .unmuted: - self.mode = .alwaysOn - case .default: + default: self.mode = .alwaysOn } self.displayPreviews = notifications.displayPreviews == .hide ? .alwaysOff : .alwaysOn diff --git a/submodules/TelegramUI/TelegramUI/NotificationExceptions.swift b/submodules/TelegramUI/TelegramUI/NotificationExceptions.swift index 7b7ec8da9e..332a7f002a 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationExceptions.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationExceptions.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData public class NotificationExceptionsController: ViewController { private let context: AccountContext @@ -157,7 +158,7 @@ public class NotificationExceptionsController: ViewController { } @objc private func removeAllPressed() { - self.controllerNode + self.controllerNode.removeAll() } @objc private func editPressed() { diff --git a/submodules/TelegramUI/TelegramUI/NotificationItemContainerNode.swift b/submodules/TelegramUI/TelegramUI/NotificationItemContainerNode.swift index 9250ab8e4a..06aadc5a36 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationItemContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationItemContainerNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class NotificationItemContainerNode: ASDisplayNode { private let backgroundNode: ASImageNode diff --git a/submodules/TelegramUI/TelegramUI/NotificationMuteSettingsController.swift b/submodules/TelegramUI/TelegramUI/NotificationMuteSettingsController.swift index 8300deaa69..a0279cb2fa 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationMuteSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationMuteSettingsController.swift @@ -3,6 +3,7 @@ import UIKit import Display import TelegramCore import Postbox +import TelegramPresentationData private enum NotificationMuteOption { case `default` diff --git a/submodules/TelegramUI/TelegramUI/NotificationSearchItem.swift b/submodules/TelegramUI/TelegramUI/NotificationSearchItem.swift index 940b1dfb04..c1ea630ab9 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationSearchItem.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationSearchItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import Display import SwiftSignalKit +import TelegramPresentationData private let searchBarFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/NotificationSoundSelection.swift b/submodules/TelegramUI/TelegramUI/NotificationSoundSelection.swift index ac9e52ec04..28c0da2b12 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationSoundSelection.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationSoundSelection.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Postbox import TelegramCore import AVFoundation +import TelegramPresentationData private struct NotificationSoundSelectionArguments { let account: Account @@ -218,27 +219,36 @@ func playSound(context: AccountContext, sound: PeerMessageSound, defaultSound: P var currentPlayer: AudioPlayerWrapper? var deactivateImpl: (() -> Void)? let session = context.sharedContext.mediaManager.audioSession.push(audioSessionType: .play, activate: { _ in - if let url = Bundle.main.url(forResource: fileNameForNotificationSound(sound, defaultSound: defaultSound), withExtension: "m4a") { - currentPlayer = AudioPlayerWrapper(url: url, completed: { - deactivateImpl?() - }) - currentPlayer?.play() + Queue.mainQueue().async { + if let url = Bundle.main.url(forResource: fileNameForNotificationSound(sound, defaultSound: defaultSound), withExtension: "m4a") { + currentPlayer = AudioPlayerWrapper(url: url, completed: { + deactivateImpl?() + }) + currentPlayer?.play() + } } }, deactivate: { - currentPlayer?.stop() - currentPlayer = nil - - return .complete() + return Signal { subscriber in + Queue.mainQueue().async { + currentPlayer?.stop() + currentPlayer = nil + subscriber.putCompletion() + } + return EmptyDisposable + } }) deactivateImpl = { session.dispose() } return ActionDisposable { session.dispose() - currentPlayer?.stop() - currentPlayer = nil + Queue.mainQueue().async { + currentPlayer?.stop() + currentPlayer = nil + } } - } |> runOn(Queue.mainQueue()) + } + |> runOn(Queue.mainQueue()) } } diff --git a/submodules/TelegramUI/TelegramUI/NotificationsAndSounds.swift b/submodules/TelegramUI/TelegramUI/NotificationsAndSounds.swift index d2a654f537..7f9242a04b 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationsAndSounds.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationsAndSounds.swift @@ -4,6 +4,9 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import DeviceAccess private final class NotificationsAndSoundsArguments { let context: AccountContext @@ -822,12 +825,14 @@ public func notificationsAndSoundsController(context: AccountContext, exceptions }, pushController: { controller in pushControllerImpl?(controller) }, soundSelectionDisposable: MetaDisposable(), authorizeNotifications: { - let _ = (DeviceAccess.authorizationStatus(context: context, subject: .notifications) + let _ = (DeviceAccess.authorizationStatus(applicationInForeground: context.sharedContext.applicationBindings.applicationInForeground, subject: .notifications) |> take(1) |> deliverOnMainQueue).start(next: { status in switch status { case .notDetermined: - DeviceAccess.authorizeAccess(to: .notifications, context: context) + DeviceAccess.authorizeAccess(to: .notifications, registerForNotifications: { result in + context.sharedContext.applicationBindings.registerForNotifications(result) + }) case .denied, .restricted: context.sharedContext.applicationBindings.openSettings() case .unreachable: @@ -997,7 +1002,7 @@ public func notificationsAndSoundsController(context: AccountContext, exceptions let sharedData = context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.inAppNotificationSettings]) let preferences = context.account.postbox.preferencesView(keys: [PreferencesKeys.globalNotifications]) - let exceptionsSignal = Signal.single(exceptionsList) |> then(notificationExceptionsList(network: context.account.network) |> map(Optional.init)) + let exceptionsSignal = Signal.single(exceptionsList) |> then(notificationExceptionsList(postbox: context.account.postbox, network: context.account.network) |> map(Optional.init)) notificationExceptions.set(exceptionsSignal |> map { list -> (NotificationExceptionMode, NotificationExceptionMode, NotificationExceptionMode) in var users:[PeerId : NotificationExceptionWrapper] = [:] @@ -1063,7 +1068,7 @@ public func notificationsAndSoundsController(context: AccountContext, exceptions } |> distinctUntilChanged - let signal = combineLatest(context.sharedContext.presentationData, sharedData, preferences, notificationExceptions.get(), DeviceAccess.authorizationStatus(context: context, subject: .notifications), notificationsWarningSuppressed.get(), hasMoreThanOneAccount) + let signal = combineLatest(context.sharedContext.presentationData, sharedData, preferences, notificationExceptions.get(), DeviceAccess.authorizationStatus(applicationInForeground: context.sharedContext.applicationBindings.applicationInForeground, subject: .notifications), notificationsWarningSuppressed.get(), hasMoreThanOneAccount) |> map { presentationData, sharedData, view, exceptions, authorizationStatus, warningSuppressed, hasMoreThanOneAccount -> (ItemListControllerState, (ItemListNodeState, NotificationsAndSoundsEntry.ItemGenerationArguments)) in let viewSettings: GlobalNotificationSettingsSet diff --git a/submodules/TelegramUI/TelegramUI/OpenAddContact.swift b/submodules/TelegramUI/TelegramUI/OpenAddContact.swift index bc711cdd75..da1669eb36 100644 --- a/submodules/TelegramUI/TelegramUI/OpenAddContact.swift +++ b/submodules/TelegramUI/TelegramUI/OpenAddContact.swift @@ -2,15 +2,16 @@ import Foundation import SwiftSignalKit import TelegramCore import Display +import DeviceAccess func openAddContact(context: AccountContext, firstName: String = "", lastName: String = "", phoneNumber: String, label: String = "_$!!$_", present: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, completed: @escaping () -> Void = {}) { - let _ = (DeviceAccess.authorizationStatus(context: context, subject: .contacts) + let _ = (DeviceAccess.authorizationStatus(subject: .contacts) |> take(1) |> deliverOnMainQueue).start(next: { value in switch value { case .allowed: let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: firstName, lastName: lastName, phoneNumbers: [DeviceContactPhoneNumberData(label: label, value: phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) - present(deviceContactInfoController(context: context, subject: .create(peer: nil, contactData: contactData, isSharing: false, completion: { peer, stableId, contactData in + present(deviceContactInfoController(context: context, subject: .create(peer: nil, contactData: contactData, isSharing: false, shareViaException: false, completion: { peer, stableId, contactData in if let peer = peer { if let infoController = peerInfoController(context: context, peer: peer) { pushController(infoController) @@ -20,7 +21,7 @@ func openAddContact(context: AccountContext, firstName: String = "", lastName: S } }), completed: completed), ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) case .notDetermined: - DeviceAccess.authorizeAccess(to: .contacts, context: context) + DeviceAccess.authorizeAccess(to: .contacts) default: let presentationData = context.sharedContext.currentPresentationData.with { $0 } present(textAlertController(context: context, title: presentationData.strings.AccessDenied_Title, text: presentationData.strings.Contacts_AccessDeniedError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_NotNow, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.AccessDenied_Settings, action: { diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index 66249177db..6276ea26af 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -6,6 +6,7 @@ import TelegramCore import SwiftSignalKit import PassKit import Lottie +import TelegramUIPreferences private enum ChatMessageGalleryControllerData { case url(String) @@ -30,7 +31,7 @@ private func chatMessageGalleryControllerData(context: AccountContext, message: switch action.action { case let .photoUpdated(image): if let peer = messageMainPeer(message), let image = image { - let promise: Promise<[AvatarGalleryEntry]> = Promise([AvatarGalleryEntry.image(image.reference, image.representations.map({ ImageRepresentationWithReference(representation: $0, reference: .media(media: .message(message: MessageReference(message), media: media), resource: $0.resource)) }), peer, message.timestamp, nil)]) + let promise: Promise<[AvatarGalleryEntry]> = Promise([AvatarGalleryEntry.image(image.reference, image.representations.map({ ImageRepresentationWithReference(representation: $0, reference: .media(media: .message(message: MessageReference(message), media: media), resource: $0.resource)) }), peer, message.timestamp, nil, message.id)]) let galleryController = AvatarGalleryController(context: context, peer: peer, remoteEntries: promise, replaceRootController: { controller, ready in }) @@ -325,7 +326,7 @@ func openChatMessage(context: AccountContext, message: Message, standalone: Bool if let vCard = contact.vCardData, let vCardData = vCard.data(using: .utf8), let parsed = DeviceContactExtendedData(vcard: vCardData) { contactData = parsed } else { - contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: contact.firstName, lastName: contact.lastName, phoneNumbers: [DeviceContactPhoneNumberData(label: "_$!!$_", value: contact.phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) + contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: contact.firstName, lastName: contact.lastName, phoneNumbers: [DeviceContactPhoneNumberData(label: "_$!!$_", value: contact.phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: []) } let controller = deviceContactInfoController(context: context, subject: .vcard(peer, nil, contactData)) navigationController?.pushViewController(controller) diff --git a/submodules/TelegramUI/TelegramUI/OpenInActionSheetController.swift b/submodules/TelegramUI/TelegramUI/OpenInActionSheetController.swift index 0715953ade..aedc3e4b1d 100644 --- a/submodules/TelegramUI/TelegramUI/OpenInActionSheetController.swift +++ b/submodules/TelegramUI/TelegramUI/OpenInActionSheetController.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import Postbox import TelegramCore import MapKit +import TelegramPresentationData public struct OpenInControllerAction { let title: String diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index 5623e52b37..b679aa198a 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -4,6 +4,7 @@ import TelegramCore import Postbox import Display import SwiftSignalKit +import TelegramUIPreferences private func defaultNavigationForPeerId(_ peerId: PeerId?, navigation: ChatControllerInteractionNavigateToPeer) -> ChatControllerInteractionNavigateToPeer { if case .default = navigation { diff --git a/submodules/TelegramUI/TelegramUI/OpenUrl.swift b/submodules/TelegramUI/TelegramUI/OpenUrl.swift index 0327d64e32..ae905baca9 100644 --- a/submodules/TelegramUI/TelegramUI/OpenUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenUrl.swift @@ -9,6 +9,7 @@ import MtProtoKit #else import MtProtoKitDynamic #endif +import TelegramPresentationData public struct ParsedSecureIdUrl { public let peerId: PeerId diff --git a/submodules/TelegramUI/TelegramUI/OverlayInstantVideoDecoration.swift b/submodules/TelegramUI/TelegramUI/OverlayInstantVideoDecoration.swift index 417bd541a5..45ad8982e5 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayInstantVideoDecoration.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayInstantVideoDecoration.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import UniversalMediaPlayer private let backgroundImage = UIImage(bundleImageName: "Chat/Message/OverlayInstantVideoShadow")?.precomposed() diff --git a/submodules/TelegramUI/TelegramUI/OverlayInstantVideoNode.swift b/submodules/TelegramUI/TelegramUI/OverlayInstantVideoNode.swift index 00b2937d2b..96219aa914 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayInstantVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayInstantVideoNode.swift @@ -5,6 +5,10 @@ import SwiftSignalKit import Display import TelegramCore import Postbox +import TelegramPresentationData +import UniversalMediaPlayer +import TelegramUIPreferences +import TelegramAudio final class OverlayInstantVideoNode: OverlayMediaItemNode { private let content: UniversalVideoContent diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerController.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerController.swift index 9abd61043e..f3446a7fbb 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerController.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerController.swift @@ -4,6 +4,7 @@ import TelegramCore import Postbox import Display import SwiftSignalKit +import TelegramUIPreferences final class OverlayPlayerController: ViewController { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift index 81d43d5289..8417e760dd 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences final class OverlayPlayerControllerNode: ViewControllerTracingNode, UIGestureRecognizerDelegate { let ready = Promise() diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift index 3a33084ace..cc429c15ca 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift @@ -5,6 +5,9 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import UniversalMediaPlayer +import TelegramUIPreferences private func generateBackground(theme: PresentationTheme) -> UIImage? { return generateImage(CGSize(width: 20.0, height: 10.0 + 8.0), rotatedContext: { size, context in diff --git a/submodules/TelegramUI/TelegramUI/OverlayStatusController.swift b/submodules/TelegramUI/TelegramUI/OverlayStatusController.swift index f91fc8fa33..172ac6a3fe 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayStatusController.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayStatusController.swift @@ -1,7 +1,7 @@ import Foundation import UIKit import Display - +import TelegramPresentationData import LegacyComponents enum OverlayStatusControllerType { diff --git a/submodules/TelegramUI/TelegramUI/OverlayUniversalVideoNode.swift b/submodules/TelegramUI/TelegramUI/OverlayUniversalVideoNode.swift index 9a55599c63..178ade029b 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayUniversalVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayUniversalVideoNode.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Display import TelegramCore import Postbox +import TelegramAudio final class OverlayUniversalVideoNode: OverlayMediaItemNode { private let content: UniversalVideoContent diff --git a/submodules/TelegramUI/TelegramUI/OverlayVideoDecoration.swift b/submodules/TelegramUI/TelegramUI/OverlayVideoDecoration.swift index 9b4a620978..6e87779c66 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayVideoDecoration.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayVideoDecoration.swift @@ -3,7 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit - +import UniversalMediaPlayer import LegacyComponents private func setupArrowFrame(size: CGSize, edge: OverlayMediaItemMinimizationEdge, view: TGEmbedPIPPullArrowView) { diff --git a/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift b/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift index 0de33cd34a..8f54e5ab9c 100644 --- a/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift +++ b/submodules/TelegramUI/TelegramUI/PaneSearchBarNode.swift @@ -3,6 +3,7 @@ import UIKit import SwiftSignalKit import AsyncDisplayKit import Display +import TelegramPresentationData private func generateLoupeIcon(color: UIColor) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Loupe"), color: color) diff --git a/submodules/TelegramUI/TelegramUI/PaneSearchBarPlaceholderItem.swift b/submodules/TelegramUI/TelegramUI/PaneSearchBarPlaceholderItem.swift index a74b5b31ce..84c0ff76f7 100644 --- a/submodules/TelegramUI/TelegramUI/PaneSearchBarPlaceholderItem.swift +++ b/submodules/TelegramUI/TelegramUI/PaneSearchBarPlaceholderItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let templateLoupeIcon = UIImage(bundleImageName: "Components/Search Bar/Loupe") diff --git a/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift index 5eb3c21e1d..862508da9c 100644 --- a/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PaneSearchContainerNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private let searchBarHeight: CGFloat = 52.0 diff --git a/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift b/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift index b57e895afd..69ccac8220 100644 --- a/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift @@ -4,6 +4,8 @@ import Display import AsyncDisplayKit import SwiftSignalKit import Postbox +import TelegramPresentationData +import TelegramUIPreferences final public class PasscodeEntryControllerPresentationArguments { let animated: Bool diff --git a/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift b/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift index cb1bc92b3a..c333cc127d 100644 --- a/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PasscodeEntryControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private let titleFont = Font.regular(20.0) private let subtitleFont = Font.regular(15.0) diff --git a/submodules/TelegramUI/TelegramUI/PasscodeOptionsController.swift b/submodules/TelegramUI/TelegramUI/PasscodeOptionsController.swift index 8bdad45ced..51fa868cea 100644 --- a/submodules/TelegramUI/TelegramUI/PasscodeOptionsController.swift +++ b/submodules/TelegramUI/TelegramUI/PasscodeOptionsController.swift @@ -6,6 +6,8 @@ import Postbox import TelegramCore import LegacyComponents import LocalAuthentication +import TelegramPresentationData +import TelegramUIPreferences private final class PasscodeOptionsControllerArguments { let turnPasscodeOff: () -> Void diff --git a/submodules/TelegramUI/TelegramUI/PasscodeSetupController.swift b/submodules/TelegramUI/TelegramUI/PasscodeSetupController.swift index 6fe6f75e4e..eb3e6daede 100644 --- a/submodules/TelegramUI/TelegramUI/PasscodeSetupController.swift +++ b/submodules/TelegramUI/TelegramUI/PasscodeSetupController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData enum PasscodeSetupControllerMode { case setup(change: Bool, PasscodeEntryFieldType) diff --git a/submodules/TelegramUI/TelegramUI/PasscodeSetupControllerNode.swift b/submodules/TelegramUI/TelegramUI/PasscodeSetupControllerNode.swift index cd2d167815..2982650cb3 100644 --- a/submodules/TelegramUI/TelegramUI/PasscodeSetupControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PasscodeSetupControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData enum PasscodeSetupInitialState { case createPasscode diff --git a/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift index c210e4a77f..4678d64f96 100644 --- a/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private struct PeerAvatarImageGalleryThumbnailItem: GalleryThumbnailItem { let account: Account @@ -78,7 +79,7 @@ class PeerAvatarImageGalleryItem: GalleryItem { switch self.entry { case let .topImage(representations, _): content = representations - case let .image(_, representations, _, _, _): + case let .image(_, representations, _, _, _, _): content = representations } @@ -167,7 +168,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { switch entry { case let .topImage(topRepresentations, _): representations = topRepresentations - case let .image(_, imageRepresentations, _, _, _): + case let .image(_, imageRepresentations, _, _, _, _): representations = imageRepresentations } self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations), dispatchOnDisplayLink: false) @@ -335,7 +336,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { switch entry { case let .topImage(topRepresentations, _): representations = topRepresentations - case let .image(_, imageRepresentations, _, _, _): + case let .image(_, imageRepresentations, _, _, _, _): representations = imageRepresentations } diff --git a/submodules/TelegramUI/TelegramUI/PeerBanTimeoutController.swift b/submodules/TelegramUI/TelegramUI/PeerBanTimeoutController.swift index d4ee5d5889..a51b481155 100644 --- a/submodules/TelegramUI/TelegramUI/PeerBanTimeoutController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerBanTimeoutController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import UIKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData final class PeerBanTimeoutController: ActionSheetController { private var presentationDisposable: Disposable? diff --git a/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift b/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift index 60e82d953a..f258c50927 100644 --- a/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift +++ b/submodules/TelegramUI/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift @@ -244,6 +244,26 @@ final class PeerChannelMemberCategoriesContextsManager { } } + func transferOwnership(account: Account, peerId: PeerId, memberId: PeerId, password: String) -> Signal { + return updateChannelOwnership(account: account, accountStateManager: account.stateManager, channelId: peerId, memberId: memberId, password: password) + |> map(Optional.init) + |> deliverOnMainQueue + |> beforeNext { [weak self] results in + if let strongSelf = self, let results = results { + strongSelf.impl.with { impl in + for (contextPeerId, context) in impl.contexts { + if peerId == contextPeerId { + context.replayUpdates(results.map { ($0.0, $0.1, nil) }) + } + } + } + } + } + |> mapToSignal { _ -> Signal in + return .complete() + } + } + func join(account: Account, peerId: PeerId) -> Signal { return joinChannel(account: account, peerId: peerId) |> deliverOnMainQueue diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index e18cbca258..0d7893b84a 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -6,6 +6,8 @@ import Display import AsyncDisplayKit import TelegramCore import SafariServices +import TelegramPresentationData +import TelegramUIPreferences public class PeerMediaCollectionController: TelegramController { private var validLayout: ContainerViewLayout? @@ -371,6 +373,7 @@ public class PeerMediaCollectionController: TelegramController { }, updateInputLanguage: { _ in }, unarchiveChat: { }, openLinkEditing: { + }, reportPeerIrrelevantGeoLocation: { }, statuses: nil) self.updateInterfaceState(animated: false, { return $0 }) diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionControllerNode.swift index 67b6186589..cf870645d5 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionControllerNode.swift @@ -5,6 +5,7 @@ import Postbox import SwiftSignalKit import Display import TelegramCore +import TelegramPresentationData struct PeerMediaCollectionMessageForGallery { let message: Message diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionEmptyNode.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionEmptyNode.swift index cdd472e1fd..11bbfaae43 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionEmptyNode.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionEmptyNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class PeerMediaCollectionEmptyNode: ASDisplayNode { private let mode: PeerMediaCollectionMode diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionInterfaceState.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionInterfaceState.swift index c1387f3a31..c0dea9dd1a 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionInterfaceState.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionInterfaceState.swift @@ -1,5 +1,6 @@ import Foundation import Postbox +import TelegramPresentationData enum PeerMediaCollectionMode: Int32 { case photoOrVideo diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift index d757b67f88..6958bdc7cc 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionSectionsNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData final class PeerMediaCollectionSectionsNode: ASDisplayNode { private var theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift b/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift index 4f12913abf..69590ac1b8 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMessagesMediaPlaylist.swift @@ -3,6 +3,7 @@ import UIKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences private enum PeerMessagesMediaPlaylistLoadAnchor { case messageId(MessageId) diff --git a/submodules/TelegramUI/TelegramUI/PeerNotificationSoundStrings.swift b/submodules/TelegramUI/TelegramUI/PeerNotificationSoundStrings.swift index 615c8867a4..8da9be20e1 100644 --- a/submodules/TelegramUI/TelegramUI/PeerNotificationSoundStrings.swift +++ b/submodules/TelegramUI/TelegramUI/PeerNotificationSoundStrings.swift @@ -1,5 +1,6 @@ import Foundation import TelegramCore +import TelegramPresentationData private let modernSoundsNamePaths: [KeyPath] = [ \.NotificationsSound_Note, diff --git a/submodules/TelegramUI/TelegramUI/PeerPresenceStatusManager.swift b/submodules/TelegramUI/TelegramUI/PeerPresenceStatusManager.swift index 4f388c911f..ef58217189 100644 --- a/submodules/TelegramUI/TelegramUI/PeerPresenceStatusManager.swift +++ b/submodules/TelegramUI/TelegramUI/PeerPresenceStatusManager.swift @@ -15,8 +15,8 @@ final class PeerPresenceStatusManager { } func reset(presence: TelegramUserPresence) { - timer?.invalidate() - timer = nil + self.timer?.invalidate() + self.timer = nil let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 let timeout = userPresenceStringRefreshTimeout(presence, relativeTo: Int32(timestamp)) diff --git a/submodules/TelegramUI/TelegramUI/PeerReportController.swift b/submodules/TelegramUI/TelegramUI/PeerReportController.swift index 4c8e945288..ce7452b630 100644 --- a/submodules/TelegramUI/TelegramUI/PeerReportController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerReportController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData enum PeerReportSubject { case peer(PeerId) diff --git a/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift b/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift index ba87e6c3e0..e4a8e39d54 100644 --- a/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import Display import TelegramCore import Postbox +import TelegramPresentationData public final class PeerSelectionController: ViewController { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift b/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift index 50f95b8e0b..c4fc539f6e 100644 --- a/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PeerSelectionControllerNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class PeerSelectionControllerNode: ASDisplayNode { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/PeerTitle.swift b/submodules/TelegramUI/TelegramUI/PeerTitle.swift index 363b23637f..a28062069a 100644 --- a/submodules/TelegramUI/TelegramUI/PeerTitle.swift +++ b/submodules/TelegramUI/TelegramUI/PeerTitle.swift @@ -1,6 +1,8 @@ import Foundation import TelegramCore import Postbox +import TelegramPresentationData +import TelegramUIPreferences extension Peer { func displayTitle(strings: PresentationStrings, displayOrder: PresentationPersonNameOrder) -> String { diff --git a/submodules/TelegramUI/TelegramUI/PeersNearbyController.swift b/submodules/TelegramUI/TelegramUI/PeersNearbyController.swift new file mode 100644 index 0000000000..5bcd2261b1 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/PeersNearbyController.swift @@ -0,0 +1,458 @@ +import Foundation +import UIKit +import Display +import SwiftSignalKit +import Postbox +import TelegramCore +import MapKit +import TelegramPresentationData +import TelegramUIPreferences + +private struct PeerNearbyEntry { + let peer: (Peer, CachedPeerData?) + let expires: Int32 + let distance: Int32 +} + +private func arePeersNearbyEqual(_ lhs: PeerNearbyEntry?, _ rhs: PeerNearbyEntry?) -> Bool { + if let lhs = lhs, let rhs = rhs { + return lhs.peer.0.isEqual(rhs.peer.0) && lhs.expires == rhs.expires && lhs.distance == rhs.distance + } else { + return (lhs != nil) == (rhs != nil) + } +} + +private func arePeerNearbyArraysEqual(_ lhs: [PeerNearbyEntry], _ rhs: [PeerNearbyEntry]) -> Bool { + if lhs.count != rhs.count { + return false + } + for i in 0 ..< lhs.count { + if !lhs[i].peer.0.isEqual(rhs[i].peer.0) || lhs[i].expires != rhs[i].expires || lhs[i].distance != rhs[i].distance { + return false + } + } + return true +} + +private final class PeersNearbyControllerArguments { + let context: AccountContext + let openChat: (Peer) -> Void + let openCreateGroup: (Double, Double, String?) -> Void + + init(context: AccountContext, openChat: @escaping (Peer) -> Void, openCreateGroup: @escaping (Double, Double, String?) -> Void) { + self.context = context + self.openChat = openChat + self.openCreateGroup = openCreateGroup + } +} + +private enum PeersNearbySection: Int32 { + case header + case users + case groups + case channels +} + +private enum PeersNearbyEntry: ItemListNodeEntry { + case header(PresentationTheme, String) + + case usersHeader(PresentationTheme, String, Bool) + case empty(PresentationTheme, String) + case user(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) + + case groupsHeader(PresentationTheme, String, Bool) + case createGroup(PresentationTheme, String, Double?, Double?, String?) + case group(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) + + case channelsHeader(PresentationTheme, String) + case channel(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) + + var section: ItemListSectionId { + switch self { + case .header: + return PeersNearbySection.header.rawValue + case .usersHeader, .empty, .user: + return PeersNearbySection.users.rawValue + case .groupsHeader, .createGroup, .group: + return PeersNearbySection.groups.rawValue + case .channelsHeader, .channel: + return PeersNearbySection.channels.rawValue + } + } + + var stableId: Int32 { + switch self { + case .header: + return 0 + case .usersHeader: + return 1 + case .empty: + return 2 + case let .user(index, _, _, _, _, _): + return 3 + index + case .groupsHeader: + return 1000 + case .createGroup: + return 1001 + case let .group(index, _, _, _, _, _): + return 1002 + index + case .channelsHeader: + return 2000 + case let .channel(index, _, _, _, _, _): + return 2001 + index + } + } + + static func ==(lhs: PeersNearbyEntry, rhs: PeersNearbyEntry) -> Bool { + switch lhs { + case let .header(lhsTheme, lhsText): + if case let .header(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .usersHeader(lhsTheme, lhsText, lhsLoading): + if case let .usersHeader(rhsTheme, rhsText, rhsLoading) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsLoading == rhsLoading { + return true + } else { + return false + } + case let .empty(lhsTheme, lhsText): + if case let .empty(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .user(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsDisplayOrder, lhsPeer): + if case let .user(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsDisplayOrder, rhsPeer) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsDisplayOrder == rhsDisplayOrder, arePeersNearbyEqual(lhsPeer, rhsPeer) { + return true + } else { + return false + } + case let .groupsHeader(lhsTheme, lhsText, lhsLoading): + if case let .groupsHeader(rhsTheme, rhsText, rhsLoading) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsLoading == rhsLoading { + return true + } else { + return false + } + case let .createGroup(lhsTheme, lhsText, lhsLatitude, lhsLongitude, lhsAddress): + if case let .createGroup(rhsTheme, rhsText, rhsLatitude, rhsLongitude, rhsAddress) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsLatitude == rhsLatitude && lhsLongitude == rhsLongitude && lhsAddress == rhsAddress { + return true + } else { + return false + } + case let .group(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsDisplayOrder, lhsPeer): + if case let .group(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsDisplayOrder, rhsPeer) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsDisplayOrder == rhsDisplayOrder, arePeersNearbyEqual(lhsPeer, rhsPeer) { + return true + } else { + return false + } + case let .channelsHeader(lhsTheme, lhsText): + if case let .channelsHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .channel(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsDisplayOrder, lhsPeer): + if case let .channel(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsDisplayOrder, rhsPeer) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsDisplayOrder == rhsDisplayOrder, arePeersNearbyEqual(lhsPeer, rhsPeer) { + return true + } else { + return false + } + } + } + + static func <(lhs: PeersNearbyEntry, rhs: PeersNearbyEntry) -> Bool { + return lhs.stableId < rhs.stableId + } + + private func stringForDistance(_ distance: Int32) -> String { + let distance = max(1, distance) + let formatter = MKDistanceFormatter() + formatter.unitStyle = .abbreviated + var result = formatter.string(fromDistance: Double(distance)) + if result.hasPrefix("0 ") { + result = result.replacingOccurrences(of: "0 ", with: "1 ") + } + return result + } + + func item(_ arguments: PeersNearbyControllerArguments) -> ListViewItem { + switch self { + case let .header(theme, text): + return PeersNearbyHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .usersHeader(theme, text, loading): + return ItemListSectionHeaderItem(theme: theme, text: text, activityIndicator: loading, sectionId: self.section) + case let .empty(theme, text): + return ItemListPlaceholderItem(theme: theme, text: text, sectionId: self.section, style: .blocks) + case let .user(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): + return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer.peer.0, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: .text(strings.Map_DistanceAway(stringForDistance(peer.distance)).0), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { + arguments.openChat(peer.peer.0) + }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopGroupInset: false, tag: nil) + case let .groupsHeader(theme, text, loading): + return ItemListSectionHeaderItem(theme: theme, text: text, activityIndicator: loading, sectionId: self.section) + case let .createGroup(theme, title, latitude, longitude, address): + return ItemListPeerActionItem(theme: theme, icon: PresentationResourcesItemList.createGroupIcon(theme), title: title, alwaysPlain: false, sectionId: self.section, editing: false, action: { + if let latitude = latitude, let longitude = longitude { + arguments.openCreateGroup(latitude, longitude, address) + } + }) + case let .group(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): + var text: ItemListPeerItemText + if let cachedData = peer.peer.1 as? CachedChannelData, let memberCount = cachedData.participantsSummary.memberCount { + text = .text("\(strings.Map_DistanceAway(stringForDistance(peer.distance)).0), \(memberCount > 0 ? strings.Conversation_StatusMembers(memberCount) : strings.PeopleNearby_NoMembers)") + } else { + text = .text(strings.Map_DistanceAway(stringForDistance(peer.distance)).0) + } + return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer.peer.0, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: text, label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { + arguments.openChat(peer.peer.0) + }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopGroupInset: false, tag: nil) + case let .channelsHeader(theme, text): + return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .channel(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): + var text: ItemListPeerItemText + if let cachedData = peer.peer.1 as? CachedChannelData, let memberCount = cachedData.participantsSummary.memberCount { + text = .text("\(strings.Map_DistanceAway(stringForDistance(peer.distance)).0), \(strings.Conversation_StatusSubscribers(memberCount))") + } else { + text = .text(strings.Map_DistanceAway(stringForDistance(peer.distance)).0) + } + return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer.peer.0, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: text, label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { + arguments.openChat(peer.peer.0) + }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopGroupInset: false, tag: nil) + } + } +} + +private struct PeersNearbyData: Equatable { + let latitude: Double + let longitude: Double + let address: String? + let users: [PeerNearbyEntry] + let groups: [PeerNearbyEntry] + let channels: [PeerNearbyEntry] + + init(latitude: Double, longitude: Double, address: String?, users: [PeerNearbyEntry], groups: [PeerNearbyEntry], channels: [PeerNearbyEntry]) { + self.latitude = latitude + self.longitude = longitude + self.address = address + self.users = users + self.groups = groups + self.channels = channels + } + + static func ==(lhs: PeersNearbyData, rhs: PeersNearbyData) -> Bool { + return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude && lhs.address == rhs.address && arePeerNearbyArraysEqual(lhs.users, rhs.users) && arePeerNearbyArraysEqual(lhs.groups, rhs.groups) && arePeerNearbyArraysEqual(lhs.channels, rhs.channels) + } +} + +private func peersNearbyControllerEntries(data: PeersNearbyData?, presentationData: PresentationData, displayLoading: Bool) -> [PeersNearbyEntry] { + var entries: [PeersNearbyEntry] = [] + + entries.append(.header(presentationData.theme, presentationData.strings.PeopleNearby_Description)) + entries.append(.usersHeader(presentationData.theme, presentationData.strings.PeopleNearby_Users.uppercased(), displayLoading && data == nil)) + if let data = data, !data.users.isEmpty { + var i: Int32 = 0 + for user in data.users { + entries.append(.user(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, user)) + i += 1 + } + } else { + entries.append(.empty(presentationData.theme, presentationData.strings.PeopleNearby_UsersEmpty)) + } + + entries.append(.groupsHeader(presentationData.theme, presentationData.strings.PeopleNearby_Groups.uppercased(), displayLoading && data == nil)) + entries.append(.createGroup(presentationData.theme, presentationData.strings.PeopleNearby_CreateGroup, data?.latitude, data?.longitude, data?.address)) + if let data = data, !data.groups.isEmpty { + var i: Int32 = 0 + for group in data.groups { + entries.append(.group(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, group)) + i += 1 + } + } + + if let data = data, !data.channels.isEmpty { + var i: Int32 = 0 + for channel in data.channels { + entries.append(.channel(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, channel)) + i += 1 + } + } + + return entries +} + +public func peersNearbyController(context: AccountContext) -> ViewController { + var pushControllerImpl: ((ViewController) -> Void)? + var replaceAllButRootControllerImpl: ((ViewController, Bool) -> Void)? + var replaceTopControllerImpl: ((ViewController) -> Void)? + var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? + var navigateToChatImpl: ((Peer) -> Void)? + + let actionsDisposable = DisposableSet() + let checkCreationAvailabilityDisposable = MetaDisposable() + actionsDisposable.add(checkCreationAvailabilityDisposable) + + let dataPromise = Promise(nil) + let addressPromise = Promise(nil) + + let arguments = PeersNearbyControllerArguments(context: context, openChat: { peer in + navigateToChatImpl?(peer) + }, openCreateGroup: { latitude, longitude, address in + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + var cancelImpl: (() -> Void)? + let progressSignal = Signal { subscriber in + let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + cancelImpl?() + })) + presentControllerImpl?(controller, nil) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } + } + } + |> runOn(Queue.mainQueue()) + |> delay(0.5, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() + cancelImpl = { + checkCreationAvailabilityDisposable.set(nil) + } + checkCreationAvailabilityDisposable.set((checkPublicChannelCreationAvailability(account: context.account, location: true) + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } + } + |> deliverOnMainQueue).start(next: { available in + if available { + let controller = PermissionController(context: context, splashScreen: true) + controller.setState(.custom(icon: PermissionControllerCustomIcon(light: UIImage(bundleImageName: "Location/LocalGroupLightIcon"), dark: UIImage(bundleImageName: "Location/LocalGroupDarkIcon")), title: presentationData.strings.LocalGroup_Title, subtitle: address, text: presentationData.strings.LocalGroup_Text, buttonTitle: presentationData.strings.LocalGroup_ButtonTitle, footerText: presentationData.strings.LocalGroup_IrrelevantWarning), animated: false) + controller.proceed = { result in + replaceTopControllerImpl?(createGroupController(context: context, peerIds: [], mode: .locatedGroup(latitude: latitude, longitude: longitude, address: address))) + } + pushControllerImpl?(controller) + } else { + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.CreateGroup_ErrorLocatedGroupsTooMuch, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + } + })) + }) + + let dataSignal: Signal = currentLocationManagerCoordinate(manager: context.sharedContext.locationManager!, timeout: 5.0) + |> mapToSignal { coordinate -> Signal in + guard let coordinate = coordinate else { + return .single(nil) + } + + return Signal { subscriber in + let peersNearbyContext = PeersNearbyContext(network: context.account.network, accountStateManager: context.account.stateManager, coordinate: (latitude: coordinate.latitude, longitude: coordinate.longitude)) + + let peersNearby: Signal = combineLatest(peersNearbyContext.get(), addressPromise.get()) + |> mapToSignal { peersNearby, address -> Signal<([PeerNearby]?, String?), NoError> in + if let address = address { + return .single((peersNearby, address)) + } else { + return reverseGeocodeLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) + |> map { placemark in + return (peersNearby, placemark?.fullAddress) + } + } + } + |> mapToSignal { peersNearby, address -> Signal in + guard let peersNearby = peersNearby else { + return .single(nil) + } + return context.account.postbox.transaction { transaction -> PeersNearbyData? in + var users: [PeerNearbyEntry] = [] + var groups: [PeerNearbyEntry] = [] + for peerNearby in peersNearby { + if peerNearby.id != context.account.peerId, let peer = transaction.getPeer(peerNearby.id) { + if peerNearby.id.namespace == Namespaces.Peer.CloudUser { + users.append(PeerNearbyEntry(peer: (peer, nil), expires: peerNearby.expires, distance: peerNearby.distance)) + } else { + let cachedData = transaction.getPeerCachedData(peerId: peerNearby.id) as? CachedChannelData + groups.append(PeerNearbyEntry(peer: (peer, cachedData), expires: peerNearby.expires, distance: peerNearby.distance)) + } + } + } + return PeersNearbyData(latitude: coordinate.latitude, longitude: coordinate.longitude, address: address, users: users, groups: groups, channels: []) + } + } + + let disposable = peersNearby.start(next: { data in + subscriber.putNext(data) + }) + + return ActionDisposable { + disposable.dispose() + let _ = peersNearbyContext.get() + } + } + } + dataPromise.set(dataSignal) + + let previousData = Atomic(value: nil) + let displayLoading: Signal = .single(false) + |> then( + .single(true) + |> delay(1.0, queue: Queue.mainQueue()) + ) + + let signal = combineLatest(context.sharedContext.presentationData, dataPromise.get(), displayLoading) + |> deliverOnMainQueue + |> map { presentationData, data, displayLoading -> (ItemListControllerState, (ItemListNodeState, PeersNearbyEntry.ItemGenerationArguments)) in + let previous = previousData.swap(data) + + var crossfade = false + if (data?.users.isEmpty ?? true) != (previous?.users.isEmpty ?? true) { + crossfade = true + } + if (data?.groups.isEmpty ?? true) != (previous?.groups.isEmpty ?? true) { + crossfade = true + } + + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.PeopleNearby_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) + let listState = ItemListNodeState(entries: peersNearbyControllerEntries(data: data, presentationData: presentationData, displayLoading: displayLoading), style: .blocks, emptyStateItem: nil, crossfadeState: crossfade, animateChanges: !crossfade, userInteractionEnabled: true) + + return (controllerState, (listState, arguments)) + } + |> afterDisposed { + actionsDisposable.dispose() + } + + let controller = ItemListController(context: context, state: signal) + controller.didDisappear = { [weak controller] _ in + controller?.clearItemNodesHighlight(animated: true) + } + navigateToChatImpl = { [weak controller] peer in + if let navigationController = controller?.navigationController as? NavigationController { + navigateToChatController(navigationController: navigationController, context: context, chatLocation: .peer(peer.id), keepStack: .always, purposefulAction: { [weak navigationController] in + if let navigationController = navigationController, let chatController = navigationController.viewControllers.last as? ChatController { + replaceAllButRootControllerImpl?(chatController, false) + } + }) + } + } + pushControllerImpl = { [weak controller] c in + if let controller = controller { + (controller.navigationController as? NavigationController)?.pushViewController(c, animated: true) + } + } + replaceAllButRootControllerImpl = { [weak controller] c, a in + if let controller = controller { + (controller.navigationController as? NavigationController)?.replaceAllButRootController(c, animated: a) + } + } + replaceTopControllerImpl = { [weak controller] c in + if let controller = controller { + (controller.navigationController as? NavigationController)?.replaceTopController(c, animated: true) + } + } + presentControllerImpl = { [weak controller] c, p in + if let controller = controller { + controller.present(c, in: .window(.root), with: p) + } + } + + return controller +} diff --git a/submodules/TelegramUI/TelegramUI/PeopleNearbyHeaderItem.swift b/submodules/TelegramUI/TelegramUI/PeersNearbyHeaderItem.swift similarity index 87% rename from submodules/TelegramUI/TelegramUI/PeopleNearbyHeaderItem.swift rename to submodules/TelegramUI/TelegramUI/PeersNearbyHeaderItem.swift index 8813823b2a..f0f990e06f 100644 --- a/submodules/TelegramUI/TelegramUI/PeopleNearbyHeaderItem.swift +++ b/submodules/TelegramUI/TelegramUI/PeersNearbyHeaderItem.swift @@ -3,8 +3,9 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData -class PeopleNearbyHeaderItem: ListViewItem, ItemListItem { +class PeersNearbyHeaderItem: ListViewItem, ItemListItem { let theme: PresentationTheme let text: String let sectionId: ItemListSectionId @@ -17,7 +18,7 @@ class PeopleNearbyHeaderItem: ListViewItem, ItemListItem { func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { async { - let node = PeopleNearbyHeaderItemNode() + let node = PeersNearbyHeaderItemNode() let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) node.contentSize = layout.contentSize @@ -33,7 +34,7 @@ class PeopleNearbyHeaderItem: ListViewItem, ItemListItem { func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { Queue.mainQueue().async { - guard let nodeValue = node() as? PeopleNearbyHeaderItemNode else { + guard let nodeValue = node() as? PeersNearbyHeaderItemNode else { assertionFailure() return } @@ -54,11 +55,11 @@ class PeopleNearbyHeaderItem: ListViewItem, ItemListItem { private let titleFont = Font.regular(13.0) -class PeopleNearbyHeaderItemNode: ListViewItemNode { +class PeersNearbyHeaderItemNode: ListViewItemNode { private let titleNode: TextNode - private var iconNode: PeopleNearbyIconNode? + private var iconNode: PeersNearbyIconNode? - private var item: PeopleNearbyHeaderItem? + private var item: PeersNearbyHeaderItem? init() { self.titleNode = TextNode() @@ -71,11 +72,11 @@ class PeopleNearbyHeaderItemNode: ListViewItemNode { self.addSubnode(self.titleNode) } - func asyncLayout() -> (_ item: PeopleNearbyHeaderItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + func asyncLayout() -> (_ item: PeersNearbyHeaderItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { let makeTitleLayout = TextNode.asyncLayout(self.titleNode) return { item, params, neighbors in - let leftInset: CGFloat = 54.0 + params.leftInset + let leftInset: CGFloat = 48.0 + params.leftInset let topInset: CGFloat = 92.0 let attributedText = NSAttributedString(string: item.text, font: titleFont, textColor: item.theme.list.freeTextColor) @@ -93,12 +94,12 @@ class PeopleNearbyHeaderItemNode: ListViewItemNode { strongSelf.item = item strongSelf.accessibilityLabel = attributedText.string - let iconNode: PeopleNearbyIconNode + let iconNode: PeersNearbyIconNode if let node = strongSelf.iconNode { iconNode = node iconNode.updateTheme(item.theme) } else { - iconNode = PeopleNearbyIconNode(theme: item.theme) + iconNode = PeersNearbyIconNode(theme: item.theme) strongSelf.iconNode = iconNode strongSelf.addSubnode(iconNode) } diff --git a/submodules/TelegramUI/TelegramUI/PeopleNearbyIconNode.swift b/submodules/TelegramUI/TelegramUI/PeersNearbyIconNode.swift similarity index 89% rename from submodules/TelegramUI/TelegramUI/PeopleNearbyIconNode.swift rename to submodules/TelegramUI/TelegramUI/PeersNearbyIconNode.swift index ce9e3c9559..942ed064aa 100644 --- a/submodules/TelegramUI/TelegramUI/PeopleNearbyIconNode.swift +++ b/submodules/TelegramUI/TelegramUI/PeersNearbyIconNode.swift @@ -2,10 +2,10 @@ import Foundation import UIKit import Display import AsyncDisplayKit - +import TelegramPresentationData import LegacyComponents -private final class PeopleNearbyIconWavesNodeParams: NSObject { +private final class PeersNearbyIconWavesNodeParams: NSObject { let color: UIColor let progress: CGFloat @@ -21,7 +21,7 @@ private func degToRad(_ degrees: CGFloat) -> CGFloat { return degrees * CGFloat.pi / 180.0 } -final class PeopleNearbyIconWavesNode: ASDisplayNode { +final class PeersNearbyIconWavesNode: ASDisplayNode { var color: UIColor { didSet { self.setNeedsDisplay() @@ -51,10 +51,10 @@ final class PeopleNearbyIconWavesNode: ASDisplayNode { let animation = POPBasicAnimation() animation.property = (POPAnimatableProperty.property(withName: "progress", initializer: { property in property?.readBlock = { node, values in - values?.pointee = (node as! PeopleNearbyIconWavesNode).effectiveProgress + values?.pointee = (node as! PeersNearbyIconWavesNode).effectiveProgress } property?.writeBlock = { node, values in - (node as! PeopleNearbyIconWavesNode).effectiveProgress = values!.pointee + (node as! PeersNearbyIconWavesNode).effectiveProgress = values!.pointee } property?.threshold = 0.01 }) as! POPAnimatableProperty) @@ -75,7 +75,7 @@ final class PeopleNearbyIconWavesNode: ASDisplayNode { override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { let t = CACurrentMediaTime() let value: CGFloat = CGFloat(t.truncatingRemainder(dividingBy: 2.0)) / 2.0 - return PeopleNearbyIconWavesNodeParams(color: self.color, progress: value) + return PeersNearbyIconWavesNodeParams(color: self.color, progress: value) } @objc override class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled: () -> Bool, isRasterizing: Bool) { @@ -87,7 +87,7 @@ final class PeopleNearbyIconWavesNode: ASDisplayNode { context.fill(bounds) } - if let parameters = parameters as? PeopleNearbyIconWavesNodeParams { + if let parameters = parameters as? PeersNearbyIconWavesNodeParams { let center = CGPoint(x: bounds.width / 2.0, y: bounds.height / 2.0) let radius: CGFloat = bounds.width * 0.3333 let range: CGFloat = (bounds.width - radius * 2.0) / 2.0 @@ -158,22 +158,27 @@ private func generateIcon(size: CGSize, color: UIColor, contentColor: UIColor) - context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) context.translateBy(x: 0.0, y: 6.0) context.setFillColor(contentColor.cgColor) + + if size.width == 120.0 { + context.translateBy(x: 30.0, y: 30.0) + } + let _ = try? drawSvgPath(context, path: "M27.8628211,52.2347452 L27.8628211,27.1373017 L2.76505663,27.1373017 C1.55217431,27.1373017 0.568938916,26.1540663 0.568938916,24.941184 C0.568938916,24.0832172 1.06857435,23.3038117 1.84819149,22.9456161 L51.2643819,0.241311309 C52.586928,-0.366333451 54.1516568,0.213208572 54.7593016,1.53575465 C55.0801868,2.23416513 55.080181,3.03785964 54.7592857,3.7362655 L32.0544935,53.1516391 C31.548107,54.2537536 30.2441593,54.7366865 29.1420449,54.2302999 C28.3624433,53.8720978 27.8628211,53.0927006 27.8628211,52.2347452 Z ") })! } -final class PeopleNearbyIconNode: ASDisplayNode { +final class PeersNearbyIconNode: ASDisplayNode { private var theme: PresentationTheme private var iconNode: ASImageNode - private var wavesNode: PeopleNearbyIconWavesNode + private var wavesNode: PeersNearbyIconWavesNode init(theme: PresentationTheme) { self.theme = theme self.iconNode = ASImageNode() self.iconNode.isOpaque = false - self.wavesNode = PeopleNearbyIconWavesNode(color: theme.list.itemAccentColor) + self.wavesNode = PeersNearbyIconWavesNode(color: theme.list.itemAccentColor) super.init() diff --git a/submodules/TelegramUI/TelegramUI/PeopleNearbyController.swift b/submodules/TelegramUI/TelegramUI/PeopleNearbyController.swift deleted file mode 100644 index da914e62b8..0000000000 --- a/submodules/TelegramUI/TelegramUI/PeopleNearbyController.swift +++ /dev/null @@ -1,330 +0,0 @@ -import Foundation -import UIKit -import Display -import SwiftSignalKit -import Postbox -import TelegramCore -import MapKit - -private struct PeerNearbyEntry { - let peer: Peer - let expires: Int32 - let distance: Int32 -} - -private func arePeersNearbyEqual(_ lhs: PeerNearbyEntry?, _ rhs: PeerNearbyEntry?) -> Bool { - if let lhs = lhs, let rhs = rhs { - return lhs.peer.isEqual(rhs.peer) && lhs.expires == rhs.expires && lhs.distance == rhs.distance - } else { - return (lhs != nil) == (rhs != nil) - } -} - -private func arePeerNearbyArraysEqual(_ lhs: [PeerNearbyEntry], _ rhs: [PeerNearbyEntry]) -> Bool { - if lhs.count != rhs.count { - return false - } - for i in 0 ..< lhs.count { - if !lhs[i].peer.isEqual(rhs[i].peer) || lhs[i].expires != rhs[i].expires || lhs[i].distance != rhs[i].distance { - return false - } - } - return true -} - -private final class PeopleNearbyControllerArguments { - let context: AccountContext - let openChat: (Peer) -> Void - let openCreateGroup: () -> Void - - init(context: AccountContext, openChat: @escaping (Peer) -> Void, openCreateGroup: @escaping () -> Void) { - self.context = context - self.openChat = openChat - self.openCreateGroup = openCreateGroup - } -} - -private enum PeopleNearbySection: Int32 { - case header - case users - case groups - case channels -} - -private enum PeopleNearbyEntry: ItemListNodeEntry { - case header(PresentationTheme, String) - - case usersHeader(PresentationTheme, String) - case empty(PresentationTheme, String) - case user(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) - - case groupsHeader(PresentationTheme, String) - case createGroup(PresentationTheme, String) - case group(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) - - case channelsHeader(PresentationTheme, String) - case channel(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) - - var section: ItemListSectionId { - switch self { - case .header: - return PeopleNearbySection.header.rawValue - case .usersHeader, .empty, .user: - return PeopleNearbySection.users.rawValue - case .groupsHeader, .createGroup, .group: - return PeopleNearbySection.groups.rawValue - case .channelsHeader, .channel: - return PeopleNearbySection.channels.rawValue - } - } - - var stableId: Int32 { - switch self { - case .header: - return 0 - case .usersHeader: - return 1 - case .empty: - return 2 - case let .user(index, _, _, _, _, _): - return 3 + index - case .groupsHeader: - return 1000 - case .createGroup: - return 1001 - case let .group(index, _, _, _, _, _): - return 1002 + index - case .channelsHeader: - return 2000 - case let .channel(index, _, _, _, _, _): - return 2001 + index - } - } - - static func ==(lhs: PeopleNearbyEntry, rhs: PeopleNearbyEntry) -> Bool { - switch lhs { - case let .header(lhsTheme, lhsText): - if case let .header(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { - return true - } else { - return false - } - case let .usersHeader(lhsTheme, lhsText): - if case let .usersHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { - return true - } else { - return false - } - case let .empty(lhsTheme, lhsText): - if case let .empty(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { - return true - } else { - return false - } - case let .user(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsDisplayOrder, lhsPeer): - if case let .user(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsDisplayOrder, rhsPeer) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsDisplayOrder == rhsDisplayOrder, arePeersNearbyEqual(lhsPeer, rhsPeer) { - return true - } else { - return false - } - case let .groupsHeader(lhsTheme, lhsText): - if case let .groupsHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { - return true - } else { - return false - } - case let .createGroup(lhsTheme, lhsText): - if case let .createGroup(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { - return true - } else { - return false - } - case let .group(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsDisplayOrder, lhsPeer): - if case let .group(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsDisplayOrder, rhsPeer) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsDisplayOrder == rhsDisplayOrder, arePeersNearbyEqual(lhsPeer, rhsPeer) { - return true - } else { - return false - } - case let .channelsHeader(lhsTheme, lhsText): - if case let .channelsHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { - return true - } else { - return false - } - case let .channel(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsDisplayOrder, lhsPeer): - if case let .channel(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsDisplayOrder, rhsPeer) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsDisplayOrder == rhsDisplayOrder, arePeersNearbyEqual(lhsPeer, rhsPeer) { - return true - } else { - return false - } - } - } - - static func <(lhs: PeopleNearbyEntry, rhs: PeopleNearbyEntry) -> Bool { - return lhs.stableId < rhs.stableId - } - - func item(_ arguments: PeopleNearbyControllerArguments) -> ListViewItem { - switch self { - case let .header(theme, text): - return PeopleNearbyHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .usersHeader(theme, text): - return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .empty(theme, text): - return ItemListPlaceholderItem(theme: theme, text: text, sectionId: self.section, style: .blocks) - case let .user(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): - func distance(_ distance: Int32) -> String { - var distance = max(1, distance) - let formatter = MKDistanceFormatter() - formatter.unitStyle = .abbreviated - return formatter.string(fromDistance: Double(distance)) - } - - return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer.peer, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: .text(distance(peer.distance)), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { - arguments.openChat(peer.peer) - }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopStripe: false, hasTopGroupInset: false, tag: nil) - case let .groupsHeader(theme, text): - return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .createGroup(theme, title): - return ContactListActionItem(theme: theme, title: title, icon: .generic(UIImage(bundleImageName: "Contact List/CreateGroupActionIcon")!), header: nil, action: { - arguments.openCreateGroup() - }) - case let .group(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): - return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer.peer, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: .text("10 members"), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { - arguments.openChat(peer.peer) - }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopStripe: false, hasTopGroupInset: false, tag: nil) - case let .channelsHeader(theme, text): - return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .channel(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): - return ItemListPeerItem(theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, account: arguments.context.account, peer: peer.peer, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: .text("10 members"), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { - arguments.openChat(peer.peer) - }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopStripe: false, hasTopGroupInset: false, tag: nil) - } - } -} - -private struct PeopleNearbyControllerState: Equatable { - static func ==(lhs: PeopleNearbyControllerState, rhs: PeopleNearbyControllerState) -> Bool { - return true - } -} - -private struct PeopleNearbyData: Equatable { - let users: [PeerNearbyEntry] - let groups: [PeerNearbyEntry] - let channels: [PeerNearbyEntry] - - init(users: [PeerNearbyEntry], groups: [PeerNearbyEntry], channels: [PeerNearbyEntry]) { - self.users = users - self.groups = groups - self.channels = channels - } - - static func ==(lhs: PeopleNearbyData, rhs: PeopleNearbyData) -> Bool { - return arePeerNearbyArraysEqual(lhs.users, rhs.users) && arePeerNearbyArraysEqual(lhs.groups, rhs.groups) && arePeerNearbyArraysEqual(lhs.channels, rhs.channels) - } -} - -private func peopleNearbyControllerEntries(state: PeopleNearbyControllerState, data: PeopleNearbyData?, presentationData: PresentationData) -> [PeopleNearbyEntry] { - var entries: [PeopleNearbyEntry] = [] - - entries.append(.header(presentationData.theme, presentationData.strings.PeopleNearby_Description)) - entries.append(.usersHeader(presentationData.theme, presentationData.strings.PeopleNearby_Users.uppercased())) - if let data = data, !data.users.isEmpty { - var i: Int32 = 0 - for user in data.users { - entries.append(.user(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, user)) - i += 1 - } - } else { - entries.append(.empty(presentationData.theme, presentationData.strings.PeopleNearby_UsersEmpty)) - } - -// entries.append(.groupsHeader(presentationData.theme, presentationData.strings.PeopleNearby_Groups.uppercased())) -// entries.append(.createGroup(presentationData.theme, presentationData.strings.PeopleNearby_CreateGroup)) -// if let data = data, !data.groups.isEmpty { -// var i: Int32 = 0 -// for group in data.groups { -// entries.append(.group(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, group)) -// i += 1 -// } -// } -// -// if let data = data, !data.channels.isEmpty { -// var i: Int32 = 0 -// for channel in data.channels { -// entries.append(.channel(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, channel)) -// i += 1 -// } -// } - - return entries -} - -public func peopleNearbyController(context: AccountContext) -> ViewController { - let statePromise = ValuePromise(PeopleNearbyControllerState(), ignoreRepeated: true) - let stateValue = Atomic(value: PeopleNearbyControllerState()) - let updateState: ((PeopleNearbyControllerState) -> PeopleNearbyControllerState) -> Void = { f in - statePromise.set(stateValue.modify { f($0) }) - } - - var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? - var navigateToChatImpl: ((Peer) -> Void)? - - let actionsDisposable = DisposableSet() - - let dataPromise = Promise(nil) - - let arguments = PeopleNearbyControllerArguments(context: context, openChat: { peer in - navigateToChatImpl?(peer) - }, openCreateGroup: { - - }) - - let dataSignal: Signal = currentLocationManagerCoordinate(manager: context.sharedContext.locationManager!, timeout: 5.0) - |> mapToSignal { coordinate -> Signal in - guard let coordinate = coordinate else { - return .single(nil) - } - let poll = peersNearby(network: context.account.network, accountStateManager: context.account.stateManager, coordinate: (latitude: coordinate.latitude, longitude: coordinate.longitude), radius: 100) - |> mapToSignal { peersNearby -> Signal in - return context.account.postbox.transaction { transaction -> PeopleNearbyData? in - var result: [PeerNearbyEntry] = [] - for peerNearby in peersNearby { - if peerNearby.id != context.account.peerId, let peer = transaction.getPeer(peerNearby.id) { - result.append(PeerNearbyEntry(peer: peer, expires: peerNearby.expires, distance: peerNearby.distance)) - } - } - return PeopleNearbyData(users: result, groups: [], channels: []) - } - } - return (poll |> then(.complete() |> suspendAwareDelay(25.0, queue: Queue.concurrentDefaultQueue()))) |> restart - } - - dataPromise.set(dataSignal) - - let signal = combineLatest(context.sharedContext.presentationData, statePromise.get(), dataPromise.get()) - |> deliverOnMainQueue - |> map { presentationData, state, data -> (ItemListControllerState, (ItemListNodeState, PeopleNearbyEntry.ItemGenerationArguments)) in - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.PeopleNearby_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - let listState = ItemListNodeState(entries: peopleNearbyControllerEntries(state: state, data: data, presentationData: presentationData), style: .blocks, emptyStateItem: nil, crossfadeState: false, animateChanges: true, userInteractionEnabled: true) - - return (controllerState, (listState, arguments)) - } |> afterDisposed { - actionsDisposable.dispose() - } - - let controller = ItemListController(context: context, state: signal) - navigateToChatImpl = { [weak controller] peer in - if let navigationController = controller?.navigationController as? NavigationController { - navigateToChatController(navigationController: navigationController, context: context, chatLocation: .peer(peer.id), keepStack: .always) - } - } - presentControllerImpl = { [weak controller] c, p in - if let controller = controller { - controller.present(c, in: .window(.root), with: p) - } - } - - return controller -} diff --git a/submodules/TelegramUI/TelegramUI/Permission.swift b/submodules/TelegramUI/TelegramUI/Permission.swift index bf651b469b..7262410961 100644 --- a/submodules/TelegramUI/TelegramUI/Permission.swift +++ b/submodules/TelegramUI/TelegramUI/Permission.swift @@ -2,12 +2,14 @@ import Foundation import SwiftSignalKit import Postbox import TelegramCore +import DeviceAccess public enum PermissionKind: Int32 { case contacts case notifications case siri case cellularData + case nearbyLocation } public enum PermissionRequestStatus { @@ -35,6 +37,7 @@ public enum PermissionState: Equatable { case notifications(status: PermissionRequestStatus) case siri(status: PermissionRequestStatus) case cellularData + case nearbyLocation(status: PermissionRequestStatus) var kind: PermissionKind { switch self { @@ -46,6 +49,8 @@ public enum PermissionState: Equatable { return .siri case .cellularData: return .cellularData + case .nearbyLocation: + return .nearbyLocation } } @@ -59,12 +64,16 @@ public enum PermissionState: Equatable { return status case .cellularData: return .unreachable + case let .nearbyLocation(status): + return status } } } public func requiredPermissions(context: AccountContext) -> Signal<(PermissionState, PermissionState, PermissionState), NoError> { - return combineLatest(DeviceAccess.authorizationStatus(context: context, subject: .contacts), DeviceAccess.authorizationStatus(context: context, subject: .notifications), DeviceAccess.authorizationStatus(context: context, subject: .siri)) + return combineLatest(DeviceAccess.authorizationStatus(subject: .contacts), DeviceAccess.authorizationStatus(applicationInForeground: context.sharedContext.applicationBindings.applicationInForeground, subject: .notifications), DeviceAccess.authorizationStatus(siriAuthorization: { + return context.sharedContext.applicationBindings.siriAuthorization() + }, subject: .siri)) |> map { contactsStatus, notificationsStatus, siriStatus in return (.contacts(status: PermissionRequestStatus(accessType: contactsStatus)), .notifications(status: PermissionRequestStatus(accessType: notificationsStatus)), .siri(status: PermissionRequestStatus(accessType: siriStatus))) } diff --git a/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift b/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift index 2a7ce4d2fc..3a8bd2b6de 100644 --- a/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/PermissionContentNode.swift @@ -2,42 +2,78 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData + +enum PermissionContentIcon { + case image(UIImage?) + case icon(PermissionControllerCustomIcon) + + func imageForTheme(_ theme: PresentationTheme) -> UIImage? { + switch self { + case let .image(image): + return image + case let .icon(icon): + return theme.overallDarkAppearance ? (icon.dark ?? icon.light) : icon.light + } + } +} final class PermissionContentNode: ASDisplayNode { private var theme: PresentationTheme - let kind: PermissionKind - + let kind: Int32 + private let iconNode: ASImageNode + private let nearbyIconNode: PeersNearbyIconNode? private let titleNode: ImmediateTextNode + private let subtitleNode: ImmediateTextNode private let textNode: ImmediateTextNode private let actionButton: SolidRoundedButtonNode + private let footerNode: ImmediateTextNode private let privacyPolicyButton: HighlightableButtonNode + private let icon: PermissionContentIcon private var title: String + private var text: String var buttonAction: (() -> Void)? var openPrivacyPolicy: (() -> Void)? - init(theme: PresentationTheme, strings: PresentationStrings, kind: PermissionKind, icon: UIImage?, title: String, text: String, buttonTitle: String, buttonAction: @escaping () -> Void, openPrivacyPolicy: (() -> Void)?) { + var validLayout: (CGSize, UIEdgeInsets)? + + init(theme: PresentationTheme, strings: PresentationStrings, kind: Int32, icon: PermissionContentIcon, title: String, subtitle: String? = nil, text: String, buttonTitle: String, footerText: String? = nil, buttonAction: @escaping () -> Void, openPrivacyPolicy: (() -> Void)?) { self.theme = theme self.kind = kind self.buttonAction = buttonAction self.openPrivacyPolicy = openPrivacyPolicy + self.icon = icon self.title = title + self.text = text self.iconNode = ASImageNode() self.iconNode.isLayerBacked = true self.iconNode.displayWithoutProcessing = true self.iconNode.displaysAsynchronously = false + if kind == PermissionKind.nearbyLocation.rawValue { + self.nearbyIconNode = PeersNearbyIconNode(theme: theme) + } else { + self.nearbyIconNode = nil + } + self.titleNode = ImmediateTextNode() self.titleNode.maximumNumberOfLines = 0 self.titleNode.textAlignment = .center self.titleNode.isUserInteractionEnabled = false self.titleNode.displaysAsynchronously = false + self.subtitleNode = ImmediateTextNode() + self.subtitleNode.maximumNumberOfLines = 1 + self.subtitleNode.textAlignment = .center + self.subtitleNode.isUserInteractionEnabled = false + self.subtitleNode.displaysAsynchronously = false + self.textNode = ImmediateTextNode() self.textNode.textAlignment = .center self.textNode.maximumNumberOfLines = 0 @@ -45,12 +81,17 @@ final class PermissionContentNode: ASDisplayNode { self.actionButton = SolidRoundedButtonNode(theme: theme, height: 48.0, cornerRadius: 9.0) + self.footerNode = ImmediateTextNode() + self.footerNode.textAlignment = .center + self.footerNode.maximumNumberOfLines = 0 + self.footerNode.displaysAsynchronously = false + self.privacyPolicyButton = HighlightableButtonNode() self.privacyPolicyButton.setTitle(strings.Permissions_PrivacyPolicy, with: Font.regular(16.0), with: theme.list.itemAccentColor, for: .normal) super.init() - self.iconNode.image = icon + self.iconNode.image = icon.imageForTheme(theme) self.title = title let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemPrimaryTextColor) @@ -60,10 +101,23 @@ final class PermissionContentNode: ASDisplayNode { self.actionButton.title = buttonTitle self.privacyPolicyButton.isHidden = openPrivacyPolicy == nil + if let subtitle = subtitle { + self.subtitleNode.attributedText = NSAttributedString(string: subtitle, font: Font.regular(13.0), textColor: theme.list.freeTextColor, paragraphAlignment: .center) + } + + if let footerText = footerText { + self.footerNode.attributedText = NSAttributedString(string: footerText, font: Font.regular(13.0), textColor: theme.list.freeTextColor, paragraphAlignment: .center) + } + self.addSubnode(self.iconNode) + if let nearbyIconNode = self.nearbyIconNode { + self.addSubnode(nearbyIconNode) + } self.addSubnode(self.titleNode) + self.addSubnode(self.subtitleNode) self.addSubnode(self.textNode) self.addSubnode(self.actionButton) + self.addSubnode(self.footerNode) self.addSubnode(self.privacyPolicyButton) self.actionButton.pressed = { [weak self] in @@ -73,34 +127,70 @@ final class PermissionContentNode: ASDisplayNode { self.privacyPolicyButton.addTarget(self, action: #selector(self.privacyPolicyPressed), forControlEvents: .touchUpInside) } + func updatePresentationData(_ presentationData: PresentationData) { + let theme = presentationData.theme + self.theme = theme + + self.iconNode.image = self.icon.imageForTheme(theme) + + let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemPrimaryTextColor) + let link = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemAccentColor, additionalAttributes: [TelegramTextAttributes.URL: ""]) + self.textNode.attributedText = parseMarkdownIntoAttributedString(self.text.replacingOccurrences(of: "]", with: "]()"), attributes: MarkdownAttributes(body: body, bold: body, link: link, linkAttribute: { _ in nil }), textAlignment: .center) + + if let subtitle = self.subtitleNode.attributedText?.string { + self.subtitleNode.attributedText = NSAttributedString(string: subtitle, font: Font.regular(13.0), textColor: theme.list.freeTextColor, paragraphAlignment: .center) + } + if let footerText = self.footerNode.attributedText?.string { + self.footerNode.attributedText = NSAttributedString(string: footerText, font: Font.regular(13.0), textColor: theme.list.freeTextColor, paragraphAlignment: .center) + } + + if let privacyPolicyTitle = self.privacyPolicyButton.attributedTitle(for: .normal)?.string { + self.privacyPolicyButton.setTitle(privacyPolicyTitle, with: Font.regular(16.0), with: theme.list.itemAccentColor, for: .normal) + } + + if let validLayout = self.validLayout { + self.updateLayout(size: validLayout.0, insets: validLayout.1, transition: .immediate) + } + } + @objc func privacyPolicyPressed() { self.openPrivacyPolicy?() } func updateLayout(size: CGSize, insets: UIEdgeInsets, transition: ContainedViewLayoutTransition) { + self.validLayout = (size, insets) + let sidePadding: CGFloat let fontSize: CGFloat if min(size.width, size.height) > 330.0 { fontSize = 24.0 - sidePadding = 38.0 + sidePadding = 36.0 } else { fontSize = 20.0 sidePadding = 20.0 } - self.titleNode.attributedText = NSAttributedString(string: self.title, font: Font.semibold(fontSize), textColor: self.theme.list.itemPrimaryTextColor) + let smallerSidePadding: CGFloat = 20.0 + + self.titleNode.attributedText = NSAttributedString(string: self.title, font: Font.bold(fontSize), textColor: self.theme.list.itemPrimaryTextColor) let titleSize = self.titleNode.updateLayout(CGSize(width: size.width - sidePadding * 2.0, height: .greatestFiniteMagnitude)) + let subtitleSize = self.subtitleNode.updateLayout(CGSize(width: size.width - smallerSidePadding * 2.0, height: .greatestFiniteMagnitude)) let textSize = self.textNode.updateLayout(CGSize(width: size.width - sidePadding * 2.0, height: .greatestFiniteMagnitude)) let buttonWidth = min(size.width, size.height) let buttonHeight = self.actionButton.updateLayout(width: buttonWidth, transition: transition) + let footerSize = self.footerNode.updateLayout(CGSize(width: size.width - smallerSidePadding * 2.0, height: .greatestFiniteMagnitude)) let privacyButtonSize = self.privacyPolicyButton.measure(CGSize(width: size.width - sidePadding * 2.0, height: .greatestFiniteMagnitude)) - let availableHeight = floor(size.height - insets.top - insets.bottom - titleSize.height - textSize.height - buttonHeight) + let availableHeight = floor(size.height - insets.top - insets.bottom - titleSize.height - subtitleSize.height - textSize.height - buttonHeight) - let titleSubtitleSpacing: CGFloat = max(15.0, floor(availableHeight * 0.055)) + let titleTextSpacing: CGFloat = max(15.0, floor(availableHeight * 0.045)) + let titleSubtitleSpacing: CGFloat = 6.0 let buttonSpacing: CGFloat = max(19.0, floor(availableHeight * 0.075)) - var contentHeight = titleSize.height + titleSubtitleSpacing + textSize.height + buttonHeight + buttonSpacing + var contentHeight = titleSize.height + titleTextSpacing + textSize.height + buttonHeight + buttonSpacing + if subtitleSize.height > 0.0 { + contentHeight += titleSubtitleSpacing + subtitleSize.height + } var imageSize = CGSize() var imageSpacing: CGFloat = 0.0 @@ -109,21 +199,49 @@ final class PermissionContentNode: ASDisplayNode { imageSize = icon.size contentHeight += imageSize.height + imageSpacing } + if let _ = self.nearbyIconNode, size.width < size.height { + imageSpacing = floor(availableHeight * 0.12) + imageSize = CGSize(width: 120.0, height: 120.0) + contentHeight += imageSize.height + imageSpacing + } - let privacySpacing: CGFloat = max(30.0 + privacyButtonSize.height, (availableHeight - titleSubtitleSpacing - buttonSpacing - imageSize.height - imageSpacing) / 2.0) + let privacySpacing: CGFloat = max(30.0 + privacyButtonSize.height, (availableHeight - titleTextSpacing - buttonSpacing - imageSize.height - imageSpacing) / 2.0) - let contentOrigin = insets.top + floor((size.height - insets.top - insets.bottom - contentHeight) / 2.0) + var verticalOffset: CGFloat = 0.0 + if size.height >= 568.0 { + verticalOffset = availableHeight * 0.05 + } + + let contentOrigin = insets.top + floor((size.height - insets.top - insets.bottom - contentHeight) / 2.0) - verticalOffset let iconFrame = CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: contentOrigin), size: imageSize) + let nearbyIconFrame = CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: contentOrigin), size: imageSize) let titleFrame = CGRect(origin: CGPoint(x: floor((size.width - titleSize.width) / 2.0), y: iconFrame.maxY + imageSpacing), size: titleSize) - let textFrame = CGRect(origin: CGPoint(x: floor((size.width - textSize.width) / 2.0), y: titleFrame.maxY + titleSubtitleSpacing), size: textSize) + + let subtitleFrame: CGRect + if subtitleSize.height > 0.0 { + subtitleFrame = CGRect(origin: CGPoint(x: floor((size.width - subtitleSize.width) / 2.0), y: titleFrame.maxY + titleSubtitleSpacing), size: subtitleSize) + } else { + subtitleFrame = titleFrame + } + + let textFrame = CGRect(origin: CGPoint(x: floor((size.width - textSize.width) / 2.0), y: subtitleFrame.maxY + titleTextSpacing), size: textSize) let buttonFrame = CGRect(origin: CGPoint(x: floor((size.width - buttonWidth) / 2.0), y: textFrame.maxY + buttonSpacing), size: CGSize(width: buttonWidth, height: buttonHeight)) + + let footerFrame = CGRect(origin: CGPoint(x: floor((size.width - footerSize.width) / 2.0), y: size.height - footerSize.height - insets.bottom - 8.0), size: footerSize) + let privacyButtonFrame = CGRect(origin: CGPoint(x: floor((size.width - privacyButtonSize.width) / 2.0), y: buttonFrame.maxY + floor((privacySpacing - privacyButtonSize.height) / 2.0)), size: privacyButtonSize) - transition.updateFrame(node: self.iconNode, frame: iconFrame) + if let nearbyIconNode = self.nearbyIconNode { + transition.updateFrame(node: nearbyIconNode, frame: nearbyIconFrame) + } transition.updateFrame(node: self.titleNode, frame: titleFrame) + transition.updateFrame(node: self.subtitleNode, frame: subtitleFrame) transition.updateFrame(node: self.textNode, frame: textFrame) transition.updateFrame(node: self.actionButton, frame: buttonFrame) + transition.updateFrame(node: self.footerNode, frame: footerFrame) transition.updateFrame(node: self.privacyPolicyButton, frame: privacyButtonFrame) + + self.footerNode.isHidden = size.height < 568.0 } } diff --git a/submodules/TelegramUI/TelegramUI/PermissionController.swift b/submodules/TelegramUI/TelegramUI/PermissionController.swift index 8eb355bdc1..89a9e5c6e1 100644 --- a/submodules/TelegramUI/TelegramUI/PermissionController.swift +++ b/submodules/TelegramUI/TelegramUI/PermissionController.swift @@ -4,21 +4,19 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData +import DeviceAccess public final class PermissionController : ViewController { private let context: AccountContext - private let splitTest: PermissionUISplitTest - private var state: PermissionState? + private let splitTest: PermissionUISplitTest? + private var state: PermissionControllerContent? + private var splashScreen = false private var controllerNode: PermissionControllerNode { return self.displayNode as! PermissionControllerNode } - private var _ready = Promise() - override public var ready: Promise { - return self._ready - } - private var didPlayPresentationAnimation = false private var presentationData: PresentationData @@ -28,12 +26,20 @@ public final class PermissionController : ViewController { private var skip: (() -> Void)? public var proceed: ((Bool) -> Void)? - public init(context: AccountContext, splitTest: PermissionUISplitTest) { + public init(context: AccountContext, splashScreen: Bool = true, splitTest: PermissionUISplitTest? = nil) { self.context = context self.splitTest = splitTest self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.splashScreen = splashScreen - super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: NavigationBarTheme(buttonColor: self.presentationData.theme.rootController.navigationBar.accentTextColor, disabledButtonColor: self.presentationData.theme.rootController.navigationBar.disabledButtonColor, primaryTextColor: self.presentationData.theme.rootController.navigationBar.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear), strings: NavigationBarStrings(presentationStrings: self.presentationData.strings))) + let navigationBarPresentationData: NavigationBarPresentationData + if splashScreen { + navigationBarPresentationData = NavigationBarPresentationData(theme: NavigationBarTheme(buttonColor: self.presentationData.theme.rootController.navigationBar.accentTextColor, disabledButtonColor: self.presentationData.theme.rootController.navigationBar.disabledButtonColor, primaryTextColor: self.presentationData.theme.rootController.navigationBar.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear), strings: NavigationBarStrings(presentationStrings: self.presentationData.strings)) + } else { + navigationBarPresentationData = NavigationBarPresentationData(presentationData: self.presentationData) + } + + super.init(navigationBarPresentationData: navigationBarPresentationData) self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) @@ -75,9 +81,19 @@ public final class PermissionController : ViewController { private func updateThemeAndStrings() { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBar.style.style - self.navigationBar?.updatePresentationData(NavigationBarPresentationData(theme: NavigationBarTheme(buttonColor: self.presentationData.theme.rootController.navigationBar.accentTextColor, disabledButtonColor: self.presentationData.theme.rootController.navigationBar.disabledButtonColor, primaryTextColor: self.presentationData.theme.rootController.navigationBar.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear), strings: NavigationBarStrings(presentationStrings: self.presentationData.strings))) + + let navigationBarPresentationData: NavigationBarPresentationData + if self.splashScreen { + navigationBarPresentationData = NavigationBarPresentationData(theme: NavigationBarTheme(buttonColor: self.presentationData.theme.rootController.navigationBar.accentTextColor, disabledButtonColor: self.presentationData.theme.rootController.navigationBar.disabledButtonColor, primaryTextColor: self.presentationData.theme.rootController.navigationBar.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear), strings: NavigationBarStrings(presentationStrings: self.presentationData.strings)) + } else { + navigationBarPresentationData = NavigationBarPresentationData(presentationData: self.presentationData) + } + + self.navigationBar?.updatePresentationData(navigationBarPresentationData) self.navigationItem.backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) - self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Permissions_Skip, style: .plain, target: self, action: #selector(PermissionController.nextPressed)) + if self.navigationItem.rightBarButtonItem != nil { + self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Permissions_Skip, style: .plain, target: self, action: #selector(PermissionController.nextPressed)) + } self.controllerNode.updatePresentationData(self.presentationData) } @@ -85,73 +101,103 @@ public final class PermissionController : ViewController { self.context.sharedContext.applicationBindings.openSettings() } - public func setState(_ state: PermissionState, animated: Bool) { + public func setState(_ state: PermissionControllerContent, animated: Bool) { guard state != self.state else { return } self.state = state - switch state { - case let .contacts(status): - self.splitTest.addEvent(.ContactsModalRequest) - - self.allow = { [weak self] in - if let strongSelf = self { - switch status { - case .requestable: - strongSelf.splitTest.addEvent(.ContactsRequest) - DeviceAccess.authorizeAccess(to: .contacts, context: strongSelf.context, { [weak self] result in - if let strongSelf = self { - if result { - strongSelf.splitTest.addEvent(.ContactsAllowed) - } else { - strongSelf.splitTest.addEvent(.ContactsDenied) + if case let .permission(permission) = state, let state = permission { + switch state { + case let .contacts(status): + self.splitTest?.addEvent(.ContactsModalRequest) + + self.allow = { [weak self] in + if let strongSelf = self { + switch status { + case .requestable: + strongSelf.splitTest?.addEvent(.ContactsRequest) + DeviceAccess.authorizeAccess(to: .contacts, { [weak self] result in + if let strongSelf = self { + if result { + strongSelf.splitTest?.addEvent(.ContactsAllowed) + } else { + strongSelf.splitTest?.addEvent(.ContactsDenied) + } + strongSelf.proceed?(true) } - strongSelf.proceed?(true) - } - }) - case .denied: - strongSelf.openAppSettings() - strongSelf.proceed?(true) - default: - break + }) + case .denied: + strongSelf.openAppSettings() + strongSelf.proceed?(true) + default: + break + } } } - } - case let .notifications(status): - self.splitTest.addEvent(.NotificationsModalRequest) - - self.allow = { [weak self] in - if let strongSelf = self { - switch status { - case .requestable: - strongSelf.splitTest.addEvent(.NotificationsRequest) - DeviceAccess.authorizeAccess(to: .notifications, context: strongSelf.context, { [weak self] result in - if let strongSelf = self { - if result { - strongSelf.splitTest.addEvent(.NotificationsAllowed) - } else { - strongSelf.splitTest.addEvent(.NotificationsDenied) + case let .notifications(status): + self.splitTest?.addEvent(.NotificationsModalRequest) + + self.allow = { [weak self] in + if let strongSelf = self { + switch status { + case .requestable: + strongSelf.splitTest?.addEvent(.NotificationsRequest) + let context = strongSelf.context + DeviceAccess.authorizeAccess(to: .notifications, registerForNotifications: { [weak context] result in + context?.sharedContext.applicationBindings.registerForNotifications(result) + }, { [weak self] result in + if let strongSelf = self { + if result { + strongSelf.splitTest?.addEvent(.NotificationsAllowed) + } else { + strongSelf.splitTest?.addEvent(.NotificationsDenied) + } + strongSelf.proceed?(true) } - strongSelf.proceed?(true) - } - }) + }) + case .denied, .unreachable: + strongSelf.openAppSettings() + strongSelf.proceed?(true) + default: + break + } + } + } + case .siri: + self.allow = { [weak self] in + self?.proceed?(true) + } + case .cellularData: + self.allow = { [weak self] in + self?.proceed?(true) + } + case let .nearbyLocation(status): + self.title = self.presentationData.strings.Permissions_PeopleNearbyTitle_v0 + self.navigationItem.rightBarButtonItem = nil + + self.allow = { [weak self] in + if let strongSelf = self { + switch status { + case .requestable: + DeviceAccess.authorizeAccess(to: .location(.tracking), presentationData: strongSelf.context.sharedContext.currentPresentationData.with { $0 }, { [weak self] result in + self?.proceed?(result) + }) case .denied, .unreachable: strongSelf.openAppSettings() - strongSelf.proceed?(true) + strongSelf.proceed?(false) default: break + } } } + } + } else { + self.allow = { [weak self] in + if let strongSelf = self { + strongSelf.proceed?(true) } - case let .siri(status): - self.allow = { [weak self] in - self?.proceed?(true) - } - case .cellularData: - self.allow = { [weak self] in - self?.proceed?(true) - } + } } self.skip = { [weak self] in diff --git a/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift b/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift index 131ac9d111..a3318b8d1d 100644 --- a/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PermissionControllerNode.swift @@ -4,9 +4,25 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData + +public struct PermissionControllerCustomIcon: Equatable { + let light: UIImage? + let dark: UIImage? + + init(light: UIImage?, dark: UIImage?) { + self.light = light + self.dark = dark + } +} + +public enum PermissionControllerContent: Equatable { + case permission(PermissionState?) + case custom(icon: PermissionControllerCustomIcon, title: String, subtitle: String?, text: String, buttonTitle: String, footerText: String?) +} private struct PermissionControllerDataState: Equatable { - var state: PermissionState? + var state: PermissionControllerContent? } private struct PermissionControllerLayoutState: Equatable { @@ -46,7 +62,7 @@ private func localizedString(for key: String, strings: PresentationStrings, fall final class PermissionControllerNode: ASDisplayNode { private let context: AccountContext private var presentationData: PresentationData - private let splitTest: PermissionUISplitTest + private let splitTest: PermissionUISplitTest? private var innerState: PermissionControllerInnerState @@ -56,7 +72,7 @@ final class PermissionControllerNode: ASDisplayNode { var openPrivacyPolicy: (() -> Void)? var dismiss: (() -> Void)? - init(context: AccountContext, splitTest: PermissionUISplitTest) { + init(context: AccountContext, splitTest: PermissionUISplitTest?) { self.context = context self.presentationData = context.sharedContext.currentPresentationData.with { $0 } self.splitTest = splitTest @@ -68,17 +84,14 @@ final class PermissionControllerNode: ASDisplayNode { return UITracingLayerView() }) - self.applyPresentationData() + self.updatePresentationData(self.presentationData) } func updatePresentationData(_ presentationData: PresentationData) { self.presentationData = presentationData - self.applyPresentationData() - } - - private func applyPresentationData() { self.backgroundColor = self.presentationData.theme.list.plainBackgroundColor + self.contentNode?.updatePresentationData(self.presentationData) } func animateIn(completion: (() -> Void)? = nil) { @@ -91,7 +104,7 @@ final class PermissionControllerNode: ASDisplayNode { }) } - public func setState(_ state: PermissionState, transition: ContainedViewLayoutTransition) { + public func setState(_ state: PermissionControllerContent, transition: ContainedViewLayoutTransition) { self.updateState({ currentState -> PermissionControllerInnerState in return PermissionControllerInnerState(layout: currentState.layout, data: PermissionControllerDataState(state: state)) }, transition: transition) @@ -111,97 +124,125 @@ final class PermissionControllerNode: ASDisplayNode { let insets = state.layout.layout.insets(options: [.statusBar]) let contentFrame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: state.layout.layout.size.width, height: state.layout.layout.size.height)) - if state.data.state?.kind != self.contentNode?.kind { - if let dataState = state.data.state { - let icon: UIImage? - let title: String - let text: String - let buttonTitle: String - let hasPrivacyPolicy: Bool - - switch dataState { - case let .contacts(status): - icon = UIImage(bundleImageName: "Settings/Permissions/Contacts") - if case let .modal(titleKey, textKey, allowTitleKey, allowInSettingsTitleKey) = self.splitTest.configuration.contacts { - title = localizedString(for: titleKey, strings: self.presentationData.strings) - text = localizedString(for: textKey, strings: self.presentationData.strings) - if status == .denied { - buttonTitle = localizedString(for: allowInSettingsTitleKey, strings: self.presentationData.strings) - } else { - buttonTitle = localizedString(for: allowTitleKey, strings: self.presentationData.strings) + if let state = state.data.state { + switch state { + case let .permission(permission): + if permission?.kind.rawValue != self.contentNode?.kind { + if let dataState = permission { + let icon: UIImage? + let title: String + let text: String + let buttonTitle: String + let hasPrivacyPolicy: Bool + + switch dataState { + case let .contacts(status): + icon = UIImage(bundleImageName: "Settings/Permissions/Contacts") + if let splitTest = self.splitTest, case let .modal(titleKey, textKey, allowTitleKey, allowInSettingsTitleKey) = splitTest.configuration.contacts { + title = localizedString(for: titleKey, strings: self.presentationData.strings) + text = localizedString(for: textKey, strings: self.presentationData.strings) + if status == .denied { + buttonTitle = localizedString(for: allowInSettingsTitleKey, strings: self.presentationData.strings) + } else { + buttonTitle = localizedString(for: allowTitleKey, strings: self.presentationData.strings) + } + } else { + title = self.presentationData.strings.Permissions_ContactsTitle_v0 + text = self.presentationData.strings.Permissions_ContactsText_v0 + if status == .denied { + buttonTitle = self.presentationData.strings.Permissions_ContactsAllowInSettings_v0 + } else { + buttonTitle = self.presentationData.strings.Permissions_ContactsAllow_v0 + } + } + hasPrivacyPolicy = true + case let .notifications(status): + icon = UIImage(bundleImageName: "Settings/Permissions/Notifications") + if let splitTest = self.splitTest, case let .modal(titleKey, textKey, allowTitleKey, allowInSettingsTitleKey) = splitTest.configuration.notifications { + title = localizedString(for: titleKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsTitle_v0) + text = localizedString(for: textKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsText_v0) + if status == .denied { + buttonTitle = localizedString(for: allowInSettingsTitleKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsAllowInSettings_v0) + } else { + buttonTitle = localizedString(for: allowTitleKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsAllow_v0) + } + } else { + title = self.presentationData.strings.Permissions_NotificationsTitle_v0 + text = self.presentationData.strings.Permissions_NotificationsText_v0 + if status == .denied { + buttonTitle = self.presentationData.strings.Permissions_NotificationsAllowInSettings_v0 + } else { + buttonTitle = self.presentationData.strings.Permissions_NotificationsAllow_v0 + } + } + hasPrivacyPolicy = false + case let .siri(status): + icon = UIImage(bundleImageName: "Settings/Permissions/Siri") + title = self.presentationData.strings.Permissions_SiriTitle_v0 + text = self.presentationData.strings.Permissions_SiriText_v0 + if status == .denied { + buttonTitle = self.presentationData.strings.Permissions_SiriAllowInSettings_v0 + } else { + buttonTitle = self.presentationData.strings.Permissions_SiriAllow_v0 + } + hasPrivacyPolicy = false + case .cellularData: + icon = UIImage(bundleImageName: "Settings/Permissions/CellularData") + title = self.presentationData.strings.Permissions_CellularDataTitle_v0 + text = self.presentationData.strings.Permissions_CellularDataText_v0 + buttonTitle = self.presentationData.strings.Permissions_CellularDataAllowInSettings_v0 + hasPrivacyPolicy = false + case let .nearbyLocation(status): + icon = nil + title = self.presentationData.strings.Permissions_PeopleNearbyTitle_v0 + text = self.presentationData.strings.Permissions_PeopleNearbyText_v0 + if status == .denied { + buttonTitle = self.presentationData.strings.Permissions_PeopleNearbyAllowInSettings_v0 + } else { + buttonTitle = self.presentationData.strings.Permissions_PeopleNearbyAllow_v0 + } + hasPrivacyPolicy = false } - } else { - title = self.presentationData.strings.Permissions_ContactsTitle_v0 - text = self.presentationData.strings.Permissions_ContactsText_v0 - if status == .denied { - buttonTitle = self.presentationData.strings.Permissions_ContactsAllowInSettings_v0 - } else { - buttonTitle = self.presentationData.strings.Permissions_ContactsAllow_v0 + + let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: dataState.kind.rawValue, icon: .image(icon), title: title, text: text, buttonTitle: buttonTitle, buttonAction: { [weak self] in + self?.allow?() + }, openPrivacyPolicy: hasPrivacyPolicy ? self.openPrivacyPolicy : nil) + self.insertSubnode(contentNode, at: 0) + contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: .immediate) + contentNode.frame = contentFrame + if let currentContentNode = self.contentNode { + transition.updatePosition(node: currentContentNode, position: CGPoint(x: -contentFrame.size.width / 2.0, y: contentFrame.midY), completion: { [weak currentContentNode] _ in + currentContentNode?.removeFromSupernode() + }) + transition.animateHorizontalOffsetAdditive(node: contentNode, offset: -contentFrame.width) + } else if transition.isAnimated { + contentNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) } + self.contentNode = contentNode + } else if let currentContentNode = self.contentNode { + transition.updateAlpha(node: currentContentNode, alpha: 0.0, completion: { [weak currentContentNode] _ in + currentContentNode?.removeFromSupernode() + }) + self.contentNode = nil } - hasPrivacyPolicy = true - case let .notifications(status): - icon = UIImage(bundleImageName: "Settings/Permissions/Notifications") - if case let .modal(titleKey, textKey, allowTitleKey, allowInSettingsTitleKey) = self.splitTest.configuration.notifications { - title = localizedString(for: titleKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsTitle_v0) - text = localizedString(for: textKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsText_v0) - if status == .denied { - buttonTitle = localizedString(for: allowInSettingsTitleKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsAllowInSettings_v0) - } else { - buttonTitle = localizedString(for: allowTitleKey, strings: self.presentationData.strings, fallback: self.presentationData.strings.Permissions_NotificationsAllow_v0) - } - } else { - title = self.presentationData.strings.Permissions_NotificationsTitle_v0 - text = self.presentationData.strings.Permissions_NotificationsText_v0 - if status == .denied { - buttonTitle = self.presentationData.strings.Permissions_NotificationsAllowInSettings_v0 - } else { - buttonTitle = self.presentationData.strings.Permissions_NotificationsAllow_v0 - } - } - hasPrivacyPolicy = false - case let .siri(status): - icon = UIImage(bundleImageName: "Settings/Permissions/Siri") - title = self.presentationData.strings.Permissions_SiriTitle_v0 - text = self.presentationData.strings.Permissions_SiriText_v0 - if status == .denied { - buttonTitle = self.presentationData.strings.Permissions_SiriAllowInSettings_v0 - } else { - buttonTitle = self.presentationData.strings.Permissions_SiriAllow_v0 - } - hasPrivacyPolicy = false - case .cellularData: - icon = UIImage(bundleImageName: "Settings/Permissions/CellularData") - title = self.presentationData.strings.Permissions_CellularDataTitle_v0 - text = self.presentationData.strings.Permissions_CellularDataText_v0 - buttonTitle = self.presentationData.strings.Permissions_CellularDataAllowInSettings_v0 - hasPrivacyPolicy = false - } - - let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: dataState.kind, icon: icon, title: title, text: text, buttonTitle: buttonTitle, buttonAction: { [weak self] in - self?.allow?() - }, openPrivacyPolicy: hasPrivacyPolicy ? self.openPrivacyPolicy : nil) - self.insertSubnode(contentNode, at: 0) - contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: .immediate) - contentNode.frame = contentFrame - if let currentContentNode = self.contentNode { - transition.updatePosition(node: currentContentNode, position: CGPoint(x: -contentFrame.size.width / 2.0, y: contentFrame.midY), completion: { [weak currentContentNode] _ in - currentContentNode?.removeFromSupernode() - }) - transition.animateHorizontalOffsetAdditive(node: contentNode, offset: -contentFrame.width) - } else if transition.isAnimated { - contentNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) - } - self.contentNode = contentNode - } else if let currentContentNode = self.contentNode { - transition.updateAlpha(node: currentContentNode, alpha: 0.0, completion: { [weak currentContentNode] _ in - currentContentNode?.removeFromSupernode() - }) - self.contentNode = nil + } else if let contentNode = self.contentNode { + transition.updateFrame(node: contentNode, frame: contentFrame) + contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: transition) + } + case let .custom(icon, title, subtitle, text, buttonTitle, footerText): + if let contentNode = self.contentNode { + transition.updateFrame(node: contentNode, frame: contentFrame) + contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: transition) + } else { + let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: 0, icon: .icon(icon), title: title, subtitle: subtitle, text: text, buttonTitle: buttonTitle, footerText: footerText, buttonAction: { [weak self] in + self?.allow?() + }, openPrivacyPolicy: nil) + self.insertSubnode(contentNode, at: 0) + contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: .immediate) + contentNode.frame = contentFrame + self.contentNode = contentNode + } } - } else if let contentNode = self.contentNode { - transition.updateFrame(node: contentNode, frame: contentFrame) - contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: transition) } } diff --git a/submodules/TelegramUI/TelegramUI/PhotoResources.swift b/submodules/TelegramUI/TelegramUI/PhotoResources.swift index c83d6c10bb..245bfbcb15 100644 --- a/submodules/TelegramUI/TelegramUI/PhotoResources.swift +++ b/submodules/TelegramUI/TelegramUI/PhotoResources.swift @@ -12,6 +12,7 @@ import WebPImage #else import WebP #endif +import TelegramUIPreferences private enum ResourceFileData { case data(Data) diff --git a/submodules/TelegramUI/TelegramUI/PictureInPictureVideoControlsNode.swift b/submodules/TelegramUI/TelegramUI/PictureInPictureVideoControlsNode.swift index 6df5905645..219afbb90b 100644 --- a/submodules/TelegramUI/TelegramUI/PictureInPictureVideoControlsNode.swift +++ b/submodules/TelegramUI/TelegramUI/PictureInPictureVideoControlsNode.swift @@ -3,7 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit - +import UniversalMediaPlayer import LegacyComponents private let leaveImage = UIImage(bundleImageName: "Media Gallery/PictureInPictureLeave")?.precomposed() diff --git a/submodules/TelegramUI/TelegramUI/PlatformVideoContent.swift b/submodules/TelegramUI/TelegramUI/PlatformVideoContent.swift index 007ac0cf76..c1db428a4c 100644 --- a/submodules/TelegramUI/TelegramUI/PlatformVideoContent.swift +++ b/submodules/TelegramUI/TelegramUI/PlatformVideoContent.swift @@ -6,6 +6,8 @@ import SwiftSignalKit import Postbox import TelegramCore import AVFoundation +import UniversalMediaPlayer +import TelegramAudio enum PlatformVideoContentId: Hashable { case message(MessageId, UInt32, MediaId) diff --git a/submodules/TelegramUI/TelegramUI/PrefetchManager.swift b/submodules/TelegramUI/TelegramUI/PrefetchManager.swift index 6d4373e173..5b03639883 100644 --- a/submodules/TelegramUI/TelegramUI/PrefetchManager.swift +++ b/submodules/TelegramUI/TelegramUI/PrefetchManager.swift @@ -2,6 +2,7 @@ import Foundation import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences private final class PrefetchMediaContext { let fetchDisposable = MetaDisposable() diff --git a/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift b/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift index 8f9c45137e..236554cb66 100644 --- a/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift +++ b/submodules/TelegramUI/TelegramUI/PreparedChatHistoryViewTransition.swift @@ -4,197 +4,192 @@ import Postbox import TelegramCore import Display -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) -> Signal { - return Signal { subscriber in - let mergeResult: (deleteIndices: [Int], indicesAndItems: [(Int, ChatHistoryEntry, Int?)], updateIndices: [(Int, ChatHistoryEntry, Int)]) - let allUpdated = fromView?.associatedData != toView.associatedData - if reverse { - mergeResult = mergeListsStableWithUpdatesReversed(leftList: fromView?.filteredEntries ?? [], rightList: toView.filteredEntries, allUpdated: allUpdated) - } else { - mergeResult = mergeListsStableWithUpdates(leftList: fromView?.filteredEntries ?? [], rightList: toView.filteredEntries, allUpdated: allUpdated) - } - - var adjustedDeleteIndices: [ListViewDeleteItem] = [] - let previousCount: Int - if let fromView = fromView { - previousCount = fromView.filteredEntries.count - } else { - previousCount = 0 - } - for index in mergeResult.deleteIndices { - adjustedDeleteIndices.append(ListViewDeleteItem(index: previousCount - 1 - index, directionHint: nil)) - } - - var adjustedIndicesAndItems: [ChatHistoryViewTransitionInsertEntry] = [] - var adjustedUpdateItems: [ChatHistoryViewTransitionUpdateEntry] = [] - let updatedCount = toView.filteredEntries.count - - var options: ListViewDeleteAndInsertOptions = [] - var animateIn = false - var maxAnimatedInsertionIndex = -1 - var stationaryItemRange: (Int, Int)? - var scrollToItem: ListViewScrollToItem? - - switch reason { - case let .Initial(fadeIn): - if fadeIn { - animateIn = true - } else { - let _ = options.insert(.LowLatency) - let _ = options.insert(.Synchronous) - let _ = options.insert(.PreferSynchronousResourceLoading) - } - case .InteractiveChanges: - let _ = options.insert(.AnimateAlpha) - let _ = options.insert(.AnimateInsertion) - - for (index, _, _) in mergeResult.indicesAndItems.sorted(by: { $0.0 > $1.0 }) { - let adjustedIndex = updatedCount - 1 - index - if adjustedIndex == maxAnimatedInsertionIndex + 1 { - maxAnimatedInsertionIndex += 1 - } - } - case .Reload: - 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 { - let adjustedIndex = updatedCount - 1 - index - - let adjustedPrevousIndex: Int? - if let previousIndex = previousIndex { - adjustedPrevousIndex = previousCount - 1 - previousIndex +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 { + let mergeResult: (deleteIndices: [Int], indicesAndItems: [(Int, ChatHistoryEntry, Int?)], updateIndices: [(Int, ChatHistoryEntry, Int)]) + let allUpdated = fromView?.associatedData != toView.associatedData + if reverse { + mergeResult = mergeListsStableWithUpdatesReversed(leftList: fromView?.filteredEntries ?? [], rightList: toView.filteredEntries, allUpdated: allUpdated) + } else { + mergeResult = mergeListsStableWithUpdates(leftList: fromView?.filteredEntries ?? [], rightList: toView.filteredEntries, allUpdated: allUpdated) + } + + var adjustedDeleteIndices: [ListViewDeleteItem] = [] + let previousCount: Int + if let fromView = fromView { + previousCount = fromView.filteredEntries.count + } else { + previousCount = 0 + } + for index in mergeResult.deleteIndices { + adjustedDeleteIndices.append(ListViewDeleteItem(index: previousCount - 1 - index, directionHint: nil)) + } + + var adjustedIndicesAndItems: [ChatHistoryViewTransitionInsertEntry] = [] + var adjustedUpdateItems: [ChatHistoryViewTransitionUpdateEntry] = [] + let updatedCount = toView.filteredEntries.count + + var options: ListViewDeleteAndInsertOptions = [] + var animateIn = false + var maxAnimatedInsertionIndex = -1 + var stationaryItemRange: (Int, Int)? + var scrollToItem: ListViewScrollToItem? + + switch reason { + case let .Initial(fadeIn): + if fadeIn { + animateIn = true } else { - adjustedPrevousIndex = nil + let _ = options.insert(.LowLatency) + let _ = options.insert(.Synchronous) + let _ = options.insert(.PreferSynchronousResourceLoading) } + case .InteractiveChanges: + let _ = options.insert(.AnimateAlpha) + let _ = options.insert(.AnimateInsertion) - var directionHint: ListViewItemOperationDirectionHint? - if maxAnimatedInsertionIndex >= 0 && adjustedIndex <= maxAnimatedInsertionIndex { - directionHint = .Down + for (index, _, _) in mergeResult.indicesAndItems.sorted(by: { $0.0 > $1.0 }) { + let adjustedIndex = updatedCount - 1 - index + if adjustedIndex == maxAnimatedInsertionIndex + 1 { + maxAnimatedInsertionIndex += 1 + } } - - adjustedIndicesAndItems.append(ChatHistoryViewTransitionInsertEntry(index: adjustedIndex, previousIndex: adjustedPrevousIndex, entry: entry, directionHint: directionHint)) + case .Reload: + 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 { + let adjustedIndex = updatedCount - 1 - index + + let adjustedPrevousIndex: Int? + if let previousIndex = previousIndex { + adjustedPrevousIndex = previousCount - 1 - previousIndex + } else { + adjustedPrevousIndex = nil } - for (index, entry, previousIndex) in mergeResult.updateIndices { - let adjustedIndex = updatedCount - 1 - index - let adjustedPreviousIndex = previousCount - 1 - previousIndex - - let directionHint: ListViewItemOperationDirectionHint? = nil - adjustedUpdateItems.append(ChatHistoryViewTransitionUpdateEntry(index: adjustedIndex, previousIndex: adjustedPreviousIndex, entry: entry, directionHint: directionHint)) + var directionHint: ListViewItemOperationDirectionHint? + if maxAnimatedInsertionIndex >= 0 && adjustedIndex <= maxAnimatedInsertionIndex { + directionHint = .Down } - var scrolledToIndex: MessageHistoryAnchorIndex? + adjustedIndicesAndItems.append(ChatHistoryViewTransitionInsertEntry(index: adjustedIndex, previousIndex: adjustedPrevousIndex, entry: entry, directionHint: directionHint)) + } + + for (index, entry, previousIndex) in mergeResult.updateIndices { + let adjustedIndex = updatedCount - 1 - index + let adjustedPreviousIndex = previousCount - 1 - previousIndex - if let scrollPosition = scrollPosition { - switch scrollPosition { - case let .unread(unreadIndex): + let directionHint: ListViewItemOperationDirectionHint? = nil + adjustedUpdateItems.append(ChatHistoryViewTransitionUpdateEntry(index: adjustedIndex, previousIndex: adjustedPreviousIndex, entry: entry, directionHint: directionHint)) + } + + var scrolledToIndex: MessageHistoryAnchorIndex? + + if let scrollPosition = scrollPosition { + switch scrollPosition { + case let .unread(unreadIndex): + var index = toView.filteredEntries.count - 1 + for entry in toView.filteredEntries { + if case .UnreadEntry = entry { + scrollToItem = ListViewScrollToItem(index: index, position: .bottom(0.0), animated: false, curve: .Default(duration: nil), directionHint: .Down) + break + } + index -= 1 + } + + if scrollToItem == nil { var index = toView.filteredEntries.count - 1 for entry in toView.filteredEntries { - if case .UnreadEntry = entry { + if entry.index >= unreadIndex { + scrollToItem = ListViewScrollToItem(index: index, position: .bottom(0.0), animated: false, curve: .Default(duration: nil), directionHint: .Down) + break + } + index -= 1 + } + } + + if scrollToItem == nil { + var index = 0 + for entry in toView.filteredEntries.reversed() { + if entry.index < unreadIndex { scrollToItem = ListViewScrollToItem(index: index, position: .bottom(0.0), animated: false, curve: .Default(duration: nil), directionHint: .Down) break } - index -= 1 + index += 1 } - - if scrollToItem == nil { - var index = toView.filteredEntries.count - 1 - for entry in toView.filteredEntries { - if entry.index >= unreadIndex { - scrollToItem = ListViewScrollToItem(index: index, position: .bottom(0.0), animated: false, curve: .Default(duration: nil), directionHint: .Down) - break - } - index -= 1 - } + } + case let .positionRestoration(scrollIndex, relativeOffset): + var index = toView.filteredEntries.count - 1 + for entry in toView.filteredEntries { + if entry.index >= scrollIndex { + scrollToItem = ListViewScrollToItem(index: index, position: .top(relativeOffset), animated: false, curve: .Default(duration: nil), directionHint: .Down) + break } - - if scrollToItem == nil { - var index = 0 - for entry in toView.filteredEntries.reversed() { - if entry.index < unreadIndex { - scrollToItem = ListViewScrollToItem(index: index, position: .bottom(0.0), animated: false, curve: .Default(duration: nil), directionHint: .Down) - break - } - index += 1 - } - } - case let .positionRestoration(scrollIndex, relativeOffset): - var index = toView.filteredEntries.count - 1 - for entry in toView.filteredEntries { - if entry.index >= scrollIndex { - scrollToItem = ListViewScrollToItem(index: index, position: .top(relativeOffset), animated: false, curve: .Default(duration: nil), directionHint: .Down) + index -= 1 + } + + if scrollToItem == nil { + var index = 0 + for entry in toView.filteredEntries.reversed() { + if entry.index < scrollIndex { + scrollToItem = ListViewScrollToItem(index: index, position: .top(0.0), animated: false, curve: .Default(duration: nil), directionHint: .Down) break } - index -= 1 + index += 1 } - - if scrollToItem == nil { - var index = 0 - for entry in toView.filteredEntries.reversed() { - if entry.index < scrollIndex { - scrollToItem = ListViewScrollToItem(index: index, position: .top(0.0), animated: false, curve: .Default(duration: nil), directionHint: .Down) - break - } - index += 1 - } + } + case let .index(scrollIndex, position, directionHint, animated): + if case .center = position { + scrolledToIndex = scrollIndex + } + var index = toView.filteredEntries.count - 1 + for entry in toView.filteredEntries { + if scrollIndex.isLessOrEqual(to: entry.index) { + scrollToItem = ListViewScrollToItem(index: index, position: position, animated: animated, curve: .Default(duration: nil), directionHint: directionHint) + break } - case let .index(scrollIndex, position, directionHint, animated): - if case .center = position { - scrolledToIndex = scrollIndex - } - var index = toView.filteredEntries.count - 1 - for entry in toView.filteredEntries { - if scrollIndex.isLessOrEqual(to: entry.index) { + index -= 1 + } + + if scrollToItem == nil { + var index = 0 + for entry in toView.filteredEntries.reversed() { + if !scrollIndex.isLess(than: entry.index) { scrollToItem = ListViewScrollToItem(index: index, position: position, animated: animated, curve: .Default(duration: nil), directionHint: directionHint) break } - index -= 1 + index += 1 } - - if scrollToItem == nil { - var index = 0 - for entry in toView.filteredEntries.reversed() { - if !scrollIndex.isLess(than: entry.index) { - scrollToItem = ListViewScrollToItem(index: index, position: position, animated: animated, curve: .Default(duration: nil), directionHint: directionHint) - break - } - index += 1 - } - } - } + } } - - subscriber.putNext(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)) - subscriber.putCompletion() - - return EmptyDisposable } + + 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) } diff --git a/submodules/TelegramUI/TelegramUI/PresenceStrings.swift b/submodules/TelegramUI/TelegramUI/PresenceStrings.swift index 7821b40912..2db092a640 100644 --- a/submodules/TelegramUI/TelegramUI/PresenceStrings.swift +++ b/submodules/TelegramUI/TelegramUI/PresenceStrings.swift @@ -1,6 +1,7 @@ import Foundation import Postbox import TelegramCore +import TelegramPresentationData func stringForTimestamp(day: Int32, month: Int32, year: Int32, dateTimeFormat: PresentationDateTimeFormat) -> String { let separator = dateTimeFormat.dateSeparator diff --git a/submodules/TelegramUI/TelegramUI/PresentationResourceKey.swift b/submodules/TelegramUI/TelegramUI/PresentationResourceKey.swift index d1aa3768a1..0ed30632c8 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationResourceKey.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationResourceKey.swift @@ -43,6 +43,7 @@ enum PresentationResourceKey: Int32 { case itemListDeleteIndicatorIcon case itemListReorderIndicatorIcon case itemListAddPersonIcon + case itemListCreateGroupIcon case itemListAddExceptionIcon case itemListAddPhoneIcon case itemListClearInputIcon diff --git a/submodules/TelegramUI/TelegramUI/PresentationResourcesCallList.swift b/submodules/TelegramUI/TelegramUI/PresentationResourcesCallList.swift index a5bbb40dd9..18943b6698 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationResourcesCallList.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationResourcesCallList.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import Display +import TelegramPresentationData struct PresentationResourcesCallList { static func outgoingIcon(_ theme: PresentationTheme) -> UIImage? { diff --git a/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift b/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift index 5dff064b48..1e1448ea07 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationResourcesChat.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import TelegramCore +import TelegramPresentationData private func generateLineImage(color: UIColor) -> UIImage? { return generateImage(CGSize(width: 2.0, height: 3.0), contextGenerator: { size, context in diff --git a/submodules/TelegramUI/TelegramUI/PresentationResourcesChatList.swift b/submodules/TelegramUI/TelegramUI/PresentationResourcesChatList.swift index 710dc511b6..df2de4003c 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationResourcesChatList.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationResourcesChatList.swift @@ -1,6 +1,7 @@ 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/TelegramUI/TelegramUI/PresentationResourcesItemList.swift b/submodules/TelegramUI/TelegramUI/PresentationResourcesItemList.swift index 744c7b67e8..b8bb44f926 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationResourcesItemList.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationResourcesItemList.swift @@ -1,6 +1,7 @@ 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 @@ -107,6 +108,12 @@ struct PresentationResourcesItemList { }) } + static func createGroupIcon(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.itemListCreateGroupIcon.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Location/CreateGroupIcon"), color: theme.list.itemAccentColor) + }) + } + static func addExceptionIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.itemListAddExceptionIcon.rawValue, { theme in return generateTintedImage(image: UIImage(bundleImageName: "Item List/AddExceptionIcon"), color: theme.list.itemAccentColor) diff --git a/submodules/TelegramUI/TelegramUI/PresentationResourcesRootController.swift b/submodules/TelegramUI/TelegramUI/PresentationResourcesRootController.swift index 72be59c2da..f047389114 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationResourcesRootController.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationResourcesRootController.swift @@ -1,6 +1,7 @@ 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/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift b/submodules/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift index 6780ecb87a..904289f854 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationThemeEssentialGraphics.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import TelegramCore +import TelegramPresentationData private func generateCheckImage(partial: Bool, color: UIColor) -> UIImage? { return generateImage(CGSize(width: 11.0, height: 9.0), rotatedContext: { size, context in diff --git a/submodules/TelegramUI/TelegramUI/PrivacyAndSecurityController.swift b/submodules/TelegramUI/TelegramUI/PrivacyAndSecurityController.swift index 72bc750169..a6ad4c5ef1 100644 --- a/submodules/TelegramUI/TelegramUI/PrivacyAndSecurityController.swift +++ b/submodules/TelegramUI/TelegramUI/PrivacyAndSecurityController.swift @@ -4,6 +4,9 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import TelegramCallsUI private final class PrivacyAndSecurityControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/PrivacyIntroController.swift b/submodules/TelegramUI/TelegramUI/PrivacyIntroController.swift index e39678e918..c01176feea 100644 --- a/submodules/TelegramUI/TelegramUI/PrivacyIntroController.swift +++ b/submodules/TelegramUI/TelegramUI/PrivacyIntroController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import SwiftSignalKit import TelegramCore +import TelegramPresentationData enum PrivacyIntroControllerMode { case passcode diff --git a/submodules/TelegramUI/TelegramUI/PrivacyIntroControllerNode.swift b/submodules/TelegramUI/TelegramUI/PrivacyIntroControllerNode.swift index b91353c18f..6eea8ed55a 100644 --- a/submodules/TelegramUI/TelegramUI/PrivacyIntroControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/PrivacyIntroControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private func generateButtonImage(backgroundColor: UIColor, borderColor: UIColor, highlightColor: UIColor?) -> UIImage? { return generateImage(CGSize(width: 1.0, height: 44.0), contextGenerator: { size, context in diff --git a/submodules/TelegramUI/TelegramUI/ProgressNavigationButtonNode.swift b/submodules/TelegramUI/TelegramUI/ProgressNavigationButtonNode.swift index 59ea36952a..2d2e07a94e 100644 --- a/submodules/TelegramUI/TelegramUI/ProgressNavigationButtonNode.swift +++ b/submodules/TelegramUI/TelegramUI/ProgressNavigationButtonNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class ProgressNavigationButtonNode: ASDisplayNode { private var indicatorNode: ActivityIndicator diff --git a/submodules/TelegramUI/TelegramUI/ProxyListSettingsController.swift b/submodules/TelegramUI/TelegramUI/ProxyListSettingsController.swift index ef11f63344..863dd39945 100644 --- a/submodules/TelegramUI/TelegramUI/ProxyListSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/ProxyListSettingsController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ProxySettingsControllerArguments { let toggleEnabled: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ProxyServerActionSheetController.swift b/submodules/TelegramUI/TelegramUI/ProxyServerActionSheetController.swift index 77ab205d0b..947a09a56d 100644 --- a/submodules/TelegramUI/TelegramUI/ProxyServerActionSheetController.swift +++ b/submodules/TelegramUI/TelegramUI/ProxyServerActionSheetController.swift @@ -6,6 +6,7 @@ import Postbox import AsyncDisplayKit import UIKit import SwiftSignalKit +import TelegramPresentationData public final class ProxyServerActionSheetController: ActionSheetController { private var presentationDisposable: Disposable? diff --git a/submodules/TelegramUI/TelegramUI/ProxyServerSettingsController.swift b/submodules/TelegramUI/TelegramUI/ProxyServerSettingsController.swift index 12c09fe19a..1cecc7b627 100644 --- a/submodules/TelegramUI/TelegramUI/ProxyServerSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/ProxyServerSettingsController.swift @@ -9,6 +9,7 @@ import MtProtoKit #else import MtProtoKitDynamic #endif +import TelegramPresentationData private func shareLink(for server: ProxyServerSettings) -> String { var link: String diff --git a/submodules/TelegramUI/TelegramUI/ProxySettingsActionItem.swift b/submodules/TelegramUI/TelegramUI/ProxySettingsActionItem.swift index 776c437796..b5bfbf37ed 100644 --- a/submodules/TelegramUI/TelegramUI/ProxySettingsActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/ProxySettingsActionItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData enum ProxySettingsActionIcon { case none diff --git a/submodules/TelegramUI/TelegramUI/ProxySettingsServerItem.swift b/submodules/TelegramUI/TelegramUI/ProxySettingsServerItem.swift index a5d1232561..cedc48ed63 100644 --- a/submodules/TelegramUI/TelegramUI/ProxySettingsServerItem.swift +++ b/submodules/TelegramUI/TelegramUI/ProxySettingsServerItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private let activitySize = CGSize(width: 24.0, height: 24.0) diff --git a/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift b/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift index e6c7e5f7db..3a7ab9a5af 100644 --- a/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift +++ b/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class RecentSessionsControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/RecentSessionsEmptyStateItem.swift b/submodules/TelegramUI/TelegramUI/RecentSessionsEmptyStateItem.swift index 7f759422c8..38773b5250 100644 --- a/submodules/TelegramUI/TelegramUI/RecentSessionsEmptyStateItem.swift +++ b/submodules/TelegramUI/TelegramUI/RecentSessionsEmptyStateItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class RecentSessionsEmptyStateItem: ItemListControllerEmptyStateItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/ReplyAccessoryPanelNode.swift b/submodules/TelegramUI/TelegramUI/ReplyAccessoryPanelNode.swift index 5a3acb2e3d..64cb0b779a 100644 --- a/submodules/TelegramUI/TelegramUI/ReplyAccessoryPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ReplyAccessoryPanelNode.swift @@ -5,6 +5,8 @@ import TelegramCore import Postbox import SwiftSignalKit import Display +import TelegramPresentationData +import TelegramUIPreferences final class ReplyAccessoryPanelNode: AccessoryPanelNode { private let messageDisposable = MetaDisposable() diff --git a/submodules/TelegramUI/TelegramUI/ResetPasswordController.swift b/submodules/TelegramUI/TelegramUI/ResetPasswordController.swift index 3f140d2d0d..76d8d3a94e 100644 --- a/submodules/TelegramUI/TelegramUI/ResetPasswordController.swift +++ b/submodules/TelegramUI/TelegramUI/ResetPasswordController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class ResetPasswordControllerArguments { let updateCodeText: (String) -> Void diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 6dec6a0013..43f28b412f 100644 Binary files a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping and b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping differ diff --git a/submodules/TelegramUI/TelegramUI/SaveIncomingMediaController.swift b/submodules/TelegramUI/TelegramUI/SaveIncomingMediaController.swift index 3816b6b49b..cd8cd71021 100644 --- a/submodules/TelegramUI/TelegramUI/SaveIncomingMediaController.swift +++ b/submodules/TelegramUI/TelegramUI/SaveIncomingMediaController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private enum PeerType { case contact diff --git a/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift b/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift index c23886206c..280c0df029 100644 --- a/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift +++ b/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift @@ -6,6 +6,7 @@ import TelegramCore import Photos import Display import MobileCoreServices +import DeviceAccess private enum SaveToCameraRollState { case progress(Float) @@ -84,7 +85,7 @@ func saveToCameraRoll(context: AccountContext, postbox: Postbox, mediaReference: case let .data(data): if data.complete { return Signal { subscriber in - DeviceAccess.authorizeAccess(to: .mediaLibrary(.save), context: context, presentationData: context.sharedContext.currentPresentationData.with { $0 }, present: { c, a in + DeviceAccess.authorizeAccess(to: .mediaLibrary(.save), presentationData: context.sharedContext.currentPresentationData.with { $0 }, present: { c, a in context.sharedContext.presentGlobalController(c, a) }, openSettings: context.sharedContext.applicationBindings.openSettings, { authorized in if !authorized { diff --git a/submodules/TelegramUI/TelegramUI/SearchBarNode.swift b/submodules/TelegramUI/TelegramUI/SearchBarNode.swift index 6958539a51..8b00daf22d 100644 --- a/submodules/TelegramUI/TelegramUI/SearchBarNode.swift +++ b/submodules/TelegramUI/TelegramUI/SearchBarNode.swift @@ -3,6 +3,7 @@ import UIKit import SwiftSignalKit import AsyncDisplayKit import Display +import TelegramPresentationData private func generateLoupeIcon(color: UIColor) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Loupe"), color: color) diff --git a/submodules/TelegramUI/TelegramUI/SearchDisplayController.swift b/submodules/TelegramUI/TelegramUI/SearchDisplayController.swift index fa627da5de..b7951012ee 100644 --- a/submodules/TelegramUI/TelegramUI/SearchDisplayController.swift +++ b/submodules/TelegramUI/TelegramUI/SearchDisplayController.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import SwiftSignalKit import Display +import TelegramPresentationData enum SearchDisplayControllerMode { case list diff --git a/submodules/TelegramUI/TelegramUI/SearchDisplayControllerContentNode.swift b/submodules/TelegramUI/TelegramUI/SearchDisplayControllerContentNode.swift index ed36ebc6ac..81b084ca15 100644 --- a/submodules/TelegramUI/TelegramUI/SearchDisplayControllerContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/SearchDisplayControllerContentNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import TelegramPresentationData class SearchDisplayControllerContentNode: ASDisplayNode { final var dismissInput: (() -> Void)? diff --git a/submodules/TelegramUI/TelegramUI/SecretChatKeyController.swift b/submodules/TelegramUI/TelegramUI/SecretChatKeyController.swift index f1b302e2c1..3e26098639 100644 --- a/submodules/TelegramUI/TelegramUI/SecretChatKeyController.swift +++ b/submodules/TelegramUI/TelegramUI/SecretChatKeyController.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import TelegramCore import Postbox +import TelegramPresentationData final class SecretChatKeyController: ViewController { private var controllerNode: SecretChatKeyControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/SecretChatKeyControllerNode.swift b/submodules/TelegramUI/TelegramUI/SecretChatKeyControllerNode.swift index 10ad1eeb1b..352e6ae560 100644 --- a/submodules/TelegramUI/TelegramUI/SecretChatKeyControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecretChatKeyControllerNode.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import TelegramCore import Postbox +import TelegramPresentationData private func processHexString(_ string: String) -> String { var result = "" diff --git a/submodules/TelegramUI/TelegramUI/SecretMediaPreviewController.swift b/submodules/TelegramUI/TelegramUI/SecretMediaPreviewController.swift index 2bd81901da..2b97ef40c4 100644 --- a/submodules/TelegramUI/TelegramUI/SecretMediaPreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/SecretMediaPreviewController.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private func galleryMediaForMedia(media: Media) -> Media? { if let media = media as? TelegramMediaImage { diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthAcceptNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthAcceptNode.swift index 99b9d16875..ba1305eef0 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthAcceptNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthAcceptNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let textFont: UIFont = Font.regular(16.0) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthController.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthController.swift index e6a766d6d5..a05718180a 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthController.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData public enum SecureIdRequestResult: String { case success = "success" diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthControllerNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthControllerNode.swift index 78d7be5a08..f09127f6d4 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthControllerNode.swift @@ -5,6 +5,7 @@ import Display import AsyncDisplayKit import Postbox import TelegramCore +import TelegramPresentationData final class SecureIdAuthControllerNode: ViewControllerTracingNode { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthFormContentNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthFormContentNode.swift index 91af679bfe..bc1593e62a 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthFormContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthFormContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let infoFont = Font.regular(14.0) private let passwordFont = Font.regular(16.0) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthFormFieldNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthFormFieldNode.swift index dae8b50747..7c3a9f0968 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthFormFieldNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthFormFieldNode.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData enum SecureIdRequestedIdentityDocument: Int32 { case passport diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthHeaderNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthHeaderNode.swift index 76b4d1852c..b1e2709f63 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthHeaderNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthHeaderNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 26.0)! private let titleFont = Font.semibold(14.0) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthListContentNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthListContentNode.swift index 8acfbfde51..5dc349a96d 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthListContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthListContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData final class SecureIdAuthListContentNode: ASDisplayNode, SecureIdAuthContentNode, UITextFieldDelegate { private let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthListFieldNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthListFieldNode.swift index bb1b18de1f..97d33b13ff 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthListFieldNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthListFieldNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData private let titleFont = Font.regular(17.0) private let textFont = Font.regular(15.0) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordOptionContentNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordOptionContentNode.swift index cb7362bd47..4566301b88 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordOptionContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordOptionContentNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let passwordFont = Font.regular(16.0) private let buttonFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordSetupContentNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordSetupContentNode.swift index 62837c9fd8..2691eeafff 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordSetupContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdAuthPasswordSetupContentNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let titleFont = Font.regular(14.0) private let buttonFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormController.swift b/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormController.swift index 5178c96246..1a9232d203 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormController.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData enum SecureIdDocumentFormScrollToSubject { case selfie diff --git a/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormControllerNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormControllerNode.swift index 175849aecf..f38e967a3c 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdDocumentFormControllerNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private enum SecureIdDocumentFormTextField { case identifier diff --git a/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryController.swift b/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryController.swift index 93e2b50034..c5a4844a7c 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryController.swift @@ -6,6 +6,7 @@ import Postbox import SwiftSignalKit import AsyncDisplayKit import TelegramCore +import TelegramPresentationData struct SecureIdDocumentGalleryEntryLocation: Equatable { let position: Int32 diff --git a/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryFooterContentNode.swift index f497fd2c50..1bb75bda6e 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdDocumentGalleryFooterContentNode.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import Photos +import TelegramPresentationData private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdDocumentImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/SecureIdDocumentImageGalleryItem.swift index a5a4722928..8be75a8dff 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdDocumentImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdDocumentImageGalleryItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData class SecureIdDocumentGalleryItem: GalleryItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/SecureIdDocumentTypeSelectionController.swift b/submodules/TelegramUI/TelegramUI/SecureIdDocumentTypeSelectionController.swift index 1b15c14900..fa25f2ba24 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdDocumentTypeSelectionController.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdDocumentTypeSelectionController.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData private func stringForDocumentType(_ type: SecureIdRequestedIdentityDocument, strings: PresentationStrings) -> String { switch type { diff --git a/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormController.swift b/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormController.swift index 28ce95ccf3..58dd22a98b 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormController.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData enum SecureIdPlaintextFormType { case phone diff --git a/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormControllerNode.swift b/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormControllerNode.swift index 95f686f729..223b59784e 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdPlaintextFormControllerNode.swift @@ -6,6 +6,7 @@ import TelegramCore import Postbox import SwiftSignalKit import CoreTelephony +import TelegramPresentationData private func cleanPhoneNumber(_ text: String?) -> String { var cleanNumber = "" diff --git a/submodules/TelegramUI/TelegramUI/SecureIdValueFormFileItem.swift b/submodules/TelegramUI/TelegramUI/SecureIdValueFormFileItem.swift index 6c581f6192..c3bfc12b60 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdValueFormFileItem.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdValueFormFileItem.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData private let textFont = Font.regular(16.0) private let labelFont = Font.regular(13.0) diff --git a/submodules/TelegramUI/TelegramUI/SecureIdValueFormPhoneItem.swift b/submodules/TelegramUI/TelegramUI/SecureIdValueFormPhoneItem.swift index 0716ce3d1d..c98986da47 100644 --- a/submodules/TelegramUI/TelegramUI/SecureIdValueFormPhoneItem.swift +++ b/submodules/TelegramUI/TelegramUI/SecureIdValueFormPhoneItem.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import TelegramCore +import TelegramPresentationData private let textFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/SelectablePeerNode.swift b/submodules/TelegramUI/TelegramUI/SelectablePeerNode.swift index b154249cf4..95a39b3b34 100644 --- a/submodules/TelegramUI/TelegramUI/SelectablePeerNode.swift +++ b/submodules/TelegramUI/TelegramUI/SelectablePeerNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData import LegacyComponents diff --git a/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsController.swift b/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsController.swift index 60cb409147..4a049fae3d 100644 --- a/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences enum SelectivePrivacySettingsKind { case presence diff --git a/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsPeersController.swift b/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsPeersController.swift index 8a958478d9..51cb25224a 100644 --- a/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsPeersController.swift +++ b/submodules/TelegramUI/TelegramUI/SelectivePrivacySettingsPeersController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class SelectivePrivacyPeersControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/SettingsController.swift b/submodules/TelegramUI/TelegramUI/SettingsController.swift index 79d16b5410..71d531fa83 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsController.swift @@ -11,6 +11,9 @@ import MtProtoKit #else import MtProtoKitDynamic #endif +import TelegramPresentationData +import TelegramUIPreferences +import DeviceAccess private let maximumNumberOfAccounts = 3 @@ -338,7 +341,7 @@ private enum SettingsEntry: ItemListNodeEntry { func item(_ arguments: SettingsItemArguments) -> ListViewItem { switch self { case let .userInfo(account, theme, strings, dateTimeFormat, peer, cachedData, state, updatingImage): - return ItemListAvatarAndNameInfoItem(account: account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .settings, peer: peer, presence: TelegramUserPresence(status: .present(until: Int32.max), lastActivity: 0), cachedData: cachedData, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false), editingNameUpdated: { _ in + return ItemListAvatarAndNameInfoItem(account: account, theme: theme, strings: strings, dateTimeFormat: dateTimeFormat, mode: .settings, peer: peer, presence: TelegramUserPresence(status: .present(until: Int32.max), lastActivity: 0), cachedData: cachedData, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { _ in }, avatarTapped: { arguments.avatarTapAction() }, context: arguments.avatarAndNameInfoContext, updatingImage: updatingImage, action: { @@ -395,39 +398,39 @@ private enum SettingsEntry: ItemListNodeEntry { case let .proxy(theme, image, text, value): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openProxy() - }) + }, clearHighlightAutomatically: false) case let .savedMessages(theme, image, text): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: "", sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openSavedMessages() - }) + }, clearHighlightAutomatically: false) case let .recentCalls(theme, image, text): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: "", sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openRecentCalls() - }) + }, clearHighlightAutomatically: false) case let .stickers(theme, image, text, value, archivedPacks): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, labelStyle: .badge(theme.list.itemAccentColor), sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openStickerPacks(archivedPacks) - }) + }, clearHighlightAutomatically: false) case let .notificationsAndSounds(theme, image, text, exceptionsList, warning): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: warning ? "!" : "", labelStyle: warning ? .badge(theme.list.itemDestructiveColor) : .text, sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openNotificationsAndSounds(exceptionsList) - }) + }, clearHighlightAutomatically: false) case let .privacyAndSecurity(theme, image, text, privacySettings): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: "", sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openPrivacyAndSecurity(privacySettings) - }) + }, clearHighlightAutomatically: false) case let .dataAndStorage(theme, image, text): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: "", sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openDataAndStorage() - }) + }, clearHighlightAutomatically: false) case let .themes(theme, image, text): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: "", sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openThemes() - }) + }, clearHighlightAutomatically: false) case let .language(theme, image, text, value): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openLanguage() - }) + }, clearHighlightAutomatically: false) case let .passport(theme, image, text, value): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openPassport() @@ -435,7 +438,7 @@ private enum SettingsEntry: ItemListNodeEntry { case let .watch(theme, image, text, value): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: value, sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openWatch() - }) + }, clearHighlightAutomatically: false) case let .askAQuestion(theme, image, text): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: "", sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openSupport() @@ -443,7 +446,7 @@ private enum SettingsEntry: ItemListNodeEntry { case let .faq(theme, image, text): return ItemListDisclosureItem(theme: theme, icon: image, title: text, label: "", sectionId: ItemListSectionId(self.section), style: .blocks, action: { arguments.openFaq(nil) - }) + }, clearHighlightAutomatically: false) } } } @@ -1036,7 +1039,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM |> then( contextValue.get() |> mapToSignal { context -> Signal in - return DeviceAccess.authorizationStatus(context: context, subject: .notifications) + return DeviceAccess.authorizationStatus(applicationInForeground: context.sharedContext.applicationBindings.applicationInForeground, subject: .notifications) } ) ) @@ -1071,7 +1074,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM |> mapToSignal { context -> Signal in return .single(NotificationExceptionsList(peers: [:], settings: [:])) |> then( - notificationExceptionsList(network: context.account.network) + notificationExceptionsList(postbox: context.account.postbox, network: context.account.network) |> map(Optional.init) ) } @@ -1429,7 +1432,8 @@ public func settingsController(context: AccountContext, accountManager: AccountM } } - controller.didDisappear = { _ in + controller.didDisappear = { [weak controller] _ in + controller?.clearItemNodesHighlight(animated: true) setDisplayNavigationBarImpl?(true) updateState { state in var state = state diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchItem.swift b/submodules/TelegramUI/TelegramUI/SettingsSearchItem.swift index 66961a42b1..3717833e9d 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsSearchItem.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsSearchItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData extension NavigationBarSearchContentNode: ItemListControllerSearchNavigationContentNode { func activate() { diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchRecentItem.swift b/submodules/TelegramUI/TelegramUI/SettingsSearchRecentItem.swift index 52b7022b47..10a0728ff9 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsSearchRecentItem.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsSearchRecentItem.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData private enum RevealOptionKey: Int32 { case delete diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchRecentQueries.swift b/submodules/TelegramUI/TelegramUI/SettingsSearchRecentQueries.swift index 3c8bb39760..38679d8a0b 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsSearchRecentQueries.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsSearchRecentQueries.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Postbox import SwiftSignalKit +import TelegramUIPreferences private struct SettingsSearchRecentQueryItemId { public let rawValue: MemoryBuffer diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchResultItem.swift b/submodules/TelegramUI/TelegramUI/SettingsSearchResultItem.swift index 6e2e8b5965..8cfecb6174 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsSearchResultItem.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsSearchResultItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class SettingsSearchResultItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/SettingsSearchableItems.swift b/submodules/TelegramUI/TelegramUI/SettingsSearchableItems.swift index 69c11bbf97..4475fd34e5 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsSearchableItems.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsSearchableItems.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramUIPreferences +import TelegramCallsUI private let maximumNumberOfAccounts = 3 diff --git a/submodules/TelegramUI/TelegramUI/SettingsThemeWallpaperNode.swift b/submodules/TelegramUI/TelegramUI/SettingsThemeWallpaperNode.swift index 4200cf93ac..41eedf98fb 100644 --- a/submodules/TelegramUI/TelegramUI/SettingsThemeWallpaperNode.swift +++ b/submodules/TelegramUI/TelegramUI/SettingsThemeWallpaperNode.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import Postbox import SwiftSignalKit +import TelegramPresentationData private func whiteColorImage(theme: PresentationTheme) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { return .single({ arguments in diff --git a/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationContentNode.swift b/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationContentNode.swift index d82b31db92..3e406b88a9 100644 --- a/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationContentNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import TelegramPresentationData enum SetupTwoStepVerificationInputType { case password diff --git a/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationController.swift b/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationController.swift index c1804e21df..fec990f061 100644 --- a/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationController.swift +++ b/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import SwiftSignalKit import TelegramCore +import TelegramPresentationData class SetupTwoStepVerificationController: ViewController { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationControllerNode.swift b/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationControllerNode.swift index 46b3a84d2e..25c114647b 100644 --- a/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/SetupTwoStepVerificationControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData enum SetupTwoStepVerificationInitialState { case automatic diff --git a/submodules/TelegramUI/TelegramUI/ShareController.swift b/submodules/TelegramUI/TelegramUI/ShareController.swift index e68f90ad50..26ed598809 100644 --- a/submodules/TelegramUI/TelegramUI/ShareController.swift +++ b/submodules/TelegramUI/TelegramUI/ShareController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData public struct ShareControllerAction { let title: String diff --git a/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift b/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift index b4d9bb13f1..e93e5a8cc4 100644 --- a/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ShareControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData enum ShareState { case preparing diff --git a/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift b/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift index c24da69c78..c150265493 100644 --- a/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ShareControllerPeerGridItem.swift @@ -5,6 +5,7 @@ import TelegramCore import SwiftSignalKit import AsyncDisplayKit import Postbox +import TelegramPresentationData final class ShareControllerInteraction { var foundPeers: [RenderedPeer] = [] diff --git a/submodules/TelegramUI/TelegramUI/ShareControllerRecentPeersGridItem.swift b/submodules/TelegramUI/TelegramUI/ShareControllerRecentPeersGridItem.swift index 2c9cf33348..6fac827f77 100644 --- a/submodules/TelegramUI/TelegramUI/ShareControllerRecentPeersGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ShareControllerRecentPeersGridItem.swift @@ -5,6 +5,7 @@ import TelegramCore import SwiftSignalKit import AsyncDisplayKit import Postbox +import TelegramPresentationData final class ShareControllerRecentPeersGridItem: GridItem { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift new file mode 100644 index 0000000000..4f3a3d3c5e --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift @@ -0,0 +1,344 @@ +import UIKit +import Display +import TelegramCore +import SwiftSignalKit +import Postbox +import TelegramPresentationData +import TelegramUIPreferences +import TelegramUIPrivateModule + +private let inForeground = ValuePromise(false, ignoreRepeated: true) + +private final class InternalContext { + let sharedContext: SharedAccountContext + let wakeupManager: SharedWakeupManager + + init(sharedContext: SharedAccountContext) { + self.sharedContext = sharedContext + self.wakeupManager = SharedWakeupManager(beginBackgroundTask: { _, _ in nil }, endBackgroundTask: { _ in }, backgroundTimeRemaining: { 0.0 }, activeAccounts: sharedContext.activeAccounts |> map { ($0.0, $0.1.map { ($0.0, $0.1) }) }, liveLocationPolling: .single(nil), watchTasks: .single(nil), inForeground: inForeground.get(), hasActiveAudioSession: .single(false), notificationManager: nil, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager, accountUserInterfaceInUse: { id in + return sharedContext.accountUserInterfaceInUse(id) + }) + } +} + +private var globalInternalContext: InternalContext? + +private var installedSharedLogger = false + +private func setupSharedLogger(_ path: String) { + if !installedSharedLogger { + installedSharedLogger = true + Logger.setSharedLogger(Logger(basePath: path)) + } +} + +private enum ShareAuthorizationError { + case unauthorized +} + +public struct ShareRootControllerInitializationData { + public let appGroupPath: String + public let apiId: Int32 + public let languagesCategory: String + public let encryptionParameters: (Data, Data) + public let appVersion: String + public let bundleData: Data? + + public init(appGroupPath: String, apiId: Int32, languagesCategory: String, encryptionParameters: (Data, Data), appVersion: String, bundleData: Data?) { + self.appGroupPath = appGroupPath + self.apiId = apiId + self.languagesCategory = languagesCategory + self.encryptionParameters = encryptionParameters + self.appVersion = appVersion + self.bundleData = bundleData + } +} + +public class ShareRootControllerImpl { + private let initializationData: ShareRootControllerInitializationData + private let getExtensionContext: () -> NSExtensionContext? + + private var mainWindow: Window1? + private var currentShareController: ShareController? + private var currentPasscodeController: ViewController? + + private var shouldBeMaster = Promise() + private let disposable = MetaDisposable() + private var observer1: AnyObject? + private var observer2: AnyObject? + + public init(initializationData: ShareRootControllerInitializationData, getExtensionContext: @escaping () -> NSExtensionContext?) { + self.initializationData = initializationData + self.getExtensionContext = getExtensionContext + } + + deinit { + self.disposable.dispose() + self.shouldBeMaster.set(.single(false)) + if let observer = self.observer1 { + NotificationCenter.default.removeObserver(observer) + } + if let observer = self.observer2 { + NotificationCenter.default.removeObserver(observer) + } + } + + public func loadView() { + telegramUIDeclareEncodables() + + if #available(iOSApplicationExtension 8.2, iOS 8.2, *) { + self.observer1 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSExtensionHostDidBecomeActive, object: nil, queue: nil, using: { _ in + inForeground.set(true) + }) + + self.observer2 = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSExtensionHostWillResignActive, object: nil, queue: nil, using: { _ in + inForeground.set(false) + }) + } + } + + public func viewWillAppear() { + inForeground.set(true) + } + + public func viewWillDisappear() { + self.disposable.dispose() + inForeground.set(false) + } + + public func viewDidLayoutSubviews(view: UIView) { + if self.mainWindow == nil { + let mainWindow = Window1(hostView: childWindowHostView(parent: view), statusBarHost: nil) + mainWindow.hostView.eventView.backgroundColor = UIColor.clear + mainWindow.hostView.eventView.isHidden = false + self.mainWindow = mainWindow + + view.addSubview(mainWindow.hostView.containerView) + mainWindow.hostView.containerView.frame = view.bounds + + let rootPath = rootPathForBasePath(self.initializationData.appGroupPath) + performAppGroupUpgrades(appGroupPath: self.initializationData.appGroupPath, rootPath: rootPath) + + TempBox.initializeShared(basePath: rootPath, processType: "share", launchSpecificId: arc4random64()) + + let logsPath = rootPath + "/share-logs" + let _ = try? FileManager.default.createDirectory(atPath: logsPath, withIntermediateDirectories: true, attributes: nil) + + setupSharedLogger(logsPath) + + let applicationBindings = TelegramApplicationBindings(isMainApp: false, containerPath: self.initializationData.appGroupPath, appSpecificScheme: "tg", openUrl: { _ in + }, openUniversalUrl: { _, completion in + completion.completion(false) + return + }, canOpenUrl: { _ in + return false + }, getTopWindow: { + return nil + }, displayNotification: { _ in + + }, applicationInForeground: .single(false), applicationIsActive: .single(false), clearMessageNotifications: { _ in + }, pushIdleTimerExtension: { + return EmptyDisposable + }, openSettings: {}, openAppStorePage: {}, registerForNotifications: { _ in }, requestSiriAuthorization: { _ in }, siriAuthorization: { return .notDetermined }, getWindowHost: { + return nil + }, presentNativeController: { _ in + }, dismissNativeController: { + }, getAvailableAlternateIcons: { + return [] + }, getAlternateIconName: { + return nil + }, requestSetAlternateIconName: { _, f in + f(false) + }) + + let internalContext: InternalContext + + if let globalInternalContext = globalInternalContext { + internalContext = globalInternalContext + } else { + initializeAccountManagement() + let accountManager = AccountManager(basePath: rootPath + "/accounts-metadata") + var initialPresentationDataAndSettings: InitialPresentationDataAndSettings? + let semaphore = DispatchSemaphore(value: 0) + let _ = currentPresentationDataAndSettings(accountManager: accountManager).start(next: { value in + initialPresentationDataAndSettings = value + semaphore.signal() + }) + semaphore.wait() + + let sharedContext = SharedAccountContext(mainWindow: nil, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, appData: self.initializationData.bundleData), rootPath: rootPath, legacyBasePath: nil, legacyCache: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) + internalContext = InternalContext(sharedContext: sharedContext) + globalInternalContext = internalContext + } + + let account: Signal<(SharedAccountContext, Account, [AccountWithInfo]), ShareAuthorizationError> = internalContext.sharedContext.accountManager.transaction { transaction -> (SharedAccountContext, LoggingSettings) in + return (internalContext.sharedContext, transaction.getSharedData(SharedDataKeys.loggingSettings) as? LoggingSettings ?? LoggingSettings.defaultSettings) + } + |> introduceError(ShareAuthorizationError.self) + |> mapToSignal { sharedContext, loggingSettings -> Signal<(SharedAccountContext, Account, [AccountWithInfo]), ShareAuthorizationError> in + Logger.shared.logToFile = loggingSettings.logToFile + Logger.shared.logToConsole = loggingSettings.logToConsole + + Logger.shared.redactSensitiveData = loggingSettings.redactSensitiveData + + return sharedContext.activeAccountsWithInfo + |> introduceError(ShareAuthorizationError.self) + |> take(1) + |> mapToSignal { primary, accounts -> Signal<(SharedAccountContext, Account, [AccountWithInfo]), ShareAuthorizationError> in + guard let primary = primary else { + return .fail(.unauthorized) + } + guard let info = accounts.first(where: { $0.account.id == primary }) else { + return .fail(.unauthorized) + } + return .single((sharedContext, info.account, Array(accounts))) + } + } + |> take(1) + + let applicationInterface = account + |> mapToSignal { sharedContext, account, otherAccounts -> Signal<(AccountContext, PostboxAccessChallengeData, [AccountWithInfo]), ShareAuthorizationError> in + let limitsConfiguration = account.postbox.transaction { transaction -> LimitsConfiguration in + return transaction.getPreferencesEntry(key: PreferencesKeys.limitsConfiguration) as? LimitsConfiguration ?? LimitsConfiguration.defaultValue + } + return combineLatest(sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationPasscodeSettings]), limitsConfiguration, sharedContext.accountManager.accessChallengeData()) + |> take(1) + |> deliverOnMainQueue + |> introduceError(ShareAuthorizationError.self) + |> map { sharedData, limitsConfiguration, data -> (AccountContext, PostboxAccessChallengeData, [AccountWithInfo]) in + updateLegacyLocalization(strings: sharedContext.currentPresentationData.with({ $0 }).strings) + let context = AccountContext(sharedContext: sharedContext, account: account, limitsConfiguration: limitsConfiguration) + return (context, data.data, otherAccounts) + } + } + |> deliverOnMainQueue + |> afterNext { [weak self] context, accessChallengeData, otherAccounts in + setupLegacyComponents(context: context) + initializeLegacyComponents(application: nil, currentSizeClassGetter: { return .compact }, currentHorizontalClassGetter: { return .compact }, documentsPath: "", currentApplicationBounds: { return CGRect() }, canOpenUrl: { _ in return false}, openUrl: { _ in }) + + let displayShare: () -> Void = { + var cancelImpl: (() -> Void)? + + let requestUserInteraction: ([UnpreparedShareItemContent]) -> Signal<[PreparedShareItemContent], NoError> = { content in + return Signal { [weak self] subscriber in + switch content[0] { + case let .contact(data): + let controller = deviceContactInfoController(context: context, subject: .filter(peer: nil, contactId: nil, contactData: data, completion: { peer, contactData in + let phone = contactData.basicData.phoneNumbers[0].value + if let vCardData = contactData.serializedVCard() { + subscriber.putNext([.media(.media(.standalone(media: TelegramMediaContact(firstName: contactData.basicData.firstName, lastName: contactData.basicData.lastName, phoneNumber: phone, peerId: nil, vCardData: vCardData))))]) + } + subscriber.putCompletion() + }), cancelled: { + cancelImpl?() + }) + + if let strongSelf = self, let window = strongSelf.mainWindow { + controller.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) + window.present(controller, on: .root) + } + break + } + + return ActionDisposable { + } + } |> runOn(Queue.mainQueue()) + } + + let sentItems: ([PeerId], [PreparedShareItemContent], Account) -> Signal = { peerIds, contents, account in + let sentItems = sentShareItems(account: account, to: peerIds, items: contents) + |> `catch` { _ -> Signal< + Float, NoError> in + return .complete() + } + return sentItems + |> map { value -> ShareControllerExternalStatus in + return .progress(value) + } + |> then(.single(.done)) + } + + let shareController = ShareController(context: context, subject: .fromExternal({ peerIds, additionalText, account in + if let strongSelf = self, let inputItems = strongSelf.getExtensionContext()?.inputItems, !inputItems.isEmpty, !peerIds.isEmpty { + let rawSignals = TGItemProviderSignals.itemSignals(forInputItems: inputItems)! + return preparedShareItems(account: account, to: peerIds[0], dataItems: rawSignals, additionalText: additionalText) + |> map(Optional.init) + |> `catch` { _ -> Signal in + return .single(nil) + } + |> mapToSignal { state -> Signal in + guard let state = state else { + return .single(.done) + } + switch state { + case .preparing: + return .single(.preparing) + case let .progress(value): + return .single(.progress(value)) + case let .userInteractionRequired(value): + return requestUserInteraction(value) + |> mapToSignal { contents -> Signal in + return sentItems(peerIds, contents, account) + } + case let .done(contents): + return sentItems(peerIds, contents, account) + } + } + } else { + return .single(.done) + } + }), externalShare: false, switchableAccounts: otherAccounts) + shareController.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) + shareController.dismissed = { _ in + self?.getExtensionContext()?.completeRequest(returningItems: nil, completionHandler: nil) + } + + cancelImpl = { [weak shareController] in + shareController?.dismiss() + } + + if let strongSelf = self { + if let currentShareController = strongSelf.currentShareController { + currentShareController.dismiss() + } + strongSelf.currentShareController = shareController + strongSelf.mainWindow?.present(shareController, on: .root) + } + + context.account.resetStateManagement() + } + + let _ = passcodeEntryController(context: context, animateIn: true, completion: { value in + if value { + displayShare() + } else { + Queue.mainQueue().after(0.5, { + self?.getExtensionContext()?.completeRequest(returningItems: nil, completionHandler: nil) + }) + } + }).start(next: { controller in + guard let strongSelf = self, let controller = controller else { + return + } + + if let currentPasscodeController = strongSelf.currentPasscodeController { + currentPasscodeController.dismiss() + } + strongSelf.currentPasscodeController = controller + strongSelf.mainWindow?.present(controller, on: .root) + }) + } + + self.disposable.set(applicationInterface.start(next: { _, _, _ in }, error: { [weak self] error in + guard let strongSelf = self else { + return + } + let presentationData = internalContext.sharedContext.currentPresentationData.with { $0 } + let controller = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: presentationData.strings.Share_AuthTitle, text: presentationData.strings.Share_AuthDescription, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { + self?.getExtensionContext()?.completeRequest(returningItems: nil, completionHandler: nil) + })]) + strongSelf.mainWindow?.present(controller, on: .root) + }, completed: {})) + } + } +} diff --git a/submodules/TelegramUI/TelegramUI/ShareInputFieldNode.swift b/submodules/TelegramUI/TelegramUI/ShareInputFieldNode.swift index c08101166e..11fc4ef4b2 100644 --- a/submodules/TelegramUI/TelegramUI/ShareInputFieldNode.swift +++ b/submodules/TelegramUI/TelegramUI/ShareInputFieldNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private func generateClearIcon(color: UIColor) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Clear"), color: color) diff --git a/Share/ShareItems.swift b/submodules/TelegramUI/TelegramUI/ShareItems.swift similarity index 99% rename from Share/ShareItems.swift rename to submodules/TelegramUI/TelegramUI/ShareItems.swift index f266e7d7ee..7879f80f0c 100644 --- a/Share/ShareItems.swift +++ b/submodules/TelegramUI/TelegramUI/ShareItems.swift @@ -8,7 +8,7 @@ import MtProtoKit import MtProtoKitDynamic #endif import Display -import TelegramUI +import TelegramUIPrivateModule import LegacyComponents @@ -36,7 +36,7 @@ enum PreparedShareItems { } private func scalePhotoImage(_ image: UIImage, dimensions: CGSize) -> UIImage? { - if #available(iOSApplicationExtension 10.0, *) { + if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { let format = UIGraphicsImageRendererFormat() format.scale = 1.0 let renderer = UIGraphicsImageRenderer(size: dimensions, format: format) diff --git a/submodules/TelegramUI/TelegramUI/ShareLoadingContainerNode.swift b/submodules/TelegramUI/TelegramUI/ShareLoadingContainerNode.swift index 297906bdb6..33896988a7 100644 --- a/submodules/TelegramUI/TelegramUI/ShareLoadingContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ShareLoadingContainerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import Postbox +import TelegramPresentationData enum ShareLoadingState { case preparing diff --git a/submodules/TelegramUI/TelegramUI/SharePeersContainerNode.swift b/submodules/TelegramUI/TelegramUI/SharePeersContainerNode.swift index 81b75cf11c..882b425887 100644 --- a/submodules/TelegramUI/TelegramUI/SharePeersContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/SharePeersContainerNode.swift @@ -5,6 +5,7 @@ import Postbox import TelegramCore import SwiftSignalKit import Display +import TelegramPresentationData private let subtitleFont = Font.regular(12.0) diff --git a/submodules/TelegramUI/TelegramUI/ShareProxyServerActionSheetController.swift b/submodules/TelegramUI/TelegramUI/ShareProxyServerActionSheetController.swift index af258bb477..4e535d3771 100644 --- a/submodules/TelegramUI/TelegramUI/ShareProxyServerActionSheetController.swift +++ b/submodules/TelegramUI/TelegramUI/ShareProxyServerActionSheetController.swift @@ -6,6 +6,7 @@ import Postbox import AsyncDisplayKit import UIKit import SwiftSignalKit +import TelegramPresentationData public final class ShareProxyServerActionSheetController: ActionSheetController { private var presentationDisposable: Disposable? diff --git a/submodules/TelegramUI/TelegramUI/ShareSearchBarNode.swift b/submodules/TelegramUI/TelegramUI/ShareSearchBarNode.swift index dcd2f7eaef..183e3457d2 100644 --- a/submodules/TelegramUI/TelegramUI/ShareSearchBarNode.swift +++ b/submodules/TelegramUI/TelegramUI/ShareSearchBarNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private func generateClearIcon(color: UIColor) -> UIImage? { return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Clear"), color: color) diff --git a/submodules/TelegramUI/TelegramUI/ShareSearchContainerNode.swift b/submodules/TelegramUI/TelegramUI/ShareSearchContainerNode.swift index a0d55288e2..b13837cc34 100644 --- a/submodules/TelegramUI/TelegramUI/ShareSearchContainerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ShareSearchContainerNode.swift @@ -5,6 +5,7 @@ import Postbox import TelegramCore import SwiftSignalKit import Display +import TelegramPresentationData private let cancelFont = Font.regular(17.0) private let subtitleFont = Font.regular(12.0) diff --git a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift index 11562af2ef..6b91d7ac8d 100644 --- a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift +++ b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift @@ -3,6 +3,9 @@ import Postbox import TelegramCore import SwiftSignalKit import Display +import TelegramPresentationData +import TelegramCallsUI +import TelegramUIPreferences private enum CallStatusText: Equatable { case none @@ -38,12 +41,6 @@ public final class AccountWithInfo: Equatable { } } -private func pathFromLegacyFile(basePath: String, fileId: Int64, isLocal: Bool, fileName: String) -> String { - let documentsPath = basePath + "/Documents" - let filePath = documentsPath + "/files/" + (isLocal ? "local" : "") + "\(String(fileId, radix: 16))/\(fileName)" - return filePath -} - private func preFetchedLegacyResourcePath(basePath: String, resource: MediaResource, cache: LegacyCache) -> String? { if let resource = resource as? CloudDocumentMediaResource { let videoPath = "\(basePath)/Documents/video/remote\(String(resource.fileId, radix: 16)).mov" @@ -199,7 +196,7 @@ public final class SharedAccountContext { self._presentationData.set(.single(initialPresentationDataAndSettings.presentationData) |> then( - updatedPresentationData(accountManager: self.accountManager, applicationBindings: self.applicationBindings) + updatedPresentationData(accountManager: self.accountManager, applicationInForeground: self.applicationBindings.applicationInForeground) )) self._automaticMediaDownloadSettings.set(.single(initialPresentationDataAndSettings.automaticMediaDownloadSettings) |> then(accountManager.sharedData(keys: [SharedDataKeys.autodownloadSettings, ApplicationSpecificSharedDataKeys.automaticMediaDownloadSettings]) diff --git a/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift b/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift index 249283027b..6cde37a7bc 100644 --- a/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift +++ b/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift @@ -3,8 +3,10 @@ import UIKit import SwiftSignalKit import Postbox import TelegramCore - +import TelegramUIPreferences import TelegramUIPrivateModule +import UniversalMediaPlayer +import TelegramAudio enum SharedMediaPlayerPlaybackControlAction { case play diff --git a/Telegram-iOS/SharedNotificationManager.swift b/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift similarity index 99% rename from Telegram-iOS/SharedNotificationManager.swift rename to submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift index 16844a5856..e6f2c5506a 100644 --- a/Telegram-iOS/SharedNotificationManager.swift +++ b/submodules/TelegramUI/TelegramUI/SharedNotificationManager.swift @@ -4,7 +4,8 @@ import UserNotifications import SwiftSignalKit import Postbox import TelegramCore -import TelegramUI +import TelegramPresentationData +import TelegramCallsUI private final class PollStateContext { let subscribers = Bag<(Bool) -> Void>() @@ -19,7 +20,7 @@ private final class PollStateContext { } } -final class SharedNotificationManager { +public final class SharedNotificationManager { private let episodeId: UInt32 private let application: UIApplication diff --git a/Telegram-iOS/SharedWakeupManager.swift b/submodules/TelegramUI/TelegramUI/SharedWakeupManager.swift similarity index 83% rename from Telegram-iOS/SharedWakeupManager.swift rename to submodules/TelegramUI/TelegramUI/SharedWakeupManager.swift index 5e144be64d..e9bf36bc6f 100644 --- a/Telegram-iOS/SharedWakeupManager.swift +++ b/submodules/TelegramUI/TelegramUI/SharedWakeupManager.swift @@ -3,7 +3,7 @@ import UIKit import SwiftSignalKit import Postbox import TelegramCore -import TelegramUI +import TelegramCallsUI private struct AccountTasks { let stateSynchronization: Bool @@ -44,13 +44,14 @@ private struct AccountTasks { } } -final class SharedWakeupManager { +public final class SharedWakeupManager { private let beginBackgroundTask: (String, @escaping () -> Void) -> UIBackgroundTaskIdentifier? private let endBackgroundTask: (UIBackgroundTaskIdentifier) -> Void private let backgroundTimeRemaining: () -> Double private var inForeground: Bool = false private var hasActiveAudioSession: Bool = false + private var activeExplicitExtensionTimer: SwiftSignalKit.Timer? private var allowBackgroundTimeExtensionDeadline: Double? private var isInBackgroundExtension: Bool = false @@ -61,7 +62,7 @@ final class SharedWakeupManager { private var accountsAndTasks: [(Account, Bool, AccountTasks)] = [] - init(beginBackgroundTask: @escaping (String, @escaping () -> Void) -> UIBackgroundTaskIdentifier?, endBackgroundTask: @escaping (UIBackgroundTaskIdentifier) -> Void, backgroundTimeRemaining: @escaping () -> Double, activeAccounts: Signal<(primary: Account?, accounts: [(AccountRecordId, Account)]), NoError>, liveLocationPolling: Signal, watchTasks: Signal, inForeground: Signal, hasActiveAudioSession: Signal, notificationManager: SharedNotificationManager?, mediaManager: MediaManager, callManager: PresentationCallManager?, accountUserInterfaceInUse: @escaping (AccountRecordId) -> Signal) { + public init(beginBackgroundTask: @escaping (String, @escaping () -> Void) -> UIBackgroundTaskIdentifier?, endBackgroundTask: @escaping (UIBackgroundTaskIdentifier) -> Void, backgroundTimeRemaining: @escaping () -> Double, activeAccounts: Signal<(primary: Account?, accounts: [(AccountRecordId, Account)]), NoError>, liveLocationPolling: Signal, watchTasks: Signal, inForeground: Signal, hasActiveAudioSession: Signal, notificationManager: SharedNotificationManager?, mediaManager: MediaManager, callManager: PresentationCallManager?, accountUserInterfaceInUse: @escaping (AccountRecordId) -> Signal) { assert(Queue.mainQueue().isCurrent()) self.beginBackgroundTask = beginBackgroundTask @@ -74,6 +75,10 @@ final class SharedWakeupManager { return } strongSelf.inForeground = value + if value { + strongSelf.activeExplicitExtensionTimer?.invalidate() + strongSelf.activeExplicitExtensionTimer = nil + } strongSelf.checkTasks() }) @@ -158,10 +163,23 @@ final class SharedWakeupManager { } } - func allowBackgroundTimeExtension(timeout: Double) { + func allowBackgroundTimeExtension(timeout: Double, extendNow: Bool = false) { let shouldCheckTasks = self.allowBackgroundTimeExtensionDeadline == nil self.allowBackgroundTimeExtensionDeadline = CACurrentMediaTime() + timeout - if shouldCheckTasks { + if extendNow { + if self.activeExplicitExtensionTimer == nil { + self.activeExplicitExtensionTimer = SwiftSignalKit.Timer(timeout: 20.0, repeat: false, completion: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.activeExplicitExtensionTimer?.invalidate() + strongSelf.activeExplicitExtensionTimer = nil + strongSelf.checkTasks() + }, queue: .mainQueue()) + self.activeExplicitExtensionTimer?.start() + } + } + if shouldCheckTasks || extendNow { self.checkTasks() } } @@ -182,6 +200,9 @@ final class SharedWakeupManager { break } } + if self.activeExplicitExtensionTimer != nil { + hasTasksForBackgroundExtension = true + } let canBeginBackgroundExtensionTasks = self.allowBackgroundTimeExtensionDeadline.flatMap({ CACurrentMediaTime() < $0 }) ?? false if hasTasksForBackgroundExtension { @@ -231,9 +252,9 @@ final class SharedWakeupManager { } private func updateAccounts() { - if self.inForeground || self.hasActiveAudioSession || self.isInBackgroundExtension { + if self.inForeground || self.hasActiveAudioSession || self.isInBackgroundExtension || self.activeExplicitExtensionTimer != nil { for (account, primary, tasks) in self.accountsAndTasks { - if (self.inForeground && primary) || !tasks.isEmpty { + if (self.inForeground && primary) || !tasks.isEmpty || (self.activeExplicitExtensionTimer != nil && primary) { account.shouldBeServiceTaskMaster.set(.single(.always)) } else { account.shouldBeServiceTaskMaster.set(.single(.never)) diff --git a/submodules/TelegramUI/TelegramUI/SoftwareAnimationRenderer.swift b/submodules/TelegramUI/TelegramUI/SoftwareAnimationRenderer.swift new file mode 100644 index 0000000000..31104db17e --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/SoftwareAnimationRenderer.swift @@ -0,0 +1,19 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display +import TelegramUIPrivateModule + +final class SoftwareAnimationRenderer: ASDisplayNode, AnimationRenderer { + func render(width: Int, height: Int, bytes: UnsafeRawPointer, length: Int) { + let image = generateImagePixel(CGSize(width: CGFloat(width), height: CGFloat(height)), scale: 1.0, pixelGenerator: { _, pixelData in + if true { + memcpy(pixelData, bytes, length) + } else { + encodeBRGR422AToRGBA(bytes.assumingMemoryBound(to: UInt8.self), bytes.assumingMemoryBound(to: UInt8.self).advanced(by: width * 2 * height), pixelData, Int32(width), Int32(height)) + } + }) + + self.contents = image?.cgImage + } +} diff --git a/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift b/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift index 68484700a7..1867870198 100644 --- a/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift +++ b/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift @@ -4,6 +4,7 @@ import Postbox import TelegramCore import SwiftSignalKit import CoreMedia +import UniversalMediaPlayer private let applyQueue = Queue() private let workers = ThreadPool(threadCount: 2, threadPriority: 0.09) diff --git a/submodules/TelegramUI/TelegramUI/SoftwareVideoSource.swift b/submodules/TelegramUI/TelegramUI/SoftwareVideoSource.swift index 475cc35dc6..f90e8c727c 100644 --- a/submodules/TelegramUI/TelegramUI/SoftwareVideoSource.swift +++ b/submodules/TelegramUI/TelegramUI/SoftwareVideoSource.swift @@ -3,6 +3,7 @@ import UIKit import CoreMedia import SwiftSignalKit import FFMpeg +import UniversalMediaPlayer private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: UnsafeMutablePointer?, bufferSize: Int32) -> Int32 { let context = Unmanaged.fromOpaque(userData!).takeUnretainedValue() diff --git a/submodules/TelegramUI/TelegramUI/SoftwareVideoThumbnailLayer.swift b/submodules/TelegramUI/TelegramUI/SoftwareVideoThumbnailLayer.swift index d92cf36d4c..cd9e2de493 100644 --- a/submodules/TelegramUI/TelegramUI/SoftwareVideoThumbnailLayer.swift +++ b/submodules/TelegramUI/TelegramUI/SoftwareVideoThumbnailLayer.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import Postbox import SwiftSignalKit +import Display private final class SoftwareVideoThumbnailLayerNullAction: NSObject, CAAction { @objc func run(forKey event: String, object anObject: Any, arguments dict: [AnyHashable : Any]?) { diff --git a/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift b/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift index a3d6d2af5c..eceb8094e9 100644 --- a/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift +++ b/submodules/TelegramUI/TelegramUI/SolidRoundedButtonNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData private let textFont: UIFont = Font.regular(16.0) @@ -67,6 +68,14 @@ final class SolidRoundedButtonNode: ASDisplayNode { } } + func updateTheme(_ theme: PresentationTheme) { + self.theme = theme + + self.buttonBackgroundNode.image = generateStretchableFilledCircleImage(radius: cornerRadius, 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) + } + func updateLayout(width: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat { self.validLayout = width diff --git a/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift b/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift index e8c5350a1d..70d1eb3efd 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private struct StickerPackPreviewGridEntry: Comparable, Identifiable { let index: Int diff --git a/submodules/TelegramUI/TelegramUI/StickerPanePeerSpecificSetupGridItem.swift b/submodules/TelegramUI/TelegramUI/StickerPanePeerSpecificSetupGridItem.swift index d01bd9f581..7cfe2605cf 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPanePeerSpecificSetupGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPanePeerSpecificSetupGridItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class StickerPanePeerSpecificSetupGridItem: GridItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift index d888f8be0f..d36a8ff2da 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPaneSearchContentNode.swift @@ -5,7 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore - +import TelegramPresentationData import LegacyComponents import TelegramUIPrivateModule @@ -267,16 +267,30 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode { let query = text.trimmingCharacters(in: .whitespacesAndNewlines) if query.isSingleEmoji { - signals = .single([searchStickers(account: account, query: text) + signals = .single([searchStickers(account: account, query: text.trimmedEmoji) |> take(1) |> map { (nil, $0) }]) } else if query.count > 1, let languageCode = languageCode, !languageCode.isEmpty && languageCode != "emoji" { - signals = searchEmojiKeywords(postbox: account.postbox, inputLanguageCode: languageCode, query: query.lowercased(), completeMatch: query.count < 3) + var signal = searchEmojiKeywords(postbox: account.postbox, inputLanguageCode: languageCode, query: query.lowercased(), completeMatch: query.count < 3) + if !languageCode.lowercased().hasPrefix("en") { + signal = signal + |> mapToSignal { keywords in + return .single(keywords) + |> then( + searchEmojiKeywords(postbox: account.postbox, inputLanguageCode: "en-US", query: query.lowercased(), completeMatch: query.count < 3) + |> map { englishKeywords in + return keywords + englishKeywords + } + ) + } + } + + signals = signal |> map { keywords -> [Signal<(String?, [FoundStickerItem]), NoError>] in var signals: [Signal<(String?, [FoundStickerItem]), NoError>] = [] let emoticons = keywords.flatMap { $0.emoticons } for emoji in emoticons { - signals.append(searchStickers(account: self.context.account, query: emoji) + signals.append(searchStickers(account: self.context.account, query: emoji.trimmedEmoji) |> take(1) |> map { (emoji, $0) }) } diff --git a/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift b/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift index 99a09ebe14..d40ab5790f 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPaneSearchGlobaltem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class StickerPaneSearchGlobalSection: GridSection { let height: CGFloat = 0.0 diff --git a/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift b/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift index efb887ef9b..882a3f09a8 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift @@ -5,6 +5,7 @@ import TelegramCore import SwiftSignalKit import AsyncDisplayKit import Postbox +import TelegramPresentationData final class StickerPaneSearchStickerSection: GridSection { let code: String diff --git a/submodules/TelegramUI/TelegramUI/StickerPreviewControllerNode.swift b/submodules/TelegramUI/TelegramUI/StickerPreviewControllerNode.swift index 0330951698..d8422acc2a 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPreviewControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPreviewControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData final class StickerPreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelItem.swift b/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelItem.swift index b8dfdd7008..8152fda34a 100644 --- a/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class StickersChatInputContextPanelItem: ListViewItem { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelNode.swift index e3cd7075d2..8882df1255 100644 --- a/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/StickersChatInputContextPanelNode.swift @@ -5,6 +5,7 @@ import Postbox import TelegramCore import Display import SwiftSignalKit +import TelegramPresentationData private struct StickersChatInputContextPanelEntryStableId: Hashable { let ids: [MediaId] diff --git a/submodules/TelegramUI/TelegramUI/StorageUsageController.swift b/submodules/TelegramUI/TelegramUI/StorageUsageController.swift index 496c9b36a1..6b82984bde 100644 --- a/submodules/TelegramUI/TelegramUI/StorageUsageController.swift +++ b/submodules/TelegramUI/TelegramUI/StorageUsageController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class StorageUsageControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/StoreDownloadedMedia.swift b/submodules/TelegramUI/TelegramUI/StoreDownloadedMedia.swift index 0a59191ea4..8c77f31d8d 100644 --- a/submodules/TelegramUI/TelegramUI/StoreDownloadedMedia.swift +++ b/submodules/TelegramUI/TelegramUI/StoreDownloadedMedia.swift @@ -3,6 +3,7 @@ import SwiftSignalKit import TelegramCore import Postbox import Photos +import TelegramUIPreferences private func appSpecificAssetCollection() -> Signal { return Signal { subscriber in diff --git a/submodules/TelegramUI/TelegramUI/StringForMessageTimestampStatus.swift b/submodules/TelegramUI/TelegramUI/StringForMessageTimestampStatus.swift index 8677336fe9..8463032d30 100644 --- a/submodules/TelegramUI/TelegramUI/StringForMessageTimestampStatus.swift +++ b/submodules/TelegramUI/TelegramUI/StringForMessageTimestampStatus.swift @@ -1,6 +1,8 @@ import Foundation import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences enum MessageTimestampStatusFormat { case regular diff --git a/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift b/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift index 63adeae151..9c38d83547 100644 --- a/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift +++ b/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift @@ -34,6 +34,8 @@ func chatInputStateStringWithAppliedEntities(_ text: String, entities: [MessageT string.addAttribute(ChatTextInputAttributes.textUrl, value: ChatTextInputTextUrlAttribute(url: url), range: range) case .Code, .Pre: string.addAttribute(ChatTextInputAttributes.monospace, value: true as NSNumber, range: range) + case .Strikethrough: + string.addAttribute(ChatTextInputAttributes.strikethrough, value: true as NSNumber, range: range) default: break } @@ -121,6 +123,8 @@ func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], ba nsString = text as NSString } string.addAttribute(NSAttributedStringKey(rawValue: TelegramTextAttributes.PeerTextMention), value: nsString!.substring(with: range), range: range) + case .Strikethrough: + string.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue as NSNumber, range: range) case let .TextMention(peerId): string.addAttribute(NSAttributedStringKey.foregroundColor, value: linkColor, range: range) if underlineLinks && underlineAllLinks { diff --git a/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift b/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift index 3a9780512e..e7646ab873 100644 --- a/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift +++ b/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift @@ -3,18 +3,19 @@ import AsyncDisplayKit import Display import SwiftSignalKit import TelegramCore +import DeviceAccess func presentContactsWarningSuppression(context: AccountContext, present: (ViewController, Any?) -> Void) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } present(textAlertController(context: context, title: presentationData.strings.Contacts_PermissionsSuppressWarningTitle, text: presentationData.strings.Contacts_PermissionsSuppressWarningText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Contacts_PermissionsKeepDisabled, action: { ApplicationSpecificNotice.setContactsPermissionWarning(accountManager: context.sharedContext.accountManager, value: Int32(Date().timeIntervalSince1970)) }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Contacts_PermissionsEnable, action: { - let _ = (DeviceAccess.authorizationStatus(context: context, subject: .contacts) + let _ = (DeviceAccess.authorizationStatus(subject: .contacts) |> take(1) |> deliverOnMainQueue).start(next: { status in switch status { case .notDetermined: - DeviceAccess.authorizeAccess(to: .contacts, context: context) + DeviceAccess.authorizeAccess(to: .contacts) case .denied, .restricted: context.sharedContext.applicationBindings.openSettings() default: diff --git a/submodules/TelegramUI/TelegramUI/SystemVideoContent.swift b/submodules/TelegramUI/TelegramUI/SystemVideoContent.swift index bbbd6922ea..a96d2b6e27 100644 --- a/submodules/TelegramUI/TelegramUI/SystemVideoContent.swift +++ b/submodules/TelegramUI/TelegramUI/SystemVideoContent.swift @@ -5,8 +5,9 @@ import Display import SwiftSignalKit import Postbox import TelegramCore - +import TelegramAudio import LegacyComponents +import UniversalMediaPlayer final class SystemVideoContent: UniversalVideoContent { let id: AnyHashable diff --git a/Telegram-iOS/TGAutoDownloadPreferences.h b/submodules/TelegramUI/TelegramUI/TGAutoDownloadPreferences.h similarity index 100% rename from Telegram-iOS/TGAutoDownloadPreferences.h rename to submodules/TelegramUI/TelegramUI/TGAutoDownloadPreferences.h diff --git a/Telegram-iOS/TGAutoDownloadPreferences.m b/submodules/TelegramUI/TelegramUI/TGAutoDownloadPreferences.m similarity index 100% rename from Telegram-iOS/TGAutoDownloadPreferences.m rename to submodules/TelegramUI/TelegramUI/TGAutoDownloadPreferences.m diff --git a/Telegram-iOS/TGBridgeServer.h b/submodules/TelegramUI/TelegramUI/TGBridgeServer.h similarity index 100% rename from Telegram-iOS/TGBridgeServer.h rename to submodules/TelegramUI/TelegramUI/TGBridgeServer.h diff --git a/Telegram-iOS/TGBridgeServer.m b/submodules/TelegramUI/TelegramUI/TGBridgeServer.m similarity index 99% rename from Telegram-iOS/TGBridgeServer.m rename to submodules/TelegramUI/TelegramUI/TGBridgeServer.m index cb1a09654f..372c92c8a1 100644 --- a/Telegram-iOS/TGBridgeServer.m +++ b/submodules/TelegramUI/TelegramUI/TGBridgeServer.m @@ -3,13 +3,7 @@ #import #import #import - -#ifdef BUCK -#import -#else -#import "TGBridgeCommon.h" -#import "TGBridgeContext.h" -#endif +#import @interface TGBridgeSignalManager : NSObject diff --git a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.h b/submodules/TelegramUI/TelegramUI/TGChannelIntroController.h deleted file mode 100644 index 3eb7a0f481..0000000000 --- a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface TGChannelIntroControllerTheme : NSObject - -@property (nonatomic, strong, readonly) UIColor *backgroundColor; -@property (nonatomic, strong, readonly) UIColor *primaryColor; -@property (nonatomic, strong, readonly) UIColor *secondaryColor; -@property (nonatomic, strong, readonly) UIColor *accentColor; -@property (nonatomic, strong, readonly) UIImage *backArrowImage; -@property (nonatomic, strong, readonly) UIImage *introImage; - -- (instancetype)initWithBackgroundColor:(UIColor *)backgroundColor primaryColor:(UIColor *)primaryColor secondaryColor:(UIColor *)secondaryColor accentColor:(UIColor *)accentColor backArrowImage:(UIImage *)backArrowImage introImage:(UIImage *)introImage; - -@end - -@interface TGChannelIntroController : TGViewController - -- (instancetype)initWithContext:(id)context getLocalizedString:(NSString *(^)(NSString *))getLocalizedString theme:(TGChannelIntroControllerTheme *)theme dismiss:(void (^)(void))dismiss completion:(void (^)(void))completion; - -@end diff --git a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.m b/submodules/TelegramUI/TelegramUI/TGChannelIntroController.m deleted file mode 100644 index e21d2fa343..0000000000 --- a/submodules/TelegramUI/TelegramUI/TGChannelIntroController.m +++ /dev/null @@ -1,266 +0,0 @@ -#import "TGChannelIntroController.h" - -#import -#import - -@implementation TGChannelIntroControllerTheme - -- (instancetype)initWithBackgroundColor:(UIColor *)backgroundColor primaryColor:(UIColor *)primaryColor secondaryColor:(UIColor *)secondaryColor accentColor:(UIColor *)accentColor backArrowImage:(UIImage *)backArrowImage introImage:(UIImage *)introImage { - self = [super init]; - if (self != nil) { - _backgroundColor = backgroundColor; - _primaryColor = primaryColor; - _secondaryColor = secondaryColor; - _accentColor = accentColor; - _backArrowImage = backArrowImage; - _introImage = introImage; - } - return self; -} - -@end - -@interface TGChannelIntroController () -{ - TGModernButton *_backButton; - UIImageView *_phoneImageView; - UILabel *_titleLabel; - UILabel *_descriptionLabel; - TGModernButton *_createButton; - TGChannelIntroControllerTheme *_theme; - NSString *(^_getLocalizedString)(NSString *); - void (^_dismiss)(void); - void (^_completion)(void); -} -@end - -@implementation TGChannelIntroController - -- (instancetype)initWithContext:(id)context getLocalizedString:(NSString *(^)(NSString *))getLocalizedString theme:(TGChannelIntroControllerTheme *)theme dismiss:(void (^)(void))dismiss completion:(void (^)(void))completion { - self = [super initWithContext:context]; - if (self != nil) { - _getLocalizedString = [getLocalizedString copy]; - _theme = theme; - _dismiss = [dismiss copy]; - _completion = [completion copy]; - } - return self; -} - -- (void)loadView -{ - [super loadView]; - - self.view.backgroundColor = _theme.backgroundColor; - - UIImage *image = _theme.backArrowImage; - UIGraphicsBeginImageContextWithOptions(image.size, false, 0.0f); - CGContextRef context = UIGraphicsGetCurrentContext(); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - CGContextSetBlendMode (context, kCGBlendModeSourceAtop); - CGContextSetFillColorWithColor(context, _theme.accentColor.CGColor); - CGContextFillRect(context, CGRectMake(0, 0, image.size.width, image.size.height)); - - UIImage *arrowImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - _backButton = [[TGModernButton alloc] initWithFrame:CGRectZero]; - _backButton.exclusiveTouch = true; - _backButton.titleLabel.font = TGSystemFontOfSize(17); - [_backButton setTitle:_getLocalizedString(@"Common.Back") forState:UIControlStateNormal]; - [_backButton setTitleColor:_theme.accentColor]; - [_backButton addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; - [self.view addSubview:_backButton]; - - UIImageView *arrowView = [[UIImageView alloc] initWithFrame:CGRectMake(-19, 5.5f, 13, 22)]; - arrowView.image = arrowImage; - [_backButton addSubview:arrowView]; - - _phoneImageView = [[UIImageView alloc] initWithImage:_theme.introImage]; - _phoneImageView.frame = CGRectMake(0, 0, 154, 220); - [self.view addSubview:_phoneImageView]; - - _titleLabel = [[UILabel alloc] init]; - _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.font = TGSystemFontOfSize(21); - _titleLabel.textColor = _theme.primaryColor; - _titleLabel.textAlignment = NSTextAlignmentCenter; - _titleLabel.text = _getLocalizedString(@"ChannelIntro.Title"); - [self.view addSubview:_titleLabel]; - - _descriptionLabel = [[UILabel alloc] init]; - _descriptionLabel.backgroundColor = [UIColor clearColor]; - _descriptionLabel.numberOfLines = 0; - _descriptionLabel.textAlignment = NSTextAlignmentCenter; - [self.view addSubview:_descriptionLabel]; - - NSString *description = _getLocalizedString(@"ChannelIntro.Text"); - NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:description]; - NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; - style.lineSpacing = 2; - style.alignment = NSTextAlignmentCenter; - [attrString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, description.length)]; - [attrString addAttribute:NSForegroundColorAttributeName value:_theme.secondaryColor range:NSMakeRange(0, description.length)]; - [attrString addAttribute:NSFontAttributeName value:TGSystemFontOfSize(16) range:NSMakeRange(0, description.length)]; - _descriptionLabel.attributedText = attrString; - - _createButton = [[TGModernButton alloc] init]; - _createButton.exclusiveTouch = true; - _createButton.backgroundColor = [UIColor clearColor]; - _createButton.titleLabel.font = TGSystemFontOfSize(21); - [_createButton setTitleColor:_theme.accentColor]; - [_createButton setTitle:_getLocalizedString(@"ChannelIntro.CreateChannel") forState:UIControlStateNormal]; - [_createButton addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; - [self.view addSubview:_createButton]; -} - -- (bool)navigationBarShouldBeHidden -{ - return true; -} - -- (void)backButtonPressed -{ - if (_dismiss != nil) - _dismiss(); - else - [self.navigationController popViewControllerAnimated:true]; -} - -- (void)buttonPressed -{ - _completion(); -} - -- (void)viewWillLayoutSubviews -{ - CGRect bounds = self.context.fullscreenBounds; - UIInterfaceOrientation orientation = UIInterfaceOrientationPortrait; - if (bounds.size.width > bounds.size.height) { - orientation = UIInterfaceOrientationLandscapeLeft; - } - - UIEdgeInsets safeAreaInset = [self calculatedSafeAreaInset]; - int iosVersion = [[[UIDevice currentDevice] systemVersion] intValue]; - if (UIEdgeInsetsEqualToEdgeInsets(safeAreaInset, UIEdgeInsetsZero) && (iosVersion < 11 || TGIsPad() || UIInterfaceOrientationIsPortrait(orientation))) - safeAreaInset.top = 20.0f; - - [_backButton sizeToFit]; - _backButton.frame = CGRectMake(27 + safeAreaInset.left, 5.0f + TGScreenPixel + safeAreaInset.top, ceil(_backButton.frame.size.width), ceil(_backButton.frame.size.height)); - - [_titleLabel sizeToFit]; - [_descriptionLabel sizeToFit]; - [_createButton sizeToFit]; - - int screenSize = (int)TGScreenSize().height; - CGFloat titleY = 0; - CGFloat imageY = 0; - CGFloat descY = 0; - CGFloat buttonY = 0; - - if (UIInterfaceOrientationIsPortrait(orientation)) - { - switch (screenSize) - { - case 812: - case 896: - titleY = 445 + 44; - imageY = 141 + 44; - descY = 490 + 44; - buttonY = 610 + 44; - break; - - case 736: - titleY = 445; - imageY = 141; - descY = 490; - buttonY = 610; - break; - - case 667: - titleY = 407; - imageY = 120; - descY = 448; - buttonY = 558; - break; - - case 568: - titleY = 354; - imageY = 87; - descY = 397; - buttonY = 496; - break; - - default: - titleY = 307; - imageY = 60; - descY = 344; - buttonY = 424; - break; - } - - _phoneImageView.frame = CGRectMake((self.view.frame.size.width - _phoneImageView.frame.size.width) / 2, imageY, _phoneImageView.frame.size.width, _phoneImageView.frame.size.height); - _titleLabel.frame = CGRectMake((self.view.frame.size.width - _titleLabel.frame.size.width) / 2, titleY, ceil(_titleLabel.frame.size.width), ceil(_titleLabel.frame.size.height)); - _descriptionLabel.frame = CGRectMake((self.view.frame.size.width - _descriptionLabel.frame.size.width) / 2, descY, ceil(_descriptionLabel.frame.size.width), ceil(_descriptionLabel.frame.size.height)); - - _createButton.frame = CGRectMake((self.view.frame.size.width - _createButton.frame.size.width) / 2, buttonY, ceil(_createButton.frame.size.width), ceil(_createButton.frame.size.height)); - } - else - { - CGFloat leftX = 0; - CGFloat rightX = 0; - - switch (screenSize) - { - case 812: - leftX = 190 + 44; - rightX = 448 + 44; - titleY = 103; - descY = 148; - buttonY = 237; - break; - - case 736: - leftX = 209; - rightX = 504; - titleY = 115; - descY = 156; - buttonY = 278; - break; - - case 667: - leftX = 190; - rightX = 448; - titleY = 103; - descY = 148; - buttonY = 237; - break; - - case 568: - leftX = 164; - rightX = 388; - titleY = 78; - descY = 121; - buttonY = 217; - break; - - default: - leftX = 125; - rightX = 328; - titleY = 78; - descY = 121; - buttonY = 219; - break; - } - - _phoneImageView.frame = CGRectMake(leftX - _phoneImageView.frame.size.width / 2, (self.view.frame.size.height - _phoneImageView.frame.size.height) / 2, _phoneImageView.frame.size.width, _phoneImageView.frame.size.height); - - _titleLabel.frame = CGRectMake(rightX - _titleLabel.frame.size.width / 2, titleY, ceil(_titleLabel.frame.size.width), ceil(_titleLabel.frame.size.height)); - - _descriptionLabel.frame = CGRectMake(rightX - _descriptionLabel.frame.size.width / 2, descY, ceil(_descriptionLabel.frame.size.width), ceil(_descriptionLabel.frame.size.height)); - - _createButton.frame = CGRectMake(rightX - _createButton.frame.size.width / 2, buttonY, ceil(_createButton.frame.size.width), ceil(_createButton.frame.size.height)); - } -} - -@end diff --git a/Share/TGContactModel.h b/submodules/TelegramUI/TelegramUI/TGContactModel.h similarity index 100% rename from Share/TGContactModel.h rename to submodules/TelegramUI/TelegramUI/TGContactModel.h diff --git a/Share/TGContactModel.m b/submodules/TelegramUI/TelegramUI/TGContactModel.m similarity index 100% rename from Share/TGContactModel.m rename to submodules/TelegramUI/TelegramUI/TGContactModel.m diff --git a/submodules/TelegramUI/TelegramUI/TGEmojiSuggestions.h b/submodules/TelegramUI/TelegramUI/TGEmojiSuggestions.h deleted file mode 100644 index 09e342638a..0000000000 --- a/submodules/TelegramUI/TelegramUI/TGEmojiSuggestions.h +++ /dev/null @@ -1,7 +0,0 @@ -#import - -@interface TGEmojiSuggestions : NSObject - -+ (NSArray *)suggestionsForQuery:(NSString *)query; - -@end diff --git a/submodules/TelegramUI/TelegramUI/TGEmojiSuggestions.mm b/submodules/TelegramUI/TelegramUI/TGEmojiSuggestions.mm deleted file mode 100644 index bc4aebd75e..0000000000 --- a/submodules/TelegramUI/TelegramUI/TGEmojiSuggestions.mm +++ /dev/null @@ -1,49 +0,0 @@ -#import "TGEmojiSuggestions.h" - -#import "emoji_suggestions.h" - -#import - -std::vector convertToUtf16(NSString *string) { - auto cf = (__bridge CFStringRef)string; - auto range = CFRangeMake(0, CFStringGetLength(cf)); - auto bufferLength = CFIndex(0); - CFStringGetBytes(cf, range, kCFStringEncodingUTF16LE, 0, FALSE, nullptr, 0, &bufferLength); - if (!bufferLength) { - return std::vector(); - } - auto result = std::vector(bufferLength / 2 + 1, 0); - CFStringGetBytes(cf, range, kCFStringEncodingUTF16LE, 0, FALSE, reinterpret_cast(result.data()), result.size() * 2, &bufferLength); - result.resize(bufferLength / 2); - return result; -} - -NSString *convertFromUtf16(Ui::Emoji::utf16string string) { - auto result = CFStringCreateWithBytes(nullptr, reinterpret_cast(string.data()), string.size() * 2, kCFStringEncodingUTF16LE, false); - return (__bridge NSString*)result; -} - -void test() { - -} - -@implementation TGEmojiSuggestions - -+ (NSArray *)suggestionsForQuery:(NSString *)queryText { - auto query = convertToUtf16(queryText); - auto values = Ui::Emoji::GetSuggestions(Ui::Emoji::utf16string(query.data(), query.size())); - - NSMutableArray *array = [[NSMutableArray alloc] init]; - - for (auto &item : values) { - NSString *emoji = convertFromUtf16(item.emoji()); - NSString *label = convertFromUtf16(item.label()); - NSString *replacement = convertFromUtf16(item.replacement()); - - [array addObject:[[TGAlphacodeEntry alloc] initWithEmoji:emoji code:replacement]]; - } - - return array; -} - -@end diff --git a/Share/TGItemProviderSignals.h b/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.h similarity index 100% rename from Share/TGItemProviderSignals.h rename to submodules/TelegramUI/TelegramUI/TGItemProviderSignals.h diff --git a/Share/TGItemProviderSignals.m b/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m similarity index 100% rename from Share/TGItemProviderSignals.m rename to submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m diff --git a/submodules/TelegramUI/TelegramUI/TGMimeTypeMap.m b/submodules/TelegramUI/TelegramUI/TGMimeTypeMap.m index 46c9021c8b..123d880dd3 100644 --- a/submodules/TelegramUI/TelegramUI/TGMimeTypeMap.m +++ b/submodules/TelegramUI/TelegramUI/TGMimeTypeMap.m @@ -315,6 +315,7 @@ static void initializeMapping() mimeToExtension[@"x-conference/x-cooltalk"] = @"ice"; extensionToMime[@"ice"] = @"x-conference/x-cooltalk"; mimeToExtension[@"x-epoc/x-sisx-app"] = @"sisx"; extensionToMime[@"sisx"] = @"x-epoc/x-sisx-app"; mimeToExtension[@"application/epub+zip"] = @"epub"; extensionToMime[@"epub"] = @"application/epub+zip"; + mimeToExtension[@"text/swift"] = @"swift"; extensionToMime[@"swift"] = @"text/swift"; mimeToExtensionMap = mimeToExtension; extensionToMimeMap = extensionToMime; diff --git a/Telegram-iOS/TGPresentationAutoNightPreferences.h b/submodules/TelegramUI/TelegramUI/TGPresentationAutoNightPreferences.h similarity index 100% rename from Telegram-iOS/TGPresentationAutoNightPreferences.h rename to submodules/TelegramUI/TelegramUI/TGPresentationAutoNightPreferences.h diff --git a/Telegram-iOS/TGPresentationAutoNightPreferences.m b/submodules/TelegramUI/TelegramUI/TGPresentationAutoNightPreferences.m similarity index 100% rename from Telegram-iOS/TGPresentationAutoNightPreferences.m rename to submodules/TelegramUI/TelegramUI/TGPresentationAutoNightPreferences.m diff --git a/Telegram-iOS/TGProxyItem.h b/submodules/TelegramUI/TelegramUI/TGProxyItem.h similarity index 100% rename from Telegram-iOS/TGProxyItem.h rename to submodules/TelegramUI/TelegramUI/TGProxyItem.h diff --git a/Telegram-iOS/TGProxyItem.m b/submodules/TelegramUI/TelegramUI/TGProxyItem.m similarity index 100% rename from Telegram-iOS/TGProxyItem.m rename to submodules/TelegramUI/TelegramUI/TGProxyItem.m diff --git a/Share/TGShareLocationSignals.h b/submodules/TelegramUI/TelegramUI/TGShareLocationSignals.h similarity index 100% rename from Share/TGShareLocationSignals.h rename to submodules/TelegramUI/TelegramUI/TGShareLocationSignals.h diff --git a/Share/TGShareLocationSignals.m b/submodules/TelegramUI/TelegramUI/TGShareLocationSignals.m similarity index 100% rename from Share/TGShareLocationSignals.m rename to submodules/TelegramUI/TelegramUI/TGShareLocationSignals.m diff --git a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift b/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift index ea76f326b2..d78ce5dd23 100644 --- a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift +++ b/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData public final class TabBarAccountSwitchController: ViewController { private var controllerNode: TabBarAccountSwitchControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchControllerNode.swift b/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchControllerNode.swift index d05d3f8b64..92cd7fea67 100644 --- a/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/TabBarAccountSwitchControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let avatarFont = UIFont(name: ".SFCompactRounded-Semibold", size: 16.0)! @@ -478,7 +479,15 @@ final class TabBarAccountSwitchControllerNode: ViewControllerTracingNode { contentSize.height += height } - let contentOrigin = CGPoint(x: layout.size.width - sideInset - contentSize.width, y: layout.size.height - 66.0 - layout.intrinsicInsets.bottom - contentSize.height) + let insets = layout.insets(options: .input) + + let contentOrigin: CGPoint + if let sourceNode = self.sourceNodes.first, let screenFrame = sourceNode.supernode?.convert(sourceNode.frame, to: nil) { + contentOrigin = CGPoint(x: screenFrame.maxX - contentSize.width + 8.0, y: layout.size.height - 66.0 - insets.bottom - contentSize.height) + } else { + contentOrigin = CGPoint(x: layout.size.width - sideInset - contentSize.width, y: layout.size.height - 66.0 - layout.intrinsicInsets.bottom - contentSize.height) + } + transition.updateFrame(node: self.contentContainerNode, frame: CGRect(origin: contentOrigin, size: contentSize)) var nextY: CGFloat = 0.0 for (itemNode, height, apply) in applyNodes { diff --git a/submodules/TelegramUI/TelegramUI/TelegramController.swift b/submodules/TelegramUI/TelegramUI/TelegramController.swift index f383904870..a8b312ca8d 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramController.swift +++ b/submodules/TelegramUI/TelegramUI/TelegramController.swift @@ -5,6 +5,9 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData +import TelegramUIPreferences +import UniversalMediaPlayer enum MediaAccessoryPanelVisibility { case none @@ -527,7 +530,7 @@ public class TelegramController: ViewController, KeyShortcutResponder { } if let id = state.id as? PeerMessagesMediaPlaylistItemId { if type == .music { - let historyView = preloadedShatHistoryViewForLocation(ChatHistoryLocationInput(content: .InitialSearch(location: .id(id.messageId), count: 60), id: 0), account: account, chatLocation: .peer(id.messageId.peerId), fixedCombinedReadStates: nil, tagMask: MessageTags.music, additionalData: []) + let historyView = preloadedChatHistoryViewForLocation(ChatHistoryLocationInput(content: .InitialSearch(location: .id(id.messageId), count: 60), id: 0), account: account, chatLocation: .peer(id.messageId.peerId), fixedCombinedReadStates: nil, tagMask: MessageTags.music, additionalData: []) let signal = historyView |> mapToSignal { historyView -> Signal<(MessageIndex?, Bool), NoError> in switch historyView { diff --git a/submodules/TelegramUI/TelegramUI/TelegramInitializeLegacyComponents.swift b/submodules/TelegramUI/TelegramUI/TelegramInitializeLegacyComponents.swift index 828b076e2c..085a36d202 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramInitializeLegacyComponents.swift +++ b/submodules/TelegramUI/TelegramUI/TelegramInitializeLegacyComponents.swift @@ -8,7 +8,9 @@ import MtProtoKit import MtProtoKitDynamic #endif import Display - +import TelegramPresentationData +import DeviceAccess +import TelegramAudio import LegacyComponents var legacyComponentsApplication: UIApplication? diff --git a/submodules/TelegramUI/TelegramUI/TelegramRootController.swift b/submodules/TelegramUI/TelegramUI/TelegramRootController.swift index 14fa0a112b..d1d771a96a 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramRootController.swift +++ b/submodules/TelegramUI/TelegramUI/TelegramRootController.swift @@ -4,7 +4,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit - +import TelegramPresentationData import TelegramUIPrivateModule public final class TelegramRootController: NavigationController { diff --git a/submodules/TelegramUI/TelegramUI/TelegramUIIncludes.h b/submodules/TelegramUI/TelegramUI/TelegramUIIncludes.h deleted file mode 100644 index 94e9f9bb75..0000000000 --- a/submodules/TelegramUI/TelegramUI/TelegramUIIncludes.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef TelegramUIIncludes_h -#define TelegramUIIncludes_h - - -#endif diff --git a/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap b/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap index 1426404bfd..959651e6e7 100644 --- a/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap +++ b/submodules/TelegramUI/TelegramUI/TelegramUIPrivate/module.modulemap @@ -2,25 +2,25 @@ module TelegramUIPrivateModule { header "../../third-party/opusenc/opusenc.h" header "../TGDataItem.h" header "../FastBlur.h" - header "../RingBuffer.h" - header "../TelegramUIIncludes.h" - header "../../third-party/RMIntro/platform/ios/RMIntroViewController.h" header "../STPPaymentCardTextField.h" header "../STPAPIClient.h" header "../STPAPIClient+ApplePay.h" header "../STPPaymentConfiguration.h" header "../STPCard.h" header "../STPToken.h" - header "../OngoingCallThreadLocalContext.h" header "../SecretChatKeyVisualization.h" - header "../NumberPluralizationForm.h" header "../DeviceProximityManager.h" header "../RaiseToListenActivator.h" header "../TGMimeTypeMap.h" - header "../TGEmojiSuggestions.h" - header "../TGChannelIntroController.h" - header "../EDSunriseSet.h" - header "../TGBridgeAudioDecoder.h" - header "../TGBridgeAudioEncoder.h" - header "../GZip.h" + header "../Bridge Audio/TGBridgeAudioDecoder.h" + header "../Bridge Audio/TGBridgeAudioEncoder.h" + header "../TGContactModel.h" + header "../TGItemProviderSignals.h" + header "../TGShareLocationSignals.h" + header "../TGBridgeServer.h" + header "../TGAutoDownloadPreferences.h" + header "../TGPresentationAutoNightPreferences.h" + header "../TGProxyItem.h" + header "../UIImage+ImageEffects.h" + header "../YUV.h" } diff --git a/submodules/TelegramUI/TelegramUI/TermsOfServiceController.swift b/submodules/TelegramUI/TelegramUI/TermsOfServiceController.swift index ccb2107908..33ea80e1a6 100644 --- a/submodules/TelegramUI/TelegramUI/TermsOfServiceController.swift +++ b/submodules/TelegramUI/TelegramUI/TermsOfServiceController.swift @@ -5,6 +5,8 @@ import Postbox import SwiftSignalKit import Display import AsyncDisplayKit +import TelegramPresentationData +import TelegramUIPreferences public class TermsOfServiceControllerTheme { public let statusBarStyle: StatusBarStyle diff --git a/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift b/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift index 3bc420882f..678c638681 100644 --- a/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift @@ -5,6 +5,7 @@ import Postbox import SwiftSignalKit import Display import AsyncDisplayKit +import TelegramPresentationData final class TermsOfServiceControllerNode: ViewControllerTracingNode { private let theme: TermsOfServiceControllerTheme @@ -101,7 +102,7 @@ final class TermsOfServiceControllerNode: ViewControllerTracingNode { strongSelf.leftActionTextNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) } } - self.leftActionNode.highligthedChanged = { [weak self] highlighted in + self.rightActionNode.highligthedChanged = { [weak self] highlighted in guard let strongSelf = self else { return } diff --git a/submodules/TelegramUI/TelegramUI/ThemeAccentColorActionSheet.swift b/submodules/TelegramUI/TelegramUI/ThemeAccentColorActionSheet.swift index ebc7186058..3800bb1fc8 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeAccentColorActionSheet.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeAccentColorActionSheet.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import UIKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData final class ThemeAccentColorActionSheet: ActionSheetController { private var presentationDisposable: Disposable? diff --git a/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift b/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift index 294f3ddd6d..6f15d652f0 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeAutoNightSettingsController.swift @@ -4,7 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore - +import TelegramPresentationData +import TelegramUIPreferences import TelegramUIPrivateModule private enum TriggerMode { @@ -366,7 +367,7 @@ public func themeAutoNightSettingsController(context: AccountContext) -> ViewCon |> mapToSignal { coordinates -> Signal<(Double, Double, String), NoError> in return reverseGeocodeLocation(latitude: coordinates.0, longitude: coordinates.1) |> map { locality in - return (coordinates.0, coordinates.1, locality) + return (coordinates.0, coordinates.1, locality?.city ?? "") } } diff --git a/submodules/TelegramUI/TelegramUI/ThemeAutoNightTimeSelectionActionSheet.swift b/submodules/TelegramUI/TelegramUI/ThemeAutoNightTimeSelectionActionSheet.swift index a81359206a..569c08ac29 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeAutoNightTimeSelectionActionSheet.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeAutoNightTimeSelectionActionSheet.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import UIKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData final class ThemeAutoNightTimeSelectionActionSheet: ActionSheetController { private var presentationDisposable: Disposable? diff --git a/submodules/TelegramUI/TelegramUI/ThemeColorsGridController.swift b/submodules/TelegramUI/TelegramUI/ThemeColorsGridController.swift index d1f5a69af9..9b81b27770 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeColorsGridController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeColorsGridController.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import LegacyComponents +import TelegramPresentationData private func availableColors() -> [Int32] { return [ diff --git a/submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerNode.swift b/submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerNode.swift index 2cc7d4f9a4..1c79c0e6a0 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeColorsGridControllerNode.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class ThemeColorsGridControllerInteraction { let openWallpaper: (TelegramWallpaper) -> Void diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridController.swift b/submodules/TelegramUI/TelegramUI/ThemeGridController.swift index 7dfb9fc831..91adf13aea 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeGridController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeGridController.swift @@ -6,6 +6,8 @@ import Postbox import TelegramCore import SwiftSignalKit import LegacyComponents +import TelegramPresentationData +import TelegramUIPreferences final class ThemeGridController: ViewController { private var controllerNode: ThemeGridControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridControllerNode.swift b/submodules/TelegramUI/TelegramUI/ThemeGridControllerNode.swift index 9aa09489c4..6eb1d77049 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeGridControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeGridControllerNode.swift @@ -5,6 +5,9 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import UniversalMediaPlayer +import TelegramPresentationData +import TelegramUIPreferences private func areWallpapersEqual(_ lhs: TelegramWallpaper, _ rhs: TelegramWallpaper) -> Bool { switch lhs { diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSearchColorsItem.swift b/submodules/TelegramUI/TelegramUI/ThemeGridSearchColorsItem.swift index 9853a90b62..ecb131a46d 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeGridSearchColorsItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeGridSearchColorsItem.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData private func nodeColor(for color: WallpaperSearchColor) -> UIColor { switch color { diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/ThemeGridSearchContentNode.swift index 9b8b175fac..d118f747bf 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeGridSearchContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeGridSearchContentNode.swift @@ -5,6 +5,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData enum WallpaperSearchColor: CaseIterable { case blue diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSearchItem.swift b/submodules/TelegramUI/TelegramUI/ThemeGridSearchItem.swift index 8f5fe18198..5cffafaedd 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeGridSearchItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeGridSearchItem.swift @@ -5,6 +5,7 @@ import TelegramCore import SwiftSignalKit import AsyncDisplayKit import Postbox +import TelegramPresentationData final class ThemeGridSearchItem: GridItem { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/ThemeGridSelectionPanelNode.swift b/submodules/TelegramUI/TelegramUI/ThemeGridSelectionPanelNode.swift index cf76cf1a1b..2c31e3fbd1 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeGridSelectionPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeGridSelectionPanelNode.swift @@ -5,6 +5,7 @@ import Display import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData final class ThemeGridSelectionPanelNode: ASDisplayNode { private let deleteButton: UIButton diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift new file mode 100644 index 0000000000..156e9cf282 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsAccentColorItem.swift @@ -0,0 +1,325 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import TelegramCore +import TelegramPresentationData + +private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selected: Bool) -> UIImage? { + return generateImage(CGSize(width: 30.0, height: 30.0), rotatedContext: { size, context in + let bounds = CGRect(origin: CGPoint(), size: size) + context.setFillColor(theme.list.itemBlocksBackgroundColor.cgColor) + context.fill(bounds) + + context.setBlendMode(.clear) + context.fillEllipse(in: bounds) + context.setBlendMode(.normal) + + let lineWidth: CGFloat + if selected { + var accentColor = theme.list.itemAccentColor + if accentColor.rgb == UIColor.white.rgb { + accentColor = UIColor(rgb: 0x999999) + } + context.setStrokeColor(accentColor.cgColor) + lineWidth = 2.0 + } else { + context.setStrokeColor(theme.list.disclosureArrowColor.withAlphaComponent(0.4).cgColor) + lineWidth = 1.0 + } + + if bordered || selected { + context.setLineWidth(lineWidth) + context.strokeEllipse(in: bounds.insetBy(dx: lineWidth / 2.0, dy: lineWidth / 2.0)) + } + })?.stretchableImage(withLeftCapWidth: 15, topCapHeight: 15) +} + +class ThemeSettingsAccentColorItem: ListViewItem, ItemListItem { + var sectionId: ItemListSectionId + + let theme: PresentationTheme + let strings: PresentationStrings + let colors: [UIColor] + let currentColor: UIColor + let updated: (UIColor) -> Void + let tag: ItemListItemTag? + + init(theme: PresentationTheme, strings: PresentationStrings, sectionId: ItemListSectionId, colors: [UIColor], currentColor: UIColor, updated: @escaping (UIColor) -> Void, tag: ItemListItemTag? = nil) { + self.theme = theme + self.strings = strings + self.colors = colors + self.currentColor = currentColor + self.updated = updated + self.tag = tag + self.sectionId = sectionId + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = ThemeSettingsAccentColorItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + if let nodeValue = node() as? ThemeSettingsAccentColorItemNode { + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } + } +} + +private final class ThemeSettingsAccentColorNode : ASDisplayNode { + private let iconNode: ASImageNode + private let overlayNode: ASImageNode + private let textNode: ASTextNode + private var action: (() -> Void)? + + override init() { + self.iconNode = ASImageNode() + self.iconNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 62.0, height: 62.0)) + self.iconNode.isLayerBacked = true + + self.overlayNode = ASImageNode() + self.overlayNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 62.0, height: 62.0)) + self.overlayNode.isLayerBacked = true + + self.textNode = ASTextNode() + self.textNode.isUserInteractionEnabled = false + self.textNode.displaysAsynchronously = true + + super.init() + + self.addSubnode(self.iconNode) + 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 + self.textNode.attributedText = title + self.overlayNode.image = generateBorderImage(theme: theme, bordered: bordered, selected: selected) + self.action = { + action() + } + } + + override func didLoad() { + super.didLoad() + + self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:)))) + } + + @objc func tapGesture(_ recognizer: UITapGestureRecognizer) { + if case .ended = recognizer.state { + self.action?() + } + } + + override func layout() { + super.layout() + + let bounds = self.bounds + + self.iconNode.frame = CGRect(origin: CGPoint(x: 10.0, y: 14.0), size: CGSize(width: 62.0, height: 62.0)) + self.overlayNode.frame = CGRect(origin: CGPoint(x: 10.0, y: 14.0), size: CGSize(width: 62.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)) + } +} + + +private let textFont = Font.regular(11.0) +private let itemSize = Font.regular(11.0) + +class ThemeSettingsAccentColorItemNode: ListViewItemNode, ItemListItemNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + + private let scrollNode: ASScrollNode + private var nodes: [ThemeSettingsAccentColorNode] = [] + + private var item: ThemeSettingsAccentColorItem? + private var layoutParams: ListViewItemLayoutParams? + + var tag: ItemListItemTag? { + return self.item?.tag + } + + init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.scrollNode = ASScrollNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.addSubnode(self.scrollNode) + } + + override func didLoad() { + super.didLoad() + self.scrollNode.view.disablesInteractiveTransitionGestureRecognizer = true + self.scrollNode.view.showsHorizontalScrollIndicator = false + } + + func asyncLayout() -> (_ item: ThemeSettingsAccentColorItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let currentItem = self.item + + return { item, params, neighbors in + var themeUpdated = false + if currentItem?.theme !== item.theme { + themeUpdated = true + + } + + let contentSize: CGSize + let insets: UIEdgeInsets + let separatorHeight = UIScreenPixel + + contentSize = CGSize(width: params.width, height: 116.0) + insets = itemListNeighborsGroupedInsets(neighbors) + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + let layoutSize = layout.size + + return (layout, { [weak self] in + if let strongSelf = self { + strongSelf.item = item + strongSelf.layoutParams = params + + strongSelf.scrollNode.view.contentInset = UIEdgeInsetsMake(0.0, params.leftInset, 0.0, params.rightInset) + strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor + strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor + + if strongSelf.backgroundNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) + } + if strongSelf.topStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1) + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) + } + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + strongSelf.topStripeNode.isHidden = false + } + let bottomStripeInset: CGFloat + let bottomStripeOffset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = params.leftInset + 16.0 + bottomStripeOffset = -separatorHeight + default: + bottomStripeInset = 0.0 + bottomStripeOffset = 0.0 + } + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height + bottomStripeOffset), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight)) + + strongSelf.scrollNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 2.0), size: CGSize(width: layoutSize.width, height: layoutSize.height)) + + let nodeInset: CGFloat = 4.0 + let nodeSize = CGSize(width: 80.0, height: 112.0) + var nodeOffset = nodeInset + + var i = 0 + for icon in item.colors { + let imageNode: ThemeSettingsAccentColorNode + if strongSelf.nodes.count > i { + imageNode = strongSelf.nodes[i] + } else { + imageNode = ThemeSettingsAccentColorNode() + strongSelf.nodes.append(imageNode) + strongSelf.scrollNode.addSubnode(imageNode) + } + +// if let image = UIImage(named: icon.imageName, in: Bundle.main, compatibleWith: nil) { +// let selected = icon.name == item.currentIconName +// +// var name = "Icon" +// var bordered = true +// switch icon.name { +// case "Blue": +// name = item.strings.Appearance_AppIconDefault +// case "Black": +// name = item.strings.Appearance_AppIconDefaultX +// case "BlueClassic": +// name = item.strings.Appearance_AppIconClassic +// case "BlackClassic": +// name = item.strings.Appearance_AppIconClassicX +// case "BlueFilled": +// name = item.strings.Appearance_AppIconFilled +// bordered = false +// case "BlackFilled": +// name = item.strings.Appearance_AppIconFilledX +// bordered = false +// case "WhiteFilled": +// name = "⍺ White" +// default: +// break +// } +// +// imageNode.setup(theme: item.theme, icon: image, title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: bordered, selected: selected, action: { +// item.updated(icon.name) +// }) +// } + + imageNode.frame = CGRect(origin: CGPoint(x: nodeOffset, y: 0.0), size: nodeSize) + nodeOffset += nodeSize.width + 15.0 + + i += 1 + } + + 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 { + strongSelf.scrollNode.view.contentSize = contentSize + } + } + } + }) + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } +} + diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift index 34ba3f9bf7..75711374a3 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsAppIconItem.swift @@ -4,6 +4,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selected: Bool) -> UIImage? { return generateImage(CGSize(width: 30.0, height: 30.0), rotatedContext: { size, context in @@ -189,16 +190,19 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { self.scrollNode.view.showsHorizontalScrollIndicator = false } + private func scrollToNode(_ node: ThemeSettingsAppIconNode, animated: Bool) { + let bounds = self.scrollNode.view.bounds + let frame = node.frame.insetBy(dx: -48.0, dy: 0.0) + + if frame.minX < bounds.minX || frame.maxX > bounds.maxX { + self.scrollNode.view.scrollRectToVisible(frame, animated: animated) + } + } + func asyncLayout() -> (_ item: ThemeSettingsAppIconItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { let currentItem = self.item return { item, params, neighbors in - var themeUpdated = false - if currentItem?.theme !== item.theme { - themeUpdated = true - - } - let contentSize: CGSize let insets: UIEdgeInsets let separatorHeight = UIScreenPixel @@ -254,6 +258,9 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { let nodeSize = CGSize(width: 80.0, height: 112.0) var nodeOffset = nodeInset + var updated = false + var selectedNode: ThemeSettingsAppIconNode? + var i = 0 for icon in item.icons { let imageNode: ThemeSettingsAppIconNode @@ -263,10 +270,14 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { imageNode = ThemeSettingsAppIconNode() strongSelf.nodes.append(imageNode) strongSelf.scrollNode.addSubnode(imageNode) + updated = true } if let image = UIImage(named: icon.imageName, in: Bundle.main, compatibleWith: nil) { let selected = icon.name == item.currentIconName + if selected { + selectedNode = imageNode + } var name = "Icon" var bordered = true @@ -287,13 +298,15 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { bordered = false case "WhiteFilled": name = "⍺ White" - bordered = false default: break } - imageNode.setup(theme: item.theme, icon: image, title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: bordered, selected: selected, action: { + imageNode.setup(theme: item.theme, icon: image, title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: bordered, selected: selected, action: { [weak self, weak imageNode] in item.updated(icon.name) + if let imageNode = imageNode { + self?.scrollToNode(imageNode, animated: true) + } }) } @@ -309,6 +322,10 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { strongSelf.scrollNode.view.contentSize = contentSize } } + + if updated, let selectedNode = selectedNode { + strongSelf.scrollToNode(selectedNode, animated: false) + } } }) } diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsBrightnessItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsBrightnessItem.swift index 36e8175071..2f13c1052f 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsBrightnessItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsBrightnessItem.swift @@ -4,7 +4,7 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore - +import TelegramPresentationData import LegacyComponents class ThemeSettingsBrightnessItem: ListViewItem, ItemListItem { diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift index cc41a2c455..a23b25a33e 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsChatPreviewItem.swift @@ -5,6 +5,8 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramCore import Postbox +import TelegramPresentationData +import TelegramUIPreferences class ThemeSettingsChatPreviewItem: ListViewItem, ItemListItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift index 47d7a51ffb..ea4044a5f1 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class ThemeSettingsControllerArguments { let context: AccountContext @@ -30,9 +32,9 @@ private final class ThemeSettingsControllerArguments { } private enum ThemeSettingsControllerSection: Int32 { - case fontSize case chatPreview - case theme + case background + case fontSize case icon case other } @@ -55,14 +57,13 @@ public enum ThemeSettingsEntryTag: ItemListItemTag { } private enum ThemeSettingsControllerEntry: ItemListNodeEntry { + case themeListHeader(PresentationTheme, String) case fontSizeHeader(PresentationTheme, String) case fontSize(PresentationTheme, PresentationFontSize) - case chatPreviewHeader(PresentationTheme, String) case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder) case wallpaper(PresentationTheme, String) case accentColor(PresentationTheme, String, Int32) case autoNightTheme(PresentationTheme, String, String) - case themeListHeader(PresentationTheme, String) case themeItem(PresentationTheme, PresentationStrings, [PresentationBuiltinThemeReference], PresentationBuiltinThemeReference, UIColor?) case iconHeader(PresentationTheme, String) case iconItem(PresentationTheme, PresentationStrings, [PresentationAppIcon], String?) @@ -73,12 +74,12 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { var section: ItemListSectionId { switch self { + case .themeListHeader, .chatPreview, .themeItem, .accentColor: + return ThemeSettingsControllerSection.chatPreview.rawValue case .fontSizeHeader, .fontSize: return ThemeSettingsControllerSection.fontSize.rawValue - case .chatPreviewHeader, .chatPreview, .wallpaper: - return ThemeSettingsControllerSection.chatPreview.rawValue - case .themeListHeader, .themeItem, .accentColor, .autoNightTheme: - return ThemeSettingsControllerSection.theme.rawValue + case .wallpaper, .autoNightTheme: + return ThemeSettingsControllerSection.background.rawValue case .iconHeader, .iconItem: return ThemeSettingsControllerSection.icon.rawValue case .otherHeader, .largeEmoji, .animations, .animationsInfo: @@ -88,47 +89,39 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { var stableId: Int32 { switch self { - case .fontSizeHeader: + case .themeListHeader: return 0 - case .fontSize: - return 1 - case .chatPreviewHeader: - return 2 case .chatPreview: + return 1 + case .themeItem: + return 2 + case .accentColor: return 3 case .wallpaper: return 4 - case .themeListHeader: - return 5 - case .themeItem: - return 6 - case .accentColor: - return 7 case .autoNightTheme: - return 8 + return 5 + case .fontSizeHeader: + return 6 + case .fontSize: + return 7 case .iconHeader: - return 100 + return 8 case .iconItem: - return 101 + return 9 case .otherHeader: - return 102 + return 10 case .largeEmoji: - return 103 + return 11 case .animations: - return 104 + return 12 case .animationsInfo: - return 105 + return 13 } } static func ==(lhs: ThemeSettingsControllerEntry, rhs: ThemeSettingsControllerEntry) -> 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 @@ -228,8 +221,6 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { return ThemeSettingsFontSizeItem(theme: theme, fontSize: fontSize, sectionId: self.section, updated: { value in arguments.selectFontSize(value) }, tag: ThemeSettingsEntryTag.fontSize) - 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 .wallpaper(theme, text): @@ -275,20 +266,17 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { private func themeSettingsControllerEntries(presentationData: PresentationData, theme: PresentationTheme, themeAccentColor: Int32?, autoNightSettings: AutomaticThemeSwitchSetting, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, dateTimeFormat: PresentationDateTimeFormat, largeEmoji: Bool, disableAnimations: Bool, availableAppIcons: [PresentationAppIcon], currentAppIconName: String?) -> [ThemeSettingsControllerEntry] { var entries: [ThemeSettingsControllerEntry] = [] - entries.append(.fontSizeHeader(presentationData.theme, strings.Appearance_TextSize.uppercased())) - entries.append(.fontSize(presentationData.theme, fontSize)) - entries.append(.chatPreviewHeader(presentationData.theme, strings.Appearance_Preview)) - entries.append(.chatPreview(presentationData.theme, theme, wallpaper, fontSize, presentationData.strings, dateTimeFormat, presentationData.nameDisplayOrder)) - entries.append(.wallpaper(presentationData.theme, strings.Settings_ChatBackground)) - entries.append(.themeListHeader(presentationData.theme, strings.Appearance_ColorTheme.uppercased())) + entries.append(.chatPreview(presentationData.theme, theme, wallpaper, fontSize, presentationData.strings, dateTimeFormat, presentationData.nameDisplayOrder)) if case let .builtin(theme) = theme.name { entries.append(.themeItem(presentationData.theme, presentationData.strings, [.dayClassic, .day, .nightAccent, .nightGrayscale], theme.reference, themeAccentColor != nil ? UIColor(rgb: UInt32(bitPattern: themeAccentColor!)) : nil)) } - if theme.name == .builtin(.day) { entries.append(.accentColor(presentationData.theme, strings.Appearance_AccentColor, themeAccentColor ?? defaultDayAccentColor)) } + + entries.append(.wallpaper(presentationData.theme, strings.Settings_ChatBackground)) + if theme.name == .builtin(.day) || theme.name == .builtin(.dayClassic) { let title: String switch autoNightSettings.trigger { @@ -302,6 +290,9 @@ private func themeSettingsControllerEntries(presentationData: PresentationData, entries.append(.autoNightTheme(presentationData.theme, strings.Appearance_AutoNightTheme, title)) } + entries.append(.fontSizeHeader(presentationData.theme, strings.Appearance_TextSize.uppercased())) + entries.append(.fontSize(presentationData.theme, fontSize)) + if !availableAppIcons.isEmpty { entries.append(.iconHeader(presentationData.theme, strings.Appearance_AppIcon.uppercased())) entries.append(.iconItem(presentationData.theme, presentationData.strings, availableAppIcons, currentAppIconName)) @@ -315,6 +306,8 @@ private func themeSettingsControllerEntries(presentationData: PresentationData, return entries } +private let themeColors = [UIColor(rgb: 0x007aff), UIColor(rgb: 0x70bb23), UIColor(rgb: 0xeb6ca4), UIColor(rgb: 0xf08200), UIColor(rgb: 0x9472ee), UIColor(rgb: 0xd33213), UIColor(rgb: 0xedb400), UIColor(rgb: 0x6d839e), UIColor(rgb: 0x000000)] + public func themeSettingsController(context: AccountContext, focusOnItemTag: ThemeSettingsEntryTag? = nil) -> ViewController { var pushControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController) -> Void)? @@ -323,7 +316,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The let availableAppIcons: Signal<[PresentationAppIcon], NoError> = .single(context.sharedContext.applicationBindings.getAvailableAlternateIcons()) let currentAppIconName = ValuePromise() - currentAppIconName.set(context.sharedContext.applicationBindings.getAlternateIconName() ?? "Black") + currentAppIconName.set(context.sharedContext.applicationBindings.getAlternateIconName() ?? "Blue") let arguments = ThemeSettingsControllerArguments(context: context, selectTheme: { index in let theme: PresentationThemeReference diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsFontSizeItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsFontSizeItem.swift index 597232daa7..8410f5b3ec 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsFontSizeItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsFontSizeItem.swift @@ -4,7 +4,8 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore - +import TelegramPresentationData +import TelegramUIPreferences import LegacyComponents class ThemeSettingsFontSizeItem: ListViewItem, ItemListItem { diff --git a/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift b/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift index 8d926f299c..1d13c1f872 100644 --- a/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift +++ b/submodules/TelegramUI/TelegramUI/ThemeSettingsThemeItem.swift @@ -4,6 +4,8 @@ import Display import AsyncDisplayKit import SwiftSignalKit import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selected: Bool) -> UIImage? { return generateImage(CGSize(width: 30.0, height: 30.0), rotatedContext: { size, context in @@ -238,15 +240,19 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { self.scrollNode.view.showsHorizontalScrollIndicator = false } + private func scrollToNode(_ node: ThemeSettingsThemeItemIconNode, animated: Bool) { + let bounds = self.scrollNode.view.bounds + let frame = node.frame.insetBy(dx: -48.0, dy: 0.0) + + if frame.minX < bounds.minX || frame.maxX > bounds.maxX { + self.scrollNode.view.scrollRectToVisible(frame, animated: animated) + } + } + func asyncLayout() -> (_ item: ThemeSettingsThemeItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { let currentItem = self.item return { item, params, neighbors in - var themeUpdated = false - if currentItem?.theme !== item.theme { - themeUpdated = true - } - let contentSize: CGSize let insets: UIEdgeInsets let separatorHeight = UIScreenPixel @@ -302,6 +308,9 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { let nodeSize = CGSize(width: 116.0, height: 112.0) var nodeOffset = nodeInset + var updated = false + var selectedNode: ThemeSettingsThemeItemIconNode? + var i = 0 for (theme, accentColor) in item.themes { let imageNode: ThemeSettingsThemeItemIconNode @@ -311,9 +320,14 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { imageNode = ThemeSettingsThemeItemIconNode() strongSelf.nodes.append(imageNode) strongSelf.scrollNode.addSubnode(imageNode) + updated = true } let selected = theme == item.currentTheme + if selected { + selectedNode = imageNode + } + let name: String switch theme { case .dayClassic: @@ -326,8 +340,11 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { name = item.strings.Appearance_ThemeCarouselNightBlue } - imageNode.setup(theme: item.theme, icon: generateThemeIconImage(theme: theme, accentColor: accentColor), title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { + imageNode.setup(theme: item.theme, icon: generateThemeIconImage(theme: theme, accentColor: accentColor), title: NSAttributedString(string: name, font: textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), bordered: true, selected: selected, action: { [weak self, weak imageNode] in item.updated(theme) + if let imageNode = imageNode { + self?.scrollToNode(imageNode, animated: true) + } }) imageNode.frame = CGRect(origin: CGPoint(x: nodeOffset, y: 0.0), size: nodeSize) @@ -342,6 +359,10 @@ class ThemeSettingsThemeItemNode: ListViewItemNode, ItemListItemNode { strongSelf.scrollNode.view.contentSize = contentSize } } + + if updated, let selectedNode = selectedNode { + strongSelf.scrollToNode(selectedNode, animated: false) + } } }) } diff --git a/submodules/TelegramUI/TelegramUI/ThrottledValue.swift b/submodules/TelegramUI/TelegramUI/ThrottledValue.swift deleted file mode 100644 index 7f1c77bc51..0000000000 --- a/submodules/TelegramUI/TelegramUI/ThrottledValue.swift +++ /dev/null @@ -1,46 +0,0 @@ -import Foundation -import UIKit -import SwiftSignalKit - -final class ThrottledValue { - private var value: T - private let interval: Double - private var previousSetTimestamp: Double - private let valuePromise: ValuePromise - private var timer: SwiftSignalKit.Timer? - - init(value: T, interval: Double) { - self.value = value - self.interval = interval - self.previousSetTimestamp = CACurrentMediaTime() - self.valuePromise = ValuePromise(value) - } - - deinit { - self.timer?.invalidate() - } - - func set(value: T) { - guard self.value != value else { - return - } - self.timer?.invalidate() - let timestamp = CACurrentMediaTime() - if timestamp > self.previousSetTimestamp + self.interval { - self.previousSetTimestamp = timestamp - self.valuePromise.set(value) - } else { - let timer = SwiftSignalKit.Timer(timeout: self.interval, repeat: false, completion: { [weak self] in - if let strongSelf = self { - strongSelf.valuePromise.set(strongSelf.value) - } - }, queue: Queue.mainQueue()) - self.timer = timer - timer.start() - } - } - - func get() -> Signal { - return self.valuePromise.get() - } -} diff --git a/submodules/TelegramUI/TelegramUI/TimeBasedVideoPreload.swift b/submodules/TelegramUI/TelegramUI/TimeBasedVideoPreload.swift index 5755a320b7..bc2aa6f543 100644 --- a/submodules/TelegramUI/TelegramUI/TimeBasedVideoPreload.swift +++ b/submodules/TelegramUI/TelegramUI/TimeBasedVideoPreload.swift @@ -4,6 +4,7 @@ import SwiftSignalKit import Postbox import TelegramCore import FFMpeg +import UniversalMediaPlayer func preloadVideoResource(postbox: Postbox, resourceReference: MediaResourceReference, duration: Double) -> Signal { return Signal { subscriber in diff --git a/submodules/TelegramUI/TelegramUI/TwoStepVerificationPasswordEntryController.swift b/submodules/TelegramUI/TelegramUI/TwoStepVerificationPasswordEntryController.swift index 36790067d3..badff3718c 100644 --- a/submodules/TelegramUI/TelegramUI/TwoStepVerificationPasswordEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/TwoStepVerificationPasswordEntryController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class TwoStepVerificationPasswordEntryControllerArguments { let updateEntryText: (String) -> Void diff --git a/submodules/TelegramUI/TelegramUI/TwoStepVerificationResetController.swift b/submodules/TelegramUI/TelegramUI/TwoStepVerificationResetController.swift index 64a9e85428..52bfa73eca 100644 --- a/submodules/TelegramUI/TelegramUI/TwoStepVerificationResetController.swift +++ b/submodules/TelegramUI/TelegramUI/TwoStepVerificationResetController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class TwoStepVerificationResetControllerArguments { let updateEntryText: (String) -> Void diff --git a/submodules/TelegramUI/TelegramUI/TwoStepVerificationUnlockController.swift b/submodules/TelegramUI/TelegramUI/TwoStepVerificationUnlockController.swift index b54d7f94cf..92c5c03ab7 100644 --- a/submodules/TelegramUI/TelegramUI/TwoStepVerificationUnlockController.swift +++ b/submodules/TelegramUI/TelegramUI/TwoStepVerificationUnlockController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class TwoStepVerificationUnlockSettingsControllerArguments { let updatePasswordText: (String) -> Void diff --git a/Telegram-iOS/UIImage+ImageEffects.h b/submodules/TelegramUI/TelegramUI/UIImage+ImageEffects.h similarity index 100% rename from Telegram-iOS/UIImage+ImageEffects.h rename to submodules/TelegramUI/TelegramUI/UIImage+ImageEffects.h diff --git a/Telegram-iOS/UIImage+ImageEffects.m b/submodules/TelegramUI/TelegramUI/UIImage+ImageEffects.m similarity index 100% rename from Telegram-iOS/UIImage+ImageEffects.m rename to submodules/TelegramUI/TelegramUI/UIImage+ImageEffects.m diff --git a/submodules/TelegramUI/TelegramUI/UndoOverlayController.swift b/submodules/TelegramUI/TelegramUI/UndoOverlayController.swift index 7bfaa3dcb6..7dbf09ba1b 100644 --- a/submodules/TelegramUI/TelegramUI/UndoOverlayController.swift +++ b/submodules/TelegramUI/TelegramUI/UndoOverlayController.swift @@ -3,6 +3,7 @@ import UIKit import Display import TelegramCore import Postbox +import TelegramPresentationData public enum UndoOverlayContent { case removedChat(text: String) diff --git a/submodules/TelegramUI/TelegramUI/UndoOverlayControllerNode.swift b/submodules/TelegramUI/TelegramUI/UndoOverlayControllerNode.swift index 5aef6f297a..ac70c36eb7 100644 --- a/submodules/TelegramUI/TelegramUI/UndoOverlayControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/UndoOverlayControllerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit +import TelegramPresentationData final class UndoOverlayControllerNode: ViewControllerTracingNode { private let elevatedLayout: Bool diff --git a/submodules/TelegramUI/TelegramUI/UniversalVideoContentManager.swift b/submodules/TelegramUI/TelegramUI/UniversalVideoContentManager.swift index d0bd6594ee..227f70453b 100644 --- a/submodules/TelegramUI/TelegramUI/UniversalVideoContentManager.swift +++ b/submodules/TelegramUI/TelegramUI/UniversalVideoContentManager.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import SwiftSignalKit +import UniversalMediaPlayer private final class UniversalVideoContentSubscriber { let id: Int32 diff --git a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift index 13b0a72184..a116dcecb7 100644 --- a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift @@ -5,6 +5,8 @@ import SwiftSignalKit import TelegramCore import Display import Postbox +import TelegramPresentationData +import UniversalMediaPlayer enum UniversalVideoGalleryItemContentInfo { case message(Message) diff --git a/submodules/TelegramUI/TelegramUI/UniversalVideoNode.swift b/submodules/TelegramUI/TelegramUI/UniversalVideoNode.swift index c7d6dfb3b7..a6113d3b22 100644 --- a/submodules/TelegramUI/TelegramUI/UniversalVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/UniversalVideoNode.swift @@ -5,6 +5,8 @@ import Postbox import SwiftSignalKit import TelegramCore import Display +import TelegramAudio +import UniversalMediaPlayer protocol UniversalVideoContentNode: class { var ready: Signal { get } diff --git a/submodules/TelegramUI/TelegramUI/UpgradedAccounts.swift b/submodules/TelegramUI/TelegramUI/UpgradedAccounts.swift index 27490c0570..956a8d2920 100644 --- a/submodules/TelegramUI/TelegramUI/UpgradedAccounts.swift +++ b/submodules/TelegramUI/TelegramUI/UpgradedAccounts.swift @@ -3,6 +3,7 @@ import UIKit import TelegramCore import Postbox import SwiftSignalKit +import TelegramUIPreferences private enum LegacyPreferencesKeyValues: Int32 { case cacheStorageSettings = 1 diff --git a/submodules/TelegramUI/TelegramUI/UrlHandling.swift b/submodules/TelegramUI/TelegramUI/UrlHandling.swift index 30c37401c4..eb0d7c4bca 100644 --- a/submodules/TelegramUI/TelegramUI/UrlHandling.swift +++ b/submodules/TelegramUI/TelegramUI/UrlHandling.swift @@ -8,6 +8,8 @@ import MtProtoKit #else import MtProtoKitDynamic #endif +import TelegramPresentationData +import TelegramUIPreferences enum ParsedInternalPeerUrlParameter { case botStart(String) @@ -22,6 +24,7 @@ enum WallpaperUrlParameter { enum ParsedInternalUrl { case peerName(String, ParsedInternalPeerUrlParameter?) + case peerId(PeerId) case privateMessage(MessageId) case stickerPack(String) case join(String) @@ -153,6 +156,8 @@ func parseInternalUrl(query: String) -> ParsedInternalUrl? { } } } + } else if pathComponents[0].hasPrefix(phonebookUsernamePathPrefix), let idValue = Int32(String(pathComponents[0][pathComponents[0].index(pathComponents[0].startIndex, offsetBy: phonebookUsernamePathPrefix.count)...])) { + return .peerId(PeerId(namespace: Namespaces.Peer.CloudUser, id: idValue)) } return .peerName(peerName, nil) } else if pathComponents.count == 2 || pathComponents.count == 3 { @@ -274,6 +279,17 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig return .peer(nil, .info) } } + case let .peerId(peerId): + return account.postbox.transaction { transaction -> Peer? in + return transaction.getPeer(peerId) + } + |> mapToSignal { peer -> Signal in + if let peer = peer { + return .single(.peer(peer.id, .chat(textInputState: nil, messageId: nil))) + } else { + return .single(.inaccessiblePeer) + } + } case let .privateMessage(messageId): return account.postbox.transaction { transaction -> Peer? in return transaction.getPeer(messageId.peerId) diff --git a/submodules/TelegramUI/TelegramUI/UserInfoController.swift b/submodules/TelegramUI/TelegramUI/UserInfoController.swift index c9a322efb9..3af7a14cdf 100644 --- a/submodules/TelegramUI/TelegramUI/UserInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/UserInfoController.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents +import TelegramPresentationData private final class UserInfoControllerArguments { let account: Account @@ -648,23 +649,24 @@ private func userInfoEntries(account: Account, presentationData: PresentationDat if !(peer is TelegramSecretChat) { entries.append(UserInfoEntry.sendMessage(presentationData.theme, presentationData.strings.UserInfo_SendMessage)) - if let user = peer as? TelegramUser, user.botInfo == nil { - if view.peerIsContact { - if let phone = user.phone, !phone.isEmpty { - entries.append(UserInfoEntry.shareContact(presentationData.theme, presentationData.strings.UserInfo_ShareContact)) - } - } else { - entries.append(UserInfoEntry.addContact(presentationData.theme, presentationData.strings.Conversation_AddToContacts)) + } + + if user.botInfo == nil { + if view.peerIsContact { + if let phone = user.phone, !phone.isEmpty { + entries.append(UserInfoEntry.shareContact(presentationData.theme, presentationData.strings.UserInfo_ShareContact)) } + } else { + entries.append(UserInfoEntry.addContact(presentationData.theme, presentationData.strings.Conversation_AddToContacts)) } + } - if let cachedUserData = cachedPeerData as? CachedUserData, let peerStatusSettings = cachedUserData.peerStatusSettings, peerStatusSettings.contains(.canShareContact) { - entries.append(UserInfoEntry.shareMyContact(presentationData.theme, presentationData.strings.UserInfo_ShareMyContactInfo)) - } - - if let peer = peer as? TelegramUser, peer.botInfo == nil { - entries.append(UserInfoEntry.startSecretChat(presentationData.theme, presentationData.strings.UserInfo_StartSecretChat)) - } + if let cachedUserData = cachedPeerData as? CachedUserData, let peerStatusSettings = cachedUserData.peerStatusSettings, peerStatusSettings.contains(.canShareContact) { + entries.append(UserInfoEntry.shareMyContact(presentationData.theme, presentationData.strings.UserInfo_ShareMyContactInfo)) + } + + if let peer = peer as? TelegramUser, peer.botInfo == nil { + entries.append(UserInfoEntry.startSecretChat(presentationData.theme, presentationData.strings.UserInfo_StartSecretChat)) } if let peer = peer as? TelegramUser, let botInfo = peer.botInfo { @@ -735,16 +737,18 @@ private func userInfoEntries(account: Account, presentationData: PresentationDat return entries } -private func getUserPeer(postbox: Postbox, peerId: PeerId) -> Signal { - return postbox.transaction { transaction -> Peer? in +private func getUserPeer(postbox: Postbox, peerId: PeerId) -> Signal<(Peer?, CachedPeerData?), NoError> { + return postbox.transaction { transaction -> (Peer?, CachedPeerData?) in guard let peer = transaction.getPeer(peerId) else { - return nil + return (nil, nil) } + var resultPeer: Peer? if let peer = peer as? TelegramSecretChat { - return transaction.getPeer(peer.regularPeerId) + resultPeer = transaction.getPeer(peer.regularPeerId) } else { - return peer + resultPeer = peer } + return (resultPeer, resultPeer.flatMap({ transaction.getPeerCachedData(peerId: $0.id) })) } } @@ -769,6 +773,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us var botAddToGroupImpl: (() -> Void)? var shareBotImpl: (() -> Void)? var dismissInputImpl: (() -> Void)? + var dismissImpl: (() -> Void)? let actionsDisposable = DisposableSet() @@ -856,7 +861,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us } } }, tapAvatarAction: { - let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) |> deliverOnMainQueue).start(next: { peer in + let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) |> deliverOnMainQueue).start(next: { peer, _ in guard let peer = peer else { return } @@ -879,12 +884,17 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us openChatImpl?() }, addContact: { let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, cachedData in guard let user = peer as? TelegramUser, let contactData = DeviceContactExtendedData(peer: user) else { return } - presentControllerImpl?(deviceContactInfoController(context: context, subject: .create(peer: user, contactData: contactData, isSharing: true, completion: { peer, stableId, contactData in + var shareViaException = false + if let cachedData = cachedData as? CachedUserData, let peerStatusSettings = cachedData.peerStatusSettings { + shareViaException = peerStatusSettings.contains(.addExceptionWhenAddingContact) + } + + presentControllerImpl?(deviceContactInfoController(context: context, subject: .create(peer: user, contactData: contactData, isSharing: true, shareViaException: shareViaException, completion: { peer, stableId, contactData in if let peer = peer as? TelegramUser { if let phone = peer.phone, !phone.isEmpty { } @@ -931,7 +941,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us }, openGroupsInCommon: { let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) |> take(1) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, _ in guard let peer = peer else { return } @@ -941,7 +951,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us }, updatePeerBlocked: { value in let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) |> take(1) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, _ in guard let peer = peer else { return } @@ -960,12 +970,12 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us let dismissAction: () -> Void = { [weak controller] in controller?.dismissAnimated() } - var reportSpam = true - var deleteChat = true + var reportSpam = false + var deleteChat = false controller.setItemGroups([ ActionSheetItemGroup(items: [ ActionSheetTextItem(title: presentationData.strings.UserInfo_BlockConfirmationTitle(peer.compactDisplayTitle).0), - ActionSheetCheckboxItem(title: presentationData.strings.Conversation_Moderate_Report, label: "", value: reportSpam, action: { [weak controller] checkValue in + /*ActionSheetCheckboxItem(title: presentationData.strings.Conversation_Moderate_Report, label: "", value: reportSpam, action: { [weak controller] checkValue in reportSpam = checkValue controller?.updateItem(groupIndex: 0, itemIndex: 1, { item in if let item = item as? ActionSheetCheckboxItem { @@ -982,7 +992,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us } return item }) - }), + }),*/ ActionSheetButtonItem(title: presentationData.strings.UserInfo_BlockActionTitle(peer.compactDisplayTitle).0, color: .destructive, action: { dismissAction() updatePeerBlockedDisposable.set(requestUpdatePeerIsBlocked(account: context.account, peerId: peer.id, isBlocked: true).start()) @@ -1021,7 +1031,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us ActionSheetButtonItem(title: presentationData.strings.UserInfo_DeleteContact, color: .destructive, action: { dismissAction() let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, _ in guard let peer = peer else { return } @@ -1031,12 +1041,35 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us } else { deleteContactFromDevice = .complete() } - updatePeerBlockedDisposable.set(( - deleteContactPeerInteractively(account: context.account, peerId: peer.id) - |> then( - deleteContactFromDevice - ) - ).start()) + + var deleteSignal = deleteContactPeerInteractively(account: context.account, peerId: peer.id) + |> then(deleteContactFromDevice) + + let progressSignal = Signal { subscriber in + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + presentControllerImpl?(controller, nil) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } + } + } + |> runOn(Queue.mainQueue()) + |> delay(0.15, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() + + deleteSignal = deleteSignal + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } + } + + updatePeerBlockedDisposable.set((deleteSignal + |> deliverOnMainQueue).start(completed: { + dismissImpl?() + })) }) }) ]), @@ -1052,7 +1085,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us requestCallImpl() }, openCallMenu: { number in let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, _ in if let peer = peer as? TelegramUser, let peerPhoneNumber = peer.phone, formatPhoneNumber(number) == formatPhoneNumber(peerPhoneNumber) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let controller = ActionSheetController(presentationTheme: presentationData.theme) @@ -1212,7 +1245,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us } let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) - |> mapToSignal { peer -> Signal in + |> mapToSignal { peer, _ -> Signal in guard let peer = peer as? TelegramUser, let phone = peer.phone, !phone.isEmpty else { return .complete() } @@ -1258,6 +1291,12 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us pushControllerImpl = { [weak controller] value in (controller?.navigationController as? NavigationController)?.pushViewController(value) } + dismissImpl = { [weak controller] in + guard let controller = controller else { + return + } + (controller.navigationController as? NavigationController)?.filterController(controller, animated: true) + } presentControllerImpl = { [weak controller] value, presentationArguments in controller?.present(value, in: .window(.root), with: presentationArguments, blockInteraction: true) } @@ -1271,7 +1310,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us } shareContactImpl = { [weak controller] in let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, _ in if let peer = peer as? TelegramUser, let phone = peer.phone { let contact = TelegramMediaContact(firstName: peer.firstName ?? "", lastName: peer.lastName ?? "", phoneNumber: phone, peerId: peer.id, vCardData: nil) let shareController = ShareController(context: context, subject: .media(.standalone(media: contact))) @@ -1281,7 +1320,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us } shareMyContactImpl = { [weak controller] in let _ = (getUserPeer(postbox: context.account.postbox, peerId: context.account.peerId) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, _ in guard let peer = peer as? TelegramUser, let phone = peer.phone else { return } @@ -1377,7 +1416,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us } shareBotImpl = { [weak controller] in let _ = (getUserPeer(postbox: context.account.postbox, peerId: peerId) - |> deliverOnMainQueue).start(next: { peer in + |> deliverOnMainQueue).start(next: { peer, _ in if let peer = peer as? TelegramUser, let username = peer.username { let shareController = ShareController(context: context, subject: .url("https://t.me/\(username)")) controller?.present(shareController, in: .window(.root)) diff --git a/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneActionItem.swift b/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneActionItem.swift index f915d8873b..1d64d3ace9 100644 --- a/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneActionItem.swift +++ b/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneActionItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData class UserInfoEditingPhoneActionItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneItem.swift b/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneItem.swift index cd26c35e45..20ea365af6 100644 --- a/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneItem.swift +++ b/submodules/TelegramUI/TelegramUI/UserInfoEditingPhoneItem.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import TelegramPresentationData struct UserInfoEditingPhoneItemEditing { let editable: Bool @@ -19,11 +20,11 @@ class UserInfoEditingPhoneItem: ListViewItem, ItemListItem { let sectionId: ItemListSectionId let setPhoneIdWithRevealedOptions: (Int64?, Int64?) -> Void let updated: (String) -> Void - let selectLabel: () -> Void + let selectLabel: (() -> Void)? let delete: () -> Void let tag: ItemListItemTag? - init(theme: PresentationTheme, strings: PresentationStrings, id: Int64, label: String, value: String, editing: UserInfoEditingPhoneItemEditing, sectionId: ItemListSectionId, setPhoneIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, updated: @escaping (String) -> Void, selectLabel: @escaping () -> Void, delete: @escaping () -> Void, tag: ItemListItemTag?) { + init(theme: PresentationTheme, strings: PresentationStrings, id: Int64, label: String, value: String, editing: UserInfoEditingPhoneItemEditing, sectionId: ItemListSectionId, setPhoneIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, updated: @escaping (String) -> Void, selectLabel: (() -> Void)?, delete: @escaping () -> Void, tag: ItemListItemTag?) { self.theme = theme self.strings = strings self.id = id @@ -236,6 +237,7 @@ class UserInfoEditingPhoneItemNode: ItemListRevealOptionsItemNode, ItemListItemN let labelFrame = CGRect(origin: CGPoint(x: revealOffset + leftInset + 30.0, y: 12.0), size: labelLayout.size) strongSelf.labelNode.frame = labelFrame strongSelf.labelButtonNode.frame = labelFrame + strongSelf.labelButtonNode.isUserInteractionEnabled = item.selectLabel != nil strongSelf.labelSeparatorNode.frame = CGRect(origin: CGPoint(x: labelFrame.maxX + 8.0, y: 0.0), size: CGSize(width: UIScreenPixel, height: layout.contentSize.height)) let phoneX = labelFrame.maxX + 16.0 @@ -292,7 +294,7 @@ class UserInfoEditingPhoneItemNode: ItemListRevealOptionsItemNode, ItemListItemN } @objc func labelPressed() { - self.item?.selectLabel() + self.item?.selectLabel?() } func focus() { diff --git a/submodules/TelegramUI/TelegramUI/UsernameSetupController.swift b/submodules/TelegramUI/TelegramUI/UsernameSetupController.swift index d0ef47793d..e87caa8845 100644 --- a/submodules/TelegramUI/TelegramUI/UsernameSetupController.swift +++ b/submodules/TelegramUI/TelegramUI/UsernameSetupController.swift @@ -4,6 +4,7 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData private final class UsernameSetupControllerArguments { let account: Account diff --git a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift index 6d22f54429..3e45034bfe 100644 --- a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputContextPanelNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import Display +import TelegramPresentationData private enum VerticalChatContextResultsEntryStableId: Hashable { case action diff --git a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelButtonItem.swift b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelButtonItem.swift index 6383579c6c..4180031e25 100644 --- a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelButtonItem.swift +++ b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelButtonItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class VerticalListContextResultsChatInputPanelButtonItem: ListViewItem { fileprivate let theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift index 59f296a2f6..4616cfa385 100644 --- a/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/VerticalListContextResultsChatInputPanelItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class VerticalListContextResultsChatInputPanelItem: ListViewItem { fileprivate let account: Account diff --git a/submodules/TelegramUI/TelegramUI/VimeoEmbedImplementation.swift b/submodules/TelegramUI/TelegramUI/VimeoEmbedImplementation.swift index 642f4fa490..5b6a588b01 100644 --- a/submodules/TelegramUI/TelegramUI/VimeoEmbedImplementation.swift +++ b/submodules/TelegramUI/TelegramUI/VimeoEmbedImplementation.swift @@ -1,6 +1,7 @@ import Foundation import WebKit import SwiftSignalKit +import UniversalMediaPlayer func extractVimeoVideoIdAndTimestamp(url: String) -> (String, Int)? { guard let url = URL(string: url), let host = url.host?.lowercased() else { diff --git a/submodules/TelegramUI/TelegramUI/VoiceCallDataSavingController.swift b/submodules/TelegramUI/TelegramUI/VoiceCallDataSavingController.swift index 4e8d5d6198..19e3d3b76a 100644 --- a/submodules/TelegramUI/TelegramUI/VoiceCallDataSavingController.swift +++ b/submodules/TelegramUI/TelegramUI/VoiceCallDataSavingController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class VoiceCallDataSavingControllerArguments { let updateSelection: (VoiceCallDataSaving) -> Void diff --git a/Telegram-iOS/WakeupManager.swift b/submodules/TelegramUI/TelegramUI/WakeupManager.swift similarity index 99% rename from Telegram-iOS/WakeupManager.swift rename to submodules/TelegramUI/TelegramUI/WakeupManager.swift index 08f65e21c2..b98d5e95e4 100644 --- a/Telegram-iOS/WakeupManager.swift +++ b/submodules/TelegramUI/TelegramUI/WakeupManager.swift @@ -4,7 +4,7 @@ import SwiftSignalKit import UIKit import Postbox import UserNotifications -import TelegramUI +import TelegramUIPreferences private final class WakeupManagerTask { let nativeId: UIBackgroundTaskIdentifier diff --git a/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift b/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift index f2ff261da0..77154b6258 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperColorPanelNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit 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? { diff --git a/submodules/TelegramUI/TelegramUI/WallpaperColorPickerNode.swift b/submodules/TelegramUI/TelegramUI/WallpaperColorPickerNode.swift index 772f50ec51..acf7a86f1f 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperColorPickerNode.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperColorPickerNode.swift @@ -3,6 +3,7 @@ import UIKit import AsyncDisplayKit import SwiftSignalKit import Display +import TelegramPresentationData private let shadowImage: UIImage = { return generateImage(CGSize(width: 45.0, height: 45.0), opaque: false, scale: nil, rotatedContext: { size, context in diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift b/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift index e3759f946a..ade8118541 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperGalleryController.swift @@ -7,6 +7,8 @@ import SwiftSignalKit import AsyncDisplayKit import TelegramCore import Photos +import TelegramPresentationData +import TelegramUIPreferences enum WallpaperListType { case wallpapers(WallpaperPresentationOptions?) diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift b/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift index 82f98b73a0..2500879f77 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift @@ -6,6 +6,8 @@ import SwiftSignalKit import Postbox import TelegramCore import LegacyComponents +import TelegramPresentationData +import TelegramUIPreferences struct WallpaperGalleryItemArguments { let colorPreview: Bool diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryToolbarNode.swift b/submodules/TelegramUI/TelegramUI/WallpaperGalleryToolbarNode.swift index f0788b163e..dc004fc422 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryToolbarNode.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperGalleryToolbarNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class WallpaperGalleryToolbarNode: ASDisplayNode { private var theme: PresentationTheme diff --git a/submodules/TelegramUI/TelegramUI/WallpaperPatternPanelNode.swift b/submodules/TelegramUI/TelegramUI/WallpaperPatternPanelNode.swift index c3f1db486b..6d7b072cbb 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperPatternPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperPatternPanelNode.swift @@ -4,7 +4,7 @@ import AsyncDisplayKit import SwiftSignalKit import Display import TelegramCore - +import TelegramPresentationData import LegacyComponents private let itemSize = CGSize(width: 88.0, height: 88.0) diff --git a/submodules/TelegramUI/TelegramUI/WallpaperSearchRecentQueries.swift b/submodules/TelegramUI/TelegramUI/WallpaperSearchRecentQueries.swift index 3f342d4a2d..7cceae91bc 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperSearchRecentQueries.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperSearchRecentQueries.swift @@ -1,6 +1,7 @@ import Foundation import Postbox import SwiftSignalKit +import TelegramUIPreferences private struct WallpaperSearchRecentQueryItemId { public let rawValue: MemoryBuffer diff --git a/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift b/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift index 8334d3ac56..f6f1621572 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperUploadManager.swift @@ -3,6 +3,8 @@ import UIKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramPresentationData +import TelegramUIPreferences private extension TelegramWallpaper { var mainResource: MediaResource? { diff --git a/Telegram-iOS/WatchBridge.swift b/submodules/TelegramUI/TelegramUI/WatchBridge.swift similarity index 99% rename from Telegram-iOS/WatchBridge.swift rename to submodules/TelegramUI/TelegramUI/WatchBridge.swift index 82f193311f..2f00e639d0 100644 --- a/Telegram-iOS/WatchBridge.swift +++ b/submodules/TelegramUI/TelegramUI/WatchBridge.swift @@ -1,10 +1,8 @@ import Foundation import Postbox import TelegramCore -import TelegramUI -#if BUCK -import WatchUtils -#endif +import WatchCommon +import TelegramPresentationData func makePeerIdFromBridgeIdentifier(_ identifier: Int64) -> PeerId? { if identifier < 0 && identifier > Int32.min { diff --git a/Telegram-iOS/WatchCommunicationManager.swift b/submodules/TelegramUI/TelegramUI/WatchCommunicationManager.swift similarity index 98% rename from Telegram-iOS/WatchCommunicationManager.swift rename to submodules/TelegramUI/TelegramUI/WatchCommunicationManager.swift index 6830be63ad..0cd2157115 100644 --- a/Telegram-iOS/WatchCommunicationManager.swift +++ b/submodules/TelegramUI/TelegramUI/WatchCommunicationManager.swift @@ -2,12 +2,10 @@ import Foundation import SwiftSignalKit import Postbox import TelegramCore -import TelegramUI - -#if BUCK -import WatchUtils -import AppBinaryPrivate -#endif +import WatchCommon +import TelegramUIPrivateModule +import SSignalKit +import TelegramUIPreferences final class WatchCommunicationManager { private let queue: Queue diff --git a/Telegram-iOS/WatchRequestHandlers.swift b/submodules/TelegramUI/TelegramUI/WatchRequestHandlers.swift similarity index 99% rename from Telegram-iOS/WatchRequestHandlers.swift rename to submodules/TelegramUI/TelegramUI/WatchRequestHandlers.swift index 480f5ff363..634cb3aa74 100644 --- a/Telegram-iOS/WatchRequestHandlers.swift +++ b/submodules/TelegramUI/TelegramUI/WatchRequestHandlers.swift @@ -3,11 +3,9 @@ import SwiftSignalKit import Postbox import Display import TelegramCore -import TelegramUI import LegacyComponents -#if BUCK -import WatchUtils -#endif +import WatchCommon +import TelegramPresentationData let allWatchRequestHandlers: [AnyClass] = [ WatchChatListHandler.self, diff --git a/submodules/TelegramUI/TelegramUI/WatchSettingsController.swift b/submodules/TelegramUI/TelegramUI/WatchSettingsController.swift index 8a6fbb6d53..22db369b0b 100644 --- a/submodules/TelegramUI/TelegramUI/WatchSettingsController.swift +++ b/submodules/TelegramUI/TelegramUI/WatchSettingsController.swift @@ -4,6 +4,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences private final class WatchSettingsControllerArguments { let updatePreset: (String, String) -> Void diff --git a/submodules/TelegramUI/TelegramUI/WebEmbedPlayerNode.swift b/submodules/TelegramUI/TelegramUI/WebEmbedPlayerNode.swift index 4364c3b082..d8a76364ef 100644 --- a/submodules/TelegramUI/TelegramUI/WebEmbedPlayerNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebEmbedPlayerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import SwiftSignalKit import WebKit import TelegramCore +import UniversalMediaPlayer protocol WebEmbedImplementation { func setup(_ webView: WKWebView, userContentController: WKUserContentController, evaluateJavaScript: @escaping (String) -> Void, updateStatus: @escaping (MediaPlayerStatus) -> Void, onPlaybackStarted: @escaping () -> Void) diff --git a/submodules/TelegramUI/TelegramUI/WebEmbedVideoContent.swift b/submodules/TelegramUI/TelegramUI/WebEmbedVideoContent.swift index 0ddbd96214..226f4c5f93 100644 --- a/submodules/TelegramUI/TelegramUI/WebEmbedVideoContent.swift +++ b/submodules/TelegramUI/TelegramUI/WebEmbedVideoContent.swift @@ -5,7 +5,8 @@ import Display import SwiftSignalKit import Postbox import TelegramCore - +import TelegramAudio +import UniversalMediaPlayer import LegacyComponents final class WebEmbedVideoContent: UniversalVideoContent { diff --git a/submodules/TelegramUI/TelegramUI/WebSearchBadgeNode.swift b/submodules/TelegramUI/TelegramUI/WebSearchBadgeNode.swift index 01f49cb416..2971837a33 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchBadgeNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchBadgeNode.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit import Display +import TelegramPresentationData final class WebSearchBadgeNode: ASDisplayNode { private var fillColor: UIColor diff --git a/submodules/TelegramUI/TelegramUI/WebSearchController.swift b/submodules/TelegramUI/TelegramUI/WebSearchController.swift index 5ccbf7341a..38644de36d 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchController.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchController.swift @@ -6,6 +6,7 @@ import Display import AsyncDisplayKit import TelegramCore import LegacyComponents +import TelegramUIPreferences func requestContextResults(account: Account, botId: PeerId, query: String, peerId: PeerId, offset: String = "", existingResults: ChatContextResultCollection? = nil, limit: Int = 60) -> Signal { return requestChatContextResults(account: account, botId: botId, peerId: peerId, query: query, offset: offset) diff --git a/submodules/TelegramUI/TelegramUI/WebSearchControllerNode.swift b/submodules/TelegramUI/TelegramUI/WebSearchControllerNode.swift index d282ae6bd9..efe1482b7d 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchControllerNode.swift @@ -6,6 +6,8 @@ import SwiftSignalKit import Display import TelegramCore import LegacyComponents +import TelegramPresentationData +import TelegramUIPreferences private struct WebSearchContextResultStableId: Hashable { let result: ChatContextResult diff --git a/submodules/TelegramUI/TelegramUI/WebSearchGalleryController.swift b/submodules/TelegramUI/TelegramUI/WebSearchGalleryController.swift index bd198981cc..dcc062e2b9 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchGalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchGalleryController.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import AsyncDisplayKit import TelegramCore import LegacyComponents +import TelegramPresentationData final class WebSearchGalleryControllerInteraction { let dismiss: (Bool) -> Void diff --git a/submodules/TelegramUI/TelegramUI/WebSearchGalleryFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/WebSearchGalleryFooterContentNode.swift index 514b28270b..30a495e24d 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchGalleryFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchGalleryFooterContentNode.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import LegacyComponents +import TelegramPresentationData final class WebSearchGalleryFooterContentNode: GalleryFooterContentNode { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/WebSearchInterfaceState.swift b/submodules/TelegramUI/TelegramUI/WebSearchInterfaceState.swift index 6b58924bda..bc67ae5408 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchInterfaceState.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchInterfaceState.swift @@ -1,10 +1,7 @@ import Foundation import UIKit - -enum WebSearchScope: Int32 { - case images - case gifs -} +import TelegramPresentationData +import TelegramUIPreferences struct WebSearchInterfaceInnerState: Equatable { let scope: WebSearchScope diff --git a/submodules/TelegramUI/TelegramUI/WebSearchItem.swift b/submodules/TelegramUI/TelegramUI/WebSearchItem.swift index 7a2f9544a7..5753330d20 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchItem.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import SwiftSignalKit import Postbox +import TelegramPresentationData final class WebSearchItem: GridItem { var section: GridSection? diff --git a/submodules/TelegramUI/TelegramUI/WebSearchNavigationContentNode.swift b/submodules/TelegramUI/TelegramUI/WebSearchNavigationContentNode.swift index b3928a4f12..5e04d19dd1 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchNavigationContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchNavigationContentNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import Postbox import TelegramCore +import TelegramPresentationData private let searchBarFont = Font.regular(17.0) diff --git a/submodules/TelegramUI/TelegramUI/WebSearchRecentQueries.swift b/submodules/TelegramUI/TelegramUI/WebSearchRecentQueries.swift index c992ae5de5..4ebcd9a51e 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchRecentQueries.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchRecentQueries.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Postbox import SwiftSignalKit +import TelegramUIPreferences private struct WebSearchRecentQueryItemId { public let rawValue: MemoryBuffer diff --git a/submodules/TelegramUI/TelegramUI/WebSearchRecentQueryItem.swift b/submodules/TelegramUI/TelegramUI/WebSearchRecentQueryItem.swift index 04623df653..48f3ff323e 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchRecentQueryItem.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchRecentQueryItem.swift @@ -5,6 +5,7 @@ import Postbox import Display import SwiftSignalKit import TelegramCore +import TelegramPresentationData private enum RevealOptionKey: Int32 { case delete diff --git a/submodules/TelegramUI/TelegramUI/WebSearchVideoGalleryItem.swift b/submodules/TelegramUI/TelegramUI/WebSearchVideoGalleryItem.swift index c30cf430b1..1ef9fd59f9 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchVideoGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/WebSearchVideoGalleryItem.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import TelegramCore import Display import Postbox +import TelegramPresentationData class WebSearchVideoGalleryItem: GalleryItem { let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift b/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift index ffae4e6beb..ccd4c68e32 100644 --- a/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/WebpagePreviewAccessoryPanelNode.swift @@ -5,6 +5,7 @@ import TelegramCore import Postbox import SwiftSignalKit import Display +import TelegramPresentationData final class WebpagePreviewAccessoryPanelNode: AccessoryPanelNode { private let webpageDisposable = MetaDisposable() diff --git a/submodules/TelegramUI/TelegramUI/YUV.h b/submodules/TelegramUI/TelegramUI/YUV.h new file mode 100644 index 0000000000..a13fe86332 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/YUV.h @@ -0,0 +1,7 @@ +#import + +void encodeRGBAToBRGR422A(uint8_t * _Nonnull bgrg422, uint8_t * _Nonnull a, uint8_t const * _Nonnull argb, int width, int height); +void encodeBRGR422AToRGBA(uint8_t const * _Nonnull bgrg422, uint8_t const * _Nonnull a, uint8_t * _Nonnull argb, int width, int height); + +NSData * _Nonnull encodeSparseBuffer(uint8_t const * _Nonnull bytes, int length); +void decodeSparseeBuffer(uint8_t * _Nonnull bytes, uint8_t const * _Nonnull buffer); diff --git a/submodules/TelegramUI/TelegramUI/YUV.m b/submodules/TelegramUI/TelegramUI/YUV.m new file mode 100644 index 0000000000..43277cabd0 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/YUV.m @@ -0,0 +1,67 @@ +#import "YUV.h" + +void encodeRGBAToBRGR422A(uint8_t *bgrg422, uint8_t *a, uint8_t const *argb, int width, int height) { + int i, j; + int lineWidth = width * 2; + for (j = 0; j < height; j++) { + for (i = 0; i < width; i += 2) { + int A1 = argb[(j * width + i) * 4 + 0]; + int R1 = argb[(j * width + i) * 4 + 3]; + int G1 = argb[(j * width + i) * 4 + 2]; + int B1 = argb[(j * width + i) * 4 + 1]; + + int A2 = argb[(j * width + i) * 4 + 4]; + int R2 = argb[(j * width + i) * 4 + 7]; + int G2 = argb[(j * width + i) * 4 + 6]; + int B2 = argb[(j * width + i) * 4 + 5]; + + bgrg422[j * lineWidth + (i / 2) * 4 + 0] = (uint8_t)((B1 + B2) >> 1); + bgrg422[j * lineWidth + (i / 2) * 4 + 1] = G1; + bgrg422[j * lineWidth + (i / 2) * 4 + 2] = (uint8_t)((R1 + R2) >> 1); + bgrg422[j * lineWidth + (i / 2) * 4 + 3] = G2; + + a[j * width + i + 0] = A1; + a[j * width + i + 1] = A2; + } + } +} + +void encodeBRGR422AToRGBA(uint8_t const * _Nonnull bgrg422, uint8_t const * _Nonnull const a, uint8_t * _Nonnull argb, int width, int height) { + int i, j; + int lineWidth = width * 2; + for (j = 0; j < height; j++) { + for (i = 0; i < width; i += 2) { + argb[(j * width + i) * 4 + 0] = a[j * width + i + 0]; + argb[(j * width + i) * 4 + 3] = bgrg422[j * lineWidth + (i / 2) * 4 + 2]; + argb[(j * width + i) * 4 + 2] = bgrg422[j * lineWidth + (i / 2) * 4 + 1]; + argb[(j * width + i) * 4 + 1] = bgrg422[j * lineWidth + (i / 2) * 4 + 0]; + + argb[(j * width + i) * 4 + 4] = a[j * width + i + 1]; + argb[(j * width + i) * 4 + 7] = bgrg422[j * lineWidth + (i / 2) * 4 + 2]; + argb[(j * width + i) * 4 + 6] = bgrg422[j * lineWidth + (i / 2) * 4 + 3]; + argb[(j * width + i) * 4 + 5] = bgrg422[j * lineWidth + (i / 2) * 4 + 0]; + } + } +} + +NSData * _Nonnull encodeSparseBuffer(uint8_t const * _Nonnull bytes, int length) { + NSMutableData *result = [[NSMutableData alloc] init]; + int offset = 0; + int currentStart = 0; + int currentType = 0; + while (offset != length) { + if (bytes[offset] == 0) { + if (currentType != 0) { + + } + } else { + + } + offset += 1; + } + return result; +} + +void decodeSparseeBuffer(uint8_t * _Nonnull bytes, uint8_t const * _Nonnull buffer) { + +} diff --git a/submodules/TelegramUI/TelegramUI/YoutubeEmbedImplementation.swift b/submodules/TelegramUI/TelegramUI/YoutubeEmbedImplementation.swift index 6f70a6482c..169bda0775 100644 --- a/submodules/TelegramUI/TelegramUI/YoutubeEmbedImplementation.swift +++ b/submodules/TelegramUI/TelegramUI/YoutubeEmbedImplementation.swift @@ -1,6 +1,7 @@ import Foundation import WebKit import SwiftSignalKit +import UniversalMediaPlayer func extractYoutubeVideoIdAndTimestamp(url: String) -> (String, Int)? { guard let url = URL(string: url), let host = url.host?.lowercased() else { diff --git a/submodules/TelegramUI/TelegramUI/emoji_suggestions.cpp b/submodules/TelegramUI/TelegramUI/emoji_suggestions.cpp deleted file mode 100755 index 8cb2e46697..0000000000 --- a/submodules/TelegramUI/TelegramUI/emoji_suggestions.cpp +++ /dev/null @@ -1,432 +0,0 @@ -/* -This file is part of Telegram Desktop, -the official desktop version of Telegram messaging app, see https://telegram.org - -Telegram Desktop is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -It is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -In addition, as a special exception, the copyright holders give permission -to link the code of portions of this program with the OpenSSL library. - -Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE -Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org -*/ -#include "emoji_suggestions.h" - -#include -#include "emoji_suggestions_data.h" - -#ifndef Expects -#include -#define Expects(condition) assert(condition) -#endif // Expects - -namespace Ui { -namespace Emoji { -namespace internal { -namespace { - -checksum Crc32Table[256]; -class Crc32Initializer { -public: - Crc32Initializer() { - checksum poly = 0x04C11DB7U; - for (auto i = 0; i != 256; ++i) { - Crc32Table[i] = reflect(i, 8) << 24; - for (auto j = 0; j != 8; ++j) { - Crc32Table[i] = (Crc32Table[i] << 1) ^ (Crc32Table[i] & (1 << 31) ? poly : 0); - } - Crc32Table[i] = reflect(Crc32Table[i], 32); - } - } - -private: - checksum reflect(checksum val, char ch) { - checksum result = 0; - for (int i = 1; i < (ch + 1); ++i) { - if (val & 1) { - result |= 1 << (ch - i); - } - val >>= 1; - } - return result; - } - -}; - -} // namespace - -checksum countChecksum(const void *data, std::size_t size) { - static Crc32Initializer InitTable; - - auto buffer = static_cast(data); - auto result = checksum(0xFFFFFFFFU); - for (auto i = std::size_t(0); i != size; ++i) { - result = (result >> 8) ^ Crc32Table[(result & 0xFFU) ^ buffer[i]]; - } - return (result ^ 0xFFFFFFFFU); -} - -} // namespace internal - -namespace { - -class string_span { -public: - string_span() = default; - string_span(const utf16string *data, std::size_t size) : begin_(data), size_(size) { - } - string_span(const std::vector &data) : begin_(data.data()), size_(data.size()) { - } - string_span(const string_span &other) = default; - string_span &operator=(const string_span &other) = default; - - const utf16string *begin() const { - return begin_; - } - const utf16string *end() const { - return begin_ + size_; - } - std::size_t size() const { - return size_; - } - - string_span subspan(std::size_t offset, std::size_t size) { - return string_span(begin_ + offset, size); - } - -private: - const utf16string *begin_ = nullptr; - std::size_t size_ = 0; - -}; - -bool IsNumber(utf16char ch) { - return (ch >= '0' && ch <= '9'); -} - -bool IsLetterOrNumber(utf16char ch) { - return (ch >= 'a' && ch <= 'z') || IsNumber(ch); -} - -using Replacement = internal::Replacement; - -class Completer { -public: - Completer(utf16string query); - - std::vector resolve(); - -private: - struct Result { - const Replacement *replacement; - int wordsUsed; - }; - - static std::vector NormalizeQuery(utf16string query); - void addResult(const Replacement *replacement); - bool isDuplicateOfLastResult(const Replacement *replacement) const; - bool isBetterThanLastResult(const Replacement *replacement) const; - void processInitialList(); - void filterInitialList(); - void initWordsTracking(); - bool matchQueryForCurrentItem(); - bool matchQueryTailStartingFrom(int position); - string_span findWordsStartingWith(utf16char ch); - int findEqualCharsCount(int position, const utf16string *word); - std::vector prepareResult(); - bool startsWithQuery(utf16string word); - bool isExactMatch(utf16string replacement); - - std::vector _result; - - utf16string _initialQuery; - const std::vector _query; - const utf16char *_queryBegin = nullptr; - int _querySize = 0; - - const std::vector *_initialList = nullptr; - - string_span _currentItemWords; - int _currentItemWordsUsedCount = 0; - - class UsedWordGuard { - public: - UsedWordGuard(std::vector &map, int index); - UsedWordGuard(const UsedWordGuard &other) = delete; - UsedWordGuard(UsedWordGuard &&other); - UsedWordGuard &operator=(const UsedWordGuard &other) = delete; - UsedWordGuard &operator=(UsedWordGuard &&other) = delete; - explicit operator bool() const; - ~UsedWordGuard(); - - private: - std::vector &_map; - int _index = 0; - bool _guarded = false; - - }; - std::vector _currentItemWordsUsedMap; - -}; - -Completer::UsedWordGuard::UsedWordGuard(std::vector &map, int index) : _map(map), _index(index) { - Expects(_map.size() > _index); - if (!_map[_index]) { - _guarded = _map[_index] = 1; - } -} - -Completer::UsedWordGuard::UsedWordGuard(UsedWordGuard &&other) : _map(other._map), _index(other._index), _guarded(other._guarded) { - other._guarded = 0; -} - -Completer::UsedWordGuard::operator bool() const { - return _guarded; -} - -Completer::UsedWordGuard::~UsedWordGuard() { - if (_guarded) { - _map[_index] = 0; - } -} - -Completer::Completer(utf16string query) : _initialQuery(query), _query(NormalizeQuery(query)) { -} - -// Remove all non-letters-or-numbers. -// Leave '-' and '+' only if they're followed by a number or -// at the end of the query (so it is possibly followed by a number). -std::vector Completer::NormalizeQuery(utf16string query) { - auto result = std::vector(); - result.reserve(query.size()); - auto copyFrom = query.data(); - auto e = copyFrom + query.size(); - auto copyTo = result.data(); - for (auto i = query.data(); i != e; ++i) { - if (IsLetterOrNumber(*i)) { - continue; - } else if (*i == '-' || *i == '+') { - if (i + 1 == e || IsNumber(*(i + 1))) { - continue; - } - } - if (i > copyFrom) { - result.resize(result.size() + (i - copyFrom)); - memcpy(copyTo, copyFrom, (i - copyFrom) * sizeof(utf16char)); - copyTo += (i - copyFrom); - } - copyFrom = i + 1; - } - if (e > copyFrom) { - result.resize(result.size() + (e - copyFrom)); - memcpy(copyTo, copyFrom, (e - copyFrom) * sizeof(utf16char)); - copyTo += (e - copyFrom); - } - return result; -} - -std::vector Completer::resolve() { - _queryBegin = _query.data(); - _querySize = _query.size(); - if (!_querySize) { - return std::vector(); - } - _initialList = Ui::Emoji::internal::GetReplacements(*_queryBegin); - if (!_initialList) { - return std::vector(); - } - _result.reserve(_initialList->size()); - processInitialList(); - return prepareResult(); -} - -bool Completer::isDuplicateOfLastResult(const Replacement *item) const { - if (_result.empty()) { - return false; - } - return (_result.back().replacement->emoji == item->emoji); -} - -bool Completer::isBetterThanLastResult(const Replacement *item) const { - Expects(!_result.empty()); - auto &last = _result.back(); - if (_currentItemWordsUsedCount < last.wordsUsed) { - return true; - } - - auto firstCharOfQuery = _query[0]; - auto firstCharAfterColonLast = last.replacement->replacement[1]; - auto firstCharAfterColonCurrent = item->replacement[1]; - auto goodLast = (firstCharAfterColonLast == firstCharOfQuery); - auto goodCurrent = (firstCharAfterColonCurrent == firstCharOfQuery); - return !goodLast && goodCurrent; -} - -void Completer::addResult(const Replacement *item) { - if (!isDuplicateOfLastResult(item)) { - _result.push_back({ item, _currentItemWordsUsedCount }); - } else if (isBetterThanLastResult(item)) { - _result.back() = { item, _currentItemWordsUsedCount }; - } -} - -void Completer::processInitialList() { - if (_querySize > 1) { - filterInitialList(); - } else { - _currentItemWordsUsedCount = 1; - for (auto item : *_initialList) { - addResult(item); - } - } -} - -void Completer::initWordsTracking() { - auto maxWordsCount = 0; - for (auto item : *_initialList) { - auto wordsCount = item->words.size(); - if (maxWordsCount < wordsCount) { - maxWordsCount = wordsCount; - } - } - _currentItemWordsUsedMap = std::vector(maxWordsCount, 0); -} - -void Completer::filterInitialList() { - initWordsTracking(); - for (auto item : *_initialList) { - _currentItemWords = string_span(item->words); - _currentItemWordsUsedCount = 1; - if (matchQueryForCurrentItem()) { - addResult(item); - } - _currentItemWordsUsedCount = 0; - } -} - -bool Completer::matchQueryForCurrentItem() { - Expects(_currentItemWords.size() != 0); - if (_currentItemWords.size() < 2) { - return startsWithQuery(*_currentItemWords.begin()); - } - return matchQueryTailStartingFrom(0); -} - -bool Completer::startsWithQuery(utf16string word) { - if (word.size() < _query.size()) { - return false; - } - for (auto i = std::size_t(0), size = _query.size(); i != size; ++i) { - if (word[i] != _query[i]) { - return false; - } - } - return true; -} - -bool Completer::isExactMatch(utf16string replacement) { - if (replacement.size() != _initialQuery.size() + 1) { - return false; - } - for (auto i = std::size_t(0), size = _initialQuery.size(); i != size; ++i) { - if (replacement[i] != _initialQuery[i]) { - return false; - } - } - return true; -} - -bool Completer::matchQueryTailStartingFrom(int position) { - auto charsLeftToMatch = (_querySize - position); - if (!charsLeftToMatch) { - return true; - } - - auto firstCharToMatch = *(_queryBegin + position); - auto foundWords = findWordsStartingWith(firstCharToMatch); - - for (auto word = foundWords.begin(), foundWordsEnd = word + foundWords.size(); word != foundWordsEnd; ++word) { - auto wordIndex = word - _currentItemWords.begin(); - if (auto guard = UsedWordGuard(_currentItemWordsUsedMap, wordIndex)) { - ++_currentItemWordsUsedCount; - auto equalCharsCount = findEqualCharsCount(position, word); - for (auto check = equalCharsCount; check != 0; --check) { - if (matchQueryTailStartingFrom(position + check)) { - return true; - } - } - --_currentItemWordsUsedCount; - } - } - return false; -} - -int Completer::findEqualCharsCount(int position, const utf16string *word) { - auto charsLeft = (_querySize - position); - auto wordBegin = word->data(); - auto wordSize = word->size(); - auto possibleEqualCharsCount = (charsLeft > wordSize ? wordSize : charsLeft); - for (auto equalTill = 1; equalTill != possibleEqualCharsCount; ++equalTill) { - auto wordCh = *(wordBegin + equalTill); - auto queryCh = *(_queryBegin + position + equalTill); - if (wordCh != queryCh) { - return equalTill; - } - } - return possibleEqualCharsCount; -} - -std::vector Completer::prepareResult() { - auto firstCharOfQuery = _query[0]; - std::stable_partition(_result.begin(), _result.end(), [firstCharOfQuery](Result &result) { - auto firstCharAfterColon = result.replacement->replacement[1]; - return (firstCharAfterColon == firstCharOfQuery); - }); - std::stable_partition(_result.begin(), _result.end(), [](Result &result) { - return (result.wordsUsed < 2); - }); - std::stable_partition(_result.begin(), _result.end(), [](Result &result) { - return (result.wordsUsed < 3); - }); - std::stable_partition(_result.begin(), _result.end(), [this](Result &result) { - return isExactMatch(result.replacement->replacement); - }); - - auto result = std::vector(); - result.reserve(_result.size()); - for (auto &item : _result) { - result.emplace_back(item.replacement->emoji, item.replacement->replacement, item.replacement->replacement); - } - return result; -} - -string_span Completer::findWordsStartingWith(utf16char ch) { - auto begin = std::lower_bound(_currentItemWords.begin(), _currentItemWords.end(), ch, [](utf16string word, utf16char ch) { - return word[0] < ch; - }); - auto end = std::upper_bound(_currentItemWords.begin(), _currentItemWords.end(), ch, [](utf16char ch, utf16string word) { - return ch < word[0]; - }); - return _currentItemWords.subspan(begin - _currentItemWords.begin(), end - begin); -} - -} // namespace - -std::vector GetSuggestions(utf16string query) { - return Completer(query).resolve(); -} - -int GetSuggestionMaxLength() { - return internal::kReplacementMaxLength; -} - -} // namespace Emoji -} // namespace Ui diff --git a/submodules/TelegramUI/TelegramUI/emoji_suggestions.h b/submodules/TelegramUI/TelegramUI/emoji_suggestions.h deleted file mode 100755 index 7e2d577ebe..0000000000 --- a/submodules/TelegramUI/TelegramUI/emoji_suggestions.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -This file is part of Telegram Desktop, -the official desktop version of Telegram messaging app, see https://telegram.org - -Telegram Desktop is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -It is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -In addition, as a special exception, the copyright holders give permission -to link the code of portions of this program with the OpenSSL library. - -Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE -Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org -*/ -#pragma once - -#include - -namespace Ui { -namespace Emoji { - -using small = unsigned char; -using medium = unsigned short; -using utf16char = unsigned short; - -static_assert(sizeof(utf16char) == 2, "Bad UTF-16 character size."); - -class utf16string { -public: - utf16string() = default; - utf16string(const utf16char *data, std::size_t size) : data_(data), size_(size) { - } - utf16string(const utf16string &other) = default; - utf16string &operator=(const utf16string &other) = default; - - const utf16char *data() const { - return data_; - } - std::size_t size() const { - return size_; - } - - utf16char operator[](int index) const { - return data_[index]; - } - -private: - const utf16char *data_ = nullptr; - std::size_t size_ = 0; - -}; - -inline bool operator==(utf16string a, utf16string b) { - return (a.size() == b.size()) && (!a.size() || !memcmp(a.data(), b.data(), a.size() * sizeof(utf16char))); -} - -namespace internal { - -using checksum = unsigned int; -checksum countChecksum(const void *data, std::size_t size); - -utf16string GetReplacementEmoji(utf16string replacement); - -} // namespace internal - -class Suggestion { -public: - Suggestion() = default; - Suggestion(utf16string emoji, utf16string label, utf16string replacement) : emoji_(emoji), label_(label), replacement_(replacement) { - } - Suggestion(const Suggestion &other) = default; - Suggestion &operator=(const Suggestion &other) = default; - - utf16string emoji() const { - return emoji_; - } - utf16string label() const { - return label_; - } - utf16string replacement() const { - return replacement_; - } - -private: - utf16string emoji_; - utf16string label_; - utf16string replacement_; - -}; - -std::vector GetSuggestions(utf16string query); - -inline utf16string GetSuggestionEmoji(utf16string replacement) { - return internal::GetReplacementEmoji(replacement); -} - -int GetSuggestionMaxLength(); - - -} // namespace Emoji -} // namespace Ui diff --git a/submodules/TelegramUI/TelegramUI/emoji_suggestions_data.cpp b/submodules/TelegramUI/TelegramUI/emoji_suggestions_data.cpp deleted file mode 100755 index e0ddd49688..0000000000 --- a/submodules/TelegramUI/TelegramUI/emoji_suggestions_data.cpp +++ /dev/null @@ -1,6367 +0,0 @@ -/* -WARNING! All changes made in this file will be lost! -Created from 'empty' by 'codegen_emoji' - -This file is part of Telegram Desktop, -the official desktop version of Telegram messaging app, see https://telegram.org - -Telegram Desktop is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -It is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -In addition, as a special exception, the copyright holders give permission -to link the code of portions of this program with the OpenSSL library. - -Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE -Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org -*/ -#include "emoji_suggestions_data.h" - -#include - -namespace Ui { -namespace Emoji { -namespace internal { -namespace { - -struct ReplacementStruct { - small emojiSize; - small replacementSize; - small wordsCount; -}; - -const utf16char ReplacementData[] = { -0xd83d, 0xde00, 0x3a, 0x67, 0x72, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x3a, -0x67, 0x72, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0xd83d, 0xde03, 0x3a, 0x73, -0x6d, 0x69, 0x6c, 0x65, 0x79, 0x3a, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x79, -0xd83d, 0xde04, 0x3a, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x3a, 0x73, 0x6d, 0x69, -0x6c, 0x65, 0xd83d, 0xde01, 0x3a, 0x67, 0x72, 0x69, 0x6e, 0x3a, 0x67, 0x72, -0x69, 0x6e, 0xd83d, 0xde06, 0x3a, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, -0x65, 0x64, 0x3a, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x64, -0xd83d, 0xde06, 0x3a, 0x6c, 0x61, 0x75, 0x67, 0x68, 0x69, 0x6e, 0x67, 0x3a, -0x6c, 0x61, 0x75, 0x67, 0x68, 0x69, 0x6e, 0x67, 0xd83d, 0xde05, 0x3a, 0x73, -0x77, 0x65, 0x61, 0x74, 0x5f, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x3a, 0x73, -0x6d, 0x69, 0x6c, 0x65, 0x73, 0x77, 0x65, 0x61, 0x74, 0xd83d, 0xde02, 0x3a, -0x6a, 0x6f, 0x79, 0x3a, 0x6a, 0x6f, 0x79, 0xd83e, 0xdd23, 0x3a, 0x72, 0x6f, -0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x68, 0x65, -0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6c, 0x61, 0x75, 0x67, 0x68, -0x69, 0x6e, 0x67, 0x3a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x6c, 0x61, 0x75, -0x67, 0x68, 0x69, 0x6e, 0x67, 0x6f, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x69, -0x6e, 0x67, 0x74, 0x68, 0x65, 0xd83e, 0xdd23, 0x3a, 0x72, 0x6f, 0x66, 0x6c, -0x3a, 0x72, 0x6f, 0x66, 0x6c, 0x263a, 0xfe0f, 0x3a, 0x72, 0x65, 0x6c, 0x61, -0x78, 0x65, 0x64, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x78, 0x65, 0x64, 0xd83d, -0xde0a, 0x3a, 0x62, 0x6c, 0x75, 0x73, 0x68, 0x3a, 0x62, 0x6c, 0x75, 0x73, -0x68, 0xd83d, 0xde07, 0x3a, 0x69, 0x6e, 0x6e, 0x6f, 0x63, 0x65, 0x6e, 0x74, -0x3a, 0x69, 0x6e, 0x6e, 0x6f, 0x63, 0x65, 0x6e, 0x74, 0xd83d, 0xde42, 0x3a, -0x73, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0x5f, 0x73, 0x6d, 0x69, -0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, -0x63, 0x65, 0x73, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0x73, 0x6d, -0x69, 0x6c, 0x69, 0x6e, 0x67, 0xd83d, 0xde42, 0x3a, 0x73, 0x6c, 0x69, 0x67, -0x68, 0x74, 0x5f, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x3a, 0x73, 0x6c, 0x69, -0x67, 0x68, 0x74, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0xd83d, 0xde43, 0x3a, 0x75, -0x70, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x66, -0x61, 0x63, 0x65, 0x3a, 0x64, 0x6f, 0x77, 0x6e, 0x66, 0x61, 0x63, 0x65, -0x75, 0x70, 0x73, 0x69, 0x64, 0x65, 0xd83d, 0xde43, 0x3a, 0x75, 0x70, 0x73, -0x69, 0x64, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x64, 0x6f, 0x77, -0x6e, 0x75, 0x70, 0x73, 0x69, 0x64, 0x65, 0xd83d, 0xde09, 0x3a, 0x77, 0x69, -0x6e, 0x6b, 0x3a, 0x77, 0x69, 0x6e, 0x6b, 0xd83d, 0xde0c, 0x3a, 0x72, 0x65, -0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0x3a, 0x72, 0x65, 0x6c, 0x69, 0x65, -0x76, 0x65, 0x64, 0xd83d, 0xde0d, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, -0x65, 0x79, 0x65, 0x73, 0x3a, 0x65, 0x79, 0x65, 0x73, 0x68, 0x65, 0x61, -0x72, 0x74, 0xd83d, 0xde18, 0x3a, 0x6b, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, -0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, -0x6b, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0xd83d, 0xde17, 0x3a, 0x6b, 0x69, -0x73, 0x73, 0x69, 0x6e, 0x67, 0x3a, 0x6b, 0x69, 0x73, 0x73, 0x69, 0x6e, -0x67, 0xd83d, 0xde19, 0x3a, 0x6b, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, -0x73, 0x6d, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x79, 0x65, 0x73, -0x3a, 0x65, 0x79, 0x65, 0x73, 0x6b, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, -0x73, 0x6d, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0xd83d, 0xde1a, 0x3a, 0x6b, 0x69, -0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, -0x5f, 0x65, 0x79, 0x65, 0x73, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, -0x65, 0x79, 0x65, 0x73, 0x6b, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0xd83d, -0xde0b, 0x3a, 0x79, 0x75, 0x6d, 0x3a, 0x79, 0x75, 0x6d, 0xd83d, 0xde1c, 0x3a, -0x73, 0x74, 0x75, 0x63, 0x6b, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, -0x6e, 0x67, 0x75, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, -0x5f, 0x65, 0x79, 0x65, 0x3a, 0x65, 0x79, 0x65, 0x6f, 0x75, 0x74, 0x73, -0x74, 0x75, 0x63, 0x6b, 0x74, 0x6f, 0x6e, 0x67, 0x75, 0x65, 0x77, 0x69, -0x6e, 0x6b, 0x69, 0x6e, 0x67, 0xd83d, 0xde1d, 0x3a, 0x73, 0x74, 0x75, 0x63, -0x6b, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6e, 0x67, 0x75, 0x65, -0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x65, 0x79, 0x65, 0x73, -0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x65, 0x79, 0x65, 0x73, 0x6f, -0x75, 0x74, 0x73, 0x74, 0x75, 0x63, 0x6b, 0x74, 0x6f, 0x6e, 0x67, 0x75, -0x65, 0xd83d, 0xde1b, 0x3a, 0x73, 0x74, 0x75, 0x63, 0x6b, 0x5f, 0x6f, 0x75, -0x74, 0x5f, 0x74, 0x6f, 0x6e, 0x67, 0x75, 0x65, 0x3a, 0x6f, 0x75, 0x74, -0x73, 0x74, 0x75, 0x63, 0x6b, 0x74, 0x6f, 0x6e, 0x67, 0x75, 0x65, 0xd83e, -0xdd11, 0x3a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x6f, 0x75, 0x74, -0x68, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x6d, -0x6f, 0x6e, 0x65, 0x79, 0x6d, 0x6f, 0x75, 0x74, 0x68, 0xd83e, 0xdd11, 0x3a, -0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x6f, 0x75, 0x74, 0x68, 0x3a, -0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x6d, 0x6f, 0x75, 0x74, 0x68, 0xd83e, 0xdd17, -0x3a, 0x68, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, -0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x68, 0x75, 0x67, 0x67, 0x69, 0x6e, -0x67, 0xd83e, 0xdd17, 0x3a, 0x68, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x3a, -0x68, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0xd83e, 0xdd13, 0x3a, 0x6e, 0x65, -0x72, 0x64, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x6e, 0x65, 0x72, 0x64, 0xd83e, 0xdd13, 0x3a, 0x6e, 0x65, 0x72, 0x64, 0x3a, -0x6e, 0x65, 0x72, 0x64, 0xd83d, 0xde0e, 0x3a, 0x73, 0x75, 0x6e, 0x67, 0x6c, -0x61, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x73, 0x75, 0x6e, 0x67, 0x6c, 0x61, -0x73, 0x73, 0x65, 0x73, 0xd83e, 0xdd21, 0x3a, 0x63, 0x6c, 0x6f, 0x77, 0x6e, -0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x63, 0x6c, 0x6f, 0x77, 0x6e, 0x66, -0x61, 0x63, 0x65, 0xd83e, 0xdd21, 0x3a, 0x63, 0x6c, 0x6f, 0x77, 0x6e, 0x3a, -0x63, 0x6c, 0x6f, 0x77, 0x6e, 0xd83e, 0xdd20, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x77, 0x62, 0x6f, 0x79, -0x5f, 0x68, 0x61, 0x74, 0x3a, 0x63, 0x6f, 0x77, 0x62, 0x6f, 0x79, 0x66, -0x61, 0x63, 0x65, 0x68, 0x61, 0x74, 0x77, 0x69, 0x74, 0x68, 0xd83e, 0xdd20, -0x3a, 0x63, 0x6f, 0x77, 0x62, 0x6f, 0x79, 0x3a, 0x63, 0x6f, 0x77, 0x62, -0x6f, 0x79, 0xd83d, 0xde0f, 0x3a, 0x73, 0x6d, 0x69, 0x72, 0x6b, 0x3a, 0x73, -0x6d, 0x69, 0x72, 0x6b, 0xd83d, 0xde12, 0x3a, 0x75, 0x6e, 0x61, 0x6d, 0x75, -0x73, 0x65, 0x64, 0x3a, 0x75, 0x6e, 0x61, 0x6d, 0x75, 0x73, 0x65, 0x64, -0xd83d, 0xde1e, 0x3a, 0x64, 0x69, 0x73, 0x61, 0x70, 0x70, 0x6f, 0x69, 0x6e, -0x74, 0x65, 0x64, 0x3a, 0x64, 0x69, 0x73, 0x61, 0x70, 0x70, 0x6f, 0x69, -0x6e, 0x74, 0x65, 0x64, 0xd83d, 0xde14, 0x3a, 0x70, 0x65, 0x6e, 0x73, 0x69, -0x76, 0x65, 0x3a, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0xd83d, 0xde1f, -0x3a, 0x77, 0x6f, 0x72, 0x72, 0x69, 0x65, 0x64, 0x3a, 0x77, 0x6f, 0x72, -0x72, 0x69, 0x65, 0x64, 0xd83d, 0xde15, 0x3a, 0x63, 0x6f, 0x6e, 0x66, 0x75, -0x73, 0x65, 0x64, 0x3a, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x65, 0x64, -0xd83d, 0xde41, 0x3a, 0x73, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0x5f, -0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, -0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, -0x6e, 0x67, 0x73, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0xd83d, 0xde41, -0x3a, 0x73, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x72, 0x6f, 0x77, -0x6e, 0x3a, 0x66, 0x72, 0x6f, 0x77, 0x6e, 0x73, 0x6c, 0x69, 0x67, 0x68, -0x74, 0x2639, 0xfe0f, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x72, -0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, -0x66, 0x61, 0x63, 0x65, 0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, -0x77, 0x68, 0x69, 0x74, 0x65, 0x2639, 0xfe0f, 0x3a, 0x66, 0x72, 0x6f, 0x77, -0x6e, 0x69, 0x6e, 0x67, 0x32, 0x3a, 0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, -0x6e, 0x67, 0x32, 0xd83d, 0xde23, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x65, 0x76, -0x65, 0x72, 0x65, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x65, 0x76, 0x65, 0x72, -0x65, 0xd83d, 0xde16, 0x3a, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x75, 0x6e, 0x64, -0x65, 0x64, 0x3a, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x65, -0x64, 0xd83d, 0xde2b, 0x3a, 0x74, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x66, 0x61, -0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x74, 0x69, 0x72, 0x65, 0x64, -0xd83d, 0xde29, 0x3a, 0x77, 0x65, 0x61, 0x72, 0x79, 0x3a, 0x77, 0x65, 0x61, -0x72, 0x79, 0xd83d, 0xde24, 0x3a, 0x74, 0x72, 0x69, 0x75, 0x6d, 0x70, 0x68, -0x3a, 0x74, 0x72, 0x69, 0x75, 0x6d, 0x70, 0x68, 0xd83d, 0xde20, 0x3a, 0x61, -0x6e, 0x67, 0x72, 0x79, 0x3a, 0x61, 0x6e, 0x67, 0x72, 0x79, 0xd83d, 0xde21, -0x3a, 0x72, 0x61, 0x67, 0x65, 0x3a, 0x72, 0x61, 0x67, 0x65, 0xd83d, 0xde36, -0x3a, 0x6e, 0x6f, 0x5f, 0x6d, 0x6f, 0x75, 0x74, 0x68, 0x3a, 0x6d, 0x6f, -0x75, 0x74, 0x68, 0x6e, 0x6f, 0xd83d, 0xde10, 0x3a, 0x6e, 0x65, 0x75, 0x74, -0x72, 0x61, 0x6c, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, -0x65, 0x6e, 0x65, 0x75, 0x74, 0x72, 0x61, 0x6c, 0xd83d, 0xde11, 0x3a, 0x65, -0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, -0x73, 0x3a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, -0x6c, 0x65, 0x73, 0x73, 0xd83d, 0xde2f, 0x3a, 0x68, 0x75, 0x73, 0x68, 0x65, -0x64, 0x3a, 0x68, 0x75, 0x73, 0x68, 0x65, 0x64, 0xd83d, 0xde26, 0x3a, 0x66, -0x72, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x72, 0x6f, 0x77, -0x6e, 0x69, 0x6e, 0x67, 0xd83d, 0xde27, 0x3a, 0x61, 0x6e, 0x67, 0x75, 0x69, -0x73, 0x68, 0x65, 0x64, 0x3a, 0x61, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, -0x65, 0x64, 0xd83d, 0xde2e, 0x3a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x6d, 0x6f, -0x75, 0x74, 0x68, 0x3a, 0x6d, 0x6f, 0x75, 0x74, 0x68, 0x6f, 0x70, 0x65, -0x6e, 0xd83d, 0xde32, 0x3a, 0x61, 0x73, 0x74, 0x6f, 0x6e, 0x69, 0x73, 0x68, -0x65, 0x64, 0x3a, 0x61, 0x73, 0x74, 0x6f, 0x6e, 0x69, 0x73, 0x68, 0x65, -0x64, 0xd83d, 0xde35, 0x3a, 0x64, 0x69, 0x7a, 0x7a, 0x79, 0x5f, 0x66, 0x61, -0x63, 0x65, 0x3a, 0x64, 0x69, 0x7a, 0x7a, 0x79, 0x66, 0x61, 0x63, 0x65, -0xd83d, 0xde33, 0x3a, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x64, 0x3a, 0x66, -0x6c, 0x75, 0x73, 0x68, 0x65, 0x64, 0xd83d, 0xde31, 0x3a, 0x73, 0x63, 0x72, -0x65, 0x61, 0x6d, 0x3a, 0x73, 0x63, 0x72, 0x65, 0x61, 0x6d, 0xd83d, 0xde28, -0x3a, 0x66, 0x65, 0x61, 0x72, 0x66, 0x75, 0x6c, 0x3a, 0x66, 0x65, 0x61, -0x72, 0x66, 0x75, 0x6c, 0xd83d, 0xde30, 0x3a, 0x63, 0x6f, 0x6c, 0x64, 0x5f, -0x73, 0x77, 0x65, 0x61, 0x74, 0x3a, 0x63, 0x6f, 0x6c, 0x64, 0x73, 0x77, -0x65, 0x61, 0x74, 0xd83d, 0xde22, 0x3a, 0x63, 0x72, 0x79, 0x3a, 0x63, 0x72, -0x79, 0xd83d, 0xde25, 0x3a, 0x64, 0x69, 0x73, 0x61, 0x70, 0x70, 0x6f, 0x69, -0x6e, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, -0x64, 0x3a, 0x64, 0x69, 0x73, 0x61, 0x70, 0x70, 0x6f, 0x69, 0x6e, 0x74, -0x65, 0x64, 0x72, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0xd83e, 0xdd24, -0x3a, 0x64, 0x72, 0x6f, 0x6f, 0x6c, 0x3a, 0x64, 0x72, 0x6f, 0x6f, 0x6c, -0xd83e, 0xdd24, 0x3a, 0x64, 0x72, 0x6f, 0x6f, 0x6c, 0x69, 0x6e, 0x67, 0x5f, -0x66, 0x61, 0x63, 0x65, 0x3a, 0x64, 0x72, 0x6f, 0x6f, 0x6c, 0x69, 0x6e, -0x67, 0x66, 0x61, 0x63, 0x65, 0xd83d, 0xde2d, 0x3a, 0x73, 0x6f, 0x62, 0x3a, -0x73, 0x6f, 0x62, 0xd83d, 0xde13, 0x3a, 0x73, 0x77, 0x65, 0x61, 0x74, 0x3a, -0x73, 0x77, 0x65, 0x61, 0x74, 0xd83d, 0xde2a, 0x3a, 0x73, 0x6c, 0x65, 0x65, -0x70, 0x79, 0x3a, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x79, 0xd83d, 0xde34, 0x3a, -0x73, 0x6c, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x3a, 0x73, 0x6c, 0x65, -0x65, 0x70, 0x69, 0x6e, 0x67, 0xd83d, 0xde44, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, -0x67, 0x5f, 0x65, 0x79, 0x65, 0x73, 0x3a, 0x65, 0x79, 0x65, 0x73, 0x66, -0x61, 0x63, 0x65, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x77, 0x69, -0x74, 0x68, 0xd83d, 0xde44, 0x3a, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, -0x5f, 0x65, 0x79, 0x65, 0x73, 0x3a, 0x65, 0x79, 0x65, 0x73, 0x72, 0x6f, -0x6c, 0x6c, 0x69, 0x6e, 0x67, 0xd83e, 0xdd14, 0x3a, 0x68, 0x6d, 0x6d, 0x3a, -0x68, 0x6d, 0x6d, 0xd83e, 0xdd14, 0x3a, 0x74, 0x68, 0x69, 0x6e, 0x6b, 0x69, -0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x74, 0x68, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0xd83e, 0xdd14, 0x3a, 0x74, -0x68, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x74, 0x68, 0x69, 0x6e, -0x6b, 0x69, 0x6e, 0x67, 0xd83e, 0xdd25, 0x3a, 0x6c, 0x69, 0x61, 0x72, 0x3a, -0x6c, 0x69, 0x61, 0x72, 0xd83e, 0xdd25, 0x3a, 0x6c, 0x79, 0x69, 0x6e, 0x67, -0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x6c, 0x79, -0x69, 0x6e, 0x67, 0xd83d, 0xde2c, 0x3a, 0x67, 0x72, 0x69, 0x6d, 0x61, 0x63, -0x69, 0x6e, 0x67, 0x3a, 0x67, 0x72, 0x69, 0x6d, 0x61, 0x63, 0x69, 0x6e, -0x67, 0xd83e, 0xdd10, 0x3a, 0x7a, 0x69, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x6d, -0x6f, 0x75, 0x74, 0x68, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, -0x63, 0x65, 0x6d, 0x6f, 0x75, 0x74, 0x68, 0x7a, 0x69, 0x70, 0x70, 0x65, -0x72, 0xd83e, 0xdd10, 0x3a, 0x7a, 0x69, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x6d, -0x6f, 0x75, 0x74, 0x68, 0x3a, 0x6d, 0x6f, 0x75, 0x74, 0x68, 0x7a, 0x69, -0x70, 0x70, 0x65, 0x72, 0xd83e, 0xdd22, 0x3a, 0x73, 0x69, 0x63, 0x6b, 0x3a, -0x73, 0x69, 0x63, 0x6b, 0xd83e, 0xdd22, 0x3a, 0x6e, 0x61, 0x75, 0x73, 0x65, -0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, -0x63, 0x65, 0x6e, 0x61, 0x75, 0x73, 0x65, 0x61, 0x74, 0x65, 0x64, 0xd83e, -0xdd27, 0x3a, 0x73, 0x6e, 0x65, 0x65, 0x7a, 0x65, 0x3a, 0x73, 0x6e, 0x65, -0x65, 0x7a, 0x65, 0xd83e, 0xdd27, 0x3a, 0x73, 0x6e, 0x65, 0x65, 0x7a, 0x69, -0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x73, 0x6e, 0x65, 0x65, 0x7a, 0x69, 0x6e, 0x67, 0xd83d, 0xde37, 0x3a, 0x6d, -0x61, 0x73, 0x6b, 0x3a, 0x6d, 0x61, 0x73, 0x6b, 0xd83e, 0xdd12, 0x3a, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x74, 0x68, 0x65, -0x72, 0x6d, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, 0x66, 0x61, 0x63, -0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, -0x77, 0x69, 0x74, 0x68, 0xd83e, 0xdd12, 0x3a, 0x74, 0x68, 0x65, 0x72, 0x6d, -0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, -0x66, 0x61, 0x63, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x6d, 0x65, -0x74, 0x65, 0x72, 0xd83e, 0xdd15, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6e, -0x64, 0x61, 0x67, 0x65, 0x3a, 0x62, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x65, -0x66, 0x61, 0x63, 0x65, 0x68, 0x65, 0x61, 0x64, 0x77, 0x69, 0x74, 0x68, -0xd83e, 0xdd15, 0x3a, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6e, 0x64, -0x61, 0x67, 0x65, 0x3a, 0x62, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x65, 0x68, -0x65, 0x61, 0x64, 0xd83d, 0xde08, 0x3a, 0x73, 0x6d, 0x69, 0x6c, 0x69, 0x6e, -0x67, 0x5f, 0x69, 0x6d, 0x70, 0x3a, 0x69, 0x6d, 0x70, 0x73, 0x6d, 0x69, -0x6c, 0x69, 0x6e, 0x67, 0xd83d, 0xdc7f, 0x3a, 0x69, 0x6d, 0x70, 0x3a, 0x69, -0x6d, 0x70, 0xd83d, 0xdc79, 0x3a, 0x6a, 0x61, 0x70, 0x61, 0x6e, 0x65, 0x73, -0x65, 0x5f, 0x6f, 0x67, 0x72, 0x65, 0x3a, 0x6a, 0x61, 0x70, 0x61, 0x6e, -0x65, 0x73, 0x65, 0x6f, 0x67, 0x72, 0x65, 0xd83d, 0xdc7a, 0x3a, 0x6a, 0x61, -0x70, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x5f, 0x67, 0x6f, 0x62, 0x6c, 0x69, -0x6e, 0x3a, 0x67, 0x6f, 0x62, 0x6c, 0x69, 0x6e, 0x6a, 0x61, 0x70, 0x61, -0x6e, 0x65, 0x73, 0x65, 0xd83d, 0xdca9, 0x3a, 0x70, 0x6f, 0x6f, 0x3a, 0x70, -0x6f, 0x6f, 0xd83d, 0xdca9, 0x3a, 0x68, 0x61, 0x6e, 0x6b, 0x65, 0x79, 0x3a, -0x68, 0x61, 0x6e, 0x6b, 0x65, 0x79, 0xd83d, 0xdca9, 0x3a, 0x73, 0x68, 0x69, -0x74, 0x3a, 0x73, 0x68, 0x69, 0x74, 0xd83d, 0xdca9, 0x3a, 0x70, 0x6f, 0x6f, -0x70, 0x3a, 0x70, 0x6f, 0x6f, 0x70, 0xd83d, 0xdc7b, 0x3a, 0x67, 0x68, 0x6f, -0x73, 0x74, 0x3a, 0x67, 0x68, 0x6f, 0x73, 0x74, 0xd83d, 0xdc80, 0x3a, 0x73, -0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x3a, 0x73, 0x6b, 0x65, 0x6c, -0x65, 0x74, 0x6f, 0x6e, 0xd83d, 0xdc80, 0x3a, 0x73, 0x6b, 0x75, 0x6c, 0x6c, -0x3a, 0x73, 0x6b, 0x75, 0x6c, 0x6c, 0x2620, 0xfe0f, 0x3a, 0x73, 0x6b, 0x75, -0x6c, 0x6c, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, -0x62, 0x6f, 0x6e, 0x65, 0x73, 0x3a, 0x61, 0x6e, 0x64, 0x63, 0x72, 0x6f, -0x73, 0x73, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x73, 0x6b, 0x75, 0x6c, 0x6c, -0x2620, 0xfe0f, 0x3a, 0x73, 0x6b, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x72, 0x6f, -0x73, 0x73, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x3a, 0x63, 0x72, 0x6f, 0x73, -0x73, 0x62, 0x6f, 0x6e, 0x65, 0x73, 0x73, 0x6b, 0x75, 0x6c, 0x6c, 0xd83d, -0xdc7d, 0x3a, 0x61, 0x6c, 0x69, 0x65, 0x6e, 0x3a, 0x61, 0x6c, 0x69, 0x65, -0x6e, 0xd83d, 0xdc7e, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6e, -0x76, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x69, 0x6e, 0x76, 0x61, 0x64, 0x65, -0x72, 0x73, 0x70, 0x61, 0x63, 0x65, 0xd83e, 0xdd16, 0x3a, 0x72, 0x6f, 0x62, -0x6f, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x72, 0x6f, 0x62, 0x6f, 0x74, 0xd83e, 0xdd16, 0x3a, 0x72, 0x6f, 0x62, 0x6f, -0x74, 0x3a, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0xd83c, 0xdf83, 0x3a, 0x6a, 0x61, -0x63, 0x6b, 0x5f, 0x6f, 0x5f, 0x6c, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x6e, -0x3a, 0x6a, 0x61, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x6e, -0x6f, 0xd83d, 0xde3a, 0x3a, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x79, 0x5f, 0x63, -0x61, 0x74, 0x3a, 0x63, 0x61, 0x74, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x79, -0xd83d, 0xde38, 0x3a, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x74, -0x3a, 0x63, 0x61, 0x74, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0xd83d, 0xde39, 0x3a, -0x6a, 0x6f, 0x79, 0x5f, 0x63, 0x61, 0x74, 0x3a, 0x63, 0x61, 0x74, 0x6a, -0x6f, 0x79, 0xd83d, 0xde3b, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x65, -0x79, 0x65, 0x73, 0x5f, 0x63, 0x61, 0x74, 0x3a, 0x63, 0x61, 0x74, 0x65, -0x79, 0x65, 0x73, 0x68, 0x65, 0x61, 0x72, 0x74, 0xd83d, 0xde3c, 0x3a, 0x73, -0x6d, 0x69, 0x72, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x3a, 0x63, 0x61, 0x74, -0x73, 0x6d, 0x69, 0x72, 0x6b, 0xd83d, 0xde3d, 0x3a, 0x6b, 0x69, 0x73, 0x73, -0x69, 0x6e, 0x67, 0x5f, 0x63, 0x61, 0x74, 0x3a, 0x63, 0x61, 0x74, 0x6b, -0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0xd83d, 0xde40, 0x3a, 0x73, 0x63, 0x72, -0x65, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x74, 0x3a, 0x63, 0x61, 0x74, 0x73, -0x63, 0x72, 0x65, 0x61, 0x6d, 0xd83d, 0xde3f, 0x3a, 0x63, 0x72, 0x79, 0x69, -0x6e, 0x67, 0x5f, 0x63, 0x61, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, -0x63, 0x61, 0x74, 0x63, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x66, 0x61, 0x63, -0x65, 0xd83d, 0xde3e, 0x3a, 0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, -0x63, 0x61, 0x74, 0x3a, 0x63, 0x61, 0x74, 0x70, 0x6f, 0x75, 0x74, 0x69, -0x6e, 0x67, 0xd83d, 0xdc50, 0x3a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x68, 0x61, -0x6e, 0x64, 0x73, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x6f, 0x70, 0x65, -0x6e, 0xd83d, 0xde4c, 0x3a, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x68, -0x61, 0x6e, 0x64, 0x73, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x72, 0x61, -0x69, 0x73, 0x65, 0x64, 0xd83d, 0xdc4f, 0x3a, 0x63, 0x6c, 0x61, 0x70, 0x3a, -0x63, 0x6c, 0x61, 0x70, 0xd83d, 0xde4f, 0x3a, 0x70, 0x72, 0x61, 0x79, 0x3a, -0x70, 0x72, 0x61, 0x79, 0xd83e, 0xdd1d, 0x3a, 0x73, 0x68, 0x61, 0x6b, 0x69, -0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x68, 0x61, 0x6e, -0x64, 0x73, 0x73, 0x68, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0xd83e, 0xdd1d, 0x3a, -0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x68, 0x61, -0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0xd83d, 0xdc4d, 0x3a, 0x6c, 0x69, -0x6b, 0x65, 0x3a, 0x6c, 0x69, 0x6b, 0x65, 0xd83d, 0xdc4d, 0x3a, 0x74, 0x68, -0x75, 0x6d, 0x62, 0x75, 0x70, 0x3a, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x75, -0x70, 0xd83d, 0xdc4d, 0x3a, 0x2b, 0x31, 0x3a, 0x2b, 0x31, 0xd83d, 0xdc4d, 0x3a, -0x74, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x75, 0x70, 0x3a, 0x74, 0x68, 0x75, -0x6d, 0x62, 0x73, 0x75, 0x70, 0xd83d, 0xdc4e, 0x3a, 0x64, 0x69, 0x73, 0x6c, -0x69, 0x6b, 0x65, 0x3a, 0x64, 0x69, 0x73, 0x6c, 0x69, 0x6b, 0x65, 0xd83d, -0xdc4e, 0x3a, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x64, 0x6f, 0x77, 0x6e, 0x3a, -0x74, 0x68, 0x75, 0x6d, 0x62, 0x64, 0x6f, 0x77, 0x6e, 0xd83d, 0xdc4e, 0x3a, -0x2d, 0x31, 0x3a, 0x2d, 0x31, 0xd83d, 0xdc4e, 0x3a, 0x74, 0x68, 0x75, 0x6d, -0x62, 0x73, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x74, 0x68, 0x75, 0x6d, 0x62, -0x73, 0x64, 0x6f, 0x77, 0x6e, 0xd83d, 0xdc4a, 0x3a, 0x70, 0x75, 0x6e, 0x63, -0x68, 0x3a, 0x70, 0x75, 0x6e, 0x63, 0x68, 0x270a, 0xfe0f, 0x3a, 0x66, 0x69, -0x73, 0x74, 0x3a, 0x66, 0x69, 0x73, 0x74, 0xd83e, 0xdd1b, 0x3a, 0x6c, 0x65, -0x66, 0x74, 0x5f, 0x66, 0x69, 0x73, 0x74, 0x3a, 0x66, 0x69, 0x73, 0x74, -0x6c, 0x65, 0x66, 0x74, 0xd83e, 0xdd1b, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x5f, -0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x73, 0x74, 0x3a, -0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x66, 0x69, 0x73, 0x74, 0x6c, 0x65, -0x66, 0x74, 0xd83e, 0xdd1c, 0x3a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, -0x69, 0x73, 0x74, 0x3a, 0x66, 0x69, 0x73, 0x74, 0x72, 0x69, 0x67, 0x68, -0x74, 0xd83e, 0xdd1c, 0x3a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x66, 0x61, -0x63, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x73, 0x74, 0x3a, 0x66, 0x61, -0x63, 0x69, 0x6e, 0x67, 0x66, 0x69, 0x73, 0x74, 0x72, 0x69, 0x67, 0x68, -0x74, 0xd83e, 0xdd1e, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x5f, 0x77, 0x69, 0x74, -0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x61, 0x6e, 0x64, 0x5f, -0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, -0x72, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, 0x3a, 0x61, 0x6e, -0x64, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, 0x66, 0x69, 0x6e, 0x67, -0x65, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x6d, -0x69, 0x64, 0x64, 0x6c, 0x65, 0x77, 0x69, 0x74, 0x68, 0xd83e, 0xdd1e, 0x3a, -0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x72, 0x6f, 0x73, -0x73, 0x65, 0x64, 0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, 0x66, -0x69, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x270c, 0xfe0f, 0x3a, 0x76, 0x3a, 0x76, -0xd83e, 0xdd18, 0x3a, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x74, -0x68, 0x65, 0x5f, 0x68, 0x6f, 0x72, 0x6e, 0x73, 0x3a, 0x68, 0x6f, 0x72, -0x6e, 0x73, 0x6f, 0x66, 0x73, 0x69, 0x67, 0x6e, 0x74, 0x68, 0x65, 0xd83e, -0xdd18, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3a, 0x6d, 0x65, 0x74, 0x61, -0x6c, 0xd83d, 0xdc4c, 0x3a, 0x6f, 0x6b, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x3a, -0x68, 0x61, 0x6e, 0x64, 0x6f, 0x6b, 0xd83d, 0xdc48, 0x3a, 0x70, 0x6f, 0x69, -0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, -0x70, 0x6f, 0x69, 0x6e, 0x74, 0xd83d, 0xdc49, 0x3a, 0x70, 0x6f, 0x69, 0x6e, -0x74, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x70, 0x6f, 0x69, 0x6e, -0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0xd83d, 0xdc46, 0x3a, 0x70, 0x6f, 0x69, -0x6e, 0x74, 0x5f, 0x75, 0x70, 0x5f, 0x32, 0x3a, 0x32, 0x70, 0x6f, 0x69, -0x6e, 0x74, 0x75, 0x70, 0xd83d, 0xdc47, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, -0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x64, 0x6f, 0x77, 0x6e, 0x70, 0x6f, -0x69, 0x6e, 0x74, 0x261d, 0xfe0f, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, -0x75, 0x70, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x75, 0x70, 0x270b, 0xfe0f, -0x3a, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, -0x3a, 0x68, 0x61, 0x6e, 0x64, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0xd83e, -0xdd1a, 0x3a, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x6f, 0x66, 0x5f, 0x68, 0x61, -0x6e, 0x64, 0x3a, 0x62, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x6e, 0x64, 0x6f, -0x66, 0xd83e, 0xdd1a, 0x3a, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x62, -0x61, 0x63, 0x6b, 0x5f, 0x6f, 0x66, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x3a, -0x62, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x6e, 0x64, 0x6f, 0x66, 0x72, 0x61, -0x69, 0x73, 0x65, 0x64, 0xd83d, 0xdd90, 0x3a, 0x72, 0x61, 0x69, 0x73, 0x65, -0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, -0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x70, 0x6c, 0x61, -0x79, 0x65, 0x64, 0x3a, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x68, -0x61, 0x6e, 0x64, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x73, 0x70, 0x6c, -0x61, 0x79, 0x65, 0x64, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdd90, 0x3a, 0x68, -0x61, 0x6e, 0x64, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x3a, -0x68, 0x61, 0x6e, 0x64, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0xd83d, -0xdd96, 0x3a, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x6e, -0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, -0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x5f, 0x6d, 0x69, 0x64, 0x64, -0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x5f, -0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x3a, 0x61, 0x6e, 0x64, 0x62, -0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, -0x73, 0x68, 0x61, 0x6e, 0x64, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x70, -0x61, 0x72, 0x74, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x72, 0x69, 0x6e, -0x67, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdd96, 0x3a, 0x76, 0x75, 0x6c, 0x63, -0x61, 0x6e, 0x3a, 0x76, 0x75, 0x6c, 0x63, 0x61, 0x6e, 0xd83d, 0xdc4b, 0x3a, -0x77, 0x61, 0x76, 0x65, 0x3a, 0x77, 0x61, 0x76, 0x65, 0xd83e, 0xdd19, 0x3a, -0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, -0x3a, 0x63, 0x61, 0x6c, 0x6c, 0x68, 0x61, 0x6e, 0x64, 0x6d, 0x65, 0xd83e, -0xdd19, 0x3a, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x65, 0x3a, 0x63, 0x61, -0x6c, 0x6c, 0x6d, 0x65, 0xd83d, 0xdcaa, 0x3a, 0x6d, 0x75, 0x73, 0x63, 0x6c, -0x65, 0x3a, 0x6d, 0x75, 0x73, 0x63, 0x6c, 0x65, 0xd83d, 0xdd95, 0x3a, 0x72, -0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, -0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, -0x6e, 0x64, 0x65, 0x64, 0x3a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, -0x64, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x6d, -0x69, 0x64, 0x64, 0x6c, 0x65, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, -0x64, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdd95, 0x3a, 0x6d, 0x69, 0x64, 0x64, -0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x66, 0x69, -0x6e, 0x67, 0x65, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x270d, 0xfe0f, -0x3a, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, -0x64, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, -0x67, 0xd83e, 0xdd33, 0x3a, 0x73, 0x65, 0x6c, 0x66, 0x69, 0x65, 0x3a, 0x73, -0x65, 0x6c, 0x66, 0x69, 0x65, 0xd83d, 0xdc85, 0x3a, 0x6e, 0x61, 0x69, 0x6c, -0x5f, 0x63, 0x61, 0x72, 0x65, 0x3a, 0x63, 0x61, 0x72, 0x65, 0x6e, 0x61, -0x69, 0x6c, 0xd83d, 0xdc8d, 0x3a, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x72, 0x69, -0x6e, 0x67, 0xd83d, 0xdc84, 0x3a, 0x6c, 0x69, 0x70, 0x73, 0x74, 0x69, 0x63, -0x6b, 0x3a, 0x6c, 0x69, 0x70, 0x73, 0x74, 0x69, 0x63, 0x6b, 0xd83d, 0xdc8b, -0x3a, 0x6b, 0x69, 0x73, 0x73, 0x3a, 0x6b, 0x69, 0x73, 0x73, 0xd83d, 0xdc44, -0x3a, 0x6c, 0x69, 0x70, 0x73, 0x3a, 0x6c, 0x69, 0x70, 0x73, 0xd83d, 0xdc45, -0x3a, 0x74, 0x6f, 0x6e, 0x67, 0x75, 0x65, 0x3a, 0x74, 0x6f, 0x6e, 0x67, -0x75, 0x65, 0xd83d, 0xdc42, 0x3a, 0x65, 0x61, 0x72, 0x3a, 0x65, 0x61, 0x72, -0xd83d, 0xdc43, 0x3a, 0x6e, 0x6f, 0x73, 0x65, 0x3a, 0x6e, 0x6f, 0x73, 0x65, -0xd83d, 0xdc63, 0x3a, 0x66, 0x6f, 0x6f, 0x74, 0x70, 0x72, 0x69, 0x6e, 0x74, -0x73, 0x3a, 0x66, 0x6f, 0x6f, 0x74, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, -0xd83d, 0xdc41, 0x3a, 0x65, 0x79, 0x65, 0x3a, 0x65, 0x79, 0x65, 0xd83d, 0xdc40, -0x3a, 0x65, 0x79, 0x65, 0x73, 0x3a, 0x65, 0x79, 0x65, 0x73, 0xd83d, 0xdde3, -0x3a, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, -0x61, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x6c, 0x68, 0x6f, 0x75, -0x65, 0x74, 0x74, 0x65, 0x3a, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x73, -0x69, 0x6c, 0x68, 0x6f, 0x75, 0x65, 0x74, 0x74, 0x65, 0x73, 0x70, 0x65, -0x61, 0x6b, 0x69, 0x6e, 0x67, 0xd83d, 0xdde3, 0x3a, 0x73, 0x70, 0x65, 0x61, -0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x3a, 0x68, 0x65, -0x61, 0x64, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0xd83d, 0xdc64, -0x3a, 0x62, 0x75, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x6c, -0x68, 0x6f, 0x75, 0x65, 0x74, 0x74, 0x65, 0x3a, 0x62, 0x75, 0x73, 0x74, -0x69, 0x6e, 0x73, 0x69, 0x6c, 0x68, 0x6f, 0x75, 0x65, 0x74, 0x74, 0x65, -0xd83d, 0xdc65, 0x3a, 0x62, 0x75, 0x73, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x5f, -0x73, 0x69, 0x6c, 0x68, 0x6f, 0x75, 0x65, 0x74, 0x74, 0x65, 0x3a, 0x62, -0x75, 0x73, 0x74, 0x73, 0x69, 0x6e, 0x73, 0x69, 0x6c, 0x68, 0x6f, 0x75, -0x65, 0x74, 0x74, 0x65, 0xd83d, 0xdc76, 0x3a, 0x62, 0x61, 0x62, 0x79, 0x3a, -0x62, 0x61, 0x62, 0x79, 0xd83d, 0xdc66, 0x3a, 0x62, 0x6f, 0x79, 0x3a, 0x62, -0x6f, 0x79, 0xd83d, 0xdc67, 0x3a, 0x67, 0x69, 0x72, 0x6c, 0x3a, 0x67, 0x69, -0x72, 0x6c, 0xd83d, 0xdc68, 0x3a, 0x6d, 0x61, 0x6e, 0x3a, 0x6d, 0x61, 0x6e, -0xd83d, 0xdc69, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x3a, 0x77, 0x6f, 0x6d, -0x61, 0x6e, 0xd83d, 0xdc71, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x62, 0x6c, 0x6f, 0x6e, -0x64, 0x2d, 0x68, 0x61, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x6d, -0x61, 0x6e, 0x3a, 0x62, 0x6c, 0x6f, 0x6e, 0x64, 0x68, 0x61, 0x69, 0x72, -0x65, 0x64, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc71, 0x3a, 0x62, 0x6c, -0x6f, 0x6e, 0x64, 0x2d, 0x68, 0x61, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, -0x61, 0x6e, 0x3a, 0x62, 0x6c, 0x6f, 0x6e, 0x64, 0x68, 0x61, 0x69, 0x72, -0x65, 0x64, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc71, 0x3a, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x6e, -0x64, 0x5f, 0x68, 0x61, 0x69, 0x72, 0x3a, 0x62, 0x6c, 0x6f, 0x6e, 0x64, -0x68, 0x61, 0x69, 0x72, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x77, 0x69, -0x74, 0x68, 0xd83d, 0xdc71, 0x3a, 0x62, 0x6c, 0x6f, 0x6e, 0x64, 0x5f, 0x68, -0x61, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x3a, 0x62, 0x6c, 0x6f, 0x6e, 0x64, 0x68, 0x61, 0x69, 0x72, 0x65, 0x64, -0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83d, 0xdc74, 0x3a, 0x6f, 0x6c, 0x64, -0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x3a, 0x6d, 0x61, 0x6e, 0x6f, 0x6c, -0x64, 0x65, 0x72, 0xd83d, 0xdc75, 0x3a, 0x67, 0x72, 0x61, 0x6e, 0x64, 0x6d, -0x61, 0x3a, 0x67, 0x72, 0x61, 0x6e, 0x64, 0x6d, 0x61, 0xd83d, 0xdc75, 0x3a, -0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x3a, -0x6f, 0x6c, 0x64, 0x65, 0x72, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc72, -0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x67, 0x75, -0x61, 0x5f, 0x70, 0x69, 0x5f, 0x6d, 0x61, 0x6f, 0x3a, 0x67, 0x75, 0x61, -0x6d, 0x61, 0x6e, 0x6d, 0x61, 0x6f, 0x70, 0x69, 0x77, 0x69, 0x74, 0x68, -0xd83d, 0xdc72, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, -0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x3a, -0x63, 0x61, 0x70, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x65, 0x6d, 0x61, -0x6e, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdc73, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x77, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, -0x5f, 0x74, 0x75, 0x72, 0x62, 0x61, 0x6e, 0x3a, 0x74, 0x75, 0x72, 0x62, -0x61, 0x6e, 0x77, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, -0x61, 0x6e, 0xd83d, 0xdc73, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x77, 0x65, 0x61, -0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x75, 0x72, 0x62, 0x61, 0x6e, 0x3a, -0x6d, 0x61, 0x6e, 0x74, 0x75, 0x72, 0x62, 0x61, 0x6e, 0x77, 0x65, 0x61, -0x72, 0x69, 0x6e, 0x67, 0xd83d, 0xdc73, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x74, 0x75, 0x72, 0x62, 0x61, 0x6e, 0x3a, 0x6d, -0x61, 0x6e, 0x74, 0x75, 0x72, 0x62, 0x61, 0x6e, 0x77, 0x69, 0x74, 0x68, -0xd83d, 0xdc73, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x77, 0x65, -0x61, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x75, 0x72, 0x62, 0x61, 0x6e, -0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x74, 0x75, 0x72, 0x62, 0x61, -0x6e, 0x77, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0xd83d, 0xdc6e, 0x200d, 0x2640, -0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, -0x63, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x72, 0x3a, 0x6f, -0x66, 0x66, 0x69, 0x63, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x65, -0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc6e, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, -0x70, 0x6f, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x69, 0x63, -0x65, 0x72, 0x3a, 0x6d, 0x61, 0x6e, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, -0x72, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x65, 0xd83d, 0xdc6e, 0x3a, 0x63, 0x6f, -0x70, 0x3a, 0x63, 0x6f, 0x70, 0xd83d, 0xdc6e, 0x3a, 0x70, 0x6f, 0x6c, 0x69, -0x63, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x72, 0x3a, 0x6f, -0x66, 0x66, 0x69, 0x63, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x65, -0xd83d, 0xdc77, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, -0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x63, 0x6f, 0x6e, 0x73, -0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0xd83d, 0xdc77, 0x3a, 0x6d, 0x61, -0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, -0x6f, 0x6e, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x63, 0x6f, -0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, -0x6e, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0xd83d, 0xdc77, 0x3a, 0x63, 0x6f, -0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, -0x6f, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, -0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, -0xd83d, 0xdc82, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, -0x67, 0x75, 0x61, 0x72, 0x64, 0x3a, 0x67, 0x75, 0x61, 0x72, 0x64, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc82, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x67, -0x75, 0x61, 0x72, 0x64, 0x3a, 0x67, 0x75, 0x61, 0x72, 0x64, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc82, 0x3a, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x6d, 0x61, -0x6e, 0x3a, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x6d, 0x61, 0x6e, 0xd83d, -0xdc82, 0x3a, 0x67, 0x75, 0x61, 0x72, 0x64, 0x3a, 0x67, 0x75, 0x61, 0x72, -0x64, 0xd83d, 0xdd75, 0xfe0f, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, -0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x77, 0x6f, 0x6d, -0x61, 0x6e, 0xd83d, 0xdd75, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x64, 0x65, -0x74, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x64, 0x65, 0x74, 0x65, -0x63, 0x74, 0x69, 0x76, 0x65, 0x6d, 0x61, 0x6e, 0xd83d, 0xdd75, 0xfe0f, 0x3a, -0x73, 0x6c, 0x65, 0x75, 0x74, 0x68, 0x5f, 0x6f, 0x72, 0x5f, 0x73, 0x70, -0x79, 0x3a, 0x6f, 0x72, 0x73, 0x6c, 0x65, 0x75, 0x74, 0x68, 0x73, 0x70, -0x79, 0xd83d, 0xdd75, 0xfe0f, 0x3a, 0x73, 0x70, 0x79, 0x3a, 0x73, 0x70, 0x79, -0xd83d, 0xdd75, 0xfe0f, 0x3a, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x76, -0x65, 0x3a, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0xd83d, -0xdc69, 0x200d, 0x2695, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x68, -0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, -0x3a, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0xd83d, 0xdc68, 0x200d, 0x2695, 0xfe0f, 0x3a, -0x6d, 0x61, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x77, -0x6f, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, -0x6d, 0x61, 0x6e, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0xd83d, 0xdc69, 0x200d, -0xd83c, 0xdf3e, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x66, 0x61, 0x72, -0x6d, 0x65, 0x72, 0x3a, 0x66, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x77, 0x6f, -0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83c, 0xdf3e, 0x3a, 0x6d, 0x61, 0x6e, -0x5f, 0x66, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x3a, 0x66, 0x61, 0x72, 0x6d, -0x65, 0x72, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, 0xd83c, 0xdf73, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x3a, 0x63, 0x6f, -0x6f, 0x6b, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83c, 0xdf73, -0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x3a, 0x63, 0x6f, -0x6f, 0x6b, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, 0xd83c, 0xdf93, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, -0x3a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83c, 0xdf93, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x73, -0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x3a, 0x6d, 0x61, 0x6e, 0x73, 0x74, -0x75, 0x64, 0x65, 0x6e, 0x74, 0xd83d, 0xdc69, 0x200d, 0xd83c, 0xdfa4, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x3a, -0x73, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, -0xdc68, 0x200d, 0xd83c, 0xdfa4, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x73, 0x69, 0x6e, -0x67, 0x65, 0x72, 0x3a, 0x6d, 0x61, 0x6e, 0x73, 0x69, 0x6e, 0x67, 0x65, -0x72, 0xd83d, 0xdc69, 0x200d, 0xd83c, 0xdfeb, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x5f, 0x74, 0x65, 0x61, 0x63, 0x68, 0x65, 0x72, 0x3a, 0x74, 0x65, 0x61, -0x63, 0x68, 0x65, 0x72, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, -0xd83c, 0xdfeb, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x74, 0x65, 0x61, 0x63, 0x68, -0x65, 0x72, 0x3a, 0x6d, 0x61, 0x6e, 0x74, 0x65, 0x61, 0x63, 0x68, 0x65, -0x72, 0xd83d, 0xdc69, 0x200d, 0xd83c, 0xdfed, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x77, 0x6f, 0x72, -0x6b, 0x65, 0x72, 0x3a, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0xd83d, 0xdc68, -0x200d, 0xd83c, 0xdfed, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, -0x6f, 0x72, 0x79, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x66, -0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x6d, 0x61, 0x6e, 0x77, 0x6f, 0x72, -0x6b, 0x65, 0x72, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdcbb, 0x3a, 0x77, 0x6f, 0x6d, -0x61, 0x6e, 0x5f, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, -0x69, 0x73, 0x74, 0x3a, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, -0x67, 0x69, 0x73, 0x74, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, -0xd83d, 0xdcbb, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x74, 0x65, 0x63, 0x68, 0x6e, -0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x73, 0x74, 0x3a, 0x6d, 0x61, 0x6e, 0x74, -0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x73, 0x74, 0xd83d, -0xdc69, 0x200d, 0xd83d, 0xdcbc, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x6f, -0x66, 0x66, 0x69, 0x63, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, -0x3a, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdcbc, 0x3a, -0x6d, 0x61, 0x6e, 0x5f, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x5f, 0x77, -0x6f, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6d, 0x61, 0x6e, 0x6f, 0x66, 0x66, -0x69, 0x63, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0xd83d, 0xdc69, 0x200d, -0xd83d, 0xdd27, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x6d, 0x65, 0x63, -0x68, 0x61, 0x6e, 0x69, 0x63, 0x3a, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, -0x69, 0x63, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdd27, -0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, -0x63, 0x3a, 0x6d, 0x61, 0x6e, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, -0x63, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdd2c, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x5f, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73, 0x74, 0x3a, 0x73, -0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73, 0x74, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdd2c, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x73, -0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73, 0x74, 0x3a, 0x6d, 0x61, 0x6e, -0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73, 0x74, 0xd83d, 0xdc69, 0x200d, -0xd83c, 0xdfa8, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x61, 0x72, 0x74, -0x69, 0x73, 0x74, 0x3a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x77, 0x6f, -0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83c, 0xdfa8, 0x3a, 0x6d, 0x61, 0x6e, -0x5f, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x3a, 0x61, 0x72, 0x74, 0x69, -0x73, 0x74, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xde92, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x66, 0x69, 0x72, 0x65, 0x66, 0x69, 0x67, -0x68, 0x74, 0x65, 0x72, 0x3a, 0x66, 0x69, 0x72, 0x65, 0x66, 0x69, 0x67, -0x68, 0x74, 0x65, 0x72, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, -0xd83d, 0xde92, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x66, 0x69, 0x72, 0x65, 0x66, -0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x3a, 0x66, 0x69, 0x72, 0x65, 0x66, -0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, -0x2708, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x70, 0x69, 0x6c, -0x6f, 0x74, 0x3a, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc68, 0x200d, 0x2708, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x70, -0x69, 0x6c, 0x6f, 0x74, 0x3a, 0x6d, 0x61, 0x6e, 0x70, 0x69, 0x6c, 0x6f, -0x74, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xde80, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x5f, 0x61, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x3a, 0x61, -0x73, 0x74, 0x72, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xde80, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x61, -0x73, 0x74, 0x72, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x3a, 0x61, 0x73, 0x74, -0x72, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, -0x2696, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x6a, 0x75, 0x64, -0x67, 0x65, 0x3a, 0x6a, 0x75, 0x64, 0x67, 0x65, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc68, 0x200d, 0x2696, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x6a, -0x75, 0x64, 0x67, 0x65, 0x3a, 0x6a, 0x75, 0x64, 0x67, 0x65, 0x6d, 0x61, -0x6e, 0xd83e, 0xdd36, 0x3a, 0x6d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, -0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x3a, 0x63, 0x68, 0x72, -0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x6d, 0x6f, 0x74, 0x68, 0x65, 0x72, -0xd83e, 0xdd36, 0x3a, 0x6d, 0x72, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x75, 0x73, -0x3a, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x6d, 0x72, 0x73, 0xd83c, 0xdf85, 0x3a, -0x73, 0x61, 0x6e, 0x74, 0x61, 0x3a, 0x73, 0x61, 0x6e, 0x74, 0x61, 0xd83d, -0xdc78, 0x3a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x70, -0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x73, 0xd83e, 0xdd34, 0x3a, 0x70, 0x72, -0x69, 0x6e, 0x63, 0x65, 0x3a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x65, 0xd83d, -0xdc70, 0x3a, 0x62, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, -0x5f, 0x76, 0x65, 0x69, 0x6c, 0x3a, 0x62, 0x72, 0x69, 0x64, 0x65, 0x76, -0x65, 0x69, 0x6c, 0x77, 0x69, 0x74, 0x68, 0xd83e, 0xdd35, 0x3a, 0x6d, 0x61, -0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x75, 0x78, 0x65, 0x64, 0x6f, 0x3a, -0x69, 0x6e, 0x6d, 0x61, 0x6e, 0x74, 0x75, 0x78, 0x65, 0x64, 0x6f, 0xd83d, -0xdc7c, 0x3a, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x3a, 0x61, 0x6e, 0x67, 0x65, -0x6c, 0xd83e, 0xdd30, 0x3a, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6e, -0x67, 0x5f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x3a, 0x65, 0x78, 0x70, 0x65, -0x63, 0x74, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83e, 0xdd30, -0x3a, 0x70, 0x72, 0x65, 0x67, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x77, 0x6f, -0x6d, 0x61, 0x6e, 0x3a, 0x70, 0x72, 0x65, 0x67, 0x6e, 0x61, 0x6e, 0x74, -0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xde47, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x62, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x3a, -0x62, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, -0xde47, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x62, 0x6f, 0x77, 0x69, 0x6e, 0x67, -0x3a, 0x62, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0xd83d, 0xde47, -0x3a, 0x62, 0x6f, 0x77, 0x3a, 0x62, 0x6f, 0x77, 0xd83d, 0xde47, 0x3a, 0x70, -0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x62, 0x6f, 0x77, 0x69, 0x6e, 0x67, -0x3a, 0x62, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x73, 0x6f, -0x6e, 0xd83d, 0xdc81, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x74, 0x69, -0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x3a, 0x68, -0x61, 0x6e, 0x64, 0x74, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x77, 0x6f, -0x6d, 0x61, 0x6e, 0xd83d, 0xdc81, 0x3a, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, -0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x5f, 0x70, -0x65, 0x72, 0x73, 0x6f, 0x6e, 0x3a, 0x64, 0x65, 0x73, 0x6b, 0x69, 0x6e, -0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x65, 0x72, -0x73, 0x6f, 0x6e, 0xd83d, 0xdc81, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x5f, 0x74, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, -0x64, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x74, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0xd83d, 0xdc81, 0x200d, 0x2642, 0xfe0f, -0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, -0x5f, 0x68, 0x61, 0x6e, 0x64, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x6d, 0x61, -0x6e, 0x74, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0xd83d, 0xde45, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x69, -0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x3a, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, -0x69, 0x6e, 0x67, 0x6e, 0x6f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xde45, -0x3a, 0x6e, 0x6f, 0x5f, 0x67, 0x6f, 0x6f, 0x64, 0x3a, 0x67, 0x6f, 0x6f, -0x64, 0x6e, 0x6f, 0xd83d, 0xde45, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x5f, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6e, -0x6f, 0x3a, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x6e, -0x6f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83d, 0xde45, 0x200d, 0x2642, 0xfe0f, -0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x69, -0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x3a, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, -0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x6e, 0x6f, 0xd83d, 0xde46, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x69, -0x6e, 0x67, 0x5f, 0x6f, 0x6b, 0x3a, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, -0x69, 0x6e, 0x67, 0x6f, 0x6b, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xde46, -0x3a, 0x6f, 0x6b, 0x5f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x3a, 0x6f, 0x6b, -0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xde46, 0x3a, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0x5f, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, -0x5f, 0x6f, 0x6b, 0x3a, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x69, 0x6e, -0x67, 0x6f, 0x6b, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83d, 0xde46, 0x200d, -0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x65, 0x73, 0x74, 0x75, -0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6b, 0x3a, 0x67, 0x65, 0x73, 0x74, -0x75, 0x72, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x6f, 0x6b, 0xd83d, 0xde4b, -0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x61, 0x69, 0x73, 0x69, -0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x3a, 0x68, 0x61, 0x6e, 0x64, -0x72, 0x61, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0xd83d, 0xde4b, 0x3a, 0x72, 0x61, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x68, -0x61, 0x6e, 0x64, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x72, 0x61, 0x69, 0x73, -0x69, 0x6e, 0x67, 0xd83d, 0xde4b, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x5f, 0x72, 0x61, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, -0x64, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x72, 0x61, 0x69, 0x73, 0x69, 0x6e, 0x67, 0xd83d, 0xde4b, 0x200d, 0x2642, 0xfe0f, -0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x61, 0x69, 0x73, 0x69, 0x6e, 0x67, -0x5f, 0x68, 0x61, 0x6e, 0x64, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x6d, 0x61, -0x6e, 0x72, 0x61, 0x69, 0x73, 0x69, 0x6e, 0x67, 0xd83e, 0xdd26, 0x200d, 0x2640, -0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x65, -0x70, 0x61, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x70, 0x61, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0xd83e, 0xdd26, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x66, 0x61, -0x63, 0x65, 0x70, 0x61, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x61, -0x63, 0x65, 0x70, 0x61, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, -0xd83e, 0xdd26, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x70, 0x61, -0x6c, 0x6d, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x70, 0x61, 0x6c, 0x6d, 0xd83e, -0xdd26, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, -0x6c, 0x6d, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x70, 0x61, 0x6c, 0x6d, 0xd83e, -0xdd26, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, -0x66, 0x61, 0x63, 0x65, 0x70, 0x61, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x3a, -0x66, 0x61, 0x63, 0x65, 0x70, 0x61, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x70, -0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83e, 0xdd37, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x73, 0x68, 0x72, 0x75, 0x67, 0x67, 0x69, -0x6e, 0x67, 0x3a, 0x73, 0x68, 0x72, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, -0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83e, 0xdd37, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x73, -0x68, 0x72, 0x75, 0x67, 0x3a, 0x73, 0x68, 0x72, 0x75, 0x67, 0xd83e, 0xdd37, -0x200d, 0x2640, 0xfe0f, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x73, -0x68, 0x72, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x3a, 0x70, 0x65, 0x72, -0x73, 0x6f, 0x6e, 0x73, 0x68, 0x72, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, -0xd83e, 0xdd37, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x73, 0x68, -0x72, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x3a, 0x6d, 0x61, 0x6e, 0x73, -0x68, 0x72, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0xd83d, 0xde4e, 0x3a, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, -0x3a, 0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83d, 0xde4e, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, -0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x70, 0x65, 0x72, -0x73, 0x6f, 0x6e, 0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x77, 0x69, -0x74, 0x68, 0xd83d, 0xde4e, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, -0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x3a, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0xd83d, 0xde4e, 0x200d, -0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x75, 0x74, 0x69, -0x6e, 0x67, 0x3a, 0x6d, 0x61, 0x6e, 0x70, 0x6f, 0x75, 0x74, 0x69, 0x6e, -0x67, 0xd83d, 0xde4d, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x66, 0x72, -0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x72, 0x6f, 0x77, 0x6e, -0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xde4d, 0x3a, 0x70, -0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, -0x6e, 0x67, 0x3a, 0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x70, -0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83d, 0xde4d, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, -0x61, 0x6e, 0x5f, 0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x3a, -0x66, 0x72, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0xd83d, -0xdc87, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x65, 0x74, 0x74, -0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x69, 0x72, 0x63, 0x75, 0x74, 0x3a, -0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x72, 0x63, -0x75, 0x74, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc87, 0x3a, 0x68, 0x61, -0x69, 0x72, 0x63, 0x75, 0x74, 0x3a, 0x68, 0x61, 0x69, 0x72, 0x63, 0x75, -0x74, 0xd83d, 0xdc87, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x67, -0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x69, 0x72, 0x63, -0x75, 0x74, 0x3a, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x68, 0x61, -0x69, 0x72, 0x63, 0x75, 0x74, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83d, -0xdc87, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x65, 0x74, -0x74, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x69, 0x72, 0x63, 0x75, 0x74, -0x3a, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x72, -0x63, 0x75, 0x74, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc86, 0x3a, 0x77, 0x6f, 0x6d, -0x61, 0x6e, 0x5f, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, -0x66, 0x61, 0x63, 0x65, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x6d, -0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, -0xdc86, 0x3a, 0x6d, 0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x6d, 0x61, -0x73, 0x73, 0x61, 0x67, 0x65, 0xd83d, 0xdc86, 0x3a, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0x5f, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6d, -0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x74, 0x69, -0x6e, 0x67, 0x6d, 0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x70, 0x65, 0x72, -0x73, 0x6f, 0x6e, 0xd83d, 0xdc86, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, -0x5f, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, -0x65, 0x5f, 0x6d, 0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x66, 0x61, -0x63, 0x65, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, -0x6d, 0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0xd83d, 0xdd74, 0x3a, 0x6d, 0x61, -0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, -0x73, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x5f, 0x6c, 0x65, 0x76, 0x69, 0x74, -0x61, 0x74, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, -0x73, 0x73, 0x69, 0x6e, 0x6c, 0x65, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, -0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x73, 0x75, 0x69, 0x74, 0xd83d, 0xdc83, 0x3a, -0x64, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x3a, 0x64, 0x61, 0x6e, 0x63, 0x65, -0x72, 0xd83d, 0xdd7a, 0x3a, 0x6d, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x6e, -0x63, 0x65, 0x72, 0x3a, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x6d, 0x61, -0x6c, 0x65, 0xd83d, 0xdd7a, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x64, 0x61, 0x6e, -0x63, 0x69, 0x6e, 0x67, 0x3a, 0x64, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, -0x6d, 0x61, 0x6e, 0xd83d, 0xdc6f, 0x3a, 0x77, 0x6f, 0x6d, 0x65, 0x6e, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x62, 0x75, 0x6e, 0x6e, 0x79, 0x5f, 0x65, -0x61, 0x72, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x69, 0x6e, 0x67, -0x3a, 0x62, 0x75, 0x6e, 0x6e, 0x79, 0x65, 0x61, 0x72, 0x73, 0x70, 0x61, -0x72, 0x74, 0x79, 0x69, 0x6e, 0x67, 0x77, 0x69, 0x74, 0x68, 0x77, 0x6f, -0x6d, 0x65, 0x6e, 0xd83d, 0xdc6f, 0x3a, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x72, -0x73, 0x3a, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0xd83d, 0xdc6f, 0x3a, -0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, -0x62, 0x75, 0x6e, 0x6e, 0x79, 0x5f, 0x65, 0x61, 0x72, 0x73, 0x5f, 0x70, -0x61, 0x72, 0x74, 0x79, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x75, 0x6e, 0x6e, -0x79, 0x65, 0x61, 0x72, 0x73, 0x70, 0x61, 0x72, 0x74, 0x79, 0x69, 0x6e, -0x67, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x77, 0x69, 0x74, 0x68, 0xd83d, -0xdc6f, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x65, 0x6e, 0x5f, 0x77, 0x69, 0x74, -0x68, 0x5f, 0x62, 0x75, 0x6e, 0x6e, 0x79, 0x5f, 0x65, 0x61, 0x72, 0x73, -0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x75, -0x6e, 0x6e, 0x79, 0x65, 0x61, 0x72, 0x73, 0x6d, 0x65, 0x6e, 0x70, 0x61, -0x72, 0x74, 0x79, 0x69, 0x6e, 0x67, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdeb6, -0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x77, 0x61, -0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, -0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdeb6, 0x3a, 0x6d, 0x61, 0x6e, -0x5f, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x6d, 0x61, 0x6e, -0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0xd83d, 0xdeb6, 0x3a, 0x77, 0x61, -0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, -0x67, 0xd83d, 0xdeb6, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x77, -0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, -0x6e, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0xd83c, 0xdfc3, 0x200d, 0x2640, -0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x6e, -0x69, 0x6e, 0x67, 0x3a, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0xd83c, 0xdfc3, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x72, -0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x6d, 0x61, 0x6e, 0x72, 0x75, -0x6e, 0x6e, 0x69, 0x6e, 0x67, 0xd83c, 0xdfc3, 0x3a, 0x72, 0x75, 0x6e, 0x6e, -0x65, 0x72, 0x3a, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0xd83c, 0xdfc3, 0x3a, -0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, -0x6e, 0x67, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x72, 0x75, 0x6e, -0x6e, 0x69, 0x6e, 0x67, 0xd83d, 0xdc6b, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, -0x65, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0xd83d, 0xdc6d, 0x3a, 0x74, -0x77, 0x6f, 0x5f, 0x77, 0x6f, 0x6d, 0x65, 0x6e, 0x5f, 0x68, 0x6f, 0x6c, -0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x68, -0x61, 0x6e, 0x64, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x74, -0x77, 0x6f, 0x77, 0x6f, 0x6d, 0x65, 0x6e, 0xd83d, 0xdc6c, 0x3a, 0x74, 0x77, -0x6f, 0x5f, 0x6d, 0x65, 0x6e, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, -0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x68, 0x61, 0x6e, 0x64, -0x73, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x6d, 0x65, 0x6e, 0x74, -0x77, 0x6f, 0xd83d, 0xdc91, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x3a, 0x63, -0x6f, 0x75, 0x70, 0x6c, 0x65, 0x68, 0x65, 0x61, 0x72, 0x74, 0x77, 0x69, -0x74, 0x68, 0xd83d, 0xdc91, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x3a, 0x63, 0x6f, 0x75, -0x70, 0x6c, 0x65, 0x68, 0x65, 0x61, 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x77, -0x69, 0x74, 0x68, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, 0x2764, -0xfe0f, 0x200d, 0xd83d, 0xdc69, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x77, -0x77, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x68, 0x65, 0x61, 0x72, -0x74, 0x77, 0x69, 0x74, 0x68, 0x77, 0x77, 0xd83d, 0xdc69, 0x200d, 0x2764, 0xfe0f, -0x200d, 0xd83d, 0xdc69, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x77, -0x77, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x77, 0x77, 0xd83d, 0xdc68, -0x200d, 0x2764, 0xfe0f, 0x200d, 0xd83d, 0xdc68, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, -0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, -0x5f, 0x6d, 0x6d, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x68, 0x65, -0x61, 0x72, 0x74, 0x6d, 0x6d, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdc68, 0x200d, -0x2764, 0xfe0f, 0x200d, 0xd83d, 0xdc68, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, -0x5f, 0x6d, 0x6d, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x6d, 0x6d, -0xd83d, 0xdc8f, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x6b, 0x69, 0x73, -0x73, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x6b, 0x69, 0x73, 0x73, -0xd83d, 0xdc8f, 0x3a, 0x6b, 0x69, 0x73, 0x73, 0x5f, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x3a, 0x6b, 0x69, 0x73, 0x73, 0x6d, 0x61, -0x6e, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, 0x2764, 0xfe0f, 0x200d, -0xd83d, 0xdc8b, 0x200d, 0xd83d, 0xdc69, 0x3a, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, -0x6b, 0x69, 0x73, 0x73, 0x5f, 0x77, 0x77, 0x3a, 0x63, 0x6f, 0x75, 0x70, -0x6c, 0x65, 0x6b, 0x69, 0x73, 0x73, 0x77, 0x77, 0xd83d, 0xdc69, 0x200d, 0x2764, -0xfe0f, 0x200d, 0xd83d, 0xdc8b, 0x200d, 0xd83d, 0xdc69, 0x3a, 0x6b, 0x69, 0x73, 0x73, -0x5f, 0x77, 0x77, 0x3a, 0x6b, 0x69, 0x73, 0x73, 0x77, 0x77, 0xd83d, 0xdc68, -0x200d, 0x2764, 0xfe0f, 0x200d, 0xd83d, 0xdc8b, 0x200d, 0xd83d, 0xdc68, 0x3a, 0x63, 0x6f, -0x75, 0x70, 0x6c, 0x65, 0x6b, 0x69, 0x73, 0x73, 0x5f, 0x6d, 0x6d, 0x3a, -0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x6b, 0x69, 0x73, 0x73, 0x6d, 0x6d, -0xd83d, 0xdc68, 0x200d, 0x2764, 0xfe0f, 0x200d, 0xd83d, 0xdc8b, 0x200d, 0xd83d, 0xdc68, 0x3a, -0x6b, 0x69, 0x73, 0x73, 0x5f, 0x6d, 0x6d, 0x3a, 0x6b, 0x69, 0x73, 0x73, -0x6d, 0x6d, 0xd83d, 0xdc6a, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, -0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0xd83d, 0xdc6a, 0x3a, 0x66, 0x61, 0x6d, -0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x5f, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0x5f, 0x62, 0x6f, 0x79, 0x3a, 0x62, 0x6f, 0x79, 0x66, 0x61, 0x6d, -0x69, 0x6c, 0x79, 0x6d, 0x61, 0x6e, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, -0xdc68, 0x200d, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc67, 0x3a, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x5f, 0x6d, 0x77, 0x67, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, -0x79, 0x6d, 0x77, 0x67, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc67, -0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, -0x77, 0x67, 0x62, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x77, -0x67, 0x62, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc66, 0x200d, 0xd83d, -0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x77, 0x62, -0x62, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x77, 0x62, 0x62, -0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc67, 0x3a, -0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x77, 0x67, 0x67, 0x3a, -0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x77, 0x67, 0x67, 0xd83d, 0xdc69, -0x200d, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, -0x79, 0x5f, 0x77, 0x77, 0x62, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, -0x77, 0x77, 0x62, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc67, 0x3a, -0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x77, 0x77, 0x67, 0x3a, 0x66, -0x61, 0x6d, 0x69, 0x6c, 0x79, 0x77, 0x77, 0x67, 0xd83d, 0xdc69, 0x200d, 0xd83d, -0xdc69, 0x200d, 0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x5f, 0x77, 0x77, 0x67, 0x62, 0x3a, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x77, 0x77, 0x67, 0x62, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc69, 0x200d, -0xd83d, 0xdc66, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, -0x5f, 0x77, 0x77, 0x62, 0x62, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, -0x77, 0x77, 0x62, 0x62, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc67, -0x200d, 0xd83d, 0xdc67, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x77, -0x77, 0x67, 0x67, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x77, 0x77, -0x67, 0x67, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, -0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x6d, 0x62, 0x3a, 0x66, 0x61, -0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x6d, 0x62, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc68, -0x200d, 0xd83d, 0xdc67, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, -0x6d, 0x67, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x6d, 0x67, -0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc66, 0x3a, -0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x6d, 0x67, 0x62, 0x3a, -0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x6d, 0x67, 0x62, 0xd83d, 0xdc68, -0x200d, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc66, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, -0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x6d, 0x62, 0x62, 0x3a, 0x66, 0x61, -0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x6d, 0x62, 0x62, 0xd83d, 0xdc68, 0x200d, 0xd83d, -0xdc68, 0x200d, 0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc67, 0x3a, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x5f, 0x6d, 0x6d, 0x67, 0x67, 0x3a, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x6d, 0x6d, 0x67, 0x67, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc66, 0x3a, -0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x5f, 0x62, 0x6f, 0x79, 0x3a, 0x62, 0x6f, 0x79, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, 0x200d, 0xd83d, 0xdc67, -0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0x5f, 0x67, 0x69, 0x72, 0x6c, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, -0x79, 0x67, 0x69, 0x72, 0x6c, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, -0x200d, 0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, -0x79, 0x5f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x69, 0x72, 0x6c, -0x5f, 0x62, 0x6f, 0x79, 0x3a, 0x62, 0x6f, 0x79, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x67, 0x69, 0x72, 0x6c, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, -0xdc69, 0x200d, 0xd83d, 0xdc66, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x5f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x62, 0x6f, 0x79, -0x5f, 0x62, 0x6f, 0x79, 0x3a, 0x62, 0x6f, 0x79, 0x62, 0x6f, 0x79, 0x66, -0x61, 0x6d, 0x69, 0x6c, 0x79, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc69, -0x200d, 0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc67, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, -0x79, 0x5f, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x69, 0x72, 0x6c, -0x5f, 0x67, 0x69, 0x72, 0x6c, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, -0x67, 0x69, 0x72, 0x6c, 0x67, 0x69, 0x72, 0x6c, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, -0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x5f, 0x62, 0x6f, 0x79, 0x3a, 0x62, 0x6f, -0x79, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, -0x200d, 0xd83d, 0xdc67, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, -0x61, 0x6e, 0x5f, 0x67, 0x69, 0x72, 0x6c, 0x3a, 0x66, 0x61, 0x6d, 0x69, -0x6c, 0x79, 0x67, 0x69, 0x72, 0x6c, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, -0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, -0x5f, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x69, 0x72, 0x6c, 0x5f, 0x62, 0x6f, -0x79, 0x3a, 0x62, 0x6f, 0x79, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x67, -0x69, 0x72, 0x6c, 0x6d, 0x61, 0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc66, 0x200d, -0xd83d, 0xdc66, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x61, -0x6e, 0x5f, 0x62, 0x6f, 0x79, 0x5f, 0x62, 0x6f, 0x79, 0x3a, 0x62, 0x6f, -0x79, 0x62, 0x6f, 0x79, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x6d, 0x61, -0x6e, 0xd83d, 0xdc68, 0x200d, 0xd83d, 0xdc67, 0x200d, 0xd83d, 0xdc67, 0x3a, 0x66, 0x61, -0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x69, 0x72, -0x6c, 0x5f, 0x67, 0x69, 0x72, 0x6c, 0x3a, 0x66, 0x61, 0x6d, 0x69, 0x6c, -0x79, 0x67, 0x69, 0x72, 0x6c, 0x67, 0x69, 0x72, 0x6c, 0x6d, 0x61, 0x6e, -0xd83d, 0xdc5a, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x73, 0x5f, 0x63, 0x6c, -0x6f, 0x74, 0x68, 0x65, 0x73, 0x3a, 0x63, 0x6c, 0x6f, 0x74, 0x68, 0x65, -0x73, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x73, 0xd83d, 0xdc55, 0x3a, 0x73, 0x68, -0x69, 0x72, 0x74, 0x3a, 0x73, 0x68, 0x69, 0x72, 0x74, 0xd83d, 0xdc56, 0x3a, -0x6a, 0x65, 0x61, 0x6e, 0x73, 0x3a, 0x6a, 0x65, 0x61, 0x6e, 0x73, 0xd83d, -0xdc54, 0x3a, 0x6e, 0x65, 0x63, 0x6b, 0x74, 0x69, 0x65, 0x3a, 0x6e, 0x65, -0x63, 0x6b, 0x74, 0x69, 0x65, 0xd83d, 0xdc57, 0x3a, 0x64, 0x72, 0x65, 0x73, -0x73, 0x3a, 0x64, 0x72, 0x65, 0x73, 0x73, 0xd83d, 0xdc59, 0x3a, 0x62, 0x69, -0x6b, 0x69, 0x6e, 0x69, 0x3a, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x69, 0xd83d, -0xdc58, 0x3a, 0x6b, 0x69, 0x6d, 0x6f, 0x6e, 0x6f, 0x3a, 0x6b, 0x69, 0x6d, -0x6f, 0x6e, 0x6f, 0xd83d, 0xdc60, 0x3a, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x68, -0x65, 0x65, 0x6c, 0x3a, 0x68, 0x65, 0x65, 0x6c, 0x68, 0x69, 0x67, 0x68, -0xd83d, 0xdc61, 0x3a, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x3a, 0x73, 0x61, -0x6e, 0x64, 0x61, 0x6c, 0xd83d, 0xdc62, 0x3a, 0x62, 0x6f, 0x6f, 0x74, 0x3a, -0x62, 0x6f, 0x6f, 0x74, 0xd83d, 0xdc5e, 0x3a, 0x6d, 0x61, 0x6e, 0x73, 0x5f, -0x73, 0x68, 0x6f, 0x65, 0x3a, 0x6d, 0x61, 0x6e, 0x73, 0x73, 0x68, 0x6f, -0x65, 0xd83d, 0xdc5f, 0x3a, 0x61, 0x74, 0x68, 0x6c, 0x65, 0x74, 0x69, 0x63, -0x5f, 0x73, 0x68, 0x6f, 0x65, 0x3a, 0x61, 0x74, 0x68, 0x6c, 0x65, 0x74, -0x69, 0x63, 0x73, 0x68, 0x6f, 0x65, 0xd83d, 0xdc52, 0x3a, 0x77, 0x6f, 0x6d, -0x61, 0x6e, 0x73, 0x5f, 0x68, 0x61, 0x74, 0x3a, 0x68, 0x61, 0x74, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0x73, 0xd83c, 0xdfa9, 0x3a, 0x74, 0x6f, 0x70, 0x68, -0x61, 0x74, 0x3a, 0x74, 0x6f, 0x70, 0x68, 0x61, 0x74, 0xd83c, 0xdf93, 0x3a, -0x6d, 0x6f, 0x72, 0x74, 0x61, 0x72, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, -0x3a, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x6d, 0x6f, 0x72, 0x74, 0x61, 0x72, -0xd83d, 0xdc51, 0x3a, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x3a, 0x63, 0x72, 0x6f, -0x77, 0x6e, 0x26d1, 0x3a, 0x68, 0x65, 0x6c, 0x6d, 0x65, 0x74, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x63, 0x72, -0x6f, 0x73, 0x73, 0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x68, 0x65, 0x6c, -0x6d, 0x65, 0x74, 0x77, 0x68, 0x69, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, -0x26d1, 0x3a, 0x68, 0x65, 0x6c, 0x6d, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x74, -0x68, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x3a, 0x63, 0x72, 0x6f, 0x73, -0x73, 0x68, 0x65, 0x6c, 0x6d, 0x65, 0x74, 0x77, 0x69, 0x74, 0x68, 0xd83c, -0xdf92, 0x3a, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x61, 0x74, -0x63, 0x68, 0x65, 0x6c, 0x3a, 0x73, 0x61, 0x74, 0x63, 0x68, 0x65, 0x6c, -0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0xd83d, 0xdc5d, 0x3a, 0x70, 0x6f, 0x75, -0x63, 0x68, 0x3a, 0x70, 0x6f, 0x75, 0x63, 0x68, 0xd83d, 0xdc5b, 0x3a, 0x70, -0x75, 0x72, 0x73, 0x65, 0x3a, 0x70, 0x75, 0x72, 0x73, 0x65, 0xd83d, 0xdc5c, -0x3a, 0x68, 0x61, 0x6e, 0x64, 0x62, 0x61, 0x67, 0x3a, 0x68, 0x61, 0x6e, -0x64, 0x62, 0x61, 0x67, 0xd83d, 0xdcbc, 0x3a, 0x62, 0x72, 0x69, 0x65, 0x66, -0x63, 0x61, 0x73, 0x65, 0x3a, 0x62, 0x72, 0x69, 0x65, 0x66, 0x63, 0x61, -0x73, 0x65, 0xd83d, 0xdc53, 0x3a, 0x65, 0x79, 0x65, 0x67, 0x6c, 0x61, 0x73, -0x73, 0x65, 0x73, 0x3a, 0x65, 0x79, 0x65, 0x67, 0x6c, 0x61, 0x73, 0x73, -0x65, 0x73, 0xd83d, 0xdd76, 0x3a, 0x64, 0x61, 0x72, 0x6b, 0x5f, 0x73, 0x75, -0x6e, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x64, 0x61, 0x72, -0x6b, 0x73, 0x75, 0x6e, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0xd83c, -0xdf02, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x75, 0x6d, 0x62, -0x72, 0x65, 0x6c, 0x6c, 0x61, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, -0x75, 0x6d, 0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0x2602, 0xfe0f, 0x3a, 0x75, -0x6d, 0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0x32, 0x3a, 0x75, 0x6d, 0x62, -0x72, 0x65, 0x6c, 0x6c, 0x61, 0x32, 0xd83d, 0xdc36, 0x3a, 0x64, 0x6f, 0x67, -0x3a, 0x64, 0x6f, 0x67, 0xd83d, 0xdc31, 0x3a, 0x63, 0x61, 0x74, 0x3a, 0x63, -0x61, 0x74, 0xd83d, 0xdc2d, 0x3a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x3a, 0x6d, -0x6f, 0x75, 0x73, 0x65, 0xd83d, 0xdc39, 0x3a, 0x68, 0x61, 0x6d, 0x73, 0x74, -0x65, 0x72, 0x3a, 0x68, 0x61, 0x6d, 0x73, 0x74, 0x65, 0x72, 0xd83d, 0xdc30, -0x3a, 0x72, 0x61, 0x62, 0x62, 0x69, 0x74, 0x3a, 0x72, 0x61, 0x62, 0x62, -0x69, 0x74, 0xd83e, 0xdd8a, 0x3a, 0x66, 0x6f, 0x78, 0x5f, 0x66, 0x61, 0x63, -0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x66, 0x6f, 0x78, 0xd83e, 0xdd8a, 0x3a, -0x66, 0x6f, 0x78, 0x3a, 0x66, 0x6f, 0x78, 0xd83d, 0xdc3b, 0x3a, 0x62, 0x65, -0x61, 0x72, 0x3a, 0x62, 0x65, 0x61, 0x72, 0xd83d, 0xdc3c, 0x3a, 0x70, 0x61, -0x6e, 0x64, 0x61, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, -0x65, 0x70, 0x61, 0x6e, 0x64, 0x61, 0xd83d, 0xdc28, 0x3a, 0x6b, 0x6f, 0x61, -0x6c, 0x61, 0x3a, 0x6b, 0x6f, 0x61, 0x6c, 0x61, 0xd83d, 0xdc2f, 0x3a, 0x74, -0x69, 0x67, 0x65, 0x72, 0x3a, 0x74, 0x69, 0x67, 0x65, 0x72, 0xd83e, 0xdd81, -0x3a, 0x6c, 0x69, 0x6f, 0x6e, 0x3a, 0x6c, 0x69, 0x6f, 0x6e, 0xd83e, 0xdd81, -0x3a, 0x6c, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, -0x61, 0x63, 0x65, 0x6c, 0x69, 0x6f, 0x6e, 0xd83d, 0xdc2e, 0x3a, 0x63, 0x6f, -0x77, 0x3a, 0x63, 0x6f, 0x77, 0xd83d, 0xdc37, 0x3a, 0x70, 0x69, 0x67, 0x3a, -0x70, 0x69, 0x67, 0xd83d, 0xdc3d, 0x3a, 0x70, 0x69, 0x67, 0x5f, 0x6e, 0x6f, -0x73, 0x65, 0x3a, 0x6e, 0x6f, 0x73, 0x65, 0x70, 0x69, 0x67, 0xd83d, 0xdc38, -0x3a, 0x66, 0x72, 0x6f, 0x67, 0x3a, 0x66, 0x72, 0x6f, 0x67, 0xd83d, 0xdc35, -0x3a, 0x6d, 0x6f, 0x6e, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x63, 0x65, -0x3a, 0x66, 0x61, 0x63, 0x65, 0x6d, 0x6f, 0x6e, 0x6b, 0x65, 0x79, 0xd83d, -0xde48, 0x3a, 0x73, 0x65, 0x65, 0x5f, 0x6e, 0x6f, 0x5f, 0x65, 0x76, 0x69, -0x6c, 0x3a, 0x65, 0x76, 0x69, 0x6c, 0x6e, 0x6f, 0x73, 0x65, 0x65, 0xd83d, -0xde49, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x5f, 0x6e, 0x6f, 0x5f, 0x65, 0x76, -0x69, 0x6c, 0x3a, 0x65, 0x76, 0x69, 0x6c, 0x68, 0x65, 0x61, 0x72, 0x6e, -0x6f, 0xd83d, 0xde4a, 0x3a, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6e, 0x6f, -0x5f, 0x65, 0x76, 0x69, 0x6c, 0x3a, 0x65, 0x76, 0x69, 0x6c, 0x6e, 0x6f, -0x73, 0x70, 0x65, 0x61, 0x6b, 0xd83d, 0xdc12, 0x3a, 0x6d, 0x6f, 0x6e, 0x6b, -0x65, 0x79, 0x3a, 0x6d, 0x6f, 0x6e, 0x6b, 0x65, 0x79, 0xd83d, 0xdc14, 0x3a, -0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x3a, 0x63, 0x68, 0x69, 0x63, -0x6b, 0x65, 0x6e, 0xd83d, 0xdc27, 0x3a, 0x70, 0x65, 0x6e, 0x67, 0x75, 0x69, -0x6e, 0x3a, 0x70, 0x65, 0x6e, 0x67, 0x75, 0x69, 0x6e, 0xd83d, 0xdc26, 0x3a, -0x62, 0x69, 0x72, 0x64, 0x3a, 0x62, 0x69, 0x72, 0x64, 0xd83d, 0xdc24, 0x3a, -0x62, 0x61, 0x62, 0x79, 0x5f, 0x63, 0x68, 0x69, 0x63, 0x6b, 0x3a, 0x62, -0x61, 0x62, 0x79, 0x63, 0x68, 0x69, 0x63, 0x6b, 0xd83d, 0xdc23, 0x3a, 0x68, -0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x69, 0x63, -0x6b, 0x3a, 0x63, 0x68, 0x69, 0x63, 0x6b, 0x68, 0x61, 0x74, 0x63, 0x68, -0x69, 0x6e, 0x67, 0xd83d, 0xdc25, 0x3a, 0x68, 0x61, 0x74, 0x63, 0x68, 0x65, -0x64, 0x5f, 0x63, 0x68, 0x69, 0x63, 0x6b, 0x3a, 0x63, 0x68, 0x69, 0x63, -0x6b, 0x68, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0xd83e, 0xdd86, 0x3a, 0x64, -0x75, 0x63, 0x6b, 0x3a, 0x64, 0x75, 0x63, 0x6b, 0xd83e, 0xdd85, 0x3a, 0x65, -0x61, 0x67, 0x6c, 0x65, 0x3a, 0x65, 0x61, 0x67, 0x6c, 0x65, 0xd83e, 0xdd89, -0x3a, 0x6f, 0x77, 0x6c, 0x3a, 0x6f, 0x77, 0x6c, 0xd83e, 0xdd87, 0x3a, 0x62, -0x61, 0x74, 0x3a, 0x62, 0x61, 0x74, 0xd83d, 0xdc3a, 0x3a, 0x77, 0x6f, 0x6c, -0x66, 0x3a, 0x77, 0x6f, 0x6c, 0x66, 0xd83d, 0xdc17, 0x3a, 0x62, 0x6f, 0x61, -0x72, 0x3a, 0x62, 0x6f, 0x61, 0x72, 0xd83d, 0xdc34, 0x3a, 0x68, 0x6f, 0x72, -0x73, 0x65, 0x3a, 0x68, 0x6f, 0x72, 0x73, 0x65, 0xd83e, 0xdd84, 0x3a, 0x75, -0x6e, 0x69, 0x63, 0x6f, 0x72, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, -0x66, 0x61, 0x63, 0x65, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x72, 0x6e, 0xd83e, -0xdd84, 0x3a, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x72, 0x6e, 0x3a, 0x75, 0x6e, -0x69, 0x63, 0x6f, 0x72, 0x6e, 0xd83d, 0xdc1d, 0x3a, 0x62, 0x65, 0x65, 0x3a, -0x62, 0x65, 0x65, 0xd83d, 0xdc1b, 0x3a, 0x62, 0x75, 0x67, 0x3a, 0x62, 0x75, -0x67, 0xd83e, 0xdd8b, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x65, 0x72, 0x66, 0x6c, -0x79, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x65, 0x72, 0x66, 0x6c, 0x79, 0xd83d, -0xdc0c, 0x3a, 0x73, 0x6e, 0x61, 0x69, 0x6c, 0x3a, 0x73, 0x6e, 0x61, 0x69, -0x6c, 0xd83d, 0xdc1a, 0x3a, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x3a, 0x73, 0x68, -0x65, 0x6c, 0x6c, 0xd83d, 0xdc1e, 0x3a, 0x62, 0x65, 0x65, 0x74, 0x6c, 0x65, -0x3a, 0x62, 0x65, 0x65, 0x74, 0x6c, 0x65, 0xd83d, 0xdc1c, 0x3a, 0x61, 0x6e, -0x74, 0x3a, 0x61, 0x6e, 0x74, 0xd83d, 0xdd77, 0x3a, 0x73, 0x70, 0x69, 0x64, -0x65, 0x72, 0x3a, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0xd83d, 0xdd78, 0x3a, -0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x65, 0x62, 0x3a, 0x73, -0x70, 0x69, 0x64, 0x65, 0x72, 0x77, 0x65, 0x62, 0xd83d, 0xdc22, 0x3a, 0x74, -0x75, 0x72, 0x74, 0x6c, 0x65, 0x3a, 0x74, 0x75, 0x72, 0x74, 0x6c, 0x65, -0xd83d, 0xdc0d, 0x3a, 0x73, 0x6e, 0x61, 0x6b, 0x65, 0x3a, 0x73, 0x6e, 0x61, -0x6b, 0x65, 0xd83e, 0xdd8e, 0x3a, 0x6c, 0x69, 0x7a, 0x61, 0x72, 0x64, 0x3a, -0x6c, 0x69, 0x7a, 0x61, 0x72, 0x64, 0xd83e, 0xdd82, 0x3a, 0x73, 0x63, 0x6f, -0x72, 0x70, 0x69, 0x6f, 0x6e, 0x3a, 0x73, 0x63, 0x6f, 0x72, 0x70, 0x69, -0x6f, 0x6e, 0xd83e, 0xdd80, 0x3a, 0x63, 0x72, 0x61, 0x62, 0x3a, 0x63, 0x72, -0x61, 0x62, 0xd83e, 0xdd91, 0x3a, 0x73, 0x71, 0x75, 0x69, 0x64, 0x3a, 0x73, -0x71, 0x75, 0x69, 0x64, 0xd83d, 0xdc19, 0x3a, 0x6f, 0x63, 0x74, 0x6f, 0x70, -0x75, 0x73, 0x3a, 0x6f, 0x63, 0x74, 0x6f, 0x70, 0x75, 0x73, 0xd83e, 0xdd90, -0x3a, 0x73, 0x68, 0x72, 0x69, 0x6d, 0x70, 0x3a, 0x73, 0x68, 0x72, 0x69, -0x6d, 0x70, 0xd83d, 0xdc20, 0x3a, 0x74, 0x72, 0x6f, 0x70, 0x69, 0x63, 0x61, -0x6c, 0x5f, 0x66, 0x69, 0x73, 0x68, 0x3a, 0x66, 0x69, 0x73, 0x68, 0x74, -0x72, 0x6f, 0x70, 0x69, 0x63, 0x61, 0x6c, 0xd83d, 0xdc1f, 0x3a, 0x66, 0x69, -0x73, 0x68, 0x3a, 0x66, 0x69, 0x73, 0x68, 0xd83d, 0xdc21, 0x3a, 0x62, 0x6c, -0x6f, 0x77, 0x66, 0x69, 0x73, 0x68, 0x3a, 0x62, 0x6c, 0x6f, 0x77, 0x66, -0x69, 0x73, 0x68, 0xd83d, 0xdc2c, 0x3a, 0x64, 0x6f, 0x6c, 0x70, 0x68, 0x69, -0x6e, 0x3a, 0x64, 0x6f, 0x6c, 0x70, 0x68, 0x69, 0x6e, 0xd83e, 0xdd88, 0x3a, -0x73, 0x68, 0x61, 0x72, 0x6b, 0x3a, 0x73, 0x68, 0x61, 0x72, 0x6b, 0xd83d, -0xdc33, 0x3a, 0x77, 0x68, 0x61, 0x6c, 0x65, 0x3a, 0x77, 0x68, 0x61, 0x6c, -0x65, 0xd83d, 0xdc0b, 0x3a, 0x77, 0x68, 0x61, 0x6c, 0x65, 0x32, 0x3a, 0x77, -0x68, 0x61, 0x6c, 0x65, 0x32, 0xd83d, 0xdc0a, 0x3a, 0x63, 0x72, 0x6f, 0x63, -0x6f, 0x64, 0x69, 0x6c, 0x65, 0x3a, 0x63, 0x72, 0x6f, 0x63, 0x6f, 0x64, -0x69, 0x6c, 0x65, 0xd83d, 0xdc06, 0x3a, 0x6c, 0x65, 0x6f, 0x70, 0x61, 0x72, -0x64, 0x3a, 0x6c, 0x65, 0x6f, 0x70, 0x61, 0x72, 0x64, 0xd83d, 0xdc05, 0x3a, -0x74, 0x69, 0x67, 0x65, 0x72, 0x32, 0x3a, 0x74, 0x69, 0x67, 0x65, 0x72, -0x32, 0xd83d, 0xdc03, 0x3a, 0x77, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, -0x66, 0x66, 0x61, 0x6c, 0x6f, 0x3a, 0x62, 0x75, 0x66, 0x66, 0x61, 0x6c, -0x6f, 0x77, 0x61, 0x74, 0x65, 0x72, 0xd83d, 0xdc02, 0x3a, 0x6f, 0x78, 0x3a, -0x6f, 0x78, 0xd83d, 0xdc04, 0x3a, 0x63, 0x6f, 0x77, 0x32, 0x3a, 0x63, 0x6f, -0x77, 0x32, 0xd83e, 0xdd8c, 0x3a, 0x64, 0x65, 0x65, 0x72, 0x3a, 0x64, 0x65, -0x65, 0x72, 0xd83d, 0xdc2a, 0x3a, 0x64, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x61, -0x72, 0x79, 0x5f, 0x63, 0x61, 0x6d, 0x65, 0x6c, 0x3a, 0x63, 0x61, 0x6d, -0x65, 0x6c, 0x64, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x61, 0x72, 0x79, 0xd83d, -0xdc2b, 0x3a, 0x63, 0x61, 0x6d, 0x65, 0x6c, 0x3a, 0x63, 0x61, 0x6d, 0x65, -0x6c, 0xd83d, 0xdc18, 0x3a, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x61, 0x6e, 0x74, -0x3a, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x61, 0x6e, 0x74, 0xd83e, 0xdd8f, 0x3a, -0x72, 0x68, 0x69, 0x6e, 0x6f, 0x63, 0x65, 0x72, 0x6f, 0x73, 0x3a, 0x72, -0x68, 0x69, 0x6e, 0x6f, 0x63, 0x65, 0x72, 0x6f, 0x73, 0xd83e, 0xdd8f, 0x3a, -0x72, 0x68, 0x69, 0x6e, 0x6f, 0x3a, 0x72, 0x68, 0x69, 0x6e, 0x6f, 0xd83e, -0xdd8d, 0x3a, 0x67, 0x6f, 0x72, 0x69, 0x6c, 0x6c, 0x61, 0x3a, 0x67, 0x6f, -0x72, 0x69, 0x6c, 0x6c, 0x61, 0xd83d, 0xdc0e, 0x3a, 0x72, 0x61, 0x63, 0x65, -0x68, 0x6f, 0x72, 0x73, 0x65, 0x3a, 0x72, 0x61, 0x63, 0x65, 0x68, 0x6f, -0x72, 0x73, 0x65, 0xd83d, 0xdc16, 0x3a, 0x70, 0x69, 0x67, 0x32, 0x3a, 0x70, -0x69, 0x67, 0x32, 0xd83d, 0xdc10, 0x3a, 0x67, 0x6f, 0x61, 0x74, 0x3a, 0x67, -0x6f, 0x61, 0x74, 0xd83d, 0xdc0f, 0x3a, 0x72, 0x61, 0x6d, 0x3a, 0x72, 0x61, -0x6d, 0xd83d, 0xdc11, 0x3a, 0x73, 0x68, 0x65, 0x65, 0x70, 0x3a, 0x73, 0x68, -0x65, 0x65, 0x70, 0xd83d, 0xdc15, 0x3a, 0x64, 0x6f, 0x67, 0x32, 0x3a, 0x64, -0x6f, 0x67, 0x32, 0xd83d, 0xdc29, 0x3a, 0x70, 0x6f, 0x6f, 0x64, 0x6c, 0x65, -0x3a, 0x70, 0x6f, 0x6f, 0x64, 0x6c, 0x65, 0xd83d, 0xdc08, 0x3a, 0x63, 0x61, -0x74, 0x32, 0x3a, 0x63, 0x61, 0x74, 0x32, 0xd83d, 0xdc13, 0x3a, 0x72, 0x6f, -0x6f, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x72, 0x6f, 0x6f, 0x73, 0x74, 0x65, -0x72, 0xd83e, 0xdd83, 0x3a, 0x74, 0x75, 0x72, 0x6b, 0x65, 0x79, 0x3a, 0x74, -0x75, 0x72, 0x6b, 0x65, 0x79, 0xd83d, 0xdd4a, 0x3a, 0x64, 0x6f, 0x76, 0x65, -0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x65, 0x61, 0x63, 0x65, 0x3a, 0x64, 0x6f, -0x76, 0x65, 0x6f, 0x66, 0x70, 0x65, 0x61, 0x63, 0x65, 0xd83d, 0xdd4a, 0x3a, -0x64, 0x6f, 0x76, 0x65, 0x3a, 0x64, 0x6f, 0x76, 0x65, 0xd83d, 0xdc07, 0x3a, -0x72, 0x61, 0x62, 0x62, 0x69, 0x74, 0x32, 0x3a, 0x72, 0x61, 0x62, 0x62, -0x69, 0x74, 0x32, 0xd83d, 0xdc01, 0x3a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x32, -0x3a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x32, 0xd83d, 0xdc00, 0x3a, 0x72, 0x61, -0x74, 0x3a, 0x72, 0x61, 0x74, 0xd83d, 0xdc3f, 0x3a, 0x63, 0x68, 0x69, 0x70, -0x6d, 0x75, 0x6e, 0x6b, 0x3a, 0x63, 0x68, 0x69, 0x70, 0x6d, 0x75, 0x6e, -0x6b, 0xd83d, 0xdc3e, 0x3a, 0x70, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6e, -0x74, 0x73, 0x3a, 0x70, 0x61, 0x77, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, -0xd83d, 0xdc3e, 0x3a, 0x66, 0x65, 0x65, 0x74, 0x3a, 0x66, 0x65, 0x65, 0x74, -0xd83d, 0xdc09, 0x3a, 0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x3a, 0x64, 0x72, -0x61, 0x67, 0x6f, 0x6e, 0xd83d, 0xdc32, 0x3a, 0x64, 0x72, 0x61, 0x67, 0x6f, -0x6e, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x64, 0x72, 0x61, 0x67, 0x6f, -0x6e, 0x66, 0x61, 0x63, 0x65, 0xd83c, 0xdf35, 0x3a, 0x63, 0x61, 0x63, 0x74, -0x75, 0x73, 0x3a, 0x63, 0x61, 0x63, 0x74, 0x75, 0x73, 0xd83c, 0xdf84, 0x3a, -0x63, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x5f, 0x74, 0x72, -0x65, 0x65, 0x3a, 0x63, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, -0x74, 0x72, 0x65, 0x65, 0xd83c, 0xdf32, 0x3a, 0x65, 0x76, 0x65, 0x72, 0x67, -0x72, 0x65, 0x65, 0x6e, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x3a, 0x65, 0x76, -0x65, 0x72, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x65, 0xd83c, -0xdf33, 0x3a, 0x64, 0x65, 0x63, 0x69, 0x64, 0x75, 0x6f, 0x75, 0x73, 0x5f, -0x74, 0x72, 0x65, 0x65, 0x3a, 0x64, 0x65, 0x63, 0x69, 0x64, 0x75, 0x6f, -0x75, 0x73, 0x74, 0x72, 0x65, 0x65, 0xd83c, 0xdf34, 0x3a, 0x70, 0x61, 0x6c, -0x6d, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x3a, 0x70, 0x61, 0x6c, 0x6d, 0x74, -0x72, 0x65, 0x65, 0xd83c, 0xdf31, 0x3a, 0x73, 0x65, 0x65, 0x64, 0x6c, 0x69, -0x6e, 0x67, 0x3a, 0x73, 0x65, 0x65, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0xd83c, -0xdf3f, 0x3a, 0x68, 0x65, 0x72, 0x62, 0x3a, 0x68, 0x65, 0x72, 0x62, 0x2618, -0xfe0f, 0x3a, 0x73, 0x68, 0x61, 0x6d, 0x72, 0x6f, 0x63, 0x6b, 0x3a, 0x73, -0x68, 0x61, 0x6d, 0x72, 0x6f, 0x63, 0x6b, 0xd83c, 0xdf40, 0x3a, 0x66, 0x6f, -0x75, 0x72, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x63, 0x6c, 0x6f, 0x76, -0x65, 0x72, 0x3a, 0x63, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6f, 0x75, -0x72, 0x6c, 0x65, 0x61, 0x66, 0xd83c, 0xdf8d, 0x3a, 0x62, 0x61, 0x6d, 0x62, -0x6f, 0x6f, 0x3a, 0x62, 0x61, 0x6d, 0x62, 0x6f, 0x6f, 0xd83c, 0xdf8b, 0x3a, -0x74, 0x61, 0x6e, 0x61, 0x62, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x72, 0x65, -0x65, 0x3a, 0x74, 0x61, 0x6e, 0x61, 0x62, 0x61, 0x74, 0x61, 0x74, 0x72, -0x65, 0x65, 0xd83c, 0xdf43, 0x3a, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, -0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0xd83c, 0xdf42, 0x3a, 0x66, 0x61, 0x6c, -0x6c, 0x65, 0x6e, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x3a, 0x66, 0x61, 0x6c, -0x6c, 0x65, 0x6e, 0x6c, 0x65, 0x61, 0x66, 0xd83c, 0xdf41, 0x3a, 0x6d, 0x61, -0x70, 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x3a, 0x6c, 0x65, 0x61, -0x66, 0x6d, 0x61, 0x70, 0x6c, 0x65, 0xd83c, 0xdf44, 0x3a, 0x6d, 0x75, 0x73, -0x68, 0x72, 0x6f, 0x6f, 0x6d, 0x3a, 0x6d, 0x75, 0x73, 0x68, 0x72, 0x6f, -0x6f, 0x6d, 0xd83c, 0xdf3e, 0x3a, 0x65, 0x61, 0x72, 0x5f, 0x6f, 0x66, 0x5f, -0x72, 0x69, 0x63, 0x65, 0x3a, 0x65, 0x61, 0x72, 0x6f, 0x66, 0x72, 0x69, -0x63, 0x65, 0xd83d, 0xdc90, 0x3a, 0x62, 0x6f, 0x75, 0x71, 0x75, 0x65, 0x74, -0x3a, 0x62, 0x6f, 0x75, 0x71, 0x75, 0x65, 0x74, 0xd83c, 0xdf37, 0x3a, 0x74, -0x75, 0x6c, 0x69, 0x70, 0x3a, 0x74, 0x75, 0x6c, 0x69, 0x70, 0xd83c, 0xdf39, -0x3a, 0x72, 0x6f, 0x73, 0x65, 0x3a, 0x72, 0x6f, 0x73, 0x65, 0xd83e, 0xdd40, -0x3a, 0x77, 0x69, 0x6c, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x3a, 0x66, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x77, 0x69, 0x6c, -0x74, 0x65, 0x64, 0xd83e, 0xdd40, 0x3a, 0x77, 0x69, 0x6c, 0x74, 0x65, 0x64, -0x5f, 0x72, 0x6f, 0x73, 0x65, 0x3a, 0x72, 0x6f, 0x73, 0x65, 0x77, 0x69, -0x6c, 0x74, 0x65, 0x64, 0xd83c, 0xdf3b, 0x3a, 0x73, 0x75, 0x6e, 0x66, 0x6c, -0x6f, 0x77, 0x65, 0x72, 0x3a, 0x73, 0x75, 0x6e, 0x66, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0xd83c, 0xdf3c, 0x3a, 0x62, 0x6c, 0x6f, 0x73, 0x73, 0x6f, 0x6d, -0x3a, 0x62, 0x6c, 0x6f, 0x73, 0x73, 0x6f, 0x6d, 0xd83c, 0xdf38, 0x3a, 0x63, -0x68, 0x65, 0x72, 0x72, 0x79, 0x5f, 0x62, 0x6c, 0x6f, 0x73, 0x73, 0x6f, -0x6d, 0x3a, 0x62, 0x6c, 0x6f, 0x73, 0x73, 0x6f, 0x6d, 0x63, 0x68, 0x65, -0x72, 0x72, 0x79, 0xd83c, 0xdf3a, 0x3a, 0x68, 0x69, 0x62, 0x69, 0x73, 0x63, -0x75, 0x73, 0x3a, 0x68, 0x69, 0x62, 0x69, 0x73, 0x63, 0x75, 0x73, 0xd83c, -0xdf0e, 0x3a, 0x65, 0x61, 0x72, 0x74, 0x68, 0x5f, 0x61, 0x6d, 0x65, 0x72, -0x69, 0x63, 0x61, 0x73, 0x3a, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x73, 0x65, 0x61, 0x72, 0x74, 0x68, 0xd83c, 0xdf0d, 0x3a, 0x65, 0x61, 0x72, -0x74, 0x68, 0x5f, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x3a, 0x61, 0x66, -0x72, 0x69, 0x63, 0x61, 0x65, 0x61, 0x72, 0x74, 0x68, 0xd83c, 0xdf0f, 0x3a, -0x65, 0x61, 0x72, 0x74, 0x68, 0x5f, 0x61, 0x73, 0x69, 0x61, 0x3a, 0x61, -0x73, 0x69, 0x61, 0x65, 0x61, 0x72, 0x74, 0x68, 0xd83c, 0xdf15, 0x3a, 0x66, -0x75, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x3a, 0x66, 0x75, 0x6c, -0x6c, 0x6d, 0x6f, 0x6f, 0x6e, 0xd83c, 0xdf16, 0x3a, 0x77, 0x61, 0x6e, 0x69, -0x6e, 0x67, 0x5f, 0x67, 0x69, 0x62, 0x62, 0x6f, 0x75, 0x73, 0x5f, 0x6d, -0x6f, 0x6f, 0x6e, 0x3a, 0x67, 0x69, 0x62, 0x62, 0x6f, 0x75, 0x73, 0x6d, -0x6f, 0x6f, 0x6e, 0x77, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0xd83c, 0xdf17, 0x3a, -0x6c, 0x61, 0x73, 0x74, 0x5f, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, -0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x6d, 0x6f, -0x6f, 0x6e, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0xd83c, 0xdf18, 0x3a, -0x77, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x65, 0x73, 0x63, -0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x3a, 0x63, 0x72, 0x65, -0x73, 0x63, 0x65, 0x6e, 0x74, 0x6d, 0x6f, 0x6f, 0x6e, 0x77, 0x61, 0x6e, -0x69, 0x6e, 0x67, 0xd83c, 0xdf11, 0x3a, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x6f, -0x6f, 0x6e, 0x3a, 0x6d, 0x6f, 0x6f, 0x6e, 0x6e, 0x65, 0x77, 0xd83c, 0xdf12, -0x3a, 0x77, 0x61, 0x78, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x65, 0x73, -0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x3a, 0x63, 0x72, -0x65, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x6d, 0x6f, 0x6f, 0x6e, 0x77, 0x61, -0x78, 0x69, 0x6e, 0x67, 0xd83c, 0xdf13, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, -0x5f, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6f, -0x6e, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6d, 0x6f, 0x6f, 0x6e, 0x71, -0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0xd83c, 0xdf14, 0x3a, 0x77, 0x61, 0x78, -0x69, 0x6e, 0x67, 0x5f, 0x67, 0x69, 0x62, 0x62, 0x6f, 0x75, 0x73, 0x5f, -0x6d, 0x6f, 0x6f, 0x6e, 0x3a, 0x67, 0x69, 0x62, 0x62, 0x6f, 0x75, 0x73, -0x6d, 0x6f, 0x6f, 0x6e, 0x77, 0x61, 0x78, 0x69, 0x6e, 0x67, 0xd83c, 0xdf1a, -0x3a, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x77, 0x69, -0x74, 0x68, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, -0x6d, 0x6f, 0x6f, 0x6e, 0x6e, 0x65, 0x77, 0x77, 0x69, 0x74, 0x68, 0xd83c, -0xdf1d, 0x3a, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, -0x63, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x6d, 0x6f, 0x6f, 0x6e, 0x77, 0x69, -0x74, 0x68, 0xd83c, 0xdf1e, 0x3a, 0x73, 0x75, 0x6e, 0x5f, 0x77, 0x69, 0x74, -0x68, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x73, -0x75, 0x6e, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdf1b, 0x3a, 0x66, 0x69, 0x72, -0x73, 0x74, 0x5f, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6d, -0x6f, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x66, 0x61, 0x63, -0x65, 0x3a, 0x66, 0x61, 0x63, 0x65, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6d, -0x6f, 0x6f, 0x6e, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x77, 0x69, -0x74, 0x68, 0xd83c, 0xdf1c, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x71, 0x75, -0x61, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x66, 0x61, 0x63, 0x65, 0x3a, 0x66, 0x61, 0x63, -0x65, 0x6c, 0x61, 0x73, 0x74, 0x6d, 0x6f, 0x6f, 0x6e, 0x71, 0x75, 0x61, -0x72, 0x74, 0x65, 0x72, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdf19, 0x3a, 0x63, -0x72, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, -0x3a, 0x63, 0x72, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x6d, 0x6f, 0x6f, -0x6e, 0xd83d, 0xdcab, 0x3a, 0x64, 0x69, 0x7a, 0x7a, 0x79, 0x3a, 0x64, 0x69, -0x7a, 0x7a, 0x79, 0x2b50, 0xfe0f, 0x3a, 0x73, 0x74, 0x61, 0x72, 0x3a, 0x73, -0x74, 0x61, 0x72, 0xd83c, 0xdf1f, 0x3a, 0x73, 0x74, 0x61, 0x72, 0x32, 0x3a, -0x73, 0x74, 0x61, 0x72, 0x32, 0x2728, 0x3a, 0x73, 0x70, 0x61, 0x72, 0x6b, -0x6c, 0x65, 0x73, 0x3a, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x6c, 0x65, 0x73, -0x26a1, 0xfe0f, 0x3a, 0x7a, 0x61, 0x70, 0x3a, 0x7a, 0x61, 0x70, 0xd83d, 0xdd25, -0x3a, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x3a, 0x66, 0x6c, 0x61, 0x6d, 0x65, -0xd83d, 0xdd25, 0x3a, 0x66, 0x69, 0x72, 0x65, 0x3a, 0x66, 0x69, 0x72, 0x65, -0xd83d, 0xdca5, 0x3a, 0x62, 0x6f, 0x6f, 0x6d, 0x3a, 0x62, 0x6f, 0x6f, 0x6d, -0x2604, 0xfe0f, 0x3a, 0x63, 0x6f, 0x6d, 0x65, 0x74, 0x3a, 0x63, 0x6f, 0x6d, -0x65, 0x74, 0x2600, 0xfe0f, 0x3a, 0x73, 0x75, 0x6e, 0x6e, 0x79, 0x3a, 0x73, -0x75, 0x6e, 0x6e, 0x79, 0xd83c, 0xdf24, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, -0x5f, 0x73, 0x75, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x6d, -0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x63, 0x6c, -0x6f, 0x75, 0x64, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x73, 0x75, 0x6e, 0x77, -0x68, 0x69, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdf24, 0x3a, 0x77, -0x68, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x6e, 0x5f, 0x73, 0x6d, 0x61, -0x6c, 0x6c, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x63, 0x6c, 0x6f, -0x75, 0x64, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x73, 0x75, 0x6e, 0x77, 0x68, -0x69, 0x74, 0x65, 0x26c5, 0xfe0f, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x6c, 0x79, -0x5f, 0x73, 0x75, 0x6e, 0x6e, 0x79, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x6c, -0x79, 0x73, 0x75, 0x6e, 0x6e, 0x79, 0xd83c, 0xdf25, 0x3a, 0x77, 0x68, 0x69, -0x74, 0x65, 0x5f, 0x73, 0x75, 0x6e, 0x5f, 0x62, 0x65, 0x68, 0x69, 0x6e, -0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x62, 0x65, 0x68, 0x69, -0x6e, 0x64, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x75, 0x6e, 0x77, 0x68, -0x69, 0x74, 0x65, 0xd83c, 0xdf25, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, -0x73, 0x75, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x63, 0x6c, -0x6f, 0x75, 0x64, 0x73, 0x75, 0x6e, 0x77, 0x68, 0x69, 0x74, 0x65, 0xd83c, -0xdf26, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x6e, 0x5f, -0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x3a, 0x62, -0x65, 0x68, 0x69, 0x6e, 0x64, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x61, -0x69, 0x6e, 0x73, 0x75, 0x6e, 0x77, 0x68, 0x69, 0x74, 0x65, 0x77, 0x69, -0x74, 0x68, 0xd83c, 0xdf26, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x73, -0x75, 0x6e, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, -0x64, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x73, -0x75, 0x6e, 0x77, 0x68, 0x69, 0x74, 0x65, 0xd83c, 0xdf08, 0x3a, 0x72, 0x61, -0x69, 0x6e, 0x62, 0x6f, 0x77, 0x3a, 0x72, 0x61, 0x69, 0x6e, 0x62, 0x6f, -0x77, 0x2601, 0xfe0f, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x63, 0x6c, -0x6f, 0x75, 0x64, 0xd83c, 0xdf27, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x3a, 0x63, 0x6c, -0x6f, 0x75, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x77, 0x69, 0x74, 0x68, 0xd83c, -0xdf27, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x61, 0x69, 0x6e, -0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x26c8, 0x3a, -0x74, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x6f, 0x75, -0x64, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x3a, 0x61, -0x6e, 0x64, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x74, -0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x26c8, 0x3a, 0x74, 0x68, 0x75, 0x6e, -0x64, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x61, -0x69, 0x6e, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x61, 0x69, 0x6e, -0x74, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0xd83c, 0xdf29, 0x3a, 0x63, 0x6c, -0x6f, 0x75, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6c, 0x69, 0x67, -0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, -0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x77, 0x69, 0x74, -0x68, 0xd83c, 0xdf29, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x6c, 0x69, -0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6c, 0x6f, 0x75, -0x64, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0xd83c, 0xdf28, -0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, -0x73, 0x6e, 0x6f, 0x77, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x6e, -0x6f, 0x77, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdf28, 0x3a, 0x63, 0x6c, 0x6f, -0x75, 0x64, 0x5f, 0x73, 0x6e, 0x6f, 0x77, 0x3a, 0x63, 0x6c, 0x6f, 0x75, -0x64, 0x73, 0x6e, 0x6f, 0x77, 0x2603, 0xfe0f, 0x3a, 0x73, 0x6e, 0x6f, 0x77, -0x6d, 0x61, 0x6e, 0x32, 0x3a, 0x73, 0x6e, 0x6f, 0x77, 0x6d, 0x61, 0x6e, -0x32, 0x26c4, 0xfe0f, 0x3a, 0x73, 0x6e, 0x6f, 0x77, 0x6d, 0x61, 0x6e, 0x3a, -0x73, 0x6e, 0x6f, 0x77, 0x6d, 0x61, 0x6e, 0x2744, 0xfe0f, 0x3a, 0x73, 0x6e, -0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x3a, 0x73, 0x6e, 0x6f, 0x77, -0x66, 0x6c, 0x61, 0x6b, 0x65, 0xd83c, 0xdf2c, 0x3a, 0x77, 0x69, 0x6e, 0x64, -0x5f, 0x62, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, -0x65, 0x3a, 0x62, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x66, 0x61, 0x63, -0x65, 0x77, 0x69, 0x6e, 0x64, 0xd83d, 0xdca8, 0x3a, 0x64, 0x61, 0x73, 0x68, -0x3a, 0x64, 0x61, 0x73, 0x68, 0xd83c, 0xdf2a, 0x3a, 0x63, 0x6c, 0x6f, 0x75, -0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x72, 0x6e, 0x61, -0x64, 0x6f, 0x3a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x74, 0x6f, 0x72, 0x6e, -0x61, 0x64, 0x6f, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdf2a, 0x3a, 0x63, 0x6c, -0x6f, 0x75, 0x64, 0x5f, 0x74, 0x6f, 0x72, 0x6e, 0x61, 0x64, 0x6f, 0x3a, -0x63, 0x6c, 0x6f, 0x75, 0x64, 0x74, 0x6f, 0x72, 0x6e, 0x61, 0x64, 0x6f, -0xd83c, 0xdf2b, 0x3a, 0x66, 0x6f, 0x67, 0x3a, 0x66, 0x6f, 0x67, 0xd83c, 0xdf0a, -0x3a, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x3a, 0x6f, 0x63, 0x65, 0x61, 0x6e, -0xd83d, 0xdca7, 0x3a, 0x64, 0x72, 0x6f, 0x70, 0x6c, 0x65, 0x74, 0x3a, 0x64, -0x72, 0x6f, 0x70, 0x6c, 0x65, 0x74, 0xd83d, 0xdca6, 0x3a, 0x73, 0x77, 0x65, -0x61, 0x74, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x73, 0x3a, 0x64, 0x72, 0x6f, -0x70, 0x73, 0x73, 0x77, 0x65, 0x61, 0x74, 0x2614, 0xfe0f, 0x3a, 0x75, 0x6d, -0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0x3a, 0x75, 0x6d, 0x62, 0x72, 0x65, -0x6c, 0x6c, 0x61, 0xd83c, 0xdf4f, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x5f, -0x61, 0x70, 0x70, 0x6c, 0x65, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x67, -0x72, 0x65, 0x65, 0x6e, 0xd83c, 0xdf4e, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, -0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, 0xd83c, 0xdf50, 0x3a, 0x70, 0x65, 0x61, -0x72, 0x3a, 0x70, 0x65, 0x61, 0x72, 0xd83c, 0xdf4a, 0x3a, 0x74, 0x61, 0x6e, -0x67, 0x65, 0x72, 0x69, 0x6e, 0x65, 0x3a, 0x74, 0x61, 0x6e, 0x67, 0x65, -0x72, 0x69, 0x6e, 0x65, 0xd83c, 0xdf4b, 0x3a, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, -0x3a, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, 0xd83c, 0xdf4c, 0x3a, 0x62, 0x61, 0x6e, -0x61, 0x6e, 0x61, 0x3a, 0x62, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0xd83c, 0xdf49, -0x3a, 0x77, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x6c, 0x6f, 0x6e, 0x3a, -0x77, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x6c, 0x6f, 0x6e, 0xd83c, 0xdf47, -0x3a, 0x67, 0x72, 0x61, 0x70, 0x65, 0x73, 0x3a, 0x67, 0x72, 0x61, 0x70, -0x65, 0x73, 0xd83c, 0xdf53, 0x3a, 0x73, 0x74, 0x72, 0x61, 0x77, 0x62, 0x65, -0x72, 0x72, 0x79, 0x3a, 0x73, 0x74, 0x72, 0x61, 0x77, 0x62, 0x65, 0x72, -0x72, 0x79, 0xd83c, 0xdf48, 0x3a, 0x6d, 0x65, 0x6c, 0x6f, 0x6e, 0x3a, 0x6d, -0x65, 0x6c, 0x6f, 0x6e, 0xd83c, 0xdf52, 0x3a, 0x63, 0x68, 0x65, 0x72, 0x72, -0x69, 0x65, 0x73, 0x3a, 0x63, 0x68, 0x65, 0x72, 0x72, 0x69, 0x65, 0x73, -0xd83c, 0xdf51, 0x3a, 0x70, 0x65, 0x61, 0x63, 0x68, 0x3a, 0x70, 0x65, 0x61, -0x63, 0x68, 0xd83c, 0xdf4d, 0x3a, 0x70, 0x69, 0x6e, 0x65, 0x61, 0x70, 0x70, -0x6c, 0x65, 0x3a, 0x70, 0x69, 0x6e, 0x65, 0x61, 0x70, 0x70, 0x6c, 0x65, -0xd83e, 0xdd5d, 0x3a, 0x6b, 0x69, 0x77, 0x69, 0x66, 0x72, 0x75, 0x69, 0x74, -0x3a, 0x6b, 0x69, 0x77, 0x69, 0x66, 0x72, 0x75, 0x69, 0x74, 0xd83e, 0xdd5d, -0x3a, 0x6b, 0x69, 0x77, 0x69, 0x3a, 0x6b, 0x69, 0x77, 0x69, 0xd83e, 0xdd51, -0x3a, 0x61, 0x76, 0x6f, 0x63, 0x61, 0x64, 0x6f, 0x3a, 0x61, 0x76, 0x6f, -0x63, 0x61, 0x64, 0x6f, 0xd83c, 0xdf45, 0x3a, 0x74, 0x6f, 0x6d, 0x61, 0x74, -0x6f, 0x3a, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x6f, 0xd83c, 0xdf46, 0x3a, 0x65, -0x67, 0x67, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x3a, 0x65, 0x67, 0x67, 0x70, -0x6c, 0x61, 0x6e, 0x74, 0xd83e, 0xdd52, 0x3a, 0x63, 0x75, 0x63, 0x75, 0x6d, -0x62, 0x65, 0x72, 0x3a, 0x63, 0x75, 0x63, 0x75, 0x6d, 0x62, 0x65, 0x72, -0xd83e, 0xdd55, 0x3a, 0x63, 0x61, 0x72, 0x72, 0x6f, 0x74, 0x3a, 0x63, 0x61, -0x72, 0x72, 0x6f, 0x74, 0xd83c, 0xdf3d, 0x3a, 0x63, 0x6f, 0x72, 0x6e, 0x3a, -0x63, 0x6f, 0x72, 0x6e, 0xd83c, 0xdf36, 0x3a, 0x68, 0x6f, 0x74, 0x5f, 0x70, -0x65, 0x70, 0x70, 0x65, 0x72, 0x3a, 0x68, 0x6f, 0x74, 0x70, 0x65, 0x70, -0x70, 0x65, 0x72, 0xd83e, 0xdd54, 0x3a, 0x70, 0x6f, 0x74, 0x61, 0x74, 0x6f, -0x3a, 0x70, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0xd83c, 0xdf60, 0x3a, 0x73, 0x77, -0x65, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x3a, 0x70, -0x6f, 0x74, 0x61, 0x74, 0x6f, 0x73, 0x77, 0x65, 0x65, 0x74, 0xd83c, 0xdf30, -0x3a, 0x63, 0x68, 0x65, 0x73, 0x74, 0x6e, 0x75, 0x74, 0x3a, 0x63, 0x68, -0x65, 0x73, 0x74, 0x6e, 0x75, 0x74, 0xd83e, 0xdd5c, 0x3a, 0x73, 0x68, 0x65, -0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x61, 0x6e, 0x75, 0x74, 0x3a, -0x70, 0x65, 0x61, 0x6e, 0x75, 0x74, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, -0x64, 0xd83e, 0xdd5c, 0x3a, 0x70, 0x65, 0x61, 0x6e, 0x75, 0x74, 0x73, 0x3a, -0x70, 0x65, 0x61, 0x6e, 0x75, 0x74, 0x73, 0xd83c, 0xdf6f, 0x3a, 0x68, 0x6f, -0x6e, 0x65, 0x79, 0x5f, 0x70, 0x6f, 0x74, 0x3a, 0x68, 0x6f, 0x6e, 0x65, -0x79, 0x70, 0x6f, 0x74, 0xd83e, 0xdd50, 0x3a, 0x63, 0x72, 0x6f, 0x69, 0x73, -0x73, 0x61, 0x6e, 0x74, 0x3a, 0x63, 0x72, 0x6f, 0x69, 0x73, 0x73, 0x61, -0x6e, 0x74, 0xd83c, 0xdf5e, 0x3a, 0x62, 0x72, 0x65, 0x61, 0x64, 0x3a, 0x62, -0x72, 0x65, 0x61, 0x64, 0xd83e, 0xdd56, 0x3a, 0x62, 0x61, 0x67, 0x75, 0x65, -0x74, 0x74, 0x65, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x64, 0x3a, 0x62, 0x61, -0x67, 0x75, 0x65, 0x74, 0x74, 0x65, 0x62, 0x72, 0x65, 0x61, 0x64, 0xd83e, -0xdd56, 0x3a, 0x66, 0x72, 0x65, 0x6e, 0x63, 0x68, 0x5f, 0x62, 0x72, 0x65, -0x61, 0x64, 0x3a, 0x62, 0x72, 0x65, 0x61, 0x64, 0x66, 0x72, 0x65, 0x6e, -0x63, 0x68, 0xd83e, 0xddc0, 0x3a, 0x63, 0x68, 0x65, 0x65, 0x73, 0x65, 0x5f, -0x77, 0x65, 0x64, 0x67, 0x65, 0x3a, 0x63, 0x68, 0x65, 0x65, 0x73, 0x65, -0x77, 0x65, 0x64, 0x67, 0x65, 0xd83e, 0xddc0, 0x3a, 0x63, 0x68, 0x65, 0x65, -0x73, 0x65, 0x3a, 0x63, 0x68, 0x65, 0x65, 0x73, 0x65, 0xd83e, 0xdd5a, 0x3a, -0x65, 0x67, 0x67, 0x3a, 0x65, 0x67, 0x67, 0xd83c, 0xdf73, 0x3a, 0x63, 0x6f, -0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, -0x67, 0xd83e, 0xdd53, 0x3a, 0x62, 0x61, 0x63, 0x6f, 0x6e, 0x3a, 0x62, 0x61, -0x63, 0x6f, 0x6e, 0xd83e, 0xdd5e, 0x3a, 0x70, 0x61, 0x6e, 0x63, 0x61, 0x6b, -0x65, 0x73, 0x3a, 0x70, 0x61, 0x6e, 0x63, 0x61, 0x6b, 0x65, 0x73, 0xd83c, -0xdf64, 0x3a, 0x66, 0x72, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x68, 0x72, 0x69, -0x6d, 0x70, 0x3a, 0x66, 0x72, 0x69, 0x65, 0x64, 0x73, 0x68, 0x72, 0x69, -0x6d, 0x70, 0xd83c, 0xdf57, 0x3a, 0x70, 0x6f, 0x75, 0x6c, 0x74, 0x72, 0x79, -0x5f, 0x6c, 0x65, 0x67, 0x3a, 0x6c, 0x65, 0x67, 0x70, 0x6f, 0x75, 0x6c, -0x74, 0x72, 0x79, 0xd83c, 0xdf56, 0x3a, 0x6d, 0x65, 0x61, 0x74, 0x5f, 0x6f, -0x6e, 0x5f, 0x62, 0x6f, 0x6e, 0x65, 0x3a, 0x62, 0x6f, 0x6e, 0x65, 0x6d, -0x65, 0x61, 0x74, 0x6f, 0x6e, 0xd83c, 0xdf55, 0x3a, 0x70, 0x69, 0x7a, 0x7a, -0x61, 0x3a, 0x70, 0x69, 0x7a, 0x7a, 0x61, 0xd83c, 0xdf2d, 0x3a, 0x68, 0x6f, -0x74, 0x5f, 0x64, 0x6f, 0x67, 0x3a, 0x64, 0x6f, 0x67, 0x68, 0x6f, 0x74, -0xd83c, 0xdf2d, 0x3a, 0x68, 0x6f, 0x74, 0x64, 0x6f, 0x67, 0x3a, 0x68, 0x6f, -0x74, 0x64, 0x6f, 0x67, 0xd83c, 0xdf54, 0x3a, 0x68, 0x61, 0x6d, 0x62, 0x75, -0x72, 0x67, 0x65, 0x72, 0x3a, 0x68, 0x61, 0x6d, 0x62, 0x75, 0x72, 0x67, -0x65, 0x72, 0xd83c, 0xdf5f, 0x3a, 0x66, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x66, -0x72, 0x69, 0x65, 0x73, 0xd83e, 0xdd59, 0x3a, 0x73, 0x74, 0x75, 0x66, 0x66, -0x65, 0x64, 0x5f, 0x70, 0x69, 0x74, 0x61, 0x3a, 0x70, 0x69, 0x74, 0x61, -0x73, 0x74, 0x75, 0x66, 0x66, 0x65, 0x64, 0xd83e, 0xdd59, 0x3a, 0x73, 0x74, -0x75, 0x66, 0x66, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x61, 0x74, 0x62, 0x72, -0x65, 0x61, 0x64, 0x3a, 0x66, 0x6c, 0x61, 0x74, 0x62, 0x72, 0x65, 0x61, -0x64, 0x73, 0x74, 0x75, 0x66, 0x66, 0x65, 0x64, 0xd83c, 0xdf2e, 0x3a, 0x74, -0x61, 0x63, 0x6f, 0x3a, 0x74, 0x61, 0x63, 0x6f, 0xd83c, 0xdf2f, 0x3a, 0x62, -0x75, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x3a, 0x62, 0x75, 0x72, 0x72, 0x69, -0x74, 0x6f, 0xd83e, 0xdd57, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x5f, 0x73, -0x61, 0x6c, 0x61, 0x64, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x61, -0x6c, 0x61, 0x64, 0xd83e, 0xdd57, 0x3a, 0x73, 0x61, 0x6c, 0x61, 0x64, 0x3a, -0x73, 0x61, 0x6c, 0x61, 0x64, 0xd83e, 0xdd58, 0x3a, 0x70, 0x61, 0x65, 0x6c, -0x6c, 0x61, 0x3a, 0x70, 0x61, 0x65, 0x6c, 0x6c, 0x61, 0xd83e, 0xdd58, 0x3a, -0x73, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x6e, 0x5f, -0x6f, 0x66, 0x5f, 0x66, 0x6f, 0x6f, 0x64, 0x3a, 0x66, 0x6f, 0x6f, 0x64, -0x6f, 0x66, 0x70, 0x61, 0x6e, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, -0xd83c, 0xdf5d, 0x3a, 0x73, 0x70, 0x61, 0x67, 0x68, 0x65, 0x74, 0x74, 0x69, -0x3a, 0x73, 0x70, 0x61, 0x67, 0x68, 0x65, 0x74, 0x74, 0x69, 0xd83c, 0xdf5c, -0x3a, 0x72, 0x61, 0x6d, 0x65, 0x6e, 0x3a, 0x72, 0x61, 0x6d, 0x65, 0x6e, -0xd83c, 0xdf72, 0x3a, 0x73, 0x74, 0x65, 0x77, 0x3a, 0x73, 0x74, 0x65, 0x77, -0xd83c, 0xdf65, 0x3a, 0x66, 0x69, 0x73, 0x68, 0x5f, 0x63, 0x61, 0x6b, 0x65, -0x3a, 0x63, 0x61, 0x6b, 0x65, 0x66, 0x69, 0x73, 0x68, 0xd83c, 0xdf63, 0x3a, -0x73, 0x75, 0x73, 0x68, 0x69, 0x3a, 0x73, 0x75, 0x73, 0x68, 0x69, 0xd83c, -0xdf71, 0x3a, 0x62, 0x65, 0x6e, 0x74, 0x6f, 0x3a, 0x62, 0x65, 0x6e, 0x74, -0x6f, 0xd83c, 0xdf5b, 0x3a, 0x63, 0x75, 0x72, 0x72, 0x79, 0x3a, 0x63, 0x75, -0x72, 0x72, 0x79, 0xd83c, 0xdf59, 0x3a, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x62, -0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x72, 0x69, 0x63, 0x65, -0xd83c, 0xdf5a, 0x3a, 0x72, 0x69, 0x63, 0x65, 0x3a, 0x72, 0x69, 0x63, 0x65, -0xd83c, 0xdf58, 0x3a, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x61, 0x63, -0x6b, 0x65, 0x72, 0x3a, 0x63, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x72, -0x69, 0x63, 0x65, 0xd83c, 0xdf62, 0x3a, 0x6f, 0x64, 0x65, 0x6e, 0x3a, 0x6f, -0x64, 0x65, 0x6e, 0xd83c, 0xdf61, 0x3a, 0x64, 0x61, 0x6e, 0x67, 0x6f, 0x3a, -0x64, 0x61, 0x6e, 0x67, 0x6f, 0xd83c, 0xdf67, 0x3a, 0x73, 0x68, 0x61, 0x76, -0x65, 0x64, 0x5f, 0x69, 0x63, 0x65, 0x3a, 0x69, 0x63, 0x65, 0x73, 0x68, -0x61, 0x76, 0x65, 0x64, 0xd83c, 0xdf68, 0x3a, 0x69, 0x63, 0x65, 0x5f, 0x63, -0x72, 0x65, 0x61, 0x6d, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x63, -0x65, 0xd83c, 0xdf66, 0x3a, 0x69, 0x63, 0x65, 0x63, 0x72, 0x65, 0x61, 0x6d, -0x3a, 0x69, 0x63, 0x65, 0x63, 0x72, 0x65, 0x61, 0x6d, 0xd83c, 0xdf70, 0x3a, -0x63, 0x61, 0x6b, 0x65, 0x3a, 0x63, 0x61, 0x6b, 0x65, 0xd83c, 0xdf82, 0x3a, -0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x3a, 0x62, 0x69, 0x72, -0x74, 0x68, 0x64, 0x61, 0x79, 0xd83c, 0xdf6e, 0x3a, 0x66, 0x6c, 0x61, 0x6e, -0x3a, 0x66, 0x6c, 0x61, 0x6e, 0xd83c, 0xdf6e, 0x3a, 0x70, 0x75, 0x64, 0x64, -0x69, 0x6e, 0x67, 0x3a, 0x70, 0x75, 0x64, 0x64, 0x69, 0x6e, 0x67, 0xd83c, -0xdf6e, 0x3a, 0x63, 0x75, 0x73, 0x74, 0x61, 0x72, 0x64, 0x3a, 0x63, 0x75, -0x73, 0x74, 0x61, 0x72, 0x64, 0xd83c, 0xdf6d, 0x3a, 0x6c, 0x6f, 0x6c, 0x6c, -0x69, 0x70, 0x6f, 0x70, 0x3a, 0x6c, 0x6f, 0x6c, 0x6c, 0x69, 0x70, 0x6f, -0x70, 0xd83c, 0xdf6c, 0x3a, 0x63, 0x61, 0x6e, 0x64, 0x79, 0x3a, 0x63, 0x61, -0x6e, 0x64, 0x79, 0xd83c, 0xdf6b, 0x3a, 0x63, 0x68, 0x6f, 0x63, 0x6f, 0x6c, -0x61, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x72, 0x3a, 0x62, 0x61, 0x72, 0x63, -0x68, 0x6f, 0x63, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0xd83c, 0xdf7f, 0x3a, 0x70, -0x6f, 0x70, 0x63, 0x6f, 0x72, 0x6e, 0x3a, 0x70, 0x6f, 0x70, 0x63, 0x6f, -0x72, 0x6e, 0xd83c, 0xdf69, 0x3a, 0x64, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x75, -0x74, 0x3a, 0x64, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x75, 0x74, 0xd83c, 0xdf6a, -0x3a, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x3a, 0x63, 0x6f, 0x6f, 0x6b, -0x69, 0x65, 0xd83e, 0xdd5b, 0x3a, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6f, -0x66, 0x5f, 0x6d, 0x69, 0x6c, 0x6b, 0x3a, 0x67, 0x6c, 0x61, 0x73, 0x73, -0x6d, 0x69, 0x6c, 0x6b, 0x6f, 0x66, 0xd83e, 0xdd5b, 0x3a, 0x6d, 0x69, 0x6c, -0x6b, 0x3a, 0x6d, 0x69, 0x6c, 0x6b, 0xd83c, 0xdf7c, 0x3a, 0x62, 0x61, 0x62, -0x79, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x3a, 0x62, 0x61, 0x62, -0x79, 0x62, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x2615, 0xfe0f, 0x3a, 0x63, 0x6f, -0x66, 0x66, 0x65, 0x65, 0x3a, 0x63, 0x6f, 0x66, 0x66, 0x65, 0x65, 0xd83c, -0xdf75, 0x3a, 0x74, 0x65, 0x61, 0x3a, 0x74, 0x65, 0x61, 0xd83c, 0xdf76, 0x3a, -0x73, 0x61, 0x6b, 0x65, 0x3a, 0x73, 0x61, 0x6b, 0x65, 0xd83c, 0xdf7a, 0x3a, -0x62, 0x65, 0x65, 0x72, 0x3a, 0x62, 0x65, 0x65, 0x72, 0xd83c, 0xdf7b, 0x3a, -0x62, 0x65, 0x65, 0x72, 0x73, 0x3a, 0x62, 0x65, 0x65, 0x72, 0x73, 0xd83e, -0xdd42, 0x3a, 0x63, 0x6c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x67, -0x6c, 0x61, 0x73, 0x73, 0x3a, 0x63, 0x6c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, -0x67, 0x67, 0x6c, 0x61, 0x73, 0x73, 0xd83e, 0xdd42, 0x3a, 0x63, 0x68, 0x61, -0x6d, 0x70, 0x61, 0x67, 0x6e, 0x65, 0x5f, 0x67, 0x6c, 0x61, 0x73, 0x73, -0x3a, 0x63, 0x68, 0x61, 0x6d, 0x70, 0x61, 0x67, 0x6e, 0x65, 0x67, 0x6c, -0x61, 0x73, 0x73, 0xd83c, 0xdf77, 0x3a, 0x77, 0x69, 0x6e, 0x65, 0x5f, 0x67, -0x6c, 0x61, 0x73, 0x73, 0x3a, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x77, 0x69, -0x6e, 0x65, 0xd83e, 0xdd43, 0x3a, 0x77, 0x68, 0x69, 0x73, 0x6b, 0x79, 0x3a, -0x77, 0x68, 0x69, 0x73, 0x6b, 0x79, 0xd83e, 0xdd43, 0x3a, 0x74, 0x75, 0x6d, -0x62, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x3a, 0x67, -0x6c, 0x61, 0x73, 0x73, 0x74, 0x75, 0x6d, 0x62, 0x6c, 0x65, 0x72, 0xd83c, -0xdf78, 0x3a, 0x63, 0x6f, 0x63, 0x6b, 0x74, 0x61, 0x69, 0x6c, 0x3a, 0x63, -0x6f, 0x63, 0x6b, 0x74, 0x61, 0x69, 0x6c, 0xd83c, 0xdf79, 0x3a, 0x74, 0x72, -0x6f, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x72, 0x69, 0x6e, 0x6b, -0x3a, 0x64, 0x72, 0x69, 0x6e, 0x6b, 0x74, 0x72, 0x6f, 0x70, 0x69, 0x63, -0x61, 0x6c, 0xd83c, 0xdf7e, 0x3a, 0x62, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, -0x5f, 0x63, 0x6f, 0x72, 0x6b, 0x3a, 0x62, 0x6f, 0x74, 0x74, 0x6c, 0x65, -0x63, 0x6f, 0x72, 0x6b, 0x70, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x77, -0x69, 0x74, 0x68, 0xd83c, 0xdf7e, 0x3a, 0x63, 0x68, 0x61, 0x6d, 0x70, 0x61, -0x67, 0x6e, 0x65, 0x3a, 0x63, 0x68, 0x61, 0x6d, 0x70, 0x61, 0x67, 0x6e, -0x65, 0xd83e, 0xdd44, 0x3a, 0x73, 0x70, 0x6f, 0x6f, 0x6e, 0x3a, 0x73, 0x70, -0x6f, 0x6f, 0x6e, 0xd83c, 0xdf74, 0x3a, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x61, -0x6e, 0x64, 0x5f, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x3a, 0x61, 0x6e, 0x64, -0x66, 0x6f, 0x72, 0x6b, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0xd83c, 0xdf7d, 0x3a, -0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x6b, 0x6e, 0x69, -0x66, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x6c, 0x61, 0x74, -0x65, 0x3a, 0x61, 0x6e, 0x64, 0x66, 0x6f, 0x72, 0x6b, 0x6b, 0x6e, 0x69, -0x66, 0x65, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0xd83c, -0xdf7d, 0x3a, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x6b, 0x6e, 0x69, 0x66, 0x65, -0x5f, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3a, 0x66, 0x6f, 0x72, 0x6b, 0x6b, -0x6e, 0x69, 0x66, 0x65, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x26bd, 0xfe0f, 0x3a, -0x73, 0x6f, 0x63, 0x63, 0x65, 0x72, 0x3a, 0x73, 0x6f, 0x63, 0x63, 0x65, -0x72, 0xd83c, 0xdfc0, 0x3a, 0x62, 0x61, 0x73, 0x6b, 0x65, 0x74, 0x62, 0x61, -0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x73, 0x6b, 0x65, 0x74, 0x62, 0x61, 0x6c, -0x6c, 0xd83c, 0xdfc8, 0x3a, 0x66, 0x6f, 0x6f, 0x74, 0x62, 0x61, 0x6c, 0x6c, -0x3a, 0x66, 0x6f, 0x6f, 0x74, 0x62, 0x61, 0x6c, 0x6c, 0x26be, 0xfe0f, 0x3a, -0x62, 0x61, 0x73, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x73, -0x65, 0x62, 0x61, 0x6c, 0x6c, 0xd83c, 0xdfbe, 0x3a, 0x74, 0x65, 0x6e, 0x6e, -0x69, 0x73, 0x3a, 0x74, 0x65, 0x6e, 0x6e, 0x69, 0x73, 0xd83c, 0xdfd0, 0x3a, -0x76, 0x6f, 0x6c, 0x6c, 0x65, 0x79, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x76, -0x6f, 0x6c, 0x6c, 0x65, 0x79, 0x62, 0x61, 0x6c, 0x6c, 0xd83c, 0xdfc9, 0x3a, -0x72, 0x75, 0x67, 0x62, 0x79, 0x5f, 0x66, 0x6f, 0x6f, 0x74, 0x62, 0x61, -0x6c, 0x6c, 0x3a, 0x66, 0x6f, 0x6f, 0x74, 0x62, 0x61, 0x6c, 0x6c, 0x72, -0x75, 0x67, 0x62, 0x79, 0xd83c, 0xdfb1, 0x3a, 0x38, 0x62, 0x61, 0x6c, 0x6c, -0x3a, 0x38, 0x62, 0x61, 0x6c, 0x6c, 0xd83c, 0xdfd3, 0x3a, 0x74, 0x61, 0x62, -0x6c, 0x65, 0x5f, 0x74, 0x65, 0x6e, 0x6e, 0x69, 0x73, 0x3a, 0x74, 0x61, -0x62, 0x6c, 0x65, 0x74, 0x65, 0x6e, 0x6e, 0x69, 0x73, 0xd83c, 0xdfd3, 0x3a, -0x70, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6e, 0x67, 0x3a, 0x70, 0x69, -0x6e, 0x67, 0x70, 0x6f, 0x6e, 0x67, 0xd83c, 0xdff8, 0x3a, 0x62, 0x61, 0x64, -0x6d, 0x69, 0x6e, 0x74, 0x6f, 0x6e, 0x3a, 0x62, 0x61, 0x64, 0x6d, 0x69, -0x6e, 0x74, 0x6f, 0x6e, 0xd83e, 0xdd45, 0x3a, 0x67, 0x6f, 0x61, 0x6c, 0x5f, -0x6e, 0x65, 0x74, 0x3a, 0x67, 0x6f, 0x61, 0x6c, 0x6e, 0x65, 0x74, 0xd83e, -0xdd45, 0x3a, 0x67, 0x6f, 0x61, 0x6c, 0x3a, 0x67, 0x6f, 0x61, 0x6c, 0xd83c, -0xdfd2, 0x3a, 0x68, 0x6f, 0x63, 0x6b, 0x65, 0x79, 0x3a, 0x68, 0x6f, 0x63, -0x6b, 0x65, 0x79, 0xd83c, 0xdfd1, 0x3a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, -0x68, 0x6f, 0x63, 0x6b, 0x65, 0x79, 0x3a, 0x66, 0x69, 0x65, 0x6c, 0x64, -0x68, 0x6f, 0x63, 0x6b, 0x65, 0x79, 0xd83c, 0xdfcf, 0x3a, 0x63, 0x72, 0x69, -0x63, 0x6b, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x5f, 0x62, 0x61, 0x6c, -0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x74, 0x63, 0x72, 0x69, -0x63, 0x6b, 0x65, 0x74, 0xd83c, 0xdfcf, 0x3a, 0x63, 0x72, 0x69, 0x63, 0x6b, -0x65, 0x74, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x3a, 0x63, 0x72, 0x69, 0x63, -0x6b, 0x65, 0x74, 0x67, 0x61, 0x6d, 0x65, 0x26f3, 0xfe0f, 0x3a, 0x67, 0x6f, -0x6c, 0x66, 0x3a, 0x67, 0x6f, 0x6c, 0x66, 0xd83c, 0xdff9, 0x3a, 0x61, 0x72, -0x63, 0x68, 0x65, 0x72, 0x79, 0x3a, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, -0x79, 0xd83c, 0xdff9, 0x3a, 0x62, 0x6f, 0x77, 0x5f, 0x61, 0x6e, 0x64, 0x5f, -0x61, 0x72, 0x72, 0x6f, 0x77, 0x3a, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x72, -0x6f, 0x77, 0x62, 0x6f, 0x77, 0xd83c, 0xdfa3, 0x3a, 0x66, 0x69, 0x73, 0x68, -0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x64, -0x5f, 0x66, 0x69, 0x73, 0x68, 0x3a, 0x61, 0x6e, 0x64, 0x66, 0x69, 0x73, -0x68, 0x66, 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x70, 0x6f, 0x6c, 0x65, -0xd83e, 0xdd4a, 0x3a, 0x62, 0x6f, 0x78, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x6c, -0x6f, 0x76, 0x65, 0x73, 0x3a, 0x62, 0x6f, 0x78, 0x69, 0x6e, 0x67, 0x67, -0x6c, 0x6f, 0x76, 0x65, 0x73, 0xd83e, 0xdd4a, 0x3a, 0x62, 0x6f, 0x78, 0x69, -0x6e, 0x67, 0x5f, 0x67, 0x6c, 0x6f, 0x76, 0x65, 0x3a, 0x62, 0x6f, 0x78, -0x69, 0x6e, 0x67, 0x67, 0x6c, 0x6f, 0x76, 0x65, 0xd83e, 0xdd4b, 0x3a, 0x6b, -0x61, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, -0x6d, 0x3a, 0x6b, 0x61, 0x72, 0x61, 0x74, 0x65, 0x75, 0x6e, 0x69, 0x66, -0x6f, 0x72, 0x6d, 0xd83e, 0xdd4b, 0x3a, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x61, -0x6c, 0x5f, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x75, 0x6e, 0x69, 0x66, 0x6f, -0x72, 0x6d, 0x3a, 0x61, 0x72, 0x74, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x69, -0x61, 0x6c, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x26f8, 0x3a, 0x69, -0x63, 0x65, 0x5f, 0x73, 0x6b, 0x61, 0x74, 0x65, 0x3a, 0x69, 0x63, 0x65, -0x73, 0x6b, 0x61, 0x74, 0x65, 0xd83c, 0xdfbf, 0x3a, 0x73, 0x6b, 0x69, 0x3a, -0x73, 0x6b, 0x69, 0x26f7, 0x3a, 0x73, 0x6b, 0x69, 0x65, 0x72, 0x3a, 0x73, -0x6b, 0x69, 0x65, 0x72, 0xd83c, 0xdfc2, 0x3a, 0x73, 0x6e, 0x6f, 0x77, 0x62, -0x6f, 0x61, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x73, 0x6e, 0x6f, 0x77, 0x62, -0x6f, 0x61, 0x72, 0x64, 0x65, 0x72, 0xd83c, 0xdfcb, 0xfe0f, 0x200d, 0x2640, 0xfe0f, -0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x6c, 0x69, 0x66, 0x74, 0x69, -0x6e, 0x67, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3a, 0x6c, -0x69, 0x66, 0x74, 0x69, 0x6e, 0x67, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, -0x73, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83c, 0xdfcb, 0xfe0f, 0x3a, 0x6d, 0x61, -0x6e, 0x5f, 0x6c, 0x69, 0x66, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x65, -0x69, 0x67, 0x68, 0x74, 0x73, 0x3a, 0x6c, 0x69, 0x66, 0x74, 0x69, 0x6e, -0x67, 0x6d, 0x61, 0x6e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0xd83c, -0xdfcb, 0xfe0f, 0x3a, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6c, 0x69, -0x66, 0x74, 0x65, 0x72, 0x3a, 0x6c, 0x69, 0x66, 0x74, 0x65, 0x72, 0x77, -0x65, 0x69, 0x67, 0x68, 0x74, 0xd83c, 0xdfcb, 0xfe0f, 0x3a, 0x6c, 0x69, 0x66, -0x74, 0x65, 0x72, 0x3a, 0x6c, 0x69, 0x66, 0x74, 0x65, 0x72, 0xd83c, 0xdfcb, -0xfe0f, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x66, -0x74, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, -0x3a, 0x6c, 0x69, 0x66, 0x74, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0xd83e, 0xdd3a, 0x3a, -0x66, 0x65, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x65, 0x6e, 0x63, -0x69, 0x6e, 0x67, 0xd83e, 0xdd3a, 0x3a, 0x66, 0x65, 0x6e, 0x63, 0x65, 0x72, -0x3a, 0x66, 0x65, 0x6e, 0x63, 0x65, 0x72, 0xd83e, 0xdd3a, 0x3a, 0x70, 0x65, -0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x65, 0x6e, 0x63, 0x69, 0x6e, 0x67, -0x3a, 0x66, 0x65, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0xd83e, 0xdd3c, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x65, -0x6e, 0x5f, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x3a, -0x77, 0x6f, 0x6d, 0x65, 0x6e, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, -0x6e, 0x67, 0xd83e, 0xdd3c, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x65, 0x6e, 0x5f, -0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x3a, 0x6d, 0x65, -0x6e, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0xd83e, 0xdd3c, -0x200d, 0x2642, 0xfe0f, 0x3a, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e, -0x67, 0x3a, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0xd83e, -0xdd3c, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x65, -0x72, 0x73, 0x3a, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x65, 0x72, 0x73, -0xd83e, 0xdd3c, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, -0x5f, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x3a, 0x70, -0x65, 0x6f, 0x70, 0x6c, 0x65, 0x77, 0x72, 0x65, 0x73, 0x74, 0x6c, 0x69, -0x6e, 0x67, 0xd83e, 0xdd38, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0x5f, 0x63, 0x61, 0x72, 0x74, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x69, -0x6e, 0x67, 0x3a, 0x63, 0x61, 0x72, 0x74, 0x77, 0x68, 0x65, 0x65, 0x6c, -0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83e, 0xdd38, 0x200d, 0x2642, -0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x63, 0x61, 0x72, 0x74, 0x77, 0x68, -0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x61, 0x72, 0x74, 0x77, -0x68, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0xd83e, 0xdd38, -0x200d, 0x2642, 0xfe0f, 0x3a, 0x63, 0x61, 0x72, 0x74, 0x77, 0x68, 0x65, 0x65, -0x6c, 0x3a, 0x63, 0x61, 0x72, 0x74, 0x77, 0x68, 0x65, 0x65, 0x6c, 0xd83e, -0xdd38, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, -0x64, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x61, 0x72, 0x74, 0x77, 0x68, -0x65, 0x65, 0x6c, 0x3a, 0x63, 0x61, 0x72, 0x74, 0x77, 0x68, 0x65, 0x65, -0x6c, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x26f9, 0xfe0f, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, -0x62, 0x6f, 0x75, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x6c, -0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x62, 0x6f, 0x75, 0x6e, 0x63, 0x69, -0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x26f9, 0xfe0f, 0x3a, 0x6d, 0x61, -0x6e, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x62, -0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x62, 0x6f, 0x75, 0x6e, -0x63, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x26f9, 0xfe0f, 0x3a, 0x70, 0x65, -0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x62, 0x61, -0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x70, 0x65, 0x72, 0x73, 0x6f, -0x6e, 0x77, 0x69, 0x74, 0x68, 0x26f9, 0xfe0f, 0x3a, 0x62, 0x61, 0x73, 0x6b, -0x65, 0x74, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, -0x72, 0x3a, 0x62, 0x61, 0x73, 0x6b, 0x65, 0x74, 0x62, 0x61, 0x6c, 0x6c, -0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x26f9, 0xfe0f, 0x3a, 0x70, 0x65, 0x72, -0x73, 0x6f, 0x6e, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x63, 0x69, 0x6e, 0x67, -0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x62, 0x6f, -0x75, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0xd83e, 0xdd3e, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, -0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, -0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x62, 0x61, 0x6c, -0x6c, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, -0x6e, 0xd83e, 0xdd3e, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x62, -0x61, 0x6c, 0x6c, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x62, 0x61, 0x6c, 0x6c, -0xd83e, 0xdd3e, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, -0x64, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x62, 0x61, -0x6c, 0x6c, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x70, 0x6c, 0x61, 0x79, -0x69, 0x6e, 0x67, 0xd83e, 0xdd3e, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, -0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x6e, -0x64, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x68, 0x61, 0x6e, 0x64, 0x62, 0x61, -0x6c, 0x6c, 0x6d, 0x61, 0x6e, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, -0xd83c, 0xdfcc, 0xfe0f, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, -0x5f, 0x67, 0x6f, 0x6c, 0x66, 0x69, 0x6e, 0x67, 0x3a, 0x67, 0x6f, 0x6c, -0x66, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83c, 0xdfcc, 0xfe0f, -0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x67, 0x6f, 0x6c, 0x66, 0x69, 0x6e, 0x67, -0x3a, 0x67, 0x6f, 0x6c, 0x66, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0xd83c, -0xdfcc, 0xfe0f, 0x3a, 0x67, 0x6f, 0x6c, 0x66, 0x65, 0x72, 0x3a, 0x67, 0x6f, -0x6c, 0x66, 0x65, 0x72, 0xd83c, 0xdfcc, 0xfe0f, 0x3a, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0x5f, 0x67, 0x6f, 0x6c, 0x66, 0x69, 0x6e, 0x67, 0x3a, 0x67, -0x6f, 0x6c, 0x66, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0xd83c, 0xdfc4, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, -0x73, 0x75, 0x72, 0x66, 0x69, 0x6e, 0x67, 0x3a, 0x73, 0x75, 0x72, 0x66, -0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83c, 0xdfc4, 0x3a, 0x6d, -0x61, 0x6e, 0x5f, 0x73, 0x75, 0x72, 0x66, 0x69, 0x6e, 0x67, 0x3a, 0x6d, -0x61, 0x6e, 0x73, 0x75, 0x72, 0x66, 0x69, 0x6e, 0x67, 0xd83c, 0xdfc4, 0x3a, -0x73, 0x75, 0x72, 0x66, 0x65, 0x72, 0x3a, 0x73, 0x75, 0x72, 0x66, 0x65, -0x72, 0xd83c, 0xdfc4, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x73, -0x75, 0x72, 0x66, 0x69, 0x6e, 0x67, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, -0x6e, 0x73, 0x75, 0x72, 0x66, 0x69, 0x6e, 0x67, 0xd83c, 0xdfca, 0x200d, 0x2640, -0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x73, 0x77, 0x69, 0x6d, -0x6d, 0x69, 0x6e, 0x67, 0x3a, 0x73, 0x77, 0x69, 0x6d, 0x6d, 0x69, 0x6e, -0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83c, 0xdfca, 0x3a, 0x6d, 0x61, 0x6e, -0x5f, 0x73, 0x77, 0x69, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x3a, 0x6d, 0x61, -0x6e, 0x73, 0x77, 0x69, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0xd83c, 0xdfca, 0x3a, -0x73, 0x77, 0x69, 0x6d, 0x6d, 0x65, 0x72, 0x3a, 0x73, 0x77, 0x69, 0x6d, -0x6d, 0x65, 0x72, 0xd83c, 0xdfca, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, -0x5f, 0x73, 0x77, 0x69, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x3a, 0x70, 0x65, -0x72, 0x73, 0x6f, 0x6e, 0x73, 0x77, 0x69, 0x6d, 0x6d, 0x69, 0x6e, 0x67, -0xd83e, 0xdd3d, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, -0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x61, 0x74, 0x65, -0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x6f, 0x3a, 0x70, 0x6c, 0x61, 0x79, 0x69, -0x6e, 0x67, 0x70, 0x6f, 0x6c, 0x6f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0xd83e, 0xdd3d, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, -0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x61, -0x74, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x6f, 0x3a, 0x6d, 0x61, 0x6e, -0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x70, 0x6f, 0x6c, 0x6f, 0x77, -0x61, 0x74, 0x65, 0x72, 0xd83e, 0xdd3d, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x77, 0x61, -0x74, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x6f, 0x3a, 0x70, 0x6f, 0x6c, -0x6f, 0x77, 0x61, 0x74, 0x65, 0x72, 0xd83e, 0xdd3d, 0x200d, 0x2642, 0xfe0f, 0x3a, -0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, -0x6e, 0x67, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, -0x6f, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x70, 0x6c, 0x61, 0x79, -0x69, 0x6e, 0x67, 0x70, 0x6f, 0x6c, 0x6f, 0x77, 0x61, 0x74, 0x65, 0x72, -0xd83d, 0xdea3, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, -0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6f, 0x61, 0x74, 0x3a, -0x62, 0x6f, 0x61, 0x74, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x77, 0x6f, -0x6d, 0x61, 0x6e, 0xd83d, 0xdea3, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x6f, -0x77, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6f, 0x61, 0x74, 0x3a, 0x62, 0x6f, -0x61, 0x74, 0x6d, 0x61, 0x6e, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0xd83d, -0xdea3, 0x3a, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x61, 0x74, 0x3a, 0x72, 0x6f, -0x77, 0x62, 0x6f, 0x61, 0x74, 0xd83d, 0xdea3, 0x3a, 0x70, 0x65, 0x72, 0x73, -0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6f, -0x61, 0x74, 0x3a, 0x62, 0x6f, 0x61, 0x74, 0x70, 0x65, 0x72, 0x73, 0x6f, -0x6e, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0xd83c, 0xdfc7, 0x3a, 0x68, 0x6f, -0x72, 0x73, 0x65, 0x5f, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3a, 0x68, -0x6f, 0x72, 0x73, 0x65, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0xd83d, 0xdeb4, -0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x62, 0x69, -0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x67, 0x77, -0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdeb4, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x62, -0x69, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x67, -0x6d, 0x61, 0x6e, 0xd83d, 0xdeb4, 0x3a, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, -0x69, 0x73, 0x74, 0x3a, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x69, 0x73, -0x74, 0xd83d, 0xdeb4, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x62, -0x69, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x67, -0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83d, 0xdeb5, 0x200d, 0x2640, 0xfe0f, 0x3a, -0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, -0x69, 0x6e, 0x5f, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x69, -0x6b, 0x69, 0x6e, 0x67, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, -0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83d, 0xdeb5, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, -0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x62, 0x69, 0x6b, -0x69, 0x6e, 0x67, 0x3a, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x67, 0x6d, 0x61, -0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0xd83d, 0xdeb5, 0x3a, -0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x62, 0x69, 0x63, -0x79, 0x63, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x62, 0x69, 0x63, 0x79, 0x63, -0x6c, 0x69, 0x73, 0x74, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, -0xd83d, 0xdeb5, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, -0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x62, 0x69, 0x6b, 0x69, 0x6e, -0x67, 0x3a, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x67, 0x6d, 0x6f, 0x75, 0x6e, -0x74, 0x61, 0x69, 0x6e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83c, 0xdfbd, -0x3a, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x68, 0x69, -0x72, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x61, 0x73, 0x68, -0x3a, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x61, 0x73, 0x68, -0x73, 0x68, 0x69, 0x72, 0x74, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdfc5, 0x3a, -0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x6d, 0x65, 0x64, 0x61, 0x6c, -0x3a, 0x6d, 0x65, 0x64, 0x61, 0x6c, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, -0xd83c, 0xdfc5, 0x3a, 0x6d, 0x65, 0x64, 0x61, 0x6c, 0x3a, 0x6d, 0x65, 0x64, -0x61, 0x6c, 0xd83c, 0xdf96, 0x3a, 0x6d, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x72, -0x79, 0x5f, 0x6d, 0x65, 0x64, 0x61, 0x6c, 0x3a, 0x6d, 0x65, 0x64, 0x61, -0x6c, 0x6d, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x72, 0x79, 0xd83e, 0xdd47, 0x3a, -0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, -0x6d, 0x65, 0x64, 0x61, 0x6c, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x6d, -0x65, 0x64, 0x61, 0x6c, 0x70, 0x6c, 0x61, 0x63, 0x65, 0xd83e, 0xdd47, 0x3a, -0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, -0x66, 0x69, 0x72, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0xd83e, 0xdd48, -0x3a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x63, -0x65, 0x5f, 0x6d, 0x65, 0x64, 0x61, 0x6c, 0x3a, 0x6d, 0x65, 0x64, 0x61, -0x6c, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, -0xd83e, 0xdd48, 0x3a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x6c, -0x61, 0x63, 0x65, 0x3a, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x65, 0x63, -0x6f, 0x6e, 0x64, 0xd83e, 0xdd49, 0x3a, 0x74, 0x68, 0x69, 0x72, 0x64, 0x5f, -0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x64, 0x61, 0x6c, 0x3a, -0x6d, 0x65, 0x64, 0x61, 0x6c, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x74, 0x68, -0x69, 0x72, 0x64, 0xd83e, 0xdd49, 0x3a, 0x74, 0x68, 0x69, 0x72, 0x64, 0x5f, -0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x74, -0x68, 0x69, 0x72, 0x64, 0xd83c, 0xdfc6, 0x3a, 0x74, 0x72, 0x6f, 0x70, 0x68, -0x79, 0x3a, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x79, 0xd83c, 0xdff5, 0x3a, 0x72, -0x6f, 0x73, 0x65, 0x74, 0x74, 0x65, 0x3a, 0x72, 0x6f, 0x73, 0x65, 0x74, -0x74, 0x65, 0xd83c, 0xdf97, 0x3a, 0x72, 0x65, 0x6d, 0x69, 0x6e, 0x64, 0x65, -0x72, 0x5f, 0x72, 0x69, 0x62, 0x62, 0x6f, 0x6e, 0x3a, 0x72, 0x65, 0x6d, -0x69, 0x6e, 0x64, 0x65, 0x72, 0x72, 0x69, 0x62, 0x62, 0x6f, 0x6e, 0xd83c, -0xdfab, 0x3a, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x3a, 0x74, 0x69, 0x63, -0x6b, 0x65, 0x74, 0xd83c, 0xdf9f, 0x3a, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, -0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x3a, -0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x74, 0x69, 0x63, -0x6b, 0x65, 0x74, 0x73, 0xd83c, 0xdf9f, 0x3a, 0x74, 0x69, 0x63, 0x6b, 0x65, -0x74, 0x73, 0x3a, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0xd83c, 0xdfaa, -0x3a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x73, 0x5f, 0x74, 0x65, 0x6e, 0x74, -0x3a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x73, 0x74, 0x65, 0x6e, 0x74, 0xd83e, -0xdd39, 0x200d, 0x2640, 0xfe0f, 0x3a, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x5f, 0x6a, -0x75, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x3a, 0x6a, 0x75, 0x67, 0x67, -0x6c, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0xd83e, 0xdd39, 0x200d, -0x2642, 0xfe0f, 0x3a, 0x6d, 0x61, 0x6e, 0x5f, 0x6a, 0x75, 0x67, 0x67, 0x6c, -0x69, 0x6e, 0x67, 0x3a, 0x6a, 0x75, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, -0x6d, 0x61, 0x6e, 0xd83e, 0xdd39, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6a, 0x75, 0x67, -0x67, 0x6c, 0x65, 0x72, 0x3a, 0x6a, 0x75, 0x67, 0x67, 0x6c, 0x65, 0x72, -0xd83e, 0xdd39, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x6a, 0x75, 0x67, 0x67, 0x6c, 0x69, -0x6e, 0x67, 0x3a, 0x6a, 0x75, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0xd83e, -0xdd39, 0x200d, 0x2642, 0xfe0f, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, -0x6a, 0x75, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x3a, 0x6a, 0x75, 0x67, -0x67, 0x6c, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0xd83c, -0xdfad, 0x3a, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, -0x5f, 0x61, 0x72, 0x74, 0x73, 0x3a, 0x61, 0x72, 0x74, 0x73, 0x70, 0x65, -0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0xd83c, 0xdfa8, 0x3a, 0x61, -0x72, 0x74, 0x3a, 0x61, 0x72, 0x74, 0xd83c, 0xdfac, 0x3a, 0x63, 0x6c, 0x61, -0x70, 0x70, 0x65, 0x72, 0x3a, 0x63, 0x6c, 0x61, 0x70, 0x70, 0x65, 0x72, -0xd83c, 0xdfa4, 0x3a, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, -0x65, 0x3a, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, -0xd83c, 0xdfa7, 0x3a, 0x68, 0x65, 0x61, 0x64, 0x70, 0x68, 0x6f, 0x6e, 0x65, -0x73, 0x3a, 0x68, 0x65, 0x61, 0x64, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x73, -0xd83c, 0xdfbc, 0x3a, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, -0x63, 0x6f, 0x72, 0x65, 0x3a, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, -0x73, 0x63, 0x6f, 0x72, 0x65, 0xd83c, 0xdfb9, 0x3a, 0x6d, 0x75, 0x73, 0x69, -0x63, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, -0x3a, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x6d, 0x75, 0x73, -0x69, 0x63, 0x61, 0x6c, 0xd83e, 0xdd41, 0x3a, 0x64, 0x72, 0x75, 0x6d, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x72, 0x75, 0x6d, 0x73, 0x74, 0x69, -0x63, 0x6b, 0x73, 0x3a, 0x64, 0x72, 0x75, 0x6d, 0x64, 0x72, 0x75, 0x6d, -0x73, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x77, 0x69, 0x74, 0x68, 0xd83e, 0xdd41, -0x3a, 0x64, 0x72, 0x75, 0x6d, 0x3a, 0x64, 0x72, 0x75, 0x6d, 0xd83c, 0xdfb7, -0x3a, 0x73, 0x61, 0x78, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x3a, 0x73, -0x61, 0x78, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0xd83c, 0xdfba, 0x3a, 0x74, -0x72, 0x75, 0x6d, 0x70, 0x65, 0x74, 0x3a, 0x74, 0x72, 0x75, 0x6d, 0x70, -0x65, 0x74, 0xd83c, 0xdfb8, 0x3a, 0x67, 0x75, 0x69, 0x74, 0x61, 0x72, 0x3a, -0x67, 0x75, 0x69, 0x74, 0x61, 0x72, 0xd83c, 0xdfbb, 0x3a, 0x76, 0x69, 0x6f, -0x6c, 0x69, 0x6e, 0x3a, 0x76, 0x69, 0x6f, 0x6c, 0x69, 0x6e, 0xd83c, 0xdfb2, -0x3a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x65, 0x3a, 0x64, 0x69, -0x65, 0x67, 0x61, 0x6d, 0x65, 0xd83c, 0xdfaf, 0x3a, 0x64, 0x61, 0x72, 0x74, -0x3a, 0x64, 0x61, 0x72, 0x74, 0xd83c, 0xdfb3, 0x3a, 0x62, 0x6f, 0x77, 0x6c, -0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, 0x77, 0x6c, 0x69, 0x6e, 0x67, 0xd83c, -0xdfae, 0x3a, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x5f, 0x67, 0x61, 0x6d, 0x65, -0x3a, 0x67, 0x61, 0x6d, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0xd83c, 0xdfb0, -0x3a, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, -0x65, 0x3a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x6c, 0x6f, -0x74, 0xd83d, 0xde97, 0x3a, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x72, 0x3a, -0x63, 0x61, 0x72, 0x72, 0x65, 0x64, 0xd83d, 0xde95, 0x3a, 0x74, 0x61, 0x78, -0x69, 0x3a, 0x74, 0x61, 0x78, 0x69, 0xd83d, 0xde99, 0x3a, 0x62, 0x6c, 0x75, -0x65, 0x5f, 0x63, 0x61, 0x72, 0x3a, 0x62, 0x6c, 0x75, 0x65, 0x63, 0x61, -0x72, 0xd83d, 0xde8c, 0x3a, 0x62, 0x75, 0x73, 0x3a, 0x62, 0x75, 0x73, 0xd83d, -0xde8e, 0x3a, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x79, 0x62, 0x75, 0x73, -0x3a, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x79, 0x62, 0x75, 0x73, 0xd83c, -0xdfce, 0x3a, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x61, 0x72, -0x3a, 0x63, 0x61, 0x72, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0xd83c, 0xdfce, -0x3a, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x72, 0x3a, 0x63, 0x61, -0x72, 0x72, 0x61, 0x63, 0x65, 0xd83d, 0xde93, 0x3a, 0x70, 0x6f, 0x6c, 0x69, -0x63, 0x65, 0x5f, 0x63, 0x61, 0x72, 0x3a, 0x63, 0x61, 0x72, 0x70, 0x6f, -0x6c, 0x69, 0x63, 0x65, 0xd83d, 0xde91, 0x3a, 0x61, 0x6d, 0x62, 0x75, 0x6c, -0x61, 0x6e, 0x63, 0x65, 0x3a, 0x61, 0x6d, 0x62, 0x75, 0x6c, 0x61, 0x6e, -0x63, 0x65, 0xd83d, 0xde92, 0x3a, 0x66, 0x69, 0x72, 0x65, 0x5f, 0x65, 0x6e, -0x67, 0x69, 0x6e, 0x65, 0x3a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x66, -0x69, 0x72, 0x65, 0xd83d, 0xde90, 0x3a, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x75, -0x73, 0x3a, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x75, 0x73, 0xd83d, 0xde9a, 0x3a, -0x74, 0x72, 0x75, 0x63, 0x6b, 0x3a, 0x74, 0x72, 0x75, 0x63, 0x6b, 0xd83d, -0xde9b, 0x3a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, -0x64, 0x5f, 0x6c, 0x6f, 0x72, 0x72, 0x79, 0x3a, 0x61, 0x72, 0x74, 0x69, -0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x6c, 0x6f, 0x72, 0x72, 0x79, -0xd83d, 0xde9c, 0x3a, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x74, -0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0xd83d, 0xdef4, 0x3a, 0x73, 0x63, 0x6f, -0x6f, 0x74, 0x65, 0x72, 0x3a, 0x73, 0x63, 0x6f, 0x6f, 0x74, 0x65, 0x72, -0xd83d, 0xdeb2, 0x3a, 0x62, 0x69, 0x6b, 0x65, 0x3a, 0x62, 0x69, 0x6b, 0x65, -0xd83d, 0xdef5, 0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x62, 0x69, 0x6b, 0x65, -0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x62, 0x69, 0x6b, 0x65, 0xd83d, 0xdef5, -0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x6f, 0x74, -0x65, 0x72, 0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x73, 0x63, 0x6f, 0x6f, -0x74, 0x65, 0x72, 0xd83c, 0xdfcd, 0x3a, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, -0x5f, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3a, -0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x61, -0x63, 0x69, 0x6e, 0x67, 0xd83c, 0xdfcd, 0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, -0x63, 0x79, 0x63, 0x6c, 0x65, 0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x63, -0x79, 0x63, 0x6c, 0x65, 0xd83d, 0xdea8, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, -0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6c, 0x69, -0x67, 0x68, 0x74, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6e, 0x67, 0xd83d, -0xde94, 0x3a, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x70, -0x6f, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x72, 0x3a, 0x63, 0x61, -0x72, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x70, 0x6f, 0x6c, -0x69, 0x63, 0x65, 0xd83d, 0xde8d, 0x3a, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x69, -0x6e, 0x67, 0x5f, 0x62, 0x75, 0x73, 0x3a, 0x62, 0x75, 0x73, 0x6f, 0x6e, -0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0xd83d, 0xde98, 0x3a, 0x6f, 0x6e, 0x63, -0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, -0x62, 0x69, 0x6c, 0x65, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x62, -0x69, 0x6c, 0x65, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0xd83d, -0xde96, 0x3a, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x74, -0x61, 0x78, 0x69, 0x3a, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, -0x74, 0x61, 0x78, 0x69, 0xd83d, 0xdea1, 0x3a, 0x61, 0x65, 0x72, 0x69, 0x61, -0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6d, 0x77, 0x61, 0x79, 0x3a, 0x61, 0x65, -0x72, 0x69, 0x61, 0x6c, 0x74, 0x72, 0x61, 0x6d, 0x77, 0x61, 0x79, 0xd83d, -0xdea0, 0x3a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x63, -0x61, 0x62, 0x6c, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x63, 0x61, 0x62, 0x6c, -0x65, 0x77, 0x61, 0x79, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, -0xd83d, 0xde9f, 0x3a, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x6f, -0x6e, 0x5f, 0x72, 0x61, 0x69, 0x6c, 0x77, 0x61, 0x79, 0x3a, 0x72, 0x61, -0x69, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x73, -0x69, 0x6f, 0x6e, 0xd83d, 0xde83, 0x3a, 0x72, 0x61, 0x69, 0x6c, 0x77, 0x61, -0x79, 0x5f, 0x63, 0x61, 0x72, 0x3a, 0x63, 0x61, 0x72, 0x72, 0x61, 0x69, -0x6c, 0x77, 0x61, 0x79, 0xd83d, 0xde8b, 0x3a, 0x74, 0x72, 0x61, 0x69, 0x6e, -0x3a, 0x74, 0x72, 0x61, 0x69, 0x6e, 0xd83d, 0xde9e, 0x3a, 0x6d, 0x6f, 0x75, -0x6e, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x69, 0x6c, 0x77, 0x61, -0x79, 0x3a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x72, 0x61, -0x69, 0x6c, 0x77, 0x61, 0x79, 0xd83d, 0xde9d, 0x3a, 0x6d, 0x6f, 0x6e, 0x6f, -0x72, 0x61, 0x69, 0x6c, 0x3a, 0x6d, 0x6f, 0x6e, 0x6f, 0x72, 0x61, 0x69, -0x6c, 0xd83d, 0xde84, 0x3a, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x74, 0x72, -0x61, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x3a, 0x62, 0x75, 0x6c, -0x6c, 0x65, 0x74, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, -0xd83d, 0xde85, 0x3a, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x74, 0x72, 0x61, -0x69, 0x6e, 0x5f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x3a, 0x62, 0x75, 0x6c, -0x6c, 0x65, 0x74, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x66, 0x72, 0x6f, 0x6e, -0x74, 0xd83d, 0xde88, 0x3a, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x72, 0x61, -0x69, 0x6c, 0x3a, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x72, 0x61, 0x69, 0x6c, -0xd83d, 0xde82, 0x3a, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, -0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x6c, 0x6f, 0x63, 0x6f, -0x6d, 0x6f, 0x74, 0x69, 0x76, 0x65, 0x73, 0x74, 0x65, 0x61, 0x6d, 0xd83d, -0xde86, 0x3a, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x32, 0x3a, 0x74, 0x72, 0x61, -0x69, 0x6e, 0x32, 0xd83d, 0xde87, 0x3a, 0x6d, 0x65, 0x74, 0x72, 0x6f, 0x3a, -0x6d, 0x65, 0x74, 0x72, 0x6f, 0xd83d, 0xde8a, 0x3a, 0x74, 0x72, 0x61, 0x6d, -0x3a, 0x74, 0x72, 0x61, 0x6d, 0xd83d, 0xde89, 0x3a, 0x73, 0x74, 0x61, 0x74, -0x69, 0x6f, 0x6e, 0x3a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xd83d, -0xde81, 0x3a, 0x68, 0x65, 0x6c, 0x69, 0x63, 0x6f, 0x70, 0x74, 0x65, 0x72, -0x3a, 0x68, 0x65, 0x6c, 0x69, 0x63, 0x6f, 0x70, 0x74, 0x65, 0x72, 0xd83d, -0xdee9, 0x3a, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x61, 0x69, 0x72, 0x70, -0x6c, 0x61, 0x6e, 0x65, 0x3a, 0x61, 0x69, 0x72, 0x70, 0x6c, 0x61, 0x6e, -0x65, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0xd83d, 0xdee9, 0x3a, 0x61, 0x69, 0x72, -0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3a, -0x61, 0x69, 0x72, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x6d, 0x61, 0x6c, -0x6c, 0x2708, 0xfe0f, 0x3a, 0x61, 0x69, 0x72, 0x70, 0x6c, 0x61, 0x6e, 0x65, -0x3a, 0x61, 0x69, 0x72, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0xd83d, 0xdeeb, 0x3a, -0x61, 0x69, 0x72, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x64, 0x65, 0x70, -0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x61, 0x69, 0x72, 0x70, 0x6c, -0x61, 0x6e, 0x65, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, -0xd83d, 0xdeec, 0x3a, 0x61, 0x69, 0x72, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, -0x61, 0x72, 0x72, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x3a, 0x61, 0x69, 0x72, -0x70, 0x6c, 0x61, 0x6e, 0x65, 0x61, 0x72, 0x72, 0x69, 0x76, 0x69, 0x6e, -0x67, 0xd83d, 0xde80, 0x3a, 0x72, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3a, 0x72, -0x6f, 0x63, 0x6b, 0x65, 0x74, 0xd83d, 0xdef0, 0x3a, 0x73, 0x61, 0x74, 0x65, -0x6c, 0x6c, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x61, -0x6c, 0x3a, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x61, 0x6c, 0x73, 0x61, 0x74, -0x65, 0x6c, 0x6c, 0x69, 0x74, 0x65, 0xd83d, 0xdcba, 0x3a, 0x73, 0x65, 0x61, -0x74, 0x3a, 0x73, 0x65, 0x61, 0x74, 0xd83d, 0xdef6, 0x3a, 0x6b, 0x61, 0x79, -0x61, 0x6b, 0x3a, 0x6b, 0x61, 0x79, 0x61, 0x6b, 0xd83d, 0xdef6, 0x3a, 0x63, -0x61, 0x6e, 0x6f, 0x65, 0x3a, 0x63, 0x61, 0x6e, 0x6f, 0x65, 0x26f5, 0xfe0f, -0x3a, 0x73, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x61, 0x74, 0x3a, 0x73, 0x61, -0x69, 0x6c, 0x62, 0x6f, 0x61, 0x74, 0xd83d, 0xdee5, 0x3a, 0x6d, 0x6f, 0x74, -0x6f, 0x72, 0x62, 0x6f, 0x61, 0x74, 0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, -0x62, 0x6f, 0x61, 0x74, 0xd83d, 0xdea4, 0x3a, 0x73, 0x70, 0x65, 0x65, 0x64, -0x62, 0x6f, 0x61, 0x74, 0x3a, 0x73, 0x70, 0x65, 0x65, 0x64, 0x62, 0x6f, -0x61, 0x74, 0xd83d, 0xdef3, 0x3a, 0x70, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, -0x65, 0x72, 0x5f, 0x73, 0x68, 0x69, 0x70, 0x3a, 0x70, 0x61, 0x73, 0x73, -0x65, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0xd83d, 0xdef3, 0x3a, -0x63, 0x72, 0x75, 0x69, 0x73, 0x65, 0x5f, 0x73, 0x68, 0x69, 0x70, 0x3a, -0x63, 0x72, 0x75, 0x69, 0x73, 0x65, 0x73, 0x68, 0x69, 0x70, 0x26f4, 0x3a, -0x66, 0x65, 0x72, 0x72, 0x79, 0x3a, 0x66, 0x65, 0x72, 0x72, 0x79, 0xd83d, -0xdea2, 0x3a, 0x73, 0x68, 0x69, 0x70, 0x3a, 0x73, 0x68, 0x69, 0x70, 0x2693, -0xfe0f, 0x3a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x61, 0x6e, 0x63, -0x68, 0x6f, 0x72, 0xd83d, 0xdea7, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, -0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, -0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x26fd, 0xfe0f, 0x3a, 0x66, 0x75, -0x65, 0x6c, 0x70, 0x75, 0x6d, 0x70, 0x3a, 0x66, 0x75, 0x65, 0x6c, 0x70, -0x75, 0x6d, 0x70, 0xd83d, 0xde8f, 0x3a, 0x62, 0x75, 0x73, 0x73, 0x74, 0x6f, -0x70, 0x3a, 0x62, 0x75, 0x73, 0x73, 0x74, 0x6f, 0x70, 0xd83d, 0xdea6, 0x3a, -0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, -0x66, 0x66, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6c, -0x69, 0x67, 0x68, 0x74, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x76, -0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0xd83d, 0xdea5, 0x3a, 0x74, 0x72, -0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x3a, -0x6c, 0x69, 0x67, 0x68, 0x74, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, -0xd83d, 0xddfa, 0x3a, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x70, -0x3a, 0x6d, 0x61, 0x70, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0xd83d, 0xddfa, 0x3a, -0x6d, 0x61, 0x70, 0x3a, 0x6d, 0x61, 0x70, 0xd83d, 0xddff, 0x3a, 0x6d, 0x6f, -0x79, 0x61, 0x69, 0x3a, 0x6d, 0x6f, 0x79, 0x61, 0x69, 0xd83d, 0xddfd, 0x3a, -0x73, 0x74, 0x61, 0x74, 0x75, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x6c, 0x69, -0x62, 0x65, 0x72, 0x74, 0x79, 0x3a, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x74, -0x79, 0x6f, 0x66, 0x73, 0x74, 0x61, 0x74, 0x75, 0x65, 0x26f2, 0xfe0f, 0x3a, -0x66, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x3a, 0x66, 0x6f, 0x75, -0x6e, 0x74, 0x61, 0x69, 0x6e, 0xd83d, 0xddfc, 0x3a, 0x74, 0x6f, 0x6b, 0x79, -0x6f, 0x5f, 0x74, 0x6f, 0x77, 0x65, 0x72, 0x3a, 0x74, 0x6f, 0x6b, 0x79, -0x6f, 0x74, 0x6f, 0x77, 0x65, 0x72, 0xd83c, 0xdff0, 0x3a, 0x65, 0x75, 0x72, -0x6f, 0x70, 0x65, 0x61, 0x6e, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x6c, 0x65, -0x3a, 0x63, 0x61, 0x73, 0x74, 0x6c, 0x65, 0x65, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x61, 0x6e, 0xd83c, 0xdfef, 0x3a, 0x6a, 0x61, 0x70, 0x61, 0x6e, 0x65, -0x73, 0x65, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x6c, 0x65, 0x3a, 0x63, 0x61, -0x73, 0x74, 0x6c, 0x65, 0x6a, 0x61, 0x70, 0x61, 0x6e, 0x65, 0x73, 0x65, -0xd83c, 0xdfdf, 0x3a, 0x73, 0x74, 0x61, 0x64, 0x69, 0x75, 0x6d, 0x3a, 0x73, -0x74, 0x61, 0x64, 0x69, 0x75, 0x6d, 0xd83c, 0xdfa1, 0x3a, 0x66, 0x65, 0x72, -0x72, 0x69, 0x73, 0x5f, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x3a, 0x66, 0x65, -0x72, 0x72, 0x69, 0x73, 0x77, 0x68, 0x65, 0x65, 0x6c, 0xd83c, 0xdfa2, 0x3a, -0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x61, 0x73, 0x74, -0x65, 0x72, 0x3a, 0x63, 0x6f, 0x61, 0x73, 0x74, 0x65, 0x72, 0x72, 0x6f, -0x6c, 0x6c, 0x65, 0x72, 0xd83c, 0xdfa0, 0x3a, 0x63, 0x61, 0x72, 0x6f, 0x75, -0x73, 0x65, 0x6c, 0x5f, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x3a, 0x63, 0x61, -0x72, 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x26f1, -0x3a, 0x75, 0x6d, 0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0x5f, 0x6f, 0x6e, -0x5f, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x67, 0x72, 0x6f, 0x75, -0x6e, 0x64, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, -0x26f1, 0x3a, 0x62, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x75, 0x6d, 0x62, 0x72, -0x65, 0x6c, 0x6c, 0x61, 0x3a, 0x62, 0x65, 0x61, 0x63, 0x68, 0x75, 0x6d, -0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0xd83c, 0xdfd6, 0x3a, 0x62, 0x65, 0x61, -0x63, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x75, 0x6d, 0x62, 0x72, -0x65, 0x6c, 0x6c, 0x61, 0x3a, 0x62, 0x65, 0x61, 0x63, 0x68, 0x75, 0x6d, -0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdfd6, -0x3a, 0x62, 0x65, 0x61, 0x63, 0x68, 0x3a, 0x62, 0x65, 0x61, 0x63, 0x68, -0xd83c, 0xdfdd, 0x3a, 0x64, 0x65, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x73, -0x6c, 0x61, 0x6e, 0x64, 0x3a, 0x64, 0x65, 0x73, 0x65, 0x72, 0x74, 0x69, -0x73, 0x6c, 0x61, 0x6e, 0x64, 0xd83c, 0xdfdd, 0x3a, 0x69, 0x73, 0x6c, 0x61, -0x6e, 0x64, 0x3a, 0x69, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x26f0, 0x3a, 0x6d, -0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x3a, 0x6d, 0x6f, 0x75, 0x6e, -0x74, 0x61, 0x69, 0x6e, 0xd83c, 0xdfd4, 0x3a, 0x73, 0x6e, 0x6f, 0x77, 0x5f, -0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, -0x61, 0x69, 0x6e, 0x3a, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x6d, 0x6f, -0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x6e, 0x6f, 0x77, 0xd83c, 0xdfd4, -0x3a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x6e, -0x6f, 0x77, 0x3a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, -0x6e, 0x6f, 0x77, 0xd83d, 0xddfb, 0x3a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, -0x66, 0x75, 0x6a, 0x69, 0x3a, 0x66, 0x75, 0x6a, 0x69, 0x6d, 0x6f, 0x75, -0x6e, 0x74, 0xd83c, 0xdf0b, 0x3a, 0x76, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, -0x3a, 0x76, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0xd83c, 0xdfdc, 0x3a, 0x64, -0x65, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x64, 0x65, 0x73, 0x65, 0x72, 0x74, -0xd83c, 0xdfd5, 0x3a, 0x63, 0x61, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x3a, 0x63, -0x61, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x26fa, 0xfe0f, 0x3a, 0x74, 0x65, 0x6e, -0x74, 0x3a, 0x74, 0x65, 0x6e, 0x74, 0xd83d, 0xdee4, 0x3a, 0x72, 0x61, 0x69, -0x6c, 0x72, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x3a, -0x72, 0x61, 0x69, 0x6c, 0x72, 0x6f, 0x61, 0x64, 0x74, 0x72, 0x61, 0x63, -0x6b, 0xd83d, 0xdee4, 0x3a, 0x72, 0x61, 0x69, 0x6c, 0x77, 0x61, 0x79, 0x5f, -0x74, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x72, 0x61, 0x69, 0x6c, 0x77, 0x61, -0x79, 0x74, 0x72, 0x61, 0x63, 0x6b, 0xd83d, 0xdee3, 0x3a, 0x6d, 0x6f, 0x74, -0x6f, 0x72, 0x77, 0x61, 0x79, 0x3a, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x77, -0x61, 0x79, 0xd83c, 0xdfd7, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, -0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, -0x6f, 0x6e, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x63, -0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xd83c, -0xdfd7, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, -0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x3a, 0x63, 0x6f, 0x6e, 0x73, -0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x74, 0x65, -0xd83c, 0xdfed, 0x3a, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x66, -0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0xd83c, 0xdfe0, 0x3a, 0x68, 0x6f, 0x75, -0x73, 0x65, 0x3a, 0x68, 0x6f, 0x75, 0x73, 0x65, 0xd83c, 0xdfe1, 0x3a, 0x68, -0x6f, 0x75, 0x73, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x67, 0x61, -0x72, 0x64, 0x65, 0x6e, 0x3a, 0x67, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x68, -0x6f, 0x75, 0x73, 0x65, 0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdfd8, 0x3a, 0x68, -0x6f, 0x75, 0x73, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, -0x67, 0x73, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x73, -0x68, 0x6f, 0x75, 0x73, 0x65, 0xd83c, 0xdfd8, 0x3a, 0x68, 0x6f, 0x6d, 0x65, -0x73, 0x3a, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0xd83c, 0xdfda, 0x3a, 0x64, 0x65, -0x72, 0x65, 0x6c, 0x69, 0x63, 0x74, 0x5f, 0x68, 0x6f, 0x75, 0x73, 0x65, -0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x75, -0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x72, 0x65, 0x6c, 0x69, -0x63, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x65, 0xd83c, 0xdfda, 0x3a, 0x68, 0x6f, -0x75, 0x73, 0x65, 0x5f, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x65, -0x64, 0x3a, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x64, 0x68, -0x6f, 0x75, 0x73, 0x65, 0xd83c, 0xdfe2, 0x3a, 0x6f, 0x66, 0x66, 0x69, 0x63, -0x65, 0x3a, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0xd83c, 0xdfec, 0x3a, 0x64, -0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, -0x6f, 0x72, 0x65, 0x3a, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, -0x6e, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xd83c, 0xdfe3, 0x3a, 0x70, 0x6f, -0x73, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x3a, 0x6f, 0x66, -0x66, 0x69, 0x63, 0x65, 0x70, 0x6f, 0x73, 0x74, 0xd83c, 0xdfe4, 0x3a, 0x65, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, -0x5f, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x3a, 0x65, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x61, 0x6e, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x70, 0x6f, -0x73, 0x74, 0xd83c, 0xdfe5, 0x3a, 0x68, 0x6f, 0x73, 0x70, 0x69, 0x74, 0x61, -0x6c, 0x3a, 0x68, 0x6f, 0x73, 0x70, 0x69, 0x74, 0x61, 0x6c, 0xd83c, 0xdfe6, -0x3a, 0x62, 0x61, 0x6e, 0x6b, 0x3a, 0x62, 0x61, 0x6e, 0x6b, 0xd83c, 0xdfe8, -0x3a, 0x68, 0x6f, 0x74, 0x65, 0x6c, 0x3a, 0x68, 0x6f, 0x74, 0x65, 0x6c, -0xd83c, 0xdfea, 0x3a, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, -0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x63, 0x6f, 0x6e, -0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, -0x65, 0xd83c, 0xdfeb, 0x3a, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x3a, 0x73, -0x63, 0x68, 0x6f, 0x6f, 0x6c, 0xd83c, 0xdfe9, 0x3a, 0x6c, 0x6f, 0x76, 0x65, -0x5f, 0x68, 0x6f, 0x74, 0x65, 0x6c, 0x3a, 0x68, 0x6f, 0x74, 0x65, 0x6c, -0x6c, 0x6f, 0x76, 0x65, 0xd83d, 0xdc92, 0x3a, 0x77, 0x65, 0x64, 0x64, 0x69, -0x6e, 0x67, 0x3a, 0x77, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0xd83c, 0xdfdb, -0x3a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x62, -0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x75, 0x69, 0x6c, -0x64, 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x61, -0x6c, 0x26ea, 0xfe0f, 0x3a, 0x63, 0x68, 0x75, 0x72, 0x63, 0x68, 0x3a, 0x63, -0x68, 0x75, 0x72, 0x63, 0x68, 0xd83d, 0xdd4c, 0x3a, 0x6d, 0x6f, 0x73, 0x71, -0x75, 0x65, 0x3a, 0x6d, 0x6f, 0x73, 0x71, 0x75, 0x65, 0xd83d, 0xdd4d, 0x3a, -0x73, 0x79, 0x6e, 0x61, 0x67, 0x6f, 0x67, 0x75, 0x65, 0x3a, 0x73, 0x79, -0x6e, 0x61, 0x67, 0x6f, 0x67, 0x75, 0x65, 0xd83d, 0xdd4b, 0x3a, 0x6b, 0x61, -0x61, 0x62, 0x61, 0x3a, 0x6b, 0x61, 0x61, 0x62, 0x61, 0x26e9, 0x3a, 0x73, -0x68, 0x69, 0x6e, 0x74, 0x6f, 0x5f, 0x73, 0x68, 0x72, 0x69, 0x6e, 0x65, -0x3a, 0x73, 0x68, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x72, 0x69, 0x6e, -0x65, 0xd83d, 0xddfe, 0x3a, 0x6a, 0x61, 0x70, 0x61, 0x6e, 0x3a, 0x6a, 0x61, -0x70, 0x61, 0x6e, 0xd83c, 0xdf91, 0x3a, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, -0x63, 0x65, 0x6e, 0x65, 0x3a, 0x72, 0x69, 0x63, 0x65, 0x73, 0x63, 0x65, -0x6e, 0x65, 0xd83c, 0xdfde, 0x3a, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, -0x6c, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x3a, 0x6e, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x61, 0x6c, 0x70, 0x61, 0x72, 0x6b, 0xd83c, 0xdfde, 0x3a, 0x70, 0x61, -0x72, 0x6b, 0x3a, 0x70, 0x61, 0x72, 0x6b, 0xd83c, 0xdf05, 0x3a, 0x73, 0x75, -0x6e, 0x72, 0x69, 0x73, 0x65, 0x3a, 0x73, 0x75, 0x6e, 0x72, 0x69, 0x73, -0x65, 0xd83c, 0xdf04, 0x3a, 0x73, 0x75, 0x6e, 0x72, 0x69, 0x73, 0x65, 0x5f, -0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, -0x6e, 0x73, 0x3a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, -0x6f, 0x76, 0x65, 0x72, 0x73, 0x75, 0x6e, 0x72, 0x69, 0x73, 0x65, 0xd83c, -0xdf20, 0x3a, 0x73, 0x74, 0x61, 0x72, 0x73, 0x3a, 0x73, 0x74, 0x61, 0x72, -0x73, 0xd83c, 0xdf87, 0x3a, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x6c, 0x65, 0x72, -0x3a, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x6c, 0x65, 0x72, 0xd83c, 0xdf86, 0x3a, -0x66, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x3a, 0x66, 0x69, -0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0xd83c, 0xdf07, 0x3a, 0x63, 0x69, -0x74, 0x79, 0x5f, 0x73, 0x75, 0x6e, 0x72, 0x69, 0x73, 0x65, 0x3a, 0x63, -0x69, 0x74, 0x79, 0x73, 0x75, 0x6e, 0x72, 0x69, 0x73, 0x65, 0xd83c, 0xdf07, -0x3a, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x75, 0x6e, 0x73, 0x65, 0x74, -0x3a, 0x63, 0x69, 0x74, 0x79, 0x73, 0x75, 0x6e, 0x73, 0x65, 0x74, 0xd83c, -0xdf06, 0x3a, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x75, 0x73, 0x6b, 0x3a, -0x63, 0x69, 0x74, 0x79, 0x64, 0x75, 0x73, 0x6b, 0xd83c, 0xdfd9, 0x3a, 0x63, -0x69, 0x74, 0x79, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3a, 0x63, 0x69, 0x74, -0x79, 0x73, 0x63, 0x61, 0x70, 0x65, 0xd83c, 0xdf03, 0x3a, 0x6e, 0x69, 0x67, -0x68, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, -0x73, 0x3a, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x73, 0x74, 0x61, 0x72, 0x73, -0x77, 0x69, 0x74, 0x68, 0xd83c, 0xdf0c, 0x3a, 0x6d, 0x69, 0x6c, 0x6b, 0x79, -0x5f, 0x77, 0x61, 0x79, 0x3a, 0x6d, 0x69, 0x6c, 0x6b, 0x79, 0x77, 0x61, -0x79, 0xd83c, 0xdf09, 0x3a, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x61, -0x74, 0x5f, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x74, 0x62, 0x72, -0x69, 0x64, 0x67, 0x65, 0x6e, 0x69, 0x67, 0x68, 0x74, 0xd83c, 0xdf01, 0x3a, -0x66, 0x6f, 0x67, 0x67, 0x79, 0x3a, 0x66, 0x6f, 0x67, 0x67, 0x79, 0x231a, -0xfe0f, 0x3a, 0x77, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x77, 0x61, 0x74, 0x63, -0x68, 0xd83d, 0xdcf1, 0x3a, 0x69, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x3a, 0x69, -0x70, 0x68, 0x6f, 0x6e, 0x65, 0xd83d, 0xdcf2, 0x3a, 0x63, 0x61, 0x6c, 0x6c, -0x69, 0x6e, 0x67, 0x3a, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0xd83d, -0xdcbb, 0x3a, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x3a, 0x63, -0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x2328, 0xfe0f, 0x3a, 0x6b, 0x65, -0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x6b, 0x65, 0x79, 0x62, 0x6f, -0x61, 0x72, 0x64, 0xd83d, 0xdda5, 0x3a, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, -0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x3a, 0x63, -0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x64, 0x65, 0x73, 0x6b, 0x74, -0x6f, 0x70, 0xd83d, 0xdda5, 0x3a, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, -0x3a, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0xd83d, 0xdda8, 0x3a, 0x70, -0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3a, 0x70, 0x72, 0x69, 0x6e, 0x74, -0x65, 0x72, 0xd83d, 0xddb1, 0x3a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x5f, 0x62, -0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x3a, -0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x74, -0x68, 0x72, 0x65, 0x65, 0xd83d, 0xddb1, 0x3a, 0x6d, 0x6f, 0x75, 0x73, 0x65, -0x5f, 0x74, 0x68, 0x72, 0x65, 0x65, 0x5f, 0x62, 0x75, 0x74, 0x74, 0x6f, -0x6e, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, -0x65, 0x74, 0x68, 0x72, 0x65, 0x65, 0xd83d, 0xddb2, 0x3a, 0x74, 0x72, 0x61, -0x63, 0x6b, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x74, 0x72, 0x61, 0x63, 0x6b, -0x62, 0x61, 0x6c, 0x6c, 0xd83d, 0xdd79, 0x3a, 0x6a, 0x6f, 0x79, 0x73, 0x74, -0x69, 0x63, 0x6b, 0x3a, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, -0xd83d, 0xdddc, 0x3a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, -0x6f, 0x6e, 0x3a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, -0x6f, 0x6e, 0xd83d, 0xdcbd, 0x3a, 0x6d, 0x69, 0x6e, 0x69, 0x64, 0x69, 0x73, -0x63, 0x3a, 0x6d, 0x69, 0x6e, 0x69, 0x64, 0x69, 0x73, 0x63, 0xd83d, 0xdcbe, -0x3a, 0x66, 0x6c, 0x6f, 0x70, 0x70, 0x79, 0x5f, 0x64, 0x69, 0x73, 0x6b, -0x3a, 0x64, 0x69, 0x73, 0x6b, 0x66, 0x6c, 0x6f, 0x70, 0x70, 0x79, 0xd83d, -0xdcbf, 0x3a, 0x63, 0x64, 0x3a, 0x63, 0x64, 0xd83d, 0xdcc0, 0x3a, 0x64, 0x76, -0x64, 0x3a, 0x64, 0x76, 0x64, 0xd83d, 0xdcfc, 0x3a, 0x76, 0x68, 0x73, 0x3a, -0x76, 0x68, 0x73, 0xd83d, 0xdcf7, 0x3a, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, -0x3a, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0xd83d, 0xdcf8, 0x3a, 0x63, 0x61, -0x6d, 0x65, 0x72, 0x61, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x66, 0x6c, -0x61, 0x73, 0x68, 0x3a, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x66, 0x6c, -0x61, 0x73, 0x68, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdcf9, 0x3a, 0x76, 0x69, -0x64, 0x65, 0x6f, 0x5f, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x3a, 0x63, -0x61, 0x6d, 0x65, 0x72, 0x61, 0x76, 0x69, 0x64, 0x65, 0x6f, 0xd83c, 0xdfa5, -0x3a, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x5f, 0x63, 0x61, 0x6d, 0x65, 0x72, -0x61, 0x3a, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x6d, 0x6f, 0x76, 0x69, -0x65, 0xd83d, 0xdcfd, 0x3a, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x70, 0x72, 0x6f, -0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x66, 0x69, 0x6c, 0x6d, 0x70, -0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0xd83d, 0xdcfd, 0x3a, 0x70, -0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x70, 0x72, 0x6f, -0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0xd83c, 0xdf9e, 0x3a, 0x66, 0x69, 0x6c, -0x6d, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x66, 0x69, 0x6c, -0x6d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0xd83d, 0xdcde, 0x3a, 0x74, 0x65, -0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, -0x69, 0x76, 0x65, 0x72, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, -0x72, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x260e, 0xfe0f, -0x3a, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x3a, 0x74, -0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0xd83d, 0xdcdf, 0x3a, 0x70, -0x61, 0x67, 0x65, 0x72, 0x3a, 0x70, 0x61, 0x67, 0x65, 0x72, 0xd83d, 0xdce0, -0x3a, 0x66, 0x61, 0x78, 0x3a, 0x66, 0x61, 0x78, 0xd83d, 0xdcfa, 0x3a, 0x74, -0x76, 0x3a, 0x74, 0x76, 0xd83d, 0xdcfb, 0x3a, 0x72, 0x61, 0x64, 0x69, 0x6f, -0x3a, 0x72, 0x61, 0x64, 0x69, 0x6f, 0xd83c, 0xdf99, 0x3a, 0x73, 0x74, 0x75, -0x64, 0x69, 0x6f, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, -0x6e, 0x65, 0x3a, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, -0x65, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, 0xd83c, 0xdf99, 0x3a, 0x6d, 0x69, -0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x32, 0x3a, 0x6d, 0x69, -0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x32, 0xd83c, 0xdf9a, 0x3a, -0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, -0x3a, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, -0xd83c, 0xdf9b, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x6b, -0x6e, 0x6f, 0x62, 0x73, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, -0x6b, 0x6e, 0x6f, 0x62, 0x73, 0x23f1, 0x3a, 0x73, 0x74, 0x6f, 0x70, 0x77, -0x61, 0x74, 0x63, 0x68, 0x3a, 0x73, 0x74, 0x6f, 0x70, 0x77, 0x61, 0x74, -0x63, 0x68, 0x23f2, 0x3a, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x5f, 0x63, 0x6c, -0x6f, 0x63, 0x6b, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x74, 0x69, 0x6d, -0x65, 0x72, 0x23f2, 0x3a, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x3a, 0x74, 0x69, -0x6d, 0x65, 0x72, 0x23f0, 0x3a, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x5f, 0x63, -0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x63, 0x6c, -0x6f, 0x63, 0x6b, 0xd83d, 0xdd70, 0x3a, 0x6d, 0x61, 0x6e, 0x74, 0x6c, 0x65, -0x70, 0x69, 0x65, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, -0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x6d, 0x61, 0x6e, 0x74, 0x6c, 0x65, 0x70, -0x69, 0x65, 0x63, 0x65, 0xd83d, 0xdd70, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, -0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x231b, 0xfe0f, 0x3a, 0x68, 0x6f, 0x75, -0x72, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x3a, 0x68, 0x6f, 0x75, 0x72, 0x67, -0x6c, 0x61, 0x73, 0x73, 0x23f3, 0x3a, 0x68, 0x6f, 0x75, 0x72, 0x67, 0x6c, -0x61, 0x73, 0x73, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x5f, -0x73, 0x61, 0x6e, 0x64, 0x3a, 0x66, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, -0x68, 0x6f, 0x75, 0x72, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x73, 0x61, 0x6e, -0x64, 0xd83d, 0xdce1, 0x3a, 0x73, 0x61, 0x74, 0x65, 0x6c, 0x6c, 0x69, 0x74, -0x65, 0x3a, 0x73, 0x61, 0x74, 0x65, 0x6c, 0x6c, 0x69, 0x74, 0x65, 0xd83d, -0xdd0b, 0x3a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x3a, 0x62, 0x61, -0x74, 0x74, 0x65, 0x72, 0x79, 0xd83d, 0xdd0c, 0x3a, 0x65, 0x6c, 0x65, 0x63, -0x74, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x3a, 0x65, 0x6c, -0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x70, 0x6c, 0x75, 0x67, 0xd83d, 0xdca1, -0x3a, 0x62, 0x75, 0x6c, 0x62, 0x3a, 0x62, 0x75, 0x6c, 0x62, 0xd83d, 0xdd26, -0x3a, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x3a, -0x66, 0x6c, 0x61, 0x73, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0xd83d, 0xdd6f, -0x3a, 0x63, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x63, 0x61, 0x6e, 0x64, -0x6c, 0x65, 0xd83d, 0xddd1, 0x3a, 0x77, 0x61, 0x73, 0x74, 0x65, 0x62, 0x61, -0x73, 0x6b, 0x65, 0x74, 0x3a, 0x77, 0x61, 0x73, 0x74, 0x65, 0x62, 0x61, -0x73, 0x6b, 0x65, 0x74, 0xd83d, 0xdee2, 0x3a, 0x6f, 0x69, 0x6c, 0x5f, 0x64, -0x72, 0x75, 0x6d, 0x3a, 0x64, 0x72, 0x75, 0x6d, 0x6f, 0x69, 0x6c, 0xd83d, -0xdee2, 0x3a, 0x6f, 0x69, 0x6c, 0x3a, 0x6f, 0x69, 0x6c, 0xd83d, 0xdcb8, 0x3a, -0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, -0x69, 0x6e, 0x67, 0x73, 0x3a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x77, 0x69, -0x6e, 0x67, 0x73, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdcb5, 0x3a, 0x64, 0x6f, -0x6c, 0x6c, 0x61, 0x72, 0x3a, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0xd83d, -0xdcb4, 0x3a, 0x79, 0x65, 0x6e, 0x3a, 0x79, 0x65, 0x6e, 0xd83d, 0xdcb6, 0x3a, -0x65, 0x75, 0x72, 0x6f, 0x3a, 0x65, 0x75, 0x72, 0x6f, 0xd83d, 0xdcb7, 0x3a, -0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0xd83d, -0xdcb0, 0x3a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x62, 0x61, 0x67, 0x3a, 0x6d, -0x6f, 0x6e, 0x65, 0x79, 0x62, 0x61, 0x67, 0xd83d, 0xdcb3, 0x3a, 0x63, 0x72, -0x65, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x3a, 0x63, 0x61, -0x72, 0x64, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0xd83d, 0xdc8e, 0x3a, 0x67, -0x65, 0x6d, 0x3a, 0x67, 0x65, 0x6d, 0x2696, 0xfe0f, 0x3a, 0x73, 0x63, 0x61, -0x6c, 0x65, 0x73, 0x3a, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x73, 0xd83d, 0xdd27, -0x3a, 0x77, 0x72, 0x65, 0x6e, 0x63, 0x68, 0x3a, 0x77, 0x72, 0x65, 0x6e, -0x63, 0x68, 0xd83d, 0xdd28, 0x3a, 0x68, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x3a, -0x68, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x2692, 0x3a, 0x68, 0x61, 0x6d, 0x6d, -0x65, 0x72, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x69, 0x63, 0x6b, 0x3a, -0x61, 0x6e, 0x64, 0x68, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x70, 0x69, 0x63, -0x6b, 0x2692, 0x3a, 0x68, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x5f, 0x70, 0x69, -0x63, 0x6b, 0x3a, 0x68, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x70, 0x69, 0x63, -0x6b, 0xd83d, 0xdee0, 0x3a, 0x68, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x5f, 0x61, -0x6e, 0x64, 0x5f, 0x77, 0x72, 0x65, 0x6e, 0x63, 0x68, 0x3a, 0x61, 0x6e, -0x64, 0x68, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x77, 0x72, 0x65, 0x6e, 0x63, -0x68, 0xd83d, 0xdee0, 0x3a, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x74, 0x6f, -0x6f, 0x6c, 0x73, 0x26cf, 0x3a, 0x70, 0x69, 0x63, 0x6b, 0x3a, 0x70, 0x69, -0x63, 0x6b, 0xd83d, 0xdd29, 0x3a, 0x6e, 0x75, 0x74, 0x5f, 0x61, 0x6e, 0x64, -0x5f, 0x62, 0x6f, 0x6c, 0x74, 0x3a, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x6c, -0x74, 0x6e, 0x75, 0x74, 0x2699, 0xfe0f, 0x3a, 0x67, 0x65, 0x61, 0x72, 0x3a, -0x67, 0x65, 0x61, 0x72, 0x26d3, 0x3a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, -0x3a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0xd83d, 0xdd2b, 0x3a, 0x67, 0x75, -0x6e, 0x3a, 0x67, 0x75, 0x6e, 0xd83d, 0xdca3, 0x3a, 0x62, 0x6f, 0x6d, 0x62, -0x3a, 0x62, 0x6f, 0x6d, 0x62, 0xd83d, 0xdd2a, 0x3a, 0x6b, 0x6e, 0x69, 0x66, -0x65, 0x3a, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0xd83d, 0xdde1, 0x3a, 0x64, 0x61, -0x67, 0x67, 0x65, 0x72, 0x5f, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x3a, 0x64, -0x61, 0x67, 0x67, 0x65, 0x72, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0xd83d, 0xdde1, -0x3a, 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x3a, 0x64, 0x61, 0x67, 0x67, -0x65, 0x72, 0x2694, 0xfe0f, 0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, -0x5f, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x3a, 0x63, 0x72, 0x6f, 0x73, -0x73, 0x65, 0x64, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0xd83d, 0xdee1, 0x3a, -0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x73, 0x68, 0x69, 0x65, 0x6c, -0x64, 0xd83d, 0xdeac, 0x3a, 0x73, 0x6d, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x3a, -0x73, 0x6d, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x26b0, 0xfe0f, 0x3a, 0x63, 0x6f, -0x66, 0x66, 0x69, 0x6e, 0x3a, 0x63, 0x6f, 0x66, 0x66, 0x69, 0x6e, 0x26b1, -0xfe0f, 0x3a, 0x66, 0x75, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x75, 0x72, -0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x75, 0x72, 0x6e, -0x26b1, 0xfe0f, 0x3a, 0x75, 0x72, 0x6e, 0x3a, 0x75, 0x72, 0x6e, 0xd83c, 0xdffa, -0x3a, 0x61, 0x6d, 0x70, 0x68, 0x6f, 0x72, 0x61, 0x3a, 0x61, 0x6d, 0x70, -0x68, 0x6f, 0x72, 0x61, 0xd83d, 0xdd2e, 0x3a, 0x63, 0x72, 0x79, 0x73, 0x74, -0x61, 0x6c, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, -0x63, 0x72, 0x79, 0x73, 0x74, 0x61, 0x6c, 0xd83d, 0xdcff, 0x3a, 0x70, 0x72, -0x61, 0x79, 0x65, 0x72, 0x5f, 0x62, 0x65, 0x61, 0x64, 0x73, 0x3a, 0x62, -0x65, 0x61, 0x64, 0x73, 0x70, 0x72, 0x61, 0x79, 0x65, 0x72, 0xd83d, 0xdc88, -0x3a, 0x62, 0x61, 0x72, 0x62, 0x65, 0x72, 0x3a, 0x62, 0x61, 0x72, 0x62, -0x65, 0x72, 0x2697, 0xfe0f, 0x3a, 0x61, 0x6c, 0x65, 0x6d, 0x62, 0x69, 0x63, -0x3a, 0x61, 0x6c, 0x65, 0x6d, 0x62, 0x69, 0x63, 0xd83d, 0xdd2d, 0x3a, 0x74, -0x65, 0x6c, 0x65, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3a, 0x74, 0x65, 0x6c, -0x65, 0x73, 0x63, 0x6f, 0x70, 0x65, 0xd83d, 0xdd2c, 0x3a, 0x6d, 0x69, 0x63, -0x72, 0x6f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3a, 0x6d, 0x69, 0x63, 0x72, -0x6f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0xd83d, 0xdd73, 0x3a, 0x68, 0x6f, 0x6c, -0x65, 0x3a, 0x68, 0x6f, 0x6c, 0x65, 0xd83d, 0xdc8a, 0x3a, 0x70, 0x69, 0x6c, -0x6c, 0x3a, 0x70, 0x69, 0x6c, 0x6c, 0xd83d, 0xdc89, 0x3a, 0x73, 0x79, 0x72, -0x69, 0x6e, 0x67, 0x65, 0x3a, 0x73, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x65, -0xd83c, 0xdf21, 0x3a, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x6d, 0x65, 0x74, -0x65, 0x72, 0x3a, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x6d, 0x65, 0x74, -0x65, 0x72, 0xd83d, 0xdebd, 0x3a, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x3a, -0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0xd83d, 0xdeb0, 0x3a, 0x70, 0x6f, 0x74, -0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x3a, 0x70, -0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x77, 0x61, 0x74, 0x65, 0x72, 0xd83d, -0xdebf, 0x3a, 0x73, 0x68, 0x6f, 0x77, 0x65, 0x72, 0x3a, 0x73, 0x68, 0x6f, -0x77, 0x65, 0x72, 0xd83d, 0xdec1, 0x3a, 0x62, 0x61, 0x74, 0x68, 0x74, 0x75, -0x62, 0x3a, 0x62, 0x61, 0x74, 0x68, 0x74, 0x75, 0x62, 0xd83d, 0xdec0, 0x3a, -0x62, 0x61, 0x74, 0x68, 0x3a, 0x62, 0x61, 0x74, 0x68, 0xd83d, 0xdece, 0x3a, -0x62, 0x65, 0x6c, 0x6c, 0x68, 0x6f, 0x70, 0x5f, 0x62, 0x65, 0x6c, 0x6c, -0x3a, 0x62, 0x65, 0x6c, 0x6c, 0x62, 0x65, 0x6c, 0x6c, 0x68, 0x6f, 0x70, -0xd83d, 0xdece, 0x3a, 0x62, 0x65, 0x6c, 0x6c, 0x68, 0x6f, 0x70, 0x3a, 0x62, -0x65, 0x6c, 0x6c, 0x68, 0x6f, 0x70, 0xd83d, 0xdd11, 0x3a, 0x6b, 0x65, 0x79, -0x3a, 0x6b, 0x65, 0x79, 0xd83d, 0xdddd, 0x3a, 0x6f, 0x6c, 0x64, 0x5f, 0x6b, -0x65, 0x79, 0x3a, 0x6b, 0x65, 0x79, 0x6f, 0x6c, 0x64, 0xd83d, 0xdddd, 0x3a, -0x6b, 0x65, 0x79, 0x32, 0x3a, 0x6b, 0x65, 0x79, 0x32, 0xd83d, 0xdeaa, 0x3a, -0x64, 0x6f, 0x6f, 0x72, 0x3a, 0x64, 0x6f, 0x6f, 0x72, 0xd83d, 0xdecb, 0x3a, -0x63, 0x6f, 0x75, 0x63, 0x68, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x6c, 0x61, -0x6d, 0x70, 0x3a, 0x61, 0x6e, 0x64, 0x63, 0x6f, 0x75, 0x63, 0x68, 0x6c, -0x61, 0x6d, 0x70, 0xd83d, 0xdecb, 0x3a, 0x63, 0x6f, 0x75, 0x63, 0x68, 0x3a, -0x63, 0x6f, 0x75, 0x63, 0x68, 0xd83d, 0xdecf, 0x3a, 0x62, 0x65, 0x64, 0x3a, -0x62, 0x65, 0x64, 0xd83d, 0xdecc, 0x3a, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x69, -0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x64, 0x61, -0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, -0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x69, -0x6e, 0x67, 0xd83d, 0xddbc, 0x3a, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x3a, -0x66, 0x72, 0x61, 0x6d, 0x65, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, -0x77, 0x69, 0x74, 0x68, 0xd83d, 0xddbc, 0x3a, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x5f, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x3a, 0x66, 0x72, 0x61, 0x6d, 0x65, -0x70, 0x68, 0x6f, 0x74, 0x6f, 0xd83d, 0xdecd, 0x3a, 0x73, 0x68, 0x6f, 0x70, -0x70, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x67, 0x73, 0x3a, 0x62, 0x61, -0x67, 0x73, 0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0xd83d, 0xded2, -0x3a, 0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, -0x6f, 0x6c, 0x6c, 0x65, 0x79, 0x3a, 0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, -0x6e, 0x67, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x79, 0xd83d, 0xded2, 0x3a, -0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x61, 0x72, -0x74, 0x3a, 0x63, 0x61, 0x72, 0x74, 0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, -0x6e, 0x67, 0xd83c, 0xdf81, 0x3a, 0x67, 0x69, 0x66, 0x74, 0x3a, 0x67, 0x69, -0x66, 0x74, 0xd83c, 0xdf88, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x6f, 0x6e, -0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x6f, 0x6e, 0xd83c, 0xdf8f, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0xd83c, 0xdf80, -0x3a, 0x72, 0x69, 0x62, 0x62, 0x6f, 0x6e, 0x3a, 0x72, 0x69, 0x62, 0x62, -0x6f, 0x6e, 0xd83c, 0xdf8a, 0x3a, 0x63, 0x6f, 0x6e, 0x66, 0x65, 0x74, 0x74, -0x69, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x63, -0x6f, 0x6e, 0x66, 0x65, 0x74, 0x74, 0x69, 0xd83c, 0xdf89, 0x3a, 0x74, 0x61, -0x64, 0x61, 0x3a, 0x74, 0x61, 0x64, 0x61, 0xd83c, 0xdf8e, 0x3a, 0x64, 0x6f, -0x6c, 0x6c, 0x73, 0x3a, 0x64, 0x6f, 0x6c, 0x6c, 0x73, 0xd83c, 0xdfee, 0x3a, -0x69, 0x7a, 0x61, 0x6b, 0x61, 0x79, 0x61, 0x5f, 0x6c, 0x61, 0x6e, 0x74, -0x65, 0x72, 0x6e, 0x3a, 0x69, 0x7a, 0x61, 0x6b, 0x61, 0x79, 0x61, 0x6c, -0x61, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0xd83c, 0xdf90, 0x3a, 0x77, 0x69, 0x6e, -0x64, 0x5f, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x3a, 0x63, 0x68, 0x69, 0x6d, -0x65, 0x77, 0x69, 0x6e, 0x64, 0x2709, 0xfe0f, 0x3a, 0x65, 0x6e, 0x76, 0x65, -0x6c, 0x6f, 0x70, 0x65, 0x3a, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, -0x65, 0xd83d, 0xdce9, 0x3a, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x3a, -0x61, 0x72, 0x72, 0x6f, 0x77, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, -0x65, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdce8, 0x3a, 0x69, 0x6e, 0x63, 0x6f, -0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, -0x65, 0x3a, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x69, 0x6e, -0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0xd83d, 0xdce7, 0x3a, 0x65, 0x6d, 0x61, -0x69, 0x6c, 0x3a, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0xd83d, 0xdce7, 0x3a, 0x65, -0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x3a, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0xd83d, -0xdc8c, 0x3a, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x6c, 0x65, 0x74, 0x74, 0x65, -0x72, 0x3a, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x6c, 0x6f, 0x76, 0x65, -0xd83d, 0xdce5, 0x3a, 0x69, 0x6e, 0x62, 0x6f, 0x78, 0x5f, 0x74, 0x72, 0x61, -0x79, 0x3a, 0x69, 0x6e, 0x62, 0x6f, 0x78, 0x74, 0x72, 0x61, 0x79, 0xd83d, -0xdce4, 0x3a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x78, 0x5f, 0x74, 0x72, 0x61, -0x79, 0x3a, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x78, 0x74, 0x72, 0x61, 0x79, -0xd83d, 0xdce6, 0x3a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x3a, 0x70, -0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0xd83c, 0xdff7, 0x3a, 0x6c, 0x61, 0x62, -0x65, 0x6c, 0x3a, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0xd83d, 0xdcea, 0x3a, 0x6d, -0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, -0x64, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x6d, 0x61, 0x69, 0x6c, -0x62, 0x6f, 0x78, 0xd83d, 0xdceb, 0x3a, 0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, -0x78, 0x3a, 0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0xd83d, 0xdcec, 0x3a, -0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x5f, 0x77, 0x69, 0x74, 0x68, -0x5f, 0x6d, 0x61, 0x69, 0x6c, 0x3a, 0x6d, 0x61, 0x69, 0x6c, 0x6d, 0x61, -0x69, 0x6c, 0x62, 0x6f, 0x78, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdced, 0x3a, -0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x5f, 0x77, 0x69, 0x74, 0x68, -0x5f, 0x6e, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6c, 0x3a, 0x6d, 0x61, 0x69, -0x6c, 0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x6e, 0x6f, 0x77, 0x69, -0x74, 0x68, 0xd83d, 0xdcee, 0x3a, 0x70, 0x6f, 0x73, 0x74, 0x62, 0x6f, 0x78, -0x3a, 0x70, 0x6f, 0x73, 0x74, 0x62, 0x6f, 0x78, 0xd83d, 0xdcef, 0x3a, 0x70, -0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x72, 0x6e, 0x3a, 0x68, -0x6f, 0x72, 0x6e, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0xd83d, 0xdcdc, 0x3a, -0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x3a, 0x73, 0x63, 0x72, 0x6f, 0x6c, -0x6c, 0xd83d, 0xdcc3, 0x3a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x74, -0x68, 0x5f, 0x63, 0x75, 0x72, 0x6c, 0x3a, 0x63, 0x75, 0x72, 0x6c, 0x70, -0x61, 0x67, 0x65, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdcc4, 0x3a, 0x70, 0x61, -0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x70, -0x3a, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x70, 0x61, 0x67, 0x65, 0x75, -0x70, 0xd83d, 0xdcd1, 0x3a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, -0x5f, 0x74, 0x61, 0x62, 0x73, 0x3a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, -0x72, 0x6b, 0x74, 0x61, 0x62, 0x73, 0xd83d, 0xdcca, 0x3a, 0x62, 0x61, 0x72, -0x5f, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3a, 0x62, 0x61, 0x72, 0x63, 0x68, -0x61, 0x72, 0x74, 0xd83d, 0xdcc8, 0x3a, 0x63, 0x68, 0x61, 0x72, 0x74, 0x5f, -0x77, 0x69, 0x74, 0x68, 0x5f, 0x75, 0x70, 0x77, 0x61, 0x72, 0x64, 0x73, -0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x3a, 0x63, 0x68, 0x61, 0x72, 0x74, -0x74, 0x72, 0x65, 0x6e, 0x64, 0x75, 0x70, 0x77, 0x61, 0x72, 0x64, 0x73, -0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdcc9, 0x3a, 0x63, 0x68, 0x61, 0x72, 0x74, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x77, 0x61, -0x72, 0x64, 0x73, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x3a, 0x63, 0x68, -0x61, 0x72, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x77, 0x61, 0x72, 0x64, 0x73, -0x74, 0x72, 0x65, 0x6e, 0x64, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xddd2, 0x3a, -0x73, 0x70, 0x69, 0x72, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x5f, -0x70, 0x61, 0x64, 0x3a, 0x6e, 0x6f, 0x74, 0x65, 0x70, 0x61, 0x64, 0x73, -0x70, 0x69, 0x72, 0x61, 0x6c, 0xd83d, 0xddd2, 0x3a, 0x6e, 0x6f, 0x74, 0x65, -0x70, 0x61, 0x64, 0x5f, 0x73, 0x70, 0x69, 0x72, 0x61, 0x6c, 0x3a, 0x6e, -0x6f, 0x74, 0x65, 0x70, 0x61, 0x64, 0x73, 0x70, 0x69, 0x72, 0x61, 0x6c, -0xd83d, 0xddd3, 0x3a, 0x73, 0x70, 0x69, 0x72, 0x61, 0x6c, 0x5f, 0x63, 0x61, -0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x5f, 0x70, 0x61, 0x64, 0x3a, 0x63, -0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x70, 0x61, 0x64, 0x73, 0x70, -0x69, 0x72, 0x61, 0x6c, 0xd83d, 0xddd3, 0x3a, 0x63, 0x61, 0x6c, 0x65, 0x6e, -0x64, 0x61, 0x72, 0x5f, 0x73, 0x70, 0x69, 0x72, 0x61, 0x6c, 0x3a, 0x63, -0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x73, 0x70, 0x69, 0x72, 0x61, -0x6c, 0xd83d, 0xdcc6, 0x3a, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, -0x3a, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0xd83d, 0xdcc5, 0x3a, -0x64, 0x61, 0x74, 0x65, 0x3a, 0x64, 0x61, 0x74, 0x65, 0xd83d, 0xdcc7, 0x3a, -0x63, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, -0x61, 0x72, 0x64, 0x69, 0x6e, 0x64, 0x65, 0x78, 0xd83d, 0xddc3, 0x3a, 0x63, -0x61, 0x72, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x78, -0x3a, 0x62, 0x6f, 0x78, 0x63, 0x61, 0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, -0xd83d, 0xddc3, 0x3a, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x62, 0x6f, 0x78, 0x3a, -0x62, 0x6f, 0x78, 0x63, 0x61, 0x72, 0x64, 0xd83d, 0xddf3, 0x3a, 0x62, 0x61, -0x6c, 0x6c, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x78, 0x5f, 0x77, 0x69, 0x74, -0x68, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x74, 0x3a, 0x62, 0x61, 0x6c, -0x6c, 0x6f, 0x74, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x74, 0x62, 0x6f, 0x78, -0x77, 0x69, 0x74, 0x68, 0xd83d, 0xddf3, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x6f, -0x74, 0x5f, 0x62, 0x6f, 0x78, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x74, -0x62, 0x6f, 0x78, 0xd83d, 0xddc4, 0x3a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, -0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x3a, 0x63, 0x61, 0x62, 0x69, 0x6e, -0x65, 0x74, 0x66, 0x69, 0x6c, 0x65, 0xd83d, 0xdccb, 0x3a, 0x63, 0x6c, 0x69, -0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x63, 0x6c, 0x69, 0x70, 0x62, -0x6f, 0x61, 0x72, 0x64, 0xd83d, 0xdcc1, 0x3a, 0x66, 0x69, 0x6c, 0x65, 0x5f, -0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3a, 0x66, 0x69, 0x6c, 0x65, 0x66, -0x6f, 0x6c, 0x64, 0x65, 0x72, 0xd83d, 0xdcc2, 0x3a, 0x6f, 0x70, 0x65, 0x6e, -0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, -0x3a, 0x66, 0x69, 0x6c, 0x65, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x6f, -0x70, 0x65, 0x6e, 0xd83d, 0xddc2, 0x3a, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x69, -0x6e, 0x64, 0x65, 0x78, 0x5f, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, -0x73, 0x3a, 0x63, 0x61, 0x72, 0x64, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, -0x72, 0x73, 0x69, 0x6e, 0x64, 0x65, 0x78, 0xd83d, 0xddc2, 0x3a, 0x64, 0x69, -0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x64, 0x69, 0x76, 0x69, 0x64, -0x65, 0x72, 0x73, 0xd83d, 0xddde, 0x3a, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, -0x5f, 0x75, 0x70, 0x5f, 0x6e, 0x65, 0x77, 0x73, 0x70, 0x61, 0x70, 0x65, -0x72, 0x3a, 0x6e, 0x65, 0x77, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x72, -0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x75, 0x70, 0xd83d, 0xddde, 0x3a, 0x6e, 0x65, -0x77, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x32, 0x3a, 0x6e, 0x65, 0x77, -0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x32, 0xd83d, 0xdcf0, 0x3a, 0x6e, 0x65, -0x77, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x3a, 0x6e, 0x65, 0x77, 0x73, -0x70, 0x61, 0x70, 0x65, 0x72, 0xd83d, 0xdcd3, 0x3a, 0x6e, 0x6f, 0x74, 0x65, -0x62, 0x6f, 0x6f, 0x6b, 0x3a, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, -0x6b, 0xd83d, 0xdcd4, 0x3a, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, -0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x3a, 0x63, -0x6f, 0x76, 0x65, 0x72, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, -0x76, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x77, 0x69, -0x74, 0x68, 0xd83d, 0xdcd2, 0x3a, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x3a, -0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0xd83d, 0xdcd5, 0x3a, 0x63, 0x6c, 0x6f, -0x73, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x3a, 0x62, 0x6f, 0x6f, -0x6b, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0xd83d, 0xdcd7, 0x3a, 0x67, 0x72, -0x65, 0x65, 0x6e, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x3a, 0x62, 0x6f, 0x6f, -0x6b, 0x67, 0x72, 0x65, 0x65, 0x6e, 0xd83d, 0xdcd8, 0x3a, 0x62, 0x6c, 0x75, -0x65, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x3a, 0x62, 0x6c, 0x75, 0x65, 0x62, -0x6f, 0x6f, 0x6b, 0xd83d, 0xdcd9, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, -0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x3a, 0x62, 0x6f, 0x6f, 0x6b, 0x6f, 0x72, -0x61, 0x6e, 0x67, 0x65, 0xd83d, 0xdcda, 0x3a, 0x62, 0x6f, 0x6f, 0x6b, 0x73, -0x3a, 0x62, 0x6f, 0x6f, 0x6b, 0x73, 0xd83d, 0xdcd6, 0x3a, 0x62, 0x6f, 0x6f, -0x6b, 0x3a, 0x62, 0x6f, 0x6f, 0x6b, 0xd83d, 0xdd16, 0x3a, 0x62, 0x6f, 0x6f, -0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x3a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, -0x72, 0x6b, 0xd83d, 0xdd17, 0x3a, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x6c, 0x69, -0x6e, 0x6b, 0xd83d, 0xdcce, 0x3a, 0x70, 0x61, 0x70, 0x65, 0x72, 0x63, 0x6c, -0x69, 0x70, 0x3a, 0x70, 0x61, 0x70, 0x65, 0x72, 0x63, 0x6c, 0x69, 0x70, -0xd83d, 0xdd87, 0x3a, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x5f, 0x70, 0x61, -0x70, 0x65, 0x72, 0x63, 0x6c, 0x69, 0x70, 0x73, 0x3a, 0x6c, 0x69, 0x6e, -0x6b, 0x65, 0x64, 0x70, 0x61, 0x70, 0x65, 0x72, 0x63, 0x6c, 0x69, 0x70, -0x73, 0xd83d, 0xdd87, 0x3a, 0x70, 0x61, 0x70, 0x65, 0x72, 0x63, 0x6c, 0x69, -0x70, 0x73, 0x3a, 0x70, 0x61, 0x70, 0x65, 0x72, 0x63, 0x6c, 0x69, 0x70, -0x73, 0xd83d, 0xdcd0, 0x3a, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x75, 0x6c, -0x61, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x72, 0x3a, 0x72, 0x75, 0x6c, -0x65, 0x72, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, -0xd83d, 0xdccf, 0x3a, 0x73, 0x74, 0x72, 0x61, 0x69, 0x67, 0x68, 0x74, 0x5f, -0x72, 0x75, 0x6c, 0x65, 0x72, 0x3a, 0x72, 0x75, 0x6c, 0x65, 0x72, 0x73, -0x74, 0x72, 0x61, 0x69, 0x67, 0x68, 0x74, 0xd83d, 0xdccc, 0x3a, 0x70, 0x75, -0x73, 0x68, 0x70, 0x69, 0x6e, 0x3a, 0x70, 0x75, 0x73, 0x68, 0x70, 0x69, -0x6e, 0xd83d, 0xdccd, 0x3a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x75, -0x73, 0x68, 0x70, 0x69, 0x6e, 0x3a, 0x70, 0x75, 0x73, 0x68, 0x70, 0x69, -0x6e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2702, 0xfe0f, 0x3a, 0x73, 0x63, 0x69, -0x73, 0x73, 0x6f, 0x72, 0x73, 0x3a, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, -0x72, 0x73, 0xd83d, 0xdd8a, 0x3a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x6c, -0x65, 0x66, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x70, 0x6f, 0x69, 0x6e, -0x74, 0x5f, 0x70, 0x65, 0x6e, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x70, 0x6f, -0x69, 0x6e, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x6c, 0x6f, 0x77, 0x65, 0x72, -0x70, 0x65, 0x6e, 0xd83d, 0xdd8a, 0x3a, 0x70, 0x65, 0x6e, 0x5f, 0x62, 0x61, -0x6c, 0x6c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x62, 0x61, 0x6c, 0x6c, -0x70, 0x6f, 0x69, 0x6e, 0x74, 0x70, 0x65, 0x6e, 0xd83d, 0xdd8b, 0x3a, 0x6c, -0x6f, 0x77, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x66, 0x6f, -0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x6e, 0x3a, 0x66, -0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x6c, -0x6f, 0x77, 0x65, 0x72, 0x70, 0x65, 0x6e, 0xd83d, 0xdd8b, 0x3a, 0x70, 0x65, -0x6e, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x3a, 0x66, -0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x70, 0x65, 0x6e, 0x2712, 0xfe0f, -0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x69, 0x62, 0x3a, 0x62, -0x6c, 0x61, 0x63, 0x6b, 0x6e, 0x69, 0x62, 0xd83d, 0xdd8c, 0x3a, 0x6c, 0x6f, -0x77, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x70, 0x61, 0x69, -0x6e, 0x74, 0x62, 0x72, 0x75, 0x73, 0x68, 0x3a, 0x6c, 0x65, 0x66, 0x74, -0x6c, 0x6f, 0x77, 0x65, 0x72, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x62, 0x72, -0x75, 0x73, 0x68, 0xd83d, 0xdd8c, 0x3a, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x62, -0x72, 0x75, 0x73, 0x68, 0x3a, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x62, 0x72, -0x75, 0x73, 0x68, 0xd83d, 0xdd8d, 0x3a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, -0x6c, 0x65, 0x66, 0x74, 0x5f, 0x63, 0x72, 0x61, 0x79, 0x6f, 0x6e, 0x3a, -0x63, 0x72, 0x61, 0x79, 0x6f, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x6c, 0x6f, -0x77, 0x65, 0x72, 0xd83d, 0xdd8d, 0x3a, 0x63, 0x72, 0x61, 0x79, 0x6f, 0x6e, -0x3a, 0x63, 0x72, 0x61, 0x79, 0x6f, 0x6e, 0xd83d, 0xdcdd, 0x3a, 0x6d, 0x65, -0x6d, 0x6f, 0x3a, 0x6d, 0x65, 0x6d, 0x6f, 0xd83d, 0xdcdd, 0x3a, 0x70, 0x65, -0x6e, 0x63, 0x69, 0x6c, 0x3a, 0x70, 0x65, 0x6e, 0x63, 0x69, 0x6c, 0x270f, -0xfe0f, 0x3a, 0x70, 0x65, 0x6e, 0x63, 0x69, 0x6c, 0x32, 0x3a, 0x70, 0x65, -0x6e, 0x63, 0x69, 0x6c, 0x32, 0xd83d, 0xdd0d, 0x3a, 0x6d, 0x61, 0x67, 0x3a, -0x6d, 0x61, 0x67, 0xd83d, 0xdd0e, 0x3a, 0x6d, 0x61, 0x67, 0x5f, 0x72, 0x69, -0x67, 0x68, 0x74, 0x3a, 0x6d, 0x61, 0x67, 0x72, 0x69, 0x67, 0x68, 0x74, -0xd83d, 0xdd0f, 0x3a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x69, 0x74, 0x68, -0x5f, 0x69, 0x6e, 0x6b, 0x5f, 0x70, 0x65, 0x6e, 0x3a, 0x69, 0x6e, 0x6b, -0x6c, 0x6f, 0x63, 0x6b, 0x70, 0x65, 0x6e, 0x77, 0x69, 0x74, 0x68, 0xd83d, -0xdd10, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x63, -0x6b, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x3a, 0x63, -0x6c, 0x6f, 0x73, 0x65, 0x64, 0x6b, 0x65, 0x79, 0x6c, 0x6f, 0x63, 0x6b, -0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdd12, 0x3a, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, -0x6c, 0x6f, 0x63, 0x6b, 0xd83d, 0xdd13, 0x3a, 0x75, 0x6e, 0x6c, 0x6f, 0x63, -0x6b, 0x3a, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x2764, 0xfe0f, 0x3a, 0x68, -0x65, 0x61, 0x72, 0x74, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0xd83d, 0xdc9b, -0x3a, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x72, -0x74, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x79, 0x65, 0x6c, 0x6c, 0x6f, -0x77, 0xd83d, 0xdc9a, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x5f, 0x68, 0x65, -0x61, 0x72, 0x74, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x68, 0x65, 0x61, -0x72, 0x74, 0xd83d, 0xdc99, 0x3a, 0x62, 0x6c, 0x75, 0x65, 0x5f, 0x68, 0x65, -0x61, 0x72, 0x74, 0x3a, 0x62, 0x6c, 0x75, 0x65, 0x68, 0x65, 0x61, 0x72, -0x74, 0xd83d, 0xdc9c, 0x3a, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x5f, 0x68, -0x65, 0x61, 0x72, 0x74, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x70, 0x75, -0x72, 0x70, 0x6c, 0x65, 0xd83d, 0xdda4, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, -0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, -0x68, 0x65, 0x61, 0x72, 0x74, 0xd83d, 0xdc94, 0x3a, 0x62, 0x72, 0x6f, 0x6b, -0x65, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x3a, 0x62, 0x72, 0x6f, -0x6b, 0x65, 0x6e, 0x68, 0x65, 0x61, 0x72, 0x74, 0x2763, 0xfe0f, 0x3a, 0x68, -0x65, 0x61, 0x76, 0x79, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x65, -0x78, 0x63, 0x6c, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, -0x61, 0x72, 0x6b, 0x5f, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, -0x3a, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, -0x68, 0x65, 0x61, 0x72, 0x74, 0x68, 0x65, 0x61, 0x76, 0x79, 0x6d, 0x61, -0x72, 0x6b, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2763, 0xfe0f, -0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x61, -0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x65, 0x78, 0x63, 0x6c, 0x61, -0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x68, 0x65, 0x61, 0x72, 0x74, 0xd83d, -0xdc95, 0x3a, 0x74, 0x77, 0x6f, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, -0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x74, 0x77, 0x6f, 0xd83d, 0xdc9e, -0x3a, 0x72, 0x65, 0x76, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x68, -0x65, 0x61, 0x72, 0x74, 0x73, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, -0x72, 0x65, 0x76, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0xd83d, 0xdc93, 0x3a, -0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x3a, 0x68, 0x65, -0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0xd83d, 0xdc97, 0x3a, 0x68, 0x65, -0x61, 0x72, 0x74, 0x70, 0x75, 0x6c, 0x73, 0x65, 0x3a, 0x68, 0x65, 0x61, -0x72, 0x74, 0x70, 0x75, 0x6c, 0x73, 0x65, 0xd83d, 0xdc96, 0x3a, 0x73, 0x70, -0x61, 0x72, 0x6b, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x72, -0x74, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x70, 0x61, 0x72, 0x6b, -0x6c, 0x69, 0x6e, 0x67, 0xd83d, 0xdc98, 0x3a, 0x63, 0x75, 0x70, 0x69, 0x64, -0x3a, 0x63, 0x75, 0x70, 0x69, 0x64, 0xd83d, 0xdc9d, 0x3a, 0x67, 0x69, 0x66, -0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x3a, 0x67, 0x69, 0x66, 0x74, -0x68, 0x65, 0x61, 0x72, 0x74, 0xd83d, 0xdc9f, 0x3a, 0x68, 0x65, 0x61, 0x72, -0x74, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, -0x3a, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x68, -0x65, 0x61, 0x72, 0x74, 0x262e, 0xfe0f, 0x3a, 0x70, 0x65, 0x61, 0x63, 0x65, -0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3a, 0x70, 0x65, 0x61, 0x63, -0x65, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x262e, 0xfe0f, 0x3a, 0x70, 0x65, -0x61, 0x63, 0x65, 0x3a, 0x70, 0x65, 0x61, 0x63, 0x65, 0x271d, 0xfe0f, 0x3a, -0x6c, 0x61, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x3a, -0x63, 0x72, 0x6f, 0x73, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x271d, 0xfe0f, -0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, -0x262a, 0xfe0f, 0x3a, 0x73, 0x74, 0x61, 0x72, 0x5f, 0x61, 0x6e, 0x64, 0x5f, -0x63, 0x72, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x3a, 0x61, 0x6e, 0x64, -0x63, 0x72, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x74, 0x61, 0x72, -0xd83d, 0xdd49, 0x3a, 0x6f, 0x6d, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, -0x3a, 0x6f, 0x6d, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2638, 0xfe0f, 0x3a, -0x77, 0x68, 0x65, 0x65, 0x6c, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x68, 0x61, -0x72, 0x6d, 0x61, 0x3a, 0x64, 0x68, 0x61, 0x72, 0x6d, 0x61, 0x6f, 0x66, -0x77, 0x68, 0x65, 0x65, 0x6c, 0x2721, 0xfe0f, 0x3a, 0x73, 0x74, 0x61, 0x72, -0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x76, 0x69, 0x64, 0x3a, 0x64, 0x61, -0x76, 0x69, 0x64, 0x6f, 0x66, 0x73, 0x74, 0x61, 0x72, 0xd83d, 0xdd2f, 0x3a, -0x73, 0x69, 0x78, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x5f, -0x73, 0x74, 0x61, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x64, -0x73, 0x69, 0x78, 0x73, 0x74, 0x61, 0x72, 0xd83d, 0xdd4e, 0x3a, 0x6d, 0x65, -0x6e, 0x6f, 0x72, 0x61, 0x68, 0x3a, 0x6d, 0x65, 0x6e, 0x6f, 0x72, 0x61, -0x68, 0x262f, 0xfe0f, 0x3a, 0x79, 0x69, 0x6e, 0x5f, 0x79, 0x61, 0x6e, 0x67, -0x3a, 0x79, 0x61, 0x6e, 0x67, 0x79, 0x69, 0x6e, 0x2626, 0xfe0f, 0x3a, 0x6f, -0x72, 0x74, 0x68, 0x6f, 0x64, 0x6f, 0x78, 0x5f, 0x63, 0x72, 0x6f, 0x73, -0x73, 0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x6f, 0x72, 0x74, 0x68, 0x6f, -0x64, 0x6f, 0x78, 0xd83d, 0xded0, 0x3a, 0x77, 0x6f, 0x72, 0x73, 0x68, 0x69, -0x70, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3a, 0x73, 0x79, 0x6d, -0x62, 0x6f, 0x6c, 0x77, 0x6f, 0x72, 0x73, 0x68, 0x69, 0x70, 0xd83d, 0xded0, -0x3a, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x77, 0x6f, -0x72, 0x73, 0x68, 0x69, 0x70, 0x3a, 0x6f, 0x66, 0x70, 0x6c, 0x61, 0x63, -0x65, 0x77, 0x6f, 0x72, 0x73, 0x68, 0x69, 0x70, 0x26ce, 0x3a, 0x6f, 0x70, -0x68, 0x69, 0x75, 0x63, 0x68, 0x75, 0x73, 0x3a, 0x6f, 0x70, 0x68, 0x69, -0x75, 0x63, 0x68, 0x75, 0x73, 0x2648, 0xfe0f, 0x3a, 0x61, 0x72, 0x69, 0x65, -0x73, 0x3a, 0x61, 0x72, 0x69, 0x65, 0x73, 0x2649, 0xfe0f, 0x3a, 0x74, 0x61, -0x75, 0x72, 0x75, 0x73, 0x3a, 0x74, 0x61, 0x75, 0x72, 0x75, 0x73, 0x264a, -0xfe0f, 0x3a, 0x67, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x3a, 0x67, 0x65, 0x6d, -0x69, 0x6e, 0x69, 0x264b, 0xfe0f, 0x3a, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x72, -0x3a, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x264c, 0xfe0f, 0x3a, 0x6c, 0x65, -0x6f, 0x3a, 0x6c, 0x65, 0x6f, 0x264d, 0xfe0f, 0x3a, 0x76, 0x69, 0x72, 0x67, -0x6f, 0x3a, 0x76, 0x69, 0x72, 0x67, 0x6f, 0x264e, 0xfe0f, 0x3a, 0x6c, 0x69, -0x62, 0x72, 0x61, 0x3a, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x264f, 0xfe0f, 0x3a, -0x73, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x75, 0x73, 0x3a, 0x73, 0x63, 0x6f, -0x72, 0x70, 0x69, 0x75, 0x73, 0x2650, 0xfe0f, 0x3a, 0x73, 0x61, 0x67, 0x69, -0x74, 0x74, 0x61, 0x72, 0x69, 0x75, 0x73, 0x3a, 0x73, 0x61, 0x67, 0x69, -0x74, 0x74, 0x61, 0x72, 0x69, 0x75, 0x73, 0x2651, 0xfe0f, 0x3a, 0x63, 0x61, -0x70, 0x72, 0x69, 0x63, 0x6f, 0x72, 0x6e, 0x3a, 0x63, 0x61, 0x70, 0x72, -0x69, 0x63, 0x6f, 0x72, 0x6e, 0x2652, 0xfe0f, 0x3a, 0x61, 0x71, 0x75, 0x61, -0x72, 0x69, 0x75, 0x73, 0x3a, 0x61, 0x71, 0x75, 0x61, 0x72, 0x69, 0x75, -0x73, 0x2653, 0xfe0f, 0x3a, 0x70, 0x69, 0x73, 0x63, 0x65, 0x73, 0x3a, 0x70, -0x69, 0x73, 0x63, 0x65, 0x73, 0xd83c, 0xdd94, 0x3a, 0x69, 0x64, 0x3a, 0x69, -0x64, 0x269b, 0xfe0f, 0x3a, 0x61, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x79, 0x6d, -0x62, 0x6f, 0x6c, 0x3a, 0x61, 0x74, 0x6f, 0x6d, 0x73, 0x79, 0x6d, 0x62, -0x6f, 0x6c, 0x269b, 0xfe0f, 0x3a, 0x61, 0x74, 0x6f, 0x6d, 0x3a, 0x61, 0x74, -0x6f, 0x6d, 0xd83c, 0xde51, 0x3a, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, -0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2622, 0xfe0f, 0x3a, 0x72, 0x61, 0x64, -0x69, 0x6f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x69, 0x67, -0x6e, 0x3a, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x61, 0x63, 0x74, 0x69, 0x76, -0x65, 0x73, 0x69, 0x67, 0x6e, 0x2622, 0xfe0f, 0x3a, 0x72, 0x61, 0x64, 0x69, -0x6f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x72, 0x61, 0x64, 0x69, -0x6f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2623, 0xfe0f, 0x3a, 0x62, 0x69, -0x6f, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, -0x3a, 0x62, 0x69, 0x6f, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x73, 0x69, -0x67, 0x6e, 0x2623, 0xfe0f, 0x3a, 0x62, 0x69, 0x6f, 0x68, 0x61, 0x7a, 0x61, -0x72, 0x64, 0x3a, 0x62, 0x69, 0x6f, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, -0xd83d, 0xdcf4, 0x3a, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x68, -0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x3a, 0x6d, 0x6f, 0x62, 0x69, -0x6c, 0x65, 0x6f, 0x66, 0x66, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0xd83d, 0xdcf3, -0x3a, 0x76, 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, -0x6f, 0x64, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x65, 0x76, 0x69, 0x62, 0x72, -0x61, 0x74, 0x69, 0x6f, 0x6e, 0xd83c, 0xde36, 0x3a, 0x75, 0x36, 0x37, 0x30, -0x39, 0x3a, 0x75, 0x36, 0x37, 0x30, 0x39, 0xd83c, 0xde1a, 0xfe0f, 0x3a, 0x75, -0x37, 0x31, 0x32, 0x31, 0x3a, 0x75, 0x37, 0x31, 0x32, 0x31, 0xd83c, 0xde38, -0x3a, 0x75, 0x37, 0x35, 0x33, 0x33, 0x3a, 0x75, 0x37, 0x35, 0x33, 0x33, -0xd83c, 0xde3a, 0x3a, 0x75, 0x35, 0x35, 0x62, 0x36, 0x3a, 0x75, 0x35, 0x35, -0x62, 0x36, 0xd83c, 0xde37, 0x3a, 0x75, 0x36, 0x37, 0x30, 0x38, 0x3a, 0x75, -0x36, 0x37, 0x30, 0x38, 0x2734, 0xfe0f, 0x3a, 0x65, 0x69, 0x67, 0x68, 0x74, -0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x61, -0x63, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x3a, 0x62, 0x6c, 0x61, 0x63, -0x6b, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, -0x64, 0x73, 0x74, 0x61, 0x72, 0xd83c, 0xdd9a, 0x3a, 0x76, 0x73, 0x3a, 0x76, -0x73, 0xd83d, 0xdcae, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6c, -0x6f, 0x77, 0x65, 0x72, 0x3a, 0x66, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x77, -0x68, 0x69, 0x74, 0x65, 0xd83c, 0xde50, 0x3a, 0x69, 0x64, 0x65, 0x6f, 0x67, -0x72, 0x61, 0x70, 0x68, 0x5f, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61, -0x67, 0x65, 0x3a, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61, 0x67, 0x65, -0x69, 0x64, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3299, 0xfe0f, 0x3a, -0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x73, 0x65, 0x63, 0x72, 0x65, -0x74, 0x3297, 0xfe0f, 0x3a, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x61, 0x74, 0x75, -0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x63, 0x6f, 0x6e, 0x67, -0x72, 0x61, 0x74, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xd83c, -0xde34, 0x3a, 0x75, 0x35, 0x34, 0x30, 0x38, 0x3a, 0x75, 0x35, 0x34, 0x30, -0x38, 0xd83c, 0xde35, 0x3a, 0x75, 0x36, 0x65, 0x38, 0x30, 0x3a, 0x75, 0x36, -0x65, 0x38, 0x30, 0xd83c, 0xde39, 0x3a, 0x75, 0x35, 0x32, 0x37, 0x32, 0x3a, -0x75, 0x35, 0x32, 0x37, 0x32, 0xd83c, 0xde32, 0x3a, 0x75, 0x37, 0x39, 0x38, -0x31, 0x3a, 0x75, 0x37, 0x39, 0x38, 0x31, 0xd83c, 0xdd70, 0xfe0f, 0x3a, 0x61, -0x3a, 0x61, 0xd83c, 0xdd71, 0xfe0f, 0x3a, 0x62, 0x3a, 0x62, 0xd83c, 0xdd8e, 0x3a, -0x61, 0x62, 0x3a, 0x61, 0x62, 0xd83c, 0xdd91, 0x3a, 0x63, 0x6c, 0x3a, 0x63, -0x6c, 0xd83c, 0xdd7e, 0xfe0f, 0x3a, 0x6f, 0x32, 0x3a, 0x6f, 0x32, 0xd83c, 0xdd98, -0x3a, 0x73, 0x6f, 0x73, 0x3a, 0x73, 0x6f, 0x73, 0x274c, 0x3a, 0x78, 0x3a, -0x78, 0x2b55, 0xfe0f, 0x3a, 0x6f, 0x3a, 0x6f, 0xd83d, 0xded1, 0x3a, 0x73, 0x74, -0x6f, 0x70, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x3a, 0x73, 0x69, 0x67, 0x6e, -0x73, 0x74, 0x6f, 0x70, 0xd83d, 0xded1, 0x3a, 0x6f, 0x63, 0x74, 0x61, 0x67, -0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x3a, 0x6f, 0x63, -0x74, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x69, 0x67, 0x6e, 0x26d4, -0xfe0f, 0x3a, 0x6e, 0x6f, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3a, 0x65, -0x6e, 0x74, 0x72, 0x79, 0x6e, 0x6f, 0xd83d, 0xdcdb, 0x3a, 0x6e, 0x61, 0x6d, -0x65, 0x5f, 0x62, 0x61, 0x64, 0x67, 0x65, 0x3a, 0x62, 0x61, 0x64, 0x67, -0x65, 0x6e, 0x61, 0x6d, 0x65, 0xd83d, 0xdeab, 0x3a, 0x6e, 0x6f, 0x5f, 0x65, -0x6e, 0x74, 0x72, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x3a, 0x65, 0x6e, -0x74, 0x72, 0x79, 0x6e, 0x6f, 0x73, 0x69, 0x67, 0x6e, 0xd83d, 0xdcaf, 0x3a, -0x31, 0x30, 0x30, 0x3a, 0x31, 0x30, 0x30, 0xd83d, 0xdca2, 0x3a, 0x61, 0x6e, -0x67, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2668, 0xfe0f, 0x3a, -0x68, 0x6f, 0x74, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x68, -0x6f, 0x74, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x73, 0xd83d, 0xdeb7, 0x3a, -0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x64, 0x65, 0x73, 0x74, 0x72, 0x69, 0x61, -0x6e, 0x73, 0x3a, 0x6e, 0x6f, 0x70, 0x65, 0x64, 0x65, 0x73, 0x74, 0x72, -0x69, 0x61, 0x6e, 0x73, 0xd83d, 0xdeaf, 0x3a, 0x64, 0x6f, 0x5f, 0x6e, 0x6f, -0x74, 0x5f, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x3a, 0x64, 0x6f, 0x6c, -0x69, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x6f, 0x74, 0xd83d, 0xdeb3, 0x3a, 0x6e, -0x6f, 0x5f, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3a, 0x62, -0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x6e, 0x6f, 0xd83d, 0xdeb1, 0x3a, -0x6e, 0x6f, 0x6e, 0x2d, 0x70, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, -0x77, 0x61, 0x74, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, 0x70, 0x6f, 0x74, -0x61, 0x62, 0x6c, 0x65, 0x77, 0x61, 0x74, 0x65, 0x72, 0xd83d, 0xdd1e, 0x3a, -0x75, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x67, 0x65, 0x3a, 0x75, 0x6e, 0x64, -0x65, 0x72, 0x61, 0x67, 0x65, 0xd83d, 0xdcf5, 0x3a, 0x6e, 0x6f, 0x5f, 0x6d, -0x6f, 0x62, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x73, -0x3a, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x70, 0x68, 0x6f, -0x6e, 0x65, 0x73, 0xd83d, 0xdead, 0x3a, 0x6e, 0x6f, 0x5f, 0x73, 0x6d, 0x6f, -0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x6e, 0x6f, 0x73, 0x6d, 0x6f, 0x6b, 0x69, -0x6e, 0x67, 0x2757, 0xfe0f, 0x3a, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x61, -0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x61, -0x74, 0x69, 0x6f, 0x6e, 0x2755, 0x3a, 0x67, 0x72, 0x65, 0x79, 0x5f, 0x65, -0x78, 0x63, 0x6c, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x65, -0x78, 0x63, 0x6c, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x67, 0x72, -0x65, 0x79, 0x2753, 0x3a, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, -0x3a, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2754, 0x3a, 0x67, -0x72, 0x65, 0x79, 0x5f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, -0x3a, 0x67, 0x72, 0x65, 0x79, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, -0x6e, 0x203c, 0xfe0f, 0x3a, 0x62, 0x61, 0x6e, 0x67, 0x62, 0x61, 0x6e, 0x67, -0x3a, 0x62, 0x61, 0x6e, 0x67, 0x62, 0x61, 0x6e, 0x67, 0x2049, 0xfe0f, 0x3a, -0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x6f, 0x62, 0x61, 0x6e, 0x67, 0x3a, -0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x6f, 0x62, 0x61, 0x6e, 0x67, 0xd83d, -0xdd05, 0x3a, 0x6c, 0x6f, 0x77, 0x5f, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, -0x6e, 0x65, 0x73, 0x73, 0x3a, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, -0x65, 0x73, 0x73, 0x6c, 0x6f, 0x77, 0xd83d, 0xdd06, 0x3a, 0x68, 0x69, 0x67, -0x68, 0x5f, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, -0x3a, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x68, -0x69, 0x67, 0x68, 0x303d, 0xfe0f, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x61, -0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, -0x61, 0x72, 0x6b, 0x3a, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, -0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x61, 0x72, 0x74, 0x26a0, -0xfe0f, 0x3a, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x77, 0x61, -0x72, 0x6e, 0x69, 0x6e, 0x67, 0xd83d, 0xdeb8, 0x3a, 0x63, 0x68, 0x69, 0x6c, -0x64, 0x72, 0x65, 0x6e, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, -0x67, 0x3a, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x63, 0x72, -0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0xd83d, 0xdd31, 0x3a, 0x74, 0x72, 0x69, -0x64, 0x65, 0x6e, 0x74, 0x3a, 0x74, 0x72, 0x69, 0x64, 0x65, 0x6e, 0x74, -0x269c, 0xfe0f, 0x3a, 0x66, 0x6c, 0x65, 0x75, 0x72, 0x2d, 0x64, 0x65, 0x2d, -0x6c, 0x69, 0x73, 0x3a, 0x64, 0x65, 0x66, 0x6c, 0x65, 0x75, 0x72, 0x6c, -0x69, 0x73, 0xd83d, 0xdd30, 0x3a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x65, -0x72, 0x3a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x267b, 0xfe0f, -0x3a, 0x72, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3a, 0x72, 0x65, 0x63, -0x79, 0x63, 0x6c, 0x65, 0x2705, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, -0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x3a, 0x63, -0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x77, 0x68, 0x69, 0x74, -0x65, 0xd83c, 0xde2f, 0xfe0f, 0x3a, 0x75, 0x36, 0x33, 0x30, 0x37, 0x3a, 0x75, -0x36, 0x33, 0x30, 0x37, 0xd83d, 0xdcb9, 0x3a, 0x63, 0x68, 0x61, 0x72, 0x74, -0x3a, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2747, 0xfe0f, 0x3a, 0x73, 0x70, 0x61, -0x72, 0x6b, 0x6c, 0x65, 0x3a, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x6c, 0x65, -0x2733, 0xfe0f, 0x3a, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x70, 0x6f, -0x6b, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, -0x3a, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x65, 0x69, 0x67, -0x68, 0x74, 0x73, 0x70, 0x6f, 0x6b, 0x65, 0x64, 0x274e, 0x3a, 0x6e, 0x65, -0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, -0x65, 0x64, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x6d, 0x61, 0x72, -0x6b, 0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x6d, 0x61, 0x72, 0x6b, 0x6e, -0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x71, 0x75, 0x61, 0x72, -0x65, 0x64, 0xd83c, 0xdf10, 0x3a, 0x67, 0x6c, 0x6f, 0x62, 0x65, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x72, 0x69, 0x64, 0x69, 0x61, 0x6e, -0x73, 0x3a, 0x67, 0x6c, 0x6f, 0x62, 0x65, 0x6d, 0x65, 0x72, 0x69, 0x64, -0x69, 0x61, 0x6e, 0x73, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdca0, 0x3a, 0x64, -0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x61, 0x5f, 0x64, 0x6f, 0x74, 0x5f, -0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x3a, 0x61, 0x64, 0x69, 0x61, 0x6d, -0x6f, 0x6e, 0x64, 0x64, 0x6f, 0x74, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, -0x73, 0x68, 0x61, 0x70, 0x65, 0x77, 0x69, 0x74, 0x68, 0x24c2, 0xfe0f, 0x3a, -0x6d, 0x3a, 0x6d, 0xd83c, 0xdf00, 0x3a, 0x63, 0x79, 0x63, 0x6c, 0x6f, 0x6e, -0x65, 0x3a, 0x63, 0x79, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0xd83d, 0xdca4, 0x3a, -0x7a, 0x7a, 0x7a, 0x3a, 0x7a, 0x7a, 0x7a, 0xd83c, 0xdfe7, 0x3a, 0x61, 0x74, -0x6d, 0x3a, 0x61, 0x74, 0x6d, 0xd83d, 0xdebe, 0x3a, 0x77, 0x63, 0x3a, 0x77, -0x63, 0x267f, 0xfe0f, 0x3a, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x63, 0x68, 0x61, -0x69, 0x72, 0x3a, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x63, 0x68, 0x61, 0x69, -0x72, 0xd83c, 0xdd7f, 0xfe0f, 0x3a, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, -0x3a, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0xd83c, 0xde33, 0x3a, 0x75, -0x37, 0x61, 0x37, 0x61, 0x3a, 0x75, 0x37, 0x61, 0x37, 0x61, 0xd83c, 0xde02, -0x3a, 0x73, 0x61, 0x3a, 0x73, 0x61, 0xd83d, 0xdec2, 0x3a, 0x70, 0x61, 0x73, -0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, -0x6c, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x70, 0x61, 0x73, -0x73, 0x70, 0x6f, 0x72, 0x74, 0xd83d, 0xdec3, 0x3a, 0x63, 0x75, 0x73, 0x74, -0x6f, 0x6d, 0x73, 0x3a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x73, 0xd83d, -0xdec4, 0x3a, 0x62, 0x61, 0x67, 0x67, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, -0x61, 0x69, 0x6d, 0x3a, 0x62, 0x61, 0x67, 0x67, 0x61, 0x67, 0x65, 0x63, -0x6c, 0x61, 0x69, 0x6d, 0xd83d, 0xdec5, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x5f, -0x6c, 0x75, 0x67, 0x67, 0x61, 0x67, 0x65, 0x3a, 0x6c, 0x65, 0x66, 0x74, -0x6c, 0x75, 0x67, 0x67, 0x61, 0x67, 0x65, 0xd83d, 0xdeb9, 0x3a, 0x6d, 0x65, -0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x6e, 0x73, 0xd83d, 0xdeba, 0x3a, 0x77, 0x6f, -0x6d, 0x65, 0x6e, 0x73, 0x3a, 0x77, 0x6f, 0x6d, 0x65, 0x6e, 0x73, 0xd83d, -0xdebc, 0x3a, 0x62, 0x61, 0x62, 0x79, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, -0x6c, 0x3a, 0x62, 0x61, 0x62, 0x79, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, -0xd83d, 0xdebb, 0x3a, 0x72, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x6f, 0x6d, 0x3a, -0x72, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x6f, 0x6d, 0xd83d, 0xdeae, 0x3a, 0x70, -0x75, 0x74, 0x5f, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, -0x5f, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x69, -0x6e, 0x69, 0x74, 0x73, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x70, 0x6c, -0x61, 0x63, 0x65, 0x70, 0x75, 0x74, 0xd83c, 0xdfa6, 0x3a, 0x63, 0x69, 0x6e, -0x65, 0x6d, 0x61, 0x3a, 0x63, 0x69, 0x6e, 0x65, 0x6d, 0x61, 0xd83d, 0xdcf6, -0x3a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x65, -0x6e, 0x67, 0x74, 0x68, 0x3a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, -0x74, 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd83c, 0xde01, 0x3a, 0x6b, 0x6f, -0x6b, 0x6f, 0x3a, 0x6b, 0x6f, 0x6b, 0x6f, 0xd83d, 0xdd23, 0x3a, 0x73, 0x79, -0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, -0x73, 0x2139, 0xfe0f, 0x3a, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, -0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x69, -0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6f, -0x75, 0x72, 0x63, 0x65, 0xd83d, 0xdd24, 0x3a, 0x61, 0x62, 0x63, 0x3a, 0x61, -0x62, 0x63, 0xd83d, 0xdd21, 0x3a, 0x61, 0x62, 0x63, 0x64, 0x3a, 0x61, 0x62, -0x63, 0x64, 0xd83d, 0xdd20, 0x3a, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, -0x5f, 0x61, 0x62, 0x63, 0x64, 0x3a, 0x61, 0x62, 0x63, 0x64, 0x63, 0x61, -0x70, 0x69, 0x74, 0x61, 0x6c, 0xd83c, 0xdd96, 0x3a, 0x6e, 0x67, 0x3a, 0x6e, -0x67, 0xd83c, 0xdd97, 0x3a, 0x6f, 0x6b, 0x3a, 0x6f, 0x6b, 0xd83c, 0xdd99, 0x3a, -0x75, 0x70, 0x3a, 0x75, 0x70, 0xd83c, 0xdd92, 0x3a, 0x63, 0x6f, 0x6f, 0x6c, -0x3a, 0x63, 0x6f, 0x6f, 0x6c, 0xd83c, 0xdd95, 0x3a, 0x6e, 0x65, 0x77, 0x3a, -0x6e, 0x65, 0x77, 0xd83c, 0xdd93, 0x3a, 0x66, 0x72, 0x65, 0x65, 0x3a, 0x66, -0x72, 0x65, 0x65, 0x30, 0xfe0f, 0x20e3, 0x3a, 0x7a, 0x65, 0x72, 0x6f, 0x3a, -0x7a, 0x65, 0x72, 0x6f, 0x31, 0xfe0f, 0x20e3, 0x3a, 0x6f, 0x6e, 0x65, 0x3a, -0x6f, 0x6e, 0x65, 0x32, 0xfe0f, 0x20e3, 0x3a, 0x74, 0x77, 0x6f, 0x3a, 0x74, -0x77, 0x6f, 0x33, 0xfe0f, 0x20e3, 0x3a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x3a, -0x74, 0x68, 0x72, 0x65, 0x65, 0x34, 0xfe0f, 0x20e3, 0x3a, 0x66, 0x6f, 0x75, -0x72, 0x3a, 0x66, 0x6f, 0x75, 0x72, 0x35, 0xfe0f, 0x20e3, 0x3a, 0x66, 0x69, -0x76, 0x65, 0x3a, 0x66, 0x69, 0x76, 0x65, 0x36, 0xfe0f, 0x20e3, 0x3a, 0x73, -0x69, 0x78, 0x3a, 0x73, 0x69, 0x78, 0x37, 0xfe0f, 0x20e3, 0x3a, 0x73, 0x65, -0x76, 0x65, 0x6e, 0x3a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x38, 0xfe0f, 0x20e3, -0x3a, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x65, 0x69, 0x67, 0x68, 0x74, -0x39, 0xfe0f, 0x20e3, 0x3a, 0x6e, 0x69, 0x6e, 0x65, 0x3a, 0x6e, 0x69, 0x6e, -0x65, 0xd83d, 0xdd1f, 0x3a, 0x6b, 0x65, 0x79, 0x63, 0x61, 0x70, 0x5f, 0x74, -0x65, 0x6e, 0x3a, 0x6b, 0x65, 0x79, 0x63, 0x61, 0x70, 0x74, 0x65, 0x6e, -0xd83d, 0xdd22, 0x3a, 0x31, 0x32, 0x33, 0x34, 0x3a, 0x31, 0x32, 0x33, 0x34, -0x23, 0xfe0f, 0x20e3, 0x3a, 0x68, 0x61, 0x73, 0x68, 0x3a, 0x68, 0x61, 0x73, -0x68, 0x2a, 0xfe0f, 0x20e3, 0x3a, 0x6b, 0x65, 0x79, 0x63, 0x61, 0x70, 0x5f, -0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x3a, 0x61, 0x73, 0x74, -0x65, 0x72, 0x69, 0x73, 0x6b, 0x6b, 0x65, 0x79, 0x63, 0x61, 0x70, 0x2a, -0xfe0f, 0x20e3, 0x3a, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x3a, -0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x25b6, 0xfe0f, 0x3a, 0x61, -0x72, 0x72, 0x6f, 0x77, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, -0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, -0x64, 0x23f8, 0x3a, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x65, -0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x72, 0x3a, 0x62, -0x61, 0x72, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x74, -0x69, 0x63, 0x61, 0x6c, 0x23f8, 0x3a, 0x70, 0x61, 0x75, 0x73, 0x65, 0x5f, -0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x6f, -0x6e, 0x70, 0x61, 0x75, 0x73, 0x65, 0x23ef, 0x3a, 0x70, 0x6c, 0x61, 0x79, -0x5f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x3a, 0x70, 0x61, 0x75, 0x73, 0x65, -0x70, 0x6c, 0x61, 0x79, 0x23f9, 0x3a, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x62, -0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, -0x73, 0x74, 0x6f, 0x70, 0x23fa, 0x3a, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, -0x5f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x62, 0x75, 0x74, 0x74, -0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x23ed, 0x3a, 0x6e, 0x65, -0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x6e, 0x65, 0x78, -0x74, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x23ed, 0x3a, 0x74, 0x72, 0x61, 0x63, -0x6b, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x3a, 0x6e, 0x65, 0x78, 0x74, 0x74, -0x72, 0x61, 0x63, 0x6b, 0x23ee, 0x3a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, -0x75, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x70, 0x72, 0x65, -0x76, 0x69, 0x6f, 0x75, 0x73, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x23ee, 0x3a, -0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, -0x75, 0x73, 0x3a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x74, -0x72, 0x61, 0x63, 0x6b, 0x23e9, 0x3a, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, -0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x3a, 0x66, 0x61, 0x73, 0x74, 0x66, -0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x23ea, 0x3a, 0x72, 0x65, 0x77, 0x69, -0x6e, 0x64, 0x3a, 0x72, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x23eb, 0x3a, 0x61, -0x72, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, -0x75, 0x70, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x75, 0x62, -0x6c, 0x65, 0x75, 0x70, 0x23ec, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, -0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x3a, -0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x64, -0x6f, 0x77, 0x6e, 0x25c0, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, -0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x3a, 0x61, 0x72, 0x72, -0x6f, 0x77, 0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0xd83d, 0xdd3c, -0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, 0x75, 0x70, 0x5f, 0x73, 0x6d, -0x61, 0x6c, 0x6c, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x73, 0x6d, 0x61, -0x6c, 0x6c, 0x75, 0x70, 0xd83d, 0xdd3d, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, -0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3a, -0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x6d, 0x61, -0x6c, 0x6c, 0x27a1, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, 0x72, -0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, -0x67, 0x68, 0x74, 0x2b05, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, -0x6c, 0x65, 0x66, 0x74, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, -0x66, 0x74, 0x2b06, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, 0x75, -0x70, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x2b07, 0xfe0f, 0x3a, -0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x61, -0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x2197, 0xfe0f, 0x3a, 0x61, -0x72, 0x72, 0x6f, 0x77, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x72, -0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, -0x67, 0x68, 0x74, 0x75, 0x70, 0x70, 0x65, 0x72, 0x2198, 0xfe0f, 0x3a, 0x61, -0x72, 0x72, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x72, -0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x6f, -0x77, 0x65, 0x72, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2199, 0xfe0f, 0x3a, 0x61, -0x72, 0x72, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x6c, -0x65, 0x66, 0x74, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, -0x74, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x2196, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, -0x6f, 0x77, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x66, -0x74, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x75, -0x70, 0x70, 0x65, 0x72, 0x2195, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, -0x5f, 0x75, 0x70, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x61, 0x72, 0x72, -0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x75, 0x70, 0x2194, 0xfe0f, 0x3a, 0x6c, -0x65, 0x66, 0x74, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x61, 0x72, -0x72, 0x6f, 0x77, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, -0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x21aa, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, -0x6f, 0x77, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x68, 0x6f, 0x6f, -0x6b, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x68, 0x6f, 0x6f, 0x6b, 0x72, -0x69, 0x67, 0x68, 0x74, 0x21a9, 0xfe0f, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x77, -0x61, 0x72, 0x64, 0x73, 0x5f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x5f, 0x77, -0x69, 0x74, 0x68, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x3a, 0x61, 0x72, 0x72, -0x6f, 0x77, 0x68, 0x6f, 0x6f, 0x6b, 0x6c, 0x65, 0x66, 0x74, 0x77, 0x61, -0x72, 0x64, 0x73, 0x77, 0x69, 0x74, 0x68, 0x2934, 0xfe0f, 0x3a, 0x61, 0x72, -0x72, 0x6f, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, -0x75, 0x70, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x68, 0x65, 0x61, 0x64, -0x69, 0x6e, 0x67, 0x75, 0x70, 0x2935, 0xfe0f, 0x3a, 0x61, 0x72, 0x72, 0x6f, -0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x6f, -0x77, 0x6e, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, -0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0xd83d, 0xdd00, 0x3a, 0x74, 0x77, -0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x77, -0x61, 0x72, 0x64, 0x73, 0x5f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x73, 0x3a, -0x61, 0x72, 0x72, 0x6f, 0x77, 0x73, 0x72, 0x69, 0x67, 0x68, 0x74, 0x77, -0x61, 0x72, 0x64, 0x73, 0x74, 0x77, 0x69, 0x73, 0x74, 0x65, 0x64, 0xd83d, -0xdd01, 0x3a, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3a, 0x72, 0x65, 0x70, -0x65, 0x61, 0x74, 0xd83d, 0xdd02, 0x3a, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, -0x5f, 0x6f, 0x6e, 0x65, 0x3a, 0x6f, 0x6e, 0x65, 0x72, 0x65, 0x70, 0x65, -0x61, 0x74, 0xd83d, 0xdd04, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x73, 0x5f, -0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6c, 0x6f, 0x63, 0x6b, -0x77, 0x69, 0x73, 0x65, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x73, 0x63, -0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x77, -0x69, 0x73, 0x65, 0xd83d, 0xdd03, 0x3a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x73, -0x5f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x77, 0x69, 0x73, 0x65, 0x3a, 0x61, -0x72, 0x72, 0x6f, 0x77, 0x73, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x77, 0x69, -0x73, 0x65, 0xd83c, 0xdfb5, 0x3a, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, -0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x3a, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, -0x6c, 0x6e, 0x6f, 0x74, 0x65, 0xd83c, 0xdfb6, 0x3a, 0x6e, 0x6f, 0x74, 0x65, -0x73, 0x3a, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2795, 0x3a, 0x68, 0x65, 0x61, -0x76, 0x79, 0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x73, 0x69, 0x67, 0x6e, -0x3a, 0x68, 0x65, 0x61, 0x76, 0x79, 0x70, 0x6c, 0x75, 0x73, 0x73, 0x69, -0x67, 0x6e, 0x2796, 0x3a, 0x68, 0x65, 0x61, 0x76, 0x79, 0x5f, 0x6d, 0x69, -0x6e, 0x75, 0x73, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x3a, 0x68, 0x65, 0x61, -0x76, 0x79, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2797, -0x3a, 0x68, 0x65, 0x61, 0x76, 0x79, 0x5f, 0x64, 0x69, 0x76, 0x69, 0x73, -0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x3a, 0x64, 0x69, 0x76, -0x69, 0x73, 0x69, 0x6f, 0x6e, 0x68, 0x65, 0x61, 0x76, 0x79, 0x73, 0x69, -0x67, 0x6e, 0x2716, 0xfe0f, 0x3a, 0x68, 0x65, 0x61, 0x76, 0x79, 0x5f, 0x6d, -0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x5f, 0x78, 0x3a, 0x68, 0x65, 0x61, 0x76, 0x79, 0x6d, 0x75, 0x6c, -0x74, 0x69, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x78, -0xd83d, 0xdcb2, 0x3a, 0x68, 0x65, 0x61, 0x76, 0x79, 0x5f, 0x64, 0x6f, 0x6c, -0x6c, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x3a, 0x64, 0x6f, 0x6c, -0x6c, 0x61, 0x72, 0x68, 0x65, 0x61, 0x76, 0x79, 0x73, 0x69, 0x67, 0x6e, -0xd83d, 0xdcb1, 0x3a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, -0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x63, 0x75, 0x72, -0x72, 0x65, 0x6e, 0x63, 0x79, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, -0x65, 0x2122, 0x3a, 0x74, 0x6d, 0x3a, 0x74, 0x6d, 0xa9, 0x3a, 0x63, 0x6f, -0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x63, 0x6f, 0x70, 0x79, -0x72, 0x69, 0x67, 0x68, 0x74, 0xae, 0x3a, 0x72, 0x65, 0x67, 0x69, 0x73, -0x74, 0x65, 0x72, 0x65, 0x64, 0x3a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, -0x65, 0x72, 0x65, 0x64, 0x3030, 0x3a, 0x77, 0x61, 0x76, 0x79, 0x5f, 0x64, -0x61, 0x73, 0x68, 0x3a, 0x64, 0x61, 0x73, 0x68, 0x77, 0x61, 0x76, 0x79, -0x27b0, 0x3a, 0x63, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, -0x3a, 0x63, 0x75, 0x72, 0x6c, 0x79, 0x6c, 0x6f, 0x6f, 0x70, 0x27bf, 0x3a, -0x6c, 0x6f, 0x6f, 0x70, 0x3a, 0x6c, 0x6f, 0x6f, 0x70, 0xd83d, 0xdd1a, 0x3a, -0x65, 0x6e, 0x64, 0x3a, 0x65, 0x6e, 0x64, 0xd83d, 0xdd19, 0x3a, 0x62, 0x61, -0x63, 0x6b, 0x3a, 0x62, 0x61, 0x63, 0x6b, 0xd83d, 0xdd1b, 0x3a, 0x6f, 0x6e, -0x3a, 0x6f, 0x6e, 0xd83d, 0xdd1d, 0x3a, 0x74, 0x6f, 0x70, 0x3a, 0x74, 0x6f, -0x70, 0xd83d, 0xdd1c, 0x3a, 0x73, 0x6f, 0x6f, 0x6e, 0x3a, 0x73, 0x6f, 0x6f, -0x6e, 0x2714, 0xfe0f, 0x3a, 0x68, 0x65, 0x61, 0x76, 0x79, 0x5f, 0x63, 0x68, -0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x3a, 0x63, 0x68, 0x65, -0x63, 0x6b, 0x68, 0x65, 0x61, 0x76, 0x79, 0x6d, 0x61, 0x72, 0x6b, 0x2611, -0xfe0f, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x78, -0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x3a, -0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x74, 0x62, 0x6f, 0x78, 0x63, 0x68, 0x65, -0x63, 0x6b, 0x77, 0x69, 0x74, 0x68, 0xd83d, 0xdd18, 0x3a, 0x72, 0x61, 0x64, -0x69, 0x6f, 0x5f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x62, 0x75, -0x74, 0x74, 0x6f, 0x6e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x26aa, 0xfe0f, 0x3a, -0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, -0x3a, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x77, 0x68, 0x69, 0x74, 0x65, -0x26ab, 0xfe0f, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x69, 0x72, -0x63, 0x6c, 0x65, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x63, 0x69, 0x72, -0x63, 0x6c, 0x65, 0xd83d, 0xdd34, 0x3a, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x69, -0x72, 0x63, 0x6c, 0x65, 0x3a, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x72, -0x65, 0x64, 0xd83d, 0xdd35, 0x3a, 0x62, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x69, -0x72, 0x63, 0x6c, 0x65, 0x3a, 0x62, 0x6c, 0x75, 0x65, 0x63, 0x69, 0x72, -0x63, 0x6c, 0x65, 0xd83d, 0xdd3a, 0x3a, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, -0x72, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, -0x3a, 0x72, 0x65, 0x64, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x74, 0x72, 0x69, -0x61, 0x6e, 0x67, 0x6c, 0x65, 0xd83d, 0xdd3b, 0x3a, 0x73, 0x6d, 0x61, 0x6c, -0x6c, 0x5f, 0x72, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, -0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x64, 0x6f, 0x77, 0x6e, -0x72, 0x65, 0x64, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x74, 0x72, 0x69, 0x61, -0x6e, 0x67, 0x6c, 0x65, 0xd83d, 0xdd38, 0x3a, 0x73, 0x6d, 0x61, 0x6c, 0x6c, -0x5f, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x69, 0x61, 0x6d, -0x6f, 0x6e, 0x64, 0x3a, 0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x6f, -0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0xd83d, 0xdd39, -0x3a, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x62, 0x6c, 0x75, 0x65, 0x5f, -0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x3a, 0x62, 0x6c, 0x75, 0x65, -0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x73, 0x6d, 0x61, 0x6c, 0x6c, -0xd83d, 0xdd36, 0x3a, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x6f, 0x72, 0x61, -0x6e, 0x67, 0x65, 0x5f, 0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x3a, -0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x6c, 0x61, 0x72, 0x67, 0x65, -0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0xd83d, 0xdd37, 0x3a, 0x6c, 0x61, 0x72, -0x67, 0x65, 0x5f, 0x62, 0x6c, 0x75, 0x65, 0x5f, 0x64, 0x69, 0x61, 0x6d, -0x6f, 0x6e, 0x64, 0x3a, 0x62, 0x6c, 0x75, 0x65, 0x64, 0x69, 0x61, 0x6d, -0x6f, 0x6e, 0x64, 0x6c, 0x61, 0x72, 0x67, 0x65, 0xd83d, 0xdd33, 0x3a, 0x77, -0x68, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x5f, -0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x6f, -0x6e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x77, 0x68, 0x69, 0x74, 0x65, -0xd83d, 0xdd32, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x5f, 0x73, 0x71, 0x75, -0x61, 0x72, 0x65, 0x5f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x62, -0x6c, 0x61, 0x63, 0x6b, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x71, -0x75, 0x61, 0x72, 0x65, 0x25aa, 0xfe0f, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, -0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, -0x65, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x73, 0x6d, 0x61, 0x6c, 0x6c, -0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x25ab, 0xfe0f, 0x3a, 0x77, 0x68, 0x69, -0x74, 0x65, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x71, 0x75, -0x61, 0x72, 0x65, 0x3a, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x73, 0x71, 0x75, -0x61, 0x72, 0x65, 0x77, 0x68, 0x69, 0x74, 0x65, 0x25fe, 0xfe0f, 0x3a, 0x62, -0x6c, 0x61, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x5f, -0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, -0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, -0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x25fd, -0xfe0f, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x64, 0x69, -0x75, 0x6d, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x71, 0x75, -0x61, 0x72, 0x65, 0x3a, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x73, 0x6d, -0x61, 0x6c, 0x6c, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x77, 0x68, 0x69, -0x74, 0x65, 0x25fc, 0xfe0f, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x5f, 0x6d, -0x65, 0x64, 0x69, 0x75, 0x6d, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, -0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, -0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x25fb, 0xfe0f, 0x3a, 0x77, 0x68, 0x69, -0x74, 0x65, 0x5f, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x5f, 0x73, 0x71, -0x75, 0x61, 0x72, 0x65, 0x3a, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x73, -0x71, 0x75, 0x61, 0x72, 0x65, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2b1b, 0xfe0f, -0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x61, 0x72, 0x67, 0x65, -0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x3a, 0x62, 0x6c, 0x61, 0x63, -0x6b, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, -0x2b1c, 0xfe0f, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x6c, 0x61, 0x72, -0x67, 0x65, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x3a, 0x6c, 0x61, -0x72, 0x67, 0x65, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x77, 0x68, 0x69, -0x74, 0x65, 0xd83d, 0xdd08, 0x3a, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x65, 0x72, -0x3a, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x65, 0x72, 0xd83d, 0xdd07, 0x3a, 0x6d, -0x75, 0x74, 0x65, 0x3a, 0x6d, 0x75, 0x74, 0x65, 0xd83d, 0xdd09, 0x3a, 0x73, -0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0xd83d, 0xdd0a, -0x3a, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x3a, -0x6c, 0x6f, 0x75, 0x64, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0xd83d, 0xdd14, 0x3a, -0x62, 0x65, 0x6c, 0x6c, 0x3a, 0x62, 0x65, 0x6c, 0x6c, 0xd83d, 0xdd15, 0x3a, -0x6e, 0x6f, 0x5f, 0x62, 0x65, 0x6c, 0x6c, 0x3a, 0x62, 0x65, 0x6c, 0x6c, -0x6e, 0x6f, 0xd83d, 0xdce3, 0x3a, 0x6d, 0x65, 0x67, 0x61, 0x3a, 0x6d, 0x65, -0x67, 0x61, 0xd83d, 0xdce2, 0x3a, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x70, 0x65, -0x61, 0x6b, 0x65, 0x72, 0x3a, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x70, 0x65, -0x61, 0x6b, 0x65, 0x72, 0xd83d, 0xdde8, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x5f, -0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, -0x65, 0x3a, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x6c, 0x65, 0x66, 0x74, -0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0xd83d, 0xdde8, 0x3a, 0x73, 0x70, 0x65, -0x65, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x6c, 0x65, 0x66, -0x74, 0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0xd83d, 0xdc41, 0x200d, 0xd83d, 0xdde8, -0x3a, 0x65, 0x79, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x65, -0x63, 0x68, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x3a, 0x62, 0x75, -0x62, 0x62, 0x6c, 0x65, 0x65, 0x79, 0x65, 0x69, 0x6e, 0x73, 0x70, 0x65, -0x65, 0x63, 0x68, 0xd83d, 0xdcac, 0x3a, 0x73, 0x70, 0x65, 0x65, 0x63, 0x68, -0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x6f, 0x6e, 0x3a, 0x62, 0x61, 0x6c, -0x6c, 0x6f, 0x6f, 0x6e, 0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0xd83d, 0xdcad, -0x3a, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x5f, 0x62, 0x61, 0x6c, -0x6c, 0x6f, 0x6f, 0x6e, 0x3a, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x6f, 0x6e, -0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0xd83d, 0xddef, 0x3a, 0x72, 0x69, -0x67, 0x68, 0x74, 0x5f, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x62, 0x75, -0x62, 0x62, 0x6c, 0x65, 0x3a, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x62, 0x75, -0x62, 0x62, 0x6c, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0xd83d, 0xddef, 0x3a, -0x61, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, -0x61, 0x6e, 0x67, 0x65, 0x72, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2660, 0xfe0f, -0x3a, 0x73, 0x70, 0x61, 0x64, 0x65, 0x73, 0x3a, 0x73, 0x70, 0x61, 0x64, -0x65, 0x73, 0x2663, 0xfe0f, 0x3a, 0x63, 0x6c, 0x75, 0x62, 0x73, 0x3a, 0x63, -0x6c, 0x75, 0x62, 0x73, 0x2665, 0xfe0f, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, -0x73, 0x3a, 0x68, 0x65, 0x61, 0x72, 0x74, 0x73, 0x2666, 0xfe0f, 0x3a, 0x64, -0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x73, 0x3a, 0x64, 0x69, 0x61, 0x6d, -0x6f, 0x6e, 0x64, 0x73, 0xd83c, 0xdccf, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, -0x5f, 0x6a, 0x6f, 0x6b, 0x65, 0x72, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, -0x6a, 0x6f, 0x6b, 0x65, 0x72, 0xd83c, 0xdfb4, 0x3a, 0x66, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x63, -0x61, 0x72, 0x64, 0x73, 0x3a, 0x63, 0x61, 0x72, 0x64, 0x73, 0x66, 0x6c, -0x6f, 0x77, 0x65, 0x72, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0xd83c, -0xdc04, 0xfe0f, 0x3a, 0x6d, 0x61, 0x68, 0x6a, 0x6f, 0x6e, 0x67, 0x3a, 0x6d, -0x61, 0x68, 0x6a, 0x6f, 0x6e, 0x67, 0xd83d, 0xdd50, 0x3a, 0x63, 0x6c, 0x6f, -0x63, 0x6b, 0x31, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0xd83d, 0xdd51, -0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x32, 0x3a, 0x63, 0x6c, 0x6f, 0x63, -0x6b, 0x32, 0xd83d, 0xdd52, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x33, 0x3a, -0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x33, 0xd83d, 0xdd53, 0x3a, 0x63, 0x6c, 0x6f, -0x63, 0x6b, 0x34, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x34, 0xd83d, 0xdd54, -0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x35, 0x3a, 0x63, 0x6c, 0x6f, 0x63, -0x6b, 0x35, 0xd83d, 0xdd55, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x36, 0x3a, -0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x36, 0xd83d, 0xdd56, 0x3a, 0x63, 0x6c, 0x6f, -0x63, 0x6b, 0x37, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x37, 0xd83d, 0xdd57, -0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x38, 0x3a, 0x63, 0x6c, 0x6f, 0x63, -0x6b, 0x38, 0xd83d, 0xdd58, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x39, 0x3a, -0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x39, 0xd83d, 0xdd59, 0x3a, 0x63, 0x6c, 0x6f, -0x63, 0x6b, 0x31, 0x30, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x30, -0xd83d, 0xdd5a, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x31, 0x3a, 0x63, -0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x31, 0xd83d, 0xdd5b, 0x3a, 0x63, 0x6c, 0x6f, -0x63, 0x6b, 0x31, 0x32, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x32, -0xd83d, 0xdd5c, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x33, 0x30, 0x3a, -0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x33, 0x30, 0xd83d, 0xdd5d, 0x3a, 0x63, -0x6c, 0x6f, 0x63, 0x6b, 0x32, 0x33, 0x30, 0x3a, 0x63, 0x6c, 0x6f, 0x63, -0x6b, 0x32, 0x33, 0x30, 0xd83d, 0xdd5e, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, -0x33, 0x33, 0x30, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x33, 0x33, 0x30, -0xd83d, 0xdd5f, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x34, 0x33, 0x30, 0x3a, -0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x34, 0x33, 0x30, 0xd83d, 0xdd60, 0x3a, 0x63, -0x6c, 0x6f, 0x63, 0x6b, 0x35, 0x33, 0x30, 0x3a, 0x63, 0x6c, 0x6f, 0x63, -0x6b, 0x35, 0x33, 0x30, 0xd83d, 0xdd61, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, -0x36, 0x33, 0x30, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x36, 0x33, 0x30, -0xd83d, 0xdd62, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x37, 0x33, 0x30, 0x3a, -0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x37, 0x33, 0x30, 0xd83d, 0xdd63, 0x3a, 0x63, -0x6c, 0x6f, 0x63, 0x6b, 0x38, 0x33, 0x30, 0x3a, 0x63, 0x6c, 0x6f, 0x63, -0x6b, 0x38, 0x33, 0x30, 0xd83d, 0xdd64, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, -0x39, 0x33, 0x30, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x39, 0x33, 0x30, -0xd83d, 0xdd65, 0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x30, 0x33, 0x30, -0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x30, 0x33, 0x30, 0xd83d, 0xdd66, -0x3a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x31, 0x33, 0x30, 0x3a, 0x63, -0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x31, 0x33, 0x30, 0xd83d, 0xdd67, 0x3a, 0x63, -0x6c, 0x6f, 0x63, 0x6b, 0x31, 0x32, 0x33, 0x30, 0x3a, 0x63, 0x6c, 0x6f, -0x63, 0x6b, 0x31, 0x32, 0x33, 0x30, 0xd83c, 0xdff3, 0x3a, 0x77, 0x61, 0x76, -0x69, 0x6e, 0x67, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6c, -0x61, 0x67, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x77, 0x61, 0x76, 0x69, 0x6e, -0x67, 0x77, 0x68, 0x69, 0x74, 0x65, 0xd83c, 0xdff3, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x77, 0x68, 0x69, 0x74, 0x65, 0xd83c, 0xdff4, 0x3a, 0x77, 0x61, 0x76, 0x69, -0x6e, 0x67, 0x5f, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x6c, 0x61, -0x67, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x66, 0x6c, 0x61, 0x67, 0x77, -0x61, 0x76, 0x69, 0x6e, 0x67, 0xd83c, 0xdff4, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdfc1, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, -0x65, 0x72, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x3a, 0x63, 0x68, -0x65, 0x63, 0x6b, 0x65, 0x72, 0x65, 0x64, 0x66, 0x6c, 0x61, 0x67, 0xd83d, -0xdea9, 0x3a, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, -0x5f, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x73, -0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6f, 0x6e, 0x70, 0x6f, 0x73, 0x74, -0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0xd83c, 0xdff3, -0xfe0f, 0x200d, 0xd83c, 0xdf08, 0x3a, 0x67, 0x61, 0x79, 0x5f, 0x70, 0x72, 0x69, -0x64, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x67, 0x61, 0x79, 0x70, 0x72, 0x69, 0x64, 0x65, 0xd83c, 0xdff3, 0xfe0f, 0x200d, -0xd83c, 0xdf08, 0x3a, 0x72, 0x61, 0x69, 0x6e, 0x62, 0x6f, 0x77, 0x5f, 0x66, -0x6c, 0x61, 0x67, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x72, 0x61, 0x69, 0x6e, -0x62, 0x6f, 0x77, 0xd83c, 0xdde6, 0xd83c, 0xddeb, 0x3a, 0x61, 0x66, 0x3a, 0x61, -0x66, 0xd83c, 0xdde6, 0xd83c, 0xddeb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, -0x66, 0x3a, 0x61, 0x66, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xddfd, -0x3a, 0x61, 0x78, 0x3a, 0x61, 0x78, 0xd83c, 0xdde6, 0xd83c, 0xddfd, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x61, 0x78, 0x3a, 0x61, 0x78, 0x66, 0x6c, 0x61, -0x67, 0xd83c, 0xdde6, 0xd83c, 0xddf1, 0x3a, 0x61, 0x6c, 0x3a, 0x61, 0x6c, 0xd83c, -0xdde6, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, 0x3a, -0x61, 0x6c, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde9, 0xd83c, 0xddff, 0x3a, 0x64, -0x7a, 0x3a, 0x64, 0x7a, 0xd83c, 0xdde9, 0xd83c, 0xddff, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x64, 0x7a, 0x3a, 0x64, 0x7a, 0x66, 0x6c, 0x61, 0x67, 0xd83c, -0xdde6, 0xd83c, 0xddf8, 0x3a, 0x61, 0x73, 0x3a, 0x61, 0x73, 0xd83c, 0xdde6, 0xd83c, -0xddf8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x73, 0x3a, 0x61, 0x73, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xdde9, 0x3a, 0x61, 0x64, 0x3a, -0x61, 0x64, 0xd83c, 0xdde6, 0xd83c, 0xdde9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x61, 0x64, 0x3a, 0x61, 0x64, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, -0xddf4, 0x3a, 0x61, 0x6f, 0x3a, 0x61, 0x6f, 0xd83c, 0xdde6, 0xd83c, 0xddf4, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6f, 0x3a, 0x61, 0x6f, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xddee, 0x3a, 0x61, 0x69, 0x3a, 0x61, 0x69, -0xd83c, 0xdde6, 0xd83c, 0xddee, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x69, -0x3a, 0x61, 0x69, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xddf6, 0x3a, -0x61, 0x71, 0x3a, 0x61, 0x71, 0xd83c, 0xdde6, 0xd83c, 0xddf6, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x61, 0x71, 0x3a, 0x61, 0x71, 0x66, 0x6c, 0x61, 0x67, -0xd83c, 0xdde6, 0xd83c, 0xddec, 0x3a, 0x61, 0x67, 0x3a, 0x61, 0x67, 0xd83c, 0xdde6, -0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x67, 0x3a, 0x61, -0x67, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xddf7, 0x3a, 0x61, 0x72, -0x3a, 0x61, 0x72, 0xd83c, 0xdde6, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x61, 0x72, 0x3a, 0x61, 0x72, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, -0xd83c, 0xddf2, 0x3a, 0x61, 0x6d, 0x3a, 0x61, 0x6d, 0xd83c, 0xdde6, 0xd83c, 0xddf2, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6d, 0x3a, 0x61, 0x6d, 0x66, -0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xddfc, 0x3a, 0x61, 0x77, 0x3a, 0x61, -0x77, 0xd83c, 0xdde6, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, -0x77, 0x3a, 0x61, 0x77, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xddfa, -0x3a, 0x68, 0x6d, 0x3a, 0x68, 0x6d, 0xd83c, 0xdde6, 0xd83c, 0xddfa, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x68, 0x6d, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x68, -0x6d, 0xd83c, 0xdde6, 0xd83c, 0xddfa, 0x3a, 0x61, 0x75, 0x3a, 0x61, 0x75, 0xd83c, -0xdde6, 0xd83c, 0xddfa, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x75, 0x3a, -0x61, 0x75, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde6, 0xd83c, 0xddf9, 0x3a, 0x61, -0x74, 0x3a, 0x61, 0x74, 0xd83c, 0xdde6, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x61, 0x74, 0x3a, 0x61, 0x74, 0x66, 0x6c, 0x61, 0x67, 0xd83c, -0xdde6, 0xd83c, 0xddff, 0x3a, 0x61, 0x7a, 0x3a, 0x61, 0x7a, 0xd83c, 0xdde6, 0xd83c, -0xddff, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x7a, 0x3a, 0x61, 0x7a, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddf8, 0x3a, 0x62, 0x73, 0x3a, -0x62, 0x73, 0xd83c, 0xdde7, 0xd83c, 0xddf8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x62, 0x73, 0x3a, 0x62, 0x73, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, -0xdded, 0x3a, 0x62, 0x68, 0x3a, 0x62, 0x68, 0xd83c, 0xdde7, 0xd83c, 0xdded, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x68, 0x3a, 0x62, 0x68, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xdde9, 0x3a, 0x62, 0x64, 0x3a, 0x62, 0x64, -0xd83c, 0xdde7, 0xd83c, 0xdde9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x64, -0x3a, 0x62, 0x64, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xdde7, 0x3a, -0x62, 0x62, 0x3a, 0x62, 0x62, 0xd83c, 0xdde7, 0xd83c, 0xdde7, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x62, 0x62, 0x3a, 0x62, 0x62, 0x66, 0x6c, 0x61, 0x67, -0xd83c, 0xdde7, 0xd83c, 0xddfe, 0x3a, 0x62, 0x79, 0x3a, 0x62, 0x79, 0xd83c, 0xdde7, -0xd83c, 0xddfe, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x79, 0x3a, 0x62, -0x79, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddea, 0x3a, 0x62, 0x65, -0x3a, 0x62, 0x65, 0xd83c, 0xdde7, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x62, 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, -0xd83c, 0xddff, 0x3a, 0x62, 0x7a, 0x3a, 0x62, 0x7a, 0xd83c, 0xdde7, 0xd83c, 0xddff, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x7a, 0x3a, 0x62, 0x7a, 0x66, -0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddef, 0x3a, 0x62, 0x6a, 0x3a, 0x62, -0x6a, 0xd83c, 0xdde7, 0xd83c, 0xddef, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, -0x6a, 0x3a, 0x62, 0x6a, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddf2, -0x3a, 0x62, 0x6d, 0x3a, 0x62, 0x6d, 0xd83c, 0xdde7, 0xd83c, 0xddf2, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x62, 0x6d, 0x3a, 0x62, 0x6d, 0x66, 0x6c, 0x61, -0x67, 0xd83c, 0xdde7, 0xd83c, 0xddf9, 0x3a, 0x62, 0x74, 0x3a, 0x62, 0x74, 0xd83c, -0xdde7, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x74, 0x3a, -0x62, 0x74, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddf4, 0x3a, 0x62, -0x6f, 0x3a, 0x62, 0x6f, 0xd83c, 0xdde7, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x62, 0x6f, 0x3a, 0x62, 0x6f, 0x66, 0x6c, 0x61, 0x67, 0xd83c, -0xdde7, 0xd83c, 0xdde6, 0x3a, 0x62, 0x61, 0x3a, 0x62, 0x61, 0xd83c, 0xdde7, 0xd83c, -0xdde6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x61, 0x3a, 0x62, 0x61, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddfc, 0x3a, 0x62, 0x77, 0x3a, -0x62, 0x77, 0xd83c, 0xdde7, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x62, 0x77, 0x3a, 0x62, 0x77, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, -0xddf7, 0x3a, 0x62, 0x72, 0x3a, 0x62, 0x72, 0xd83c, 0xdde7, 0xd83c, 0xddf7, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x72, 0x3a, 0x62, 0x72, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xddee, 0xd83c, 0xddf4, 0x3a, 0x69, 0x6f, 0x3a, 0x69, 0x6f, -0xd83c, 0xddee, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x69, 0x6f, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x69, 0x6f, 0xd83c, 0xddee, 0xd83c, 0xddf4, 0x3a, -0x64, 0x67, 0x3a, 0x64, 0x67, 0xd83c, 0xddee, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x64, 0x67, 0x3a, 0x64, 0x67, 0x66, 0x6c, 0x61, 0x67, -0xd83c, 0xddfb, 0xd83c, 0xddec, 0x3a, 0x76, 0x67, 0x3a, 0x76, 0x67, 0xd83c, 0xddfb, -0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x76, 0x67, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x76, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddf3, 0x3a, 0x62, 0x6e, -0x3a, 0x62, 0x6e, 0xd83c, 0xdde7, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x62, 0x6e, 0x3a, 0x62, 0x6e, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, -0xd83c, 0xddec, 0x3a, 0x62, 0x67, 0x3a, 0x62, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddec, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x67, 0x3a, 0x62, 0x67, 0x66, -0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddeb, 0x3a, 0x62, 0x66, 0x3a, 0x62, -0x66, 0xd83c, 0xdde7, 0xd83c, 0xddeb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, -0x66, 0x3a, 0x62, 0x66, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddee, -0x3a, 0x62, 0x69, 0x3a, 0x62, 0x69, 0xd83c, 0xdde7, 0xd83c, 0xddee, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x62, 0x69, 0x3a, 0x62, 0x69, 0x66, 0x6c, 0x61, -0x67, 0xd83c, 0xddf0, 0xd83c, 0xdded, 0x3a, 0x6b, 0x68, 0x3a, 0x6b, 0x68, 0xd83c, -0xddf0, 0xd83c, 0xdded, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x68, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x6b, 0x68, 0xd83c, 0xdde8, 0xd83c, 0xddf2, 0x3a, 0x63, -0x6d, 0x3a, 0x63, 0x6d, 0xd83c, 0xdde8, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x63, 0x6d, 0x3a, 0x63, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0xd83c, -0xdde8, 0xd83c, 0xdde6, 0x3a, 0x63, 0x61, 0x3a, 0x63, 0x61, 0xd83c, 0xdde8, 0xd83c, -0xdde6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x61, 0x3a, 0x63, 0x61, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddee, 0xd83c, 0xdde8, 0x3a, 0x69, 0x63, 0x3a, -0x69, 0x63, 0xd83c, 0xddee, 0xd83c, 0xdde8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x69, 0x63, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x69, 0x63, 0xd83c, 0xdde8, 0xd83c, -0xddfb, 0x3a, 0x63, 0x76, 0x3a, 0x63, 0x76, 0xd83c, 0xdde8, 0xd83c, 0xddfb, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x76, 0x3a, 0x63, 0x76, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xdde7, 0xd83c, 0xddf6, 0x3a, 0x62, 0x71, 0x3a, 0x62, 0x71, -0xd83c, 0xdde7, 0xd83c, 0xddf6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x71, -0x3a, 0x62, 0x71, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddf0, 0xd83c, 0xddfe, 0x3a, -0x6b, 0x79, 0x3a, 0x6b, 0x79, 0xd83c, 0xddf0, 0xd83c, 0xddfe, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x6b, 0x79, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6b, 0x79, -0xd83c, 0xdde8, 0xd83c, 0xddeb, 0x3a, 0x63, 0x66, 0x3a, 0x63, 0x66, 0xd83c, 0xdde8, -0xd83c, 0xddeb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x66, 0x3a, 0x63, -0x66, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddf9, 0xd83c, 0xdde9, 0x3a, 0x74, 0x64, -0x3a, 0x74, 0x64, 0xd83c, 0xddf9, 0xd83c, 0xdde9, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x74, 0x64, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x64, 0xd83c, 0xdde8, -0xd83c, 0xddf1, 0x3a, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x3a, 0x63, 0x68, 0x69, -0x6c, 0x65, 0xd83c, 0xdde8, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x63, 0x6c, 0x3a, 0x63, 0x6c, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, -0xddf3, 0x3a, 0x63, 0x6e, 0x3a, 0x63, 0x6e, 0xd83c, 0xdde8, 0xd83c, 0xddf3, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x6e, 0x3a, 0x63, 0x6e, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xddfd, 0x3a, 0x63, 0x78, 0x3a, 0x63, 0x78, -0xd83c, 0xdde8, 0xd83c, 0xddfd, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x78, -0x3a, 0x63, 0x78, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xdde8, 0x3a, -0x63, 0x63, 0x3a, 0x63, 0x63, 0xd83c, 0xdde8, 0xd83c, 0xdde8, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x63, 0x63, 0x3a, 0x63, 0x63, 0x66, 0x6c, 0x61, 0x67, -0xd83c, 0xdde8, 0xd83c, 0xddf4, 0x3a, 0x63, 0x6f, 0x3a, 0x63, 0x6f, 0xd83c, 0xdde8, -0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x3a, 0x63, -0x6f, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddf0, 0xd83c, 0xddf2, 0x3a, 0x6b, 0x6d, -0x3a, 0x6b, 0x6d, 0xd83c, 0xddf0, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x6b, 0x6d, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6b, 0x6d, 0xd83c, 0xdde8, -0xd83c, 0xddec, 0x3a, 0x63, 0x67, 0x3a, 0x63, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xddec, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x67, 0x3a, 0x63, 0x67, 0x66, -0x6c, 0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xdde9, 0x3a, 0x63, 0x6f, 0x6e, 0x67, -0x6f, 0x3a, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0xd83c, 0xdde8, 0xd83c, 0xdde9, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x64, 0x3a, 0x63, 0x64, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xddf0, 0x3a, 0x63, 0x6b, 0x3a, 0x63, 0x6b, -0xd83c, 0xdde8, 0xd83c, 0xddf0, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x6b, -0x3a, 0x63, 0x6b, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xddf7, 0x3a, -0x63, 0x72, 0x3a, 0x63, 0x72, 0xd83c, 0xdde8, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x63, 0x72, 0x3a, 0x63, 0x72, 0x66, 0x6c, 0x61, 0x67, -0xd83c, 0xdde8, 0xd83c, 0xddee, 0x3a, 0x63, 0x69, 0x3a, 0x63, 0x69, 0xd83c, 0xdde8, -0xd83c, 0xddee, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x69, 0x3a, 0x63, -0x69, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdded, 0xd83c, 0xddf7, 0x3a, 0x68, 0x72, -0x3a, 0x68, 0x72, 0xd83c, 0xdded, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x68, 0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x68, 0x72, 0xd83c, 0xdde8, -0xd83c, 0xddfa, 0x3a, 0x63, 0x75, 0x3a, 0x63, 0x75, 0xd83c, 0xdde8, 0xd83c, 0xddfa, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x75, 0x3a, 0x63, 0x75, 0x66, -0x6c, 0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xddfc, 0x3a, 0x63, 0x77, 0x3a, 0x63, -0x77, 0xd83c, 0xdde8, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, -0x77, 0x3a, 0x63, 0x77, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde8, 0xd83c, 0xddfe, -0x3a, 0x63, 0x79, 0x3a, 0x63, 0x79, 0xd83c, 0xdde8, 0xd83c, 0xddfe, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x63, 0x79, 0x3a, 0x63, 0x79, 0x66, 0x6c, 0x61, -0x67, 0xd83c, 0xdde8, 0xd83c, 0xddff, 0x3a, 0x63, 0x7a, 0x3a, 0x63, 0x7a, 0xd83c, -0xdde8, 0xd83c, 0xddff, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x7a, 0x3a, -0x63, 0x7a, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde9, 0xd83c, 0xddf0, 0x3a, 0x64, -0x6b, 0x3a, 0x64, 0x6b, 0xd83c, 0xdde9, 0xd83c, 0xddf0, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x64, 0x6b, 0x3a, 0x64, 0x6b, 0x66, 0x6c, 0x61, 0x67, 0xd83c, -0xdde9, 0xd83c, 0xddef, 0x3a, 0x64, 0x6a, 0x3a, 0x64, 0x6a, 0xd83c, 0xdde9, 0xd83c, -0xddef, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x64, 0x6a, 0x3a, 0x64, 0x6a, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde9, 0xd83c, 0xddf2, 0x3a, 0x64, 0x6d, 0x3a, -0x64, 0x6d, 0xd83c, 0xdde9, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x64, 0x6d, 0x3a, 0x64, 0x6d, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xdde9, 0xd83c, -0xddf4, 0x3a, 0x64, 0x6f, 0x3a, 0x64, 0x6f, 0xd83c, 0xdde9, 0xd83c, 0xddf4, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x64, 0x6f, 0x3a, 0x64, 0x6f, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xddea, 0xd83c, 0xdde8, 0x3a, 0x65, 0x63, 0x3a, 0x65, 0x63, -0xd83c, 0xddea, 0xd83c, 0xdde8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x65, 0x63, -0x3a, 0x65, 0x63, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddea, 0xd83c, 0xddec, 0x3a, -0x65, 0x67, 0x3a, 0x65, 0x67, 0xd83c, 0xddea, 0xd83c, 0xddec, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x65, 0x67, 0x3a, 0x65, 0x67, 0x66, 0x6c, 0x61, 0x67, -0xd83c, 0xddf8, 0xd83c, 0xddfb, 0x3a, 0x73, 0x76, 0x3a, 0x73, 0x76, 0xd83c, 0xddf8, -0xd83c, 0xddfb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x76, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x73, 0x76, 0xd83c, 0xddec, 0xd83c, 0xddf6, 0x3a, 0x67, 0x71, -0x3a, 0x67, 0x71, 0xd83c, 0xddec, 0xd83c, 0xddf6, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x67, 0x71, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x71, 0xd83c, 0xddea, -0xd83c, 0xddf7, 0x3a, 0x65, 0x72, 0x3a, 0x65, 0x72, 0xd83c, 0xddea, 0xd83c, 0xddf7, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x65, 0x72, 0x3a, 0x65, 0x72, 0x66, -0x6c, 0x61, 0x67, 0xd83c, 0xddea, 0xd83c, 0xddea, 0x3a, 0x65, 0x65, 0x3a, 0x65, -0x65, 0xd83c, 0xddea, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x65, -0x65, 0x3a, 0x65, 0x65, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddea, 0xd83c, 0xddf9, -0x3a, 0x65, 0x74, 0x3a, 0x65, 0x74, 0xd83c, 0xddea, 0xd83c, 0xddf9, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x65, 0x74, 0x3a, 0x65, 0x74, 0x66, 0x6c, 0x61, -0x67, 0xd83c, 0xddea, 0xd83c, 0xddfa, 0x3a, 0x65, 0x75, 0x3a, 0x65, 0x75, 0xd83c, -0xddea, 0xd83c, 0xddfa, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x65, 0x75, 0x3a, -0x65, 0x75, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddeb, 0xd83c, 0xddf0, 0x3a, 0x66, -0x6b, 0x3a, 0x66, 0x6b, 0xd83c, 0xddeb, 0xd83c, 0xddf0, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x66, 0x6b, 0x3a, 0x66, 0x6b, 0x66, 0x6c, 0x61, 0x67, 0xd83c, -0xddeb, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6f, 0x3a, 0x66, 0x6f, 0xd83c, 0xddeb, 0xd83c, -0xddf4, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x66, 0x6f, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x66, 0x6f, 0xd83c, 0xddeb, 0xd83c, 0xddef, 0x3a, 0x66, 0x6a, 0x3a, -0x66, 0x6a, 0xd83c, 0xddeb, 0xd83c, 0xddef, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x66, 0x6a, 0x3a, 0x66, 0x6a, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddeb, 0xd83c, -0xddee, 0x3a, 0x66, 0x69, 0x3a, 0x66, 0x69, 0xd83c, 0xddeb, 0xd83c, 0xddee, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x66, 0x69, 0x3a, 0x66, 0x69, 0x66, 0x6c, -0x61, 0x67, 0xd83c, 0xddeb, 0xd83c, 0xddf7, 0x3a, 0x6d, 0x66, 0x3a, 0x6d, 0x66, -0xd83c, 0xddeb, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x66, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x66, 0xd83c, 0xddeb, 0xd83c, 0xddf7, 0x3a, -0x66, 0x72, 0x3a, 0x66, 0x72, 0xd83c, 0xddeb, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x66, 0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x66, 0x72, -0xd83c, 0xddeb, 0xd83c, 0xddf7, 0x3a, 0x63, 0x70, 0x3a, 0x63, 0x70, 0xd83c, 0xddeb, -0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x63, 0x70, 0x3a, 0x63, -0x70, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddec, 0xd83c, 0xddeb, 0x3a, 0x67, 0x66, -0x3a, 0x67, 0x66, 0xd83c, 0xddec, 0xd83c, 0xddeb, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x67, 0x66, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x66, 0xd83c, 0xddf5, -0xd83c, 0xddeb, 0x3a, 0x70, 0x66, 0x3a, 0x70, 0x66, 0xd83c, 0xddf5, 0xd83c, 0xddeb, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x66, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x70, 0x66, 0xd83c, 0xddf9, 0xd83c, 0xddeb, 0x3a, 0x74, 0x66, 0x3a, 0x74, -0x66, 0xd83c, 0xddf9, 0xd83c, 0xddeb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, -0x66, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x66, 0xd83c, 0xddec, 0xd83c, 0xdde6, -0x3a, 0x67, 0x61, 0x3a, 0x67, 0x61, 0xd83c, 0xddec, 0xd83c, 0xdde6, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x67, 0x61, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, -0x61, 0xd83c, 0xddec, 0xd83c, 0xddf2, 0x3a, 0x67, 0x6d, 0x3a, 0x67, 0x6d, 0xd83c, -0xddec, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x6d, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x67, 0x6d, 0xd83c, 0xddec, 0xd83c, 0xddea, 0x3a, 0x67, -0x65, 0x3a, 0x67, 0x65, 0xd83c, 0xddec, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x67, 0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x65, 0xd83c, -0xdde9, 0xd83c, 0xddea, 0x3a, 0x64, 0x65, 0x3a, 0x64, 0x65, 0xd83c, 0xdde9, 0xd83c, -0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x64, 0x65, 0x3a, 0x64, 0x65, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddec, 0xd83c, 0xdded, 0x3a, 0x67, 0x68, 0x3a, -0x67, 0x68, 0xd83c, 0xddec, 0xd83c, 0xdded, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x67, 0x68, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x68, 0xd83c, 0xddec, 0xd83c, -0xddee, 0x3a, 0x67, 0x69, 0x3a, 0x67, 0x69, 0xd83c, 0xddec, 0xd83c, 0xddee, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x69, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x67, 0x69, 0xd83c, 0xddec, 0xd83c, 0xddf7, 0x3a, 0x67, 0x72, 0x3a, 0x67, 0x72, -0xd83c, 0xddec, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x72, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x72, 0xd83c, 0xddec, 0xd83c, 0xddf1, 0x3a, -0x67, 0x6c, 0x3a, 0x67, 0x6c, 0xd83c, 0xddec, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x67, 0x6c, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x6c, -0xd83c, 0xddec, 0xd83c, 0xdde9, 0x3a, 0x67, 0x64, 0x3a, 0x67, 0x64, 0xd83c, 0xddec, -0xd83c, 0xdde9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x64, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x67, 0x64, 0xd83c, 0xddec, 0xd83c, 0xddf5, 0x3a, 0x67, 0x70, -0x3a, 0x67, 0x70, 0xd83c, 0xddec, 0xd83c, 0xddf5, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x67, 0x70, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x70, 0xd83c, 0xddec, -0xd83c, 0xddfa, 0x3a, 0x67, 0x75, 0x3a, 0x67, 0x75, 0xd83c, 0xddec, 0xd83c, 0xddfa, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x75, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x67, 0x75, 0xd83c, 0xddec, 0xd83c, 0xddf9, 0x3a, 0x67, 0x74, 0x3a, 0x67, -0x74, 0xd83c, 0xddec, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, -0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x74, 0xd83c, 0xddec, 0xd83c, 0xddec, -0x3a, 0x67, 0x67, 0x3a, 0x67, 0x67, 0xd83c, 0xddec, 0xd83c, 0xddec, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x67, 0x67, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, -0x67, 0xd83c, 0xddec, 0xd83c, 0xddf3, 0x3a, 0x67, 0x6e, 0x3a, 0x67, 0x6e, 0xd83c, -0xddec, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x6e, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x67, 0x6e, 0xd83c, 0xddec, 0xd83c, 0xddfc, 0x3a, 0x67, -0x77, 0x3a, 0x67, 0x77, 0xd83c, 0xddec, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x67, 0x77, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, 0x77, 0xd83c, -0xddec, 0xd83c, 0xddfe, 0x3a, 0x67, 0x79, 0x3a, 0x67, 0x79, 0xd83c, 0xddec, 0xd83c, -0xddfe, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x79, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x67, 0x79, 0xd83c, 0xdded, 0xd83c, 0xddf9, 0x3a, 0x68, 0x74, 0x3a, -0x68, 0x74, 0xd83c, 0xdded, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x68, 0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x68, 0x74, 0xd83c, 0xdded, 0xd83c, -0xddf3, 0x3a, 0x68, 0x6e, 0x3a, 0x68, 0x6e, 0xd83c, 0xdded, 0xd83c, 0xddf3, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x68, 0x6e, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x68, 0x6e, 0xd83c, 0xdded, 0xd83c, 0xddf0, 0x3a, 0x68, 0x6b, 0x3a, 0x68, 0x6b, -0xd83c, 0xdded, 0xd83c, 0xddf0, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x68, 0x6b, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x68, 0x6b, 0xd83c, 0xdded, 0xd83c, 0xddfa, 0x3a, -0x68, 0x75, 0x3a, 0x68, 0x75, 0xd83c, 0xdded, 0xd83c, 0xddfa, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x68, 0x75, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x68, 0x75, -0xd83c, 0xddee, 0xd83c, 0xddf8, 0x3a, 0x69, 0x73, 0x3a, 0x69, 0x73, 0xd83c, 0xddee, -0xd83c, 0xddf8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x69, 0x73, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x69, 0x73, 0xd83c, 0xddee, 0xd83c, 0xddf3, 0x3a, 0x69, 0x6e, -0x3a, 0x69, 0x6e, 0xd83c, 0xddee, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x69, 0x6e, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x69, 0x6e, 0xd83c, 0xddee, -0xd83c, 0xdde9, 0x3a, 0x69, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, -0x3a, 0x69, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0xd83c, 0xddee, -0xd83c, 0xdde9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x69, 0x64, 0xd83c, 0xddee, 0xd83c, 0xddf7, 0x3a, 0x69, 0x72, -0x3a, 0x69, 0x72, 0xd83c, 0xddee, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x69, 0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x69, 0x72, 0xd83c, 0xddee, -0xd83c, 0xddf6, 0x3a, 0x69, 0x71, 0x3a, 0x69, 0x71, 0xd83c, 0xddee, 0xd83c, 0xddf6, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x69, 0x71, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x69, 0x71, 0xd83c, 0xddee, 0xd83c, 0xddea, 0x3a, 0x69, 0x65, 0x3a, 0x69, -0x65, 0xd83c, 0xddee, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x69, -0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x69, 0x65, 0xd83c, 0xddee, 0xd83c, 0xddf2, -0x3a, 0x69, 0x6d, 0x3a, 0x69, 0x6d, 0xd83c, 0xddee, 0xd83c, 0xddf2, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x69, 0x6d, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x69, -0x6d, 0xd83c, 0xddee, 0xd83c, 0xddf1, 0x3a, 0x69, 0x6c, 0x3a, 0x69, 0x6c, 0xd83c, -0xddee, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x69, 0x6c, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x69, 0x6c, 0xd83c, 0xddee, 0xd83c, 0xddf9, 0x3a, 0x69, -0x74, 0x3a, 0x69, 0x74, 0xd83c, 0xddee, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x69, 0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x69, 0x74, 0xd83c, -0xddef, 0xd83c, 0xddf2, 0x3a, 0x6a, 0x6d, 0x3a, 0x6a, 0x6d, 0xd83c, 0xddef, 0xd83c, -0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6a, 0x6d, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x6a, 0x6d, 0xd83c, 0xddef, 0xd83c, 0xddf5, 0x3a, 0x6a, 0x70, 0x3a, -0x6a, 0x70, 0xd83c, 0xddef, 0xd83c, 0xddf5, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x6a, 0x70, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6a, 0x70, 0xd83c, 0xdf8c, 0x3a, -0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x61, 0x67, -0x73, 0x3a, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, 0x66, 0x6c, 0x61, -0x67, 0x73, 0xd83c, 0xddef, 0xd83c, 0xddea, 0x3a, 0x6a, 0x65, 0x3a, 0x6a, 0x65, -0xd83c, 0xddef, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6a, 0x65, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6a, 0x65, 0xd83c, 0xddef, 0xd83c, 0xddf4, 0x3a, -0x6a, 0x6f, 0x3a, 0x6a, 0x6f, 0xd83c, 0xddef, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x6a, 0x6f, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6a, 0x6f, -0xd83c, 0xddf0, 0xd83c, 0xddff, 0x3a, 0x6b, 0x7a, 0x3a, 0x6b, 0x7a, 0xd83c, 0xddf0, -0xd83c, 0xddff, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x7a, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x6b, 0x7a, 0xd83c, 0xddf0, 0xd83c, 0xddea, 0x3a, 0x6b, 0x65, -0x3a, 0x6b, 0x65, 0xd83c, 0xddf0, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x6b, 0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6b, 0x65, 0xd83c, 0xddf0, -0xd83c, 0xddee, 0x3a, 0x6b, 0x69, 0x3a, 0x6b, 0x69, 0xd83c, 0xddf0, 0xd83c, 0xddee, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x69, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x6b, 0x69, 0xd83c, 0xddfd, 0xd83c, 0xddf0, 0x3a, 0x78, 0x6b, 0x3a, 0x78, -0x6b, 0xd83c, 0xddfd, 0xd83c, 0xddf0, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x78, -0x6b, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x78, 0x6b, 0xd83c, 0xddf0, 0xd83c, 0xddfc, -0x3a, 0x6b, 0x77, 0x3a, 0x6b, 0x77, 0xd83c, 0xddf0, 0xd83c, 0xddfc, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x77, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6b, -0x77, 0xd83c, 0xddf0, 0xd83c, 0xddec, 0x3a, 0x6b, 0x67, 0x3a, 0x6b, 0x67, 0xd83c, -0xddf0, 0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x67, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x6b, 0x67, 0xd83c, 0xddf1, 0xd83c, 0xdde6, 0x3a, 0x6c, -0x61, 0x3a, 0x6c, 0x61, 0xd83c, 0xddf1, 0xd83c, 0xdde6, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x6c, 0x61, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6c, 0x61, 0xd83c, -0xddf1, 0xd83c, 0xddfb, 0x3a, 0x6c, 0x76, 0x3a, 0x6c, 0x76, 0xd83c, 0xddf1, 0xd83c, -0xddfb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6c, 0x76, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x6c, 0x76, 0xd83c, 0xddf1, 0xd83c, 0xdde7, 0x3a, 0x6c, 0x62, 0x3a, -0x6c, 0x62, 0xd83c, 0xddf1, 0xd83c, 0xdde7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x6c, 0x62, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6c, 0x62, 0xd83c, 0xddf1, 0xd83c, -0xddf8, 0x3a, 0x6c, 0x73, 0x3a, 0x6c, 0x73, 0xd83c, 0xddf1, 0xd83c, 0xddf8, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6c, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x6c, 0x73, 0xd83c, 0xddf1, 0xd83c, 0xddf7, 0x3a, 0x6c, 0x72, 0x3a, 0x6c, 0x72, -0xd83c, 0xddf1, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6c, 0x72, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6c, 0x72, 0xd83c, 0xddf1, 0xd83c, 0xddfe, 0x3a, -0x6c, 0x79, 0x3a, 0x6c, 0x79, 0xd83c, 0xddf1, 0xd83c, 0xddfe, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x6c, 0x79, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6c, 0x79, -0xd83c, 0xddf1, 0xd83c, 0xddee, 0x3a, 0x6c, 0x69, 0x3a, 0x6c, 0x69, 0xd83c, 0xddf1, -0xd83c, 0xddee, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6c, 0x69, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x6c, 0x69, 0xd83c, 0xddf1, 0xd83c, 0xddf9, 0x3a, 0x6c, 0x74, -0x3a, 0x6c, 0x74, 0xd83c, 0xddf1, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x6c, 0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6c, 0x74, 0xd83c, 0xddf1, -0xd83c, 0xddfa, 0x3a, 0x6c, 0x75, 0x3a, 0x6c, 0x75, 0xd83c, 0xddf1, 0xd83c, 0xddfa, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6c, 0x75, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x6c, 0x75, 0xd83c, 0xddf2, 0xd83c, 0xddf4, 0x3a, 0x6d, 0x6f, 0x3a, 0x6d, -0x6f, 0xd83c, 0xddf2, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, -0x6f, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x6f, 0xd83c, 0xddf2, 0xd83c, 0xddf0, -0x3a, 0x6d, 0x6b, 0x3a, 0x6d, 0x6b, 0xd83c, 0xddf2, 0xd83c, 0xddf0, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x6b, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, -0x6b, 0xd83c, 0xddf2, 0xd83c, 0xddec, 0x3a, 0x6d, 0x67, 0x3a, 0x6d, 0x67, 0xd83c, -0xddf2, 0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x67, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x6d, 0x67, 0xd83c, 0xddf2, 0xd83c, 0xddfc, 0x3a, 0x6d, -0x77, 0x3a, 0x6d, 0x77, 0xd83c, 0xddf2, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x6d, 0x77, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x77, 0xd83c, -0xddf2, 0xd83c, 0xddfe, 0x3a, 0x6d, 0x79, 0x3a, 0x6d, 0x79, 0xd83c, 0xddf2, 0xd83c, -0xddfe, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x79, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x6d, 0x79, 0xd83c, 0xddf2, 0xd83c, 0xddfb, 0x3a, 0x6d, 0x76, 0x3a, -0x6d, 0x76, 0xd83c, 0xddf2, 0xd83c, 0xddfb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x6d, 0x76, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x76, 0xd83c, 0xddf2, 0xd83c, -0xddf1, 0x3a, 0x6d, 0x6c, 0x3a, 0x6d, 0x6c, 0xd83c, 0xddf2, 0xd83c, 0xddf1, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x6c, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x6d, 0x6c, 0xd83c, 0xddf2, 0xd83c, 0xddf9, 0x3a, 0x6d, 0x74, 0x3a, 0x6d, 0x74, -0xd83c, 0xddf2, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x74, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x74, 0xd83c, 0xddf2, 0xd83c, 0xdded, 0x3a, -0x6d, 0x68, 0x3a, 0x6d, 0x68, 0xd83c, 0xddf2, 0xd83c, 0xdded, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x6d, 0x68, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x68, -0xd83c, 0xddf2, 0xd83c, 0xddf6, 0x3a, 0x6d, 0x71, 0x3a, 0x6d, 0x71, 0xd83c, 0xddf2, -0xd83c, 0xddf6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x71, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x6d, 0x71, 0xd83c, 0xddf2, 0xd83c, 0xddf7, 0x3a, 0x6d, 0x72, -0x3a, 0x6d, 0x72, 0xd83c, 0xddf2, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x6d, 0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x72, 0xd83c, 0xddf2, -0xd83c, 0xddfa, 0x3a, 0x6d, 0x75, 0x3a, 0x6d, 0x75, 0xd83c, 0xddf2, 0xd83c, 0xddfa, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x75, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x6d, 0x75, 0xd83c, 0xddfe, 0xd83c, 0xddf9, 0x3a, 0x79, 0x74, 0x3a, 0x79, -0x74, 0xd83c, 0xddfe, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x79, -0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x79, 0x74, 0xd83c, 0xddf2, 0xd83c, 0xddfd, -0x3a, 0x6d, 0x78, 0x3a, 0x6d, 0x78, 0xd83c, 0xddf2, 0xd83c, 0xddfd, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x78, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, -0x78, 0xd83c, 0xddeb, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6d, 0x3a, 0x66, 0x6d, 0xd83c, -0xddeb, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x66, 0x6d, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x66, 0x6d, 0xd83c, 0xddf2, 0xd83c, 0xdde9, 0x3a, 0x6d, -0x64, 0x3a, 0x6d, 0x64, 0xd83c, 0xddf2, 0xd83c, 0xdde9, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x6d, 0x64, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x64, 0xd83c, -0xddf2, 0xd83c, 0xdde8, 0x3a, 0x6d, 0x63, 0x3a, 0x6d, 0x63, 0xd83c, 0xddf2, 0xd83c, -0xdde8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x63, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x6d, 0x63, 0xd83c, 0xddf2, 0xd83c, 0xddf3, 0x3a, 0x6d, 0x6e, 0x3a, -0x6d, 0x6e, 0xd83c, 0xddf2, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x6d, 0x6e, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x6e, 0xd83c, 0xddf2, 0xd83c, -0xddea, 0x3a, 0x6d, 0x65, 0x3a, 0x6d, 0x65, 0xd83c, 0xddf2, 0xd83c, 0xddea, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x6d, 0x65, 0xd83c, 0xddf2, 0xd83c, 0xddf8, 0x3a, 0x6d, 0x73, 0x3a, 0x6d, 0x73, -0xd83c, 0xddf2, 0xd83c, 0xddf8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x73, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x73, 0xd83c, 0xddf2, 0xd83c, 0xdde6, 0x3a, -0x6d, 0x61, 0x3a, 0x6d, 0x61, 0xd83c, 0xddf2, 0xd83c, 0xdde6, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x6d, 0x61, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x61, -0xd83c, 0xddf2, 0xd83c, 0xddff, 0x3a, 0x6d, 0x7a, 0x3a, 0x6d, 0x7a, 0xd83c, 0xddf2, -0xd83c, 0xddff, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x7a, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x6d, 0x7a, 0xd83c, 0xddf2, 0xd83c, 0xddf2, 0x3a, 0x6d, 0x6d, -0x3a, 0x6d, 0x6d, 0xd83c, 0xddf2, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x6d, 0x6d, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, 0x6d, 0xd83c, 0xddf3, -0xd83c, 0xdde6, 0x3a, 0x6e, 0x61, 0x3a, 0x6e, 0x61, 0xd83c, 0xddf3, 0xd83c, 0xdde6, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x6e, 0x61, 0xd83c, 0xddf3, 0xd83c, 0xddf7, 0x3a, 0x6e, 0x72, 0x3a, 0x6e, -0x72, 0xd83c, 0xddf3, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6e, -0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6e, 0x72, 0xd83c, 0xddf3, 0xd83c, 0xddf5, -0x3a, 0x6e, 0x70, 0x3a, 0x6e, 0x70, 0xd83c, 0xddf3, 0xd83c, 0xddf5, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x6e, 0x70, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6e, -0x70, 0xd83c, 0xddf3, 0xd83c, 0xddf1, 0x3a, 0x6e, 0x6c, 0x3a, 0x6e, 0x6c, 0xd83c, -0xddf3, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6e, 0x6c, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x6e, 0x6c, 0xd83c, 0xddf3, 0xd83c, 0xdde8, 0x3a, 0x6e, -0x63, 0x3a, 0x6e, 0x63, 0xd83c, 0xddf3, 0xd83c, 0xdde8, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x6e, 0x63, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6e, 0x63, 0xd83c, -0xddf3, 0xd83c, 0xddff, 0x3a, 0x6e, 0x7a, 0x3a, 0x6e, 0x7a, 0xd83c, 0xddf3, 0xd83c, -0xddff, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6e, 0x7a, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x6e, 0x7a, 0xd83c, 0xddf3, 0xd83c, 0xddee, 0x3a, 0x6e, 0x69, 0x3a, -0x6e, 0x69, 0xd83c, 0xddf3, 0xd83c, 0xddee, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x6e, 0x69, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6e, 0x69, 0xd83c, 0xddf3, 0xd83c, -0xddea, 0x3a, 0x6e, 0x65, 0x3a, 0x6e, 0x65, 0xd83c, 0xddf3, 0xd83c, 0xddea, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6e, 0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x6e, 0x65, 0xd83c, 0xddf3, 0xd83c, 0xddec, 0x3a, 0x6e, 0x69, 0x67, 0x65, 0x72, -0x69, 0x61, 0x3a, 0x6e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0xd83c, 0xddf3, -0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6e, 0x67, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x6e, 0x67, 0xd83c, 0xddf3, 0xd83c, 0xddfa, 0x3a, 0x6e, 0x75, -0x3a, 0x6e, 0x75, 0xd83c, 0xddf3, 0xd83c, 0xddfa, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x6e, 0x75, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6e, 0x75, 0xd83c, 0xddf3, -0xd83c, 0xddeb, 0x3a, 0x6e, 0x66, 0x3a, 0x6e, 0x66, 0xd83c, 0xddf3, 0xd83c, 0xddeb, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6e, 0x66, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x6e, 0x66, 0xd83c, 0xddf0, 0xd83c, 0xddf5, 0x3a, 0x6b, 0x70, 0x3a, 0x6b, -0x70, 0xd83c, 0xddf0, 0xd83c, 0xddf5, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, -0x70, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6b, 0x70, 0xd83c, 0xddf2, 0xd83c, 0xddf5, -0x3a, 0x6d, 0x70, 0x3a, 0x6d, 0x70, 0xd83c, 0xddf2, 0xd83c, 0xddf5, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x70, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6d, -0x70, 0xd83c, 0xddf3, 0xd83c, 0xddf4, 0x3a, 0x73, 0x6a, 0x3a, 0x73, 0x6a, 0xd83c, -0xddf3, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x6a, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x73, 0x6a, 0xd83c, 0xddf3, 0xd83c, 0xddf4, 0x3a, 0x6e, -0x6f, 0x3a, 0x6e, 0x6f, 0xd83c, 0xddf3, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x6e, 0x6f, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6e, 0x6f, 0xd83c, -0xddf3, 0xd83c, 0xddf4, 0x3a, 0x62, 0x76, 0x3a, 0x62, 0x76, 0xd83c, 0xddf3, 0xd83c, -0xddf4, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x62, 0x76, 0x3a, 0x62, 0x76, -0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddf4, 0xd83c, 0xddf2, 0x3a, 0x6f, 0x6d, 0x3a, -0x6f, 0x6d, 0xd83c, 0xddf4, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x6f, 0x6d, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6f, 0x6d, 0xd83c, 0xddf5, 0xd83c, -0xddf0, 0x3a, 0x70, 0x6b, 0x3a, 0x70, 0x6b, 0xd83c, 0xddf5, 0xd83c, 0xddf0, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x6b, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x70, 0x6b, 0xd83c, 0xddf5, 0xd83c, 0xddfc, 0x3a, 0x70, 0x77, 0x3a, 0x70, 0x77, -0xd83c, 0xddf5, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x77, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x70, 0x77, 0xd83c, 0xddf5, 0xd83c, 0xddf8, 0x3a, -0x70, 0x73, 0x3a, 0x70, 0x73, 0xd83c, 0xddf5, 0xd83c, 0xddf8, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x70, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x70, 0x73, -0xd83c, 0xddf5, 0xd83c, 0xdde6, 0x3a, 0x70, 0x61, 0x3a, 0x70, 0x61, 0xd83c, 0xddf5, -0xd83c, 0xdde6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x61, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x70, 0x61, 0xd83c, 0xddf5, 0xd83c, 0xddec, 0x3a, 0x70, 0x67, -0x3a, 0x70, 0x67, 0xd83c, 0xddf5, 0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x70, 0x67, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x70, 0x67, 0xd83c, 0xddf5, -0xd83c, 0xddfe, 0x3a, 0x70, 0x79, 0x3a, 0x70, 0x79, 0xd83c, 0xddf5, 0xd83c, 0xddfe, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x79, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x70, 0x79, 0xd83c, 0xddf5, 0xd83c, 0xddea, 0x3a, 0x70, 0x65, 0x3a, 0x70, -0x65, 0xd83c, 0xddf5, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, -0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x70, 0x65, 0xd83c, 0xddf5, 0xd83c, 0xdded, -0x3a, 0x70, 0x68, 0x3a, 0x70, 0x68, 0xd83c, 0xddf5, 0xd83c, 0xdded, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x70, 0x68, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x70, -0x68, 0xd83c, 0xddf5, 0xd83c, 0xddf3, 0x3a, 0x70, 0x6e, 0x3a, 0x70, 0x6e, 0xd83c, -0xddf5, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x6e, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x70, 0x6e, 0xd83c, 0xddf5, 0xd83c, 0xddf1, 0x3a, 0x70, -0x6c, 0x3a, 0x70, 0x6c, 0xd83c, 0xddf5, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x70, 0x6c, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x70, 0x6c, 0xd83c, -0xddf5, 0xd83c, 0xddf9, 0x3a, 0x70, 0x74, 0x3a, 0x70, 0x74, 0xd83c, 0xddf5, 0xd83c, -0xddf9, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x74, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x70, 0x74, 0xd83c, 0xddf5, 0xd83c, 0xddf7, 0x3a, 0x70, 0x72, 0x3a, -0x70, 0x72, 0xd83c, 0xddf5, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x70, 0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x70, 0x72, 0xd83c, 0xddf6, 0xd83c, -0xdde6, 0x3a, 0x71, 0x61, 0x3a, 0x71, 0x61, 0xd83c, 0xddf6, 0xd83c, 0xdde6, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x71, 0x61, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x71, 0x61, 0xd83c, 0xddf7, 0xd83c, 0xddea, 0x3a, 0x72, 0x65, 0x3a, 0x72, 0x65, -0xd83c, 0xddf7, 0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x72, 0x65, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x72, 0x65, 0xd83c, 0xddf7, 0xd83c, 0xddf4, 0x3a, -0x72, 0x6f, 0x3a, 0x72, 0x6f, 0xd83c, 0xddf7, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x72, 0x6f, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x72, 0x6f, -0xd83c, 0xddf7, 0xd83c, 0xddfa, 0x3a, 0x72, 0x75, 0x3a, 0x72, 0x75, 0xd83c, 0xddf7, -0xd83c, 0xddfa, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x72, 0x75, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x72, 0x75, 0xd83c, 0xddf7, 0xd83c, 0xddfc, 0x3a, 0x72, 0x77, -0x3a, 0x72, 0x77, 0xd83c, 0xddf7, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x72, 0x77, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x72, 0x77, 0xd83c, 0xddfc, -0xd83c, 0xddf8, 0x3a, 0x77, 0x73, 0x3a, 0x77, 0x73, 0xd83c, 0xddfc, 0xd83c, 0xddf8, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x77, 0x73, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x77, 0x73, 0xd83c, 0xddf8, 0xd83c, 0xddf2, 0x3a, 0x73, 0x6d, 0x3a, 0x73, -0x6d, 0xd83c, 0xddf8, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, -0x6d, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x6d, 0xd83c, 0xddf8, 0xd83c, 0xddf9, -0x3a, 0x73, 0x74, 0x3a, 0x73, 0x74, 0xd83c, 0xddf8, 0xd83c, 0xddf9, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x73, 0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, -0x74, 0xd83c, 0xddf8, 0xd83c, 0xdde6, 0x3a, 0x73, 0x61, 0x75, 0x64, 0x69, 0x3a, -0x73, 0x61, 0x75, 0x64, 0x69, 0xd83c, 0xddf8, 0xd83c, 0xdde6, 0x3a, 0x73, 0x61, -0x75, 0x64, 0x69, 0x61, 0x72, 0x61, 0x62, 0x69, 0x61, 0x3a, 0x73, 0x61, -0x75, 0x64, 0x69, 0x61, 0x72, 0x61, 0x62, 0x69, 0x61, 0xd83c, 0xddf8, 0xd83c, -0xdde6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x61, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x73, 0x61, 0xd83c, 0xddf8, 0xd83c, 0xddf3, 0x3a, 0x73, 0x6e, 0x3a, -0x73, 0x6e, 0xd83c, 0xddf8, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x73, 0x6e, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x6e, 0xd83c, 0xddf7, 0xd83c, -0xddf8, 0x3a, 0x72, 0x73, 0x3a, 0x72, 0x73, 0xd83c, 0xddf7, 0xd83c, 0xddf8, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x72, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x72, 0x73, 0xd83c, 0xddf8, 0xd83c, 0xdde8, 0x3a, 0x73, 0x63, 0x3a, 0x73, 0x63, -0xd83c, 0xddf8, 0xd83c, 0xdde8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x63, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x63, 0xd83c, 0xddf8, 0xd83c, 0xddf1, 0x3a, -0x73, 0x6c, 0x3a, 0x73, 0x6c, 0xd83c, 0xddf8, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x73, 0x6c, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x6c, -0xd83c, 0xddf8, 0xd83c, 0xddec, 0x3a, 0x73, 0x67, 0x3a, 0x73, 0x67, 0xd83c, 0xddf8, -0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x67, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x73, 0x67, 0xd83c, 0xddf8, 0xd83c, 0xddfd, 0x3a, 0x73, 0x78, -0x3a, 0x73, 0x78, 0xd83c, 0xddf8, 0xd83c, 0xddfd, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x73, 0x78, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x78, 0xd83c, 0xddf8, -0xd83c, 0xddf0, 0x3a, 0x73, 0x6b, 0x3a, 0x73, 0x6b, 0xd83c, 0xddf8, 0xd83c, 0xddf0, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x6b, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x73, 0x6b, 0xd83c, 0xddf8, 0xd83c, 0xddee, 0x3a, 0x73, 0x69, 0x3a, 0x73, -0x69, 0xd83c, 0xddf8, 0xd83c, 0xddee, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, -0x69, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x69, 0xd83c, 0xddec, 0xd83c, 0xddf8, -0x3a, 0x67, 0x73, 0x3a, 0x67, 0x73, 0xd83c, 0xddec, 0xd83c, 0xddf8, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x67, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x67, -0x73, 0xd83c, 0xddf8, 0xd83c, 0xdde7, 0x3a, 0x73, 0x62, 0x3a, 0x73, 0x62, 0xd83c, -0xddf8, 0xd83c, 0xdde7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x62, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x73, 0x62, 0xd83c, 0xddf8, 0xd83c, 0xddf4, 0x3a, 0x73, -0x6f, 0x3a, 0x73, 0x6f, 0xd83c, 0xddf8, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x73, 0x6f, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x6f, 0xd83c, -0xddff, 0xd83c, 0xdde6, 0x3a, 0x7a, 0x61, 0x3a, 0x7a, 0x61, 0xd83c, 0xddff, 0xd83c, -0xdde6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x7a, 0x61, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x7a, 0x61, 0xd83c, 0xddf0, 0xd83c, 0xddf7, 0x3a, 0x6b, 0x72, 0x3a, -0x6b, 0x72, 0xd83c, 0xddf0, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x6b, 0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6b, 0x72, 0xd83c, 0xddf8, 0xd83c, -0xddf8, 0x3a, 0x73, 0x73, 0x3a, 0x73, 0x73, 0xd83c, 0xddf8, 0xd83c, 0xddf8, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x73, 0x73, 0xd83c, 0xddea, 0xd83c, 0xddf8, 0x3a, 0x65, 0x73, 0x3a, 0x65, 0x73, -0xd83c, 0xddea, 0xd83c, 0xddf8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x65, 0x73, -0x3a, 0x65, 0x73, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddea, 0xd83c, 0xddf8, 0x3a, -0x65, 0x61, 0x3a, 0x65, 0x61, 0xd83c, 0xddea, 0xd83c, 0xddf8, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x65, 0x61, 0x3a, 0x65, 0x61, 0x66, 0x6c, 0x61, 0x67, -0xd83c, 0xddf1, 0xd83c, 0xddf0, 0x3a, 0x6c, 0x6b, 0x3a, 0x6c, 0x6b, 0xd83c, 0xddf1, -0xd83c, 0xddf0, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6c, 0x6b, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x6c, 0x6b, 0xd83c, 0xdde7, 0xd83c, 0xddf1, 0x3a, 0x62, 0x6c, -0x3a, 0x62, 0x6c, 0xd83c, 0xdde7, 0xd83c, 0xddf1, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x62, 0x6c, 0x3a, 0x62, 0x6c, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddf8, -0xd83c, 0xdded, 0x3a, 0x74, 0x61, 0x3a, 0x74, 0x61, 0xd83c, 0xddf8, 0xd83c, 0xdded, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x61, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x74, 0x61, 0xd83c, 0xddf8, 0xd83c, 0xdded, 0x3a, 0x73, 0x68, 0x3a, 0x73, -0x68, 0xd83c, 0xddf8, 0xd83c, 0xdded, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, -0x68, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x68, 0xd83c, 0xddf8, 0xd83c, 0xdded, -0x3a, 0x61, 0x63, 0x3a, 0x61, 0x63, 0xd83c, 0xddf8, 0xd83c, 0xdded, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x61, 0x63, 0x3a, 0x61, 0x63, 0x66, 0x6c, 0x61, -0x67, 0xd83c, 0xddf0, 0xd83c, 0xddf3, 0x3a, 0x6b, 0x6e, 0x3a, 0x6b, 0x6e, 0xd83c, -0xddf0, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x6e, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x6b, 0x6e, 0xd83c, 0xddf1, 0xd83c, 0xdde8, 0x3a, 0x6c, -0x63, 0x3a, 0x6c, 0x63, 0xd83c, 0xddf1, 0xd83c, 0xdde8, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x6c, 0x63, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x6c, 0x63, 0xd83c, -0xddf5, 0xd83c, 0xddf2, 0x3a, 0x70, 0x6d, 0x3a, 0x70, 0x6d, 0xd83c, 0xddf5, 0xd83c, -0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x70, 0x6d, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x70, 0x6d, 0xd83c, 0xddfb, 0xd83c, 0xdde8, 0x3a, 0x76, 0x63, 0x3a, -0x76, 0x63, 0xd83c, 0xddfb, 0xd83c, 0xdde8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x76, 0x63, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x76, 0x63, 0xd83c, 0xddf8, 0xd83c, -0xdde9, 0x3a, 0x73, 0x64, 0x3a, 0x73, 0x64, 0xd83c, 0xddf8, 0xd83c, 0xdde9, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x64, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x73, 0x64, 0xd83c, 0xddf8, 0xd83c, 0xddf7, 0x3a, 0x73, 0x72, 0x3a, 0x73, 0x72, -0xd83c, 0xddf8, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x72, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x72, 0xd83c, 0xddf8, 0xd83c, 0xddff, 0x3a, -0x73, 0x7a, 0x3a, 0x73, 0x7a, 0xd83c, 0xddf8, 0xd83c, 0xddff, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x73, 0x7a, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x7a, -0xd83c, 0xddf8, 0xd83c, 0xddea, 0x3a, 0x73, 0x65, 0x3a, 0x73, 0x65, 0xd83c, 0xddf8, -0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x65, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x73, 0x65, 0xd83c, 0xdde8, 0xd83c, 0xdded, 0x3a, 0x63, 0x68, -0x3a, 0x63, 0x68, 0xd83c, 0xdde8, 0xd83c, 0xdded, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x63, 0x68, 0x3a, 0x63, 0x68, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddf8, -0xd83c, 0xddfe, 0x3a, 0x73, 0x79, 0x3a, 0x73, 0x79, 0xd83c, 0xddf8, 0xd83c, 0xddfe, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x79, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x73, 0x79, 0xd83c, 0xddf9, 0xd83c, 0xddfc, 0x3a, 0x74, 0x77, 0x3a, 0x74, -0x77, 0xd83c, 0xddf9, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, -0x77, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x77, 0xd83c, 0xddf9, 0xd83c, 0xddef, -0x3a, 0x74, 0x6a, 0x3a, 0x74, 0x6a, 0xd83c, 0xddf9, 0xd83c, 0xddef, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x74, 0x6a, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, -0x6a, 0xd83c, 0xddf9, 0xd83c, 0xddff, 0x3a, 0x74, 0x7a, 0x3a, 0x74, 0x7a, 0xd83c, -0xddf9, 0xd83c, 0xddff, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x7a, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x74, 0x7a, 0xd83c, 0xddf9, 0xd83c, 0xdded, 0x3a, 0x74, -0x68, 0x3a, 0x74, 0x68, 0xd83c, 0xddf9, 0xd83c, 0xdded, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x74, 0x68, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x68, 0xd83c, -0xddf9, 0xd83c, 0xddf1, 0x3a, 0x74, 0x6c, 0x3a, 0x74, 0x6c, 0xd83c, 0xddf9, 0xd83c, -0xddf1, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x6c, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x74, 0x6c, 0xd83c, 0xddf9, 0xd83c, 0xddec, 0x3a, 0x74, 0x67, 0x3a, -0x74, 0x67, 0xd83c, 0xddf9, 0xd83c, 0xddec, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x74, 0x67, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x67, 0xd83c, 0xddf9, 0xd83c, -0xddf0, 0x3a, 0x74, 0x6b, 0x3a, 0x74, 0x6b, 0xd83c, 0xddf9, 0xd83c, 0xddf0, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x6b, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x74, 0x6b, 0xd83c, 0xddf9, 0xd83c, 0xddf4, 0x3a, 0x74, 0x6f, 0x3a, 0x74, 0x6f, -0xd83c, 0xddf9, 0xd83c, 0xddf4, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x6f, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x6f, 0xd83c, 0xddf9, 0xd83c, 0xddf9, 0x3a, -0x74, 0x74, 0x3a, 0x74, 0x74, 0xd83c, 0xddf9, 0xd83c, 0xddf9, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x74, 0x74, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x74, -0xd83c, 0xddf9, 0xd83c, 0xddf3, 0x3a, 0x74, 0x6e, 0x3a, 0x74, 0x6e, 0xd83c, 0xddf9, -0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x6e, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x74, 0x6e, 0xd83c, 0xddf9, 0xd83c, 0xddf7, 0x3a, 0x74, 0x72, -0x3a, 0x74, 0x72, 0xd83c, 0xddf9, 0xd83c, 0xddf7, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x74, 0x72, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x72, 0xd83c, 0xddf9, -0xd83c, 0xddf2, 0x3a, 0x74, 0x75, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x69, 0x73, -0x74, 0x61, 0x6e, 0x3a, 0x74, 0x75, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x69, -0x73, 0x74, 0x61, 0x6e, 0xd83c, 0xddf9, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x74, 0x6d, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x74, 0x6d, 0xd83c, -0xddf9, 0xd83c, 0xdde8, 0x3a, 0x74, 0x63, 0x3a, 0x74, 0x63, 0xd83c, 0xddf9, 0xd83c, -0xdde8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x63, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x74, 0x63, 0xd83c, 0xddf9, 0xd83c, 0xddfb, 0x3a, 0x74, 0x75, 0x76, -0x61, 0x6c, 0x75, 0x3a, 0x74, 0x75, 0x76, 0x61, 0x6c, 0x75, 0xd83c, 0xddf9, -0xd83c, 0xddfb, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x74, 0x76, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x74, 0x76, 0xd83c, 0xddfb, 0xd83c, 0xddee, 0x3a, 0x76, 0x69, -0x3a, 0x76, 0x69, 0xd83c, 0xddfb, 0xd83c, 0xddee, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x76, 0x69, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x76, 0x69, 0xd83c, 0xddfa, -0xd83c, 0xddec, 0x3a, 0x75, 0x67, 0x3a, 0x75, 0x67, 0xd83c, 0xddfa, 0xd83c, 0xddec, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x75, 0x67, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x75, 0x67, 0xd83c, 0xddfa, 0xd83c, 0xdde6, 0x3a, 0x75, 0x61, 0x3a, 0x75, -0x61, 0xd83c, 0xddfa, 0xd83c, 0xdde6, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x75, -0x61, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x75, 0x61, 0xd83c, 0xdde6, 0xd83c, 0xddea, -0x3a, 0x61, 0x65, 0x3a, 0x61, 0x65, 0xd83c, 0xdde6, 0xd83c, 0xddea, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x61, 0x65, 0x3a, 0x61, 0x65, 0x66, 0x6c, 0x61, -0x67, 0xd83c, 0xddec, 0xd83c, 0xdde7, 0x3a, 0x67, 0x62, 0x3a, 0x67, 0x62, 0xd83c, -0xddec, 0xd83c, 0xdde7, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x67, 0x62, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x67, 0x62, 0xd83c, 0xddfa, 0xd83c, 0xddf8, 0x3a, 0x75, -0x73, 0x3a, 0x75, 0x73, 0xd83c, 0xddfa, 0xd83c, 0xddf8, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x75, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x75, 0x73, 0xd83c, -0xddfa, 0xd83c, 0xddf8, 0x3a, 0x75, 0x6d, 0x3a, 0x75, 0x6d, 0xd83c, 0xddfa, 0xd83c, -0xddf8, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x75, 0x6d, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x75, 0x6d, 0xd83c, 0xddfa, 0xd83c, 0xddfe, 0x3a, 0x75, 0x79, 0x3a, -0x75, 0x79, 0xd83c, 0xddfa, 0xd83c, 0xddfe, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, -0x75, 0x79, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x75, 0x79, 0xd83c, 0xddfa, 0xd83c, -0xddff, 0x3a, 0x75, 0x7a, 0x3a, 0x75, 0x7a, 0xd83c, 0xddfa, 0xd83c, 0xddff, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x5f, 0x75, 0x7a, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x75, 0x7a, 0xd83c, 0xddfb, 0xd83c, 0xddfa, 0x3a, 0x76, 0x75, 0x3a, 0x76, 0x75, -0xd83c, 0xddfb, 0xd83c, 0xddfa, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x76, 0x75, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x76, 0x75, 0xd83c, 0xddfb, 0xd83c, 0xdde6, 0x3a, -0x76, 0x61, 0x3a, 0x76, 0x61, 0xd83c, 0xddfb, 0xd83c, 0xdde6, 0x3a, 0x66, 0x6c, -0x61, 0x67, 0x5f, 0x76, 0x61, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x76, 0x61, -0xd83c, 0xddfb, 0xd83c, 0xddea, 0x3a, 0x76, 0x65, 0x3a, 0x76, 0x65, 0xd83c, 0xddfb, -0xd83c, 0xddea, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x76, 0x65, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x76, 0x65, 0xd83c, 0xddfb, 0xd83c, 0xddf3, 0x3a, 0x76, 0x6e, -0x3a, 0x76, 0x6e, 0xd83c, 0xddfb, 0xd83c, 0xddf3, 0x3a, 0x66, 0x6c, 0x61, 0x67, -0x5f, 0x76, 0x6e, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x76, 0x6e, 0xd83c, 0xddfc, -0xd83c, 0xddeb, 0x3a, 0x77, 0x66, 0x3a, 0x77, 0x66, 0xd83c, 0xddfc, 0xd83c, 0xddeb, -0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x77, 0x66, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x77, 0x66, 0xd83c, 0xddea, 0xd83c, 0xdded, 0x3a, 0x65, 0x68, 0x3a, 0x65, -0x68, 0xd83c, 0xddea, 0xd83c, 0xdded, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x65, -0x68, 0x3a, 0x65, 0x68, 0x66, 0x6c, 0x61, 0x67, 0xd83c, 0xddfe, 0xd83c, 0xddea, -0x3a, 0x79, 0x65, 0x3a, 0x79, 0x65, 0xd83c, 0xddfe, 0xd83c, 0xddea, 0x3a, 0x66, -0x6c, 0x61, 0x67, 0x5f, 0x79, 0x65, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x79, -0x65, 0xd83c, 0xddff, 0xd83c, 0xddf2, 0x3a, 0x7a, 0x6d, 0x3a, 0x7a, 0x6d, 0xd83c, -0xddff, 0xd83c, 0xddf2, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x7a, 0x6d, 0x3a, -0x66, 0x6c, 0x61, 0x67, 0x7a, 0x6d, 0xd83c, 0xddff, 0xd83c, 0xddfc, 0x3a, 0x7a, -0x77, 0x3a, 0x7a, 0x77, 0xd83c, 0xddff, 0xd83c, 0xddfc, 0x3a, 0x66, 0x6c, 0x61, -0x67, 0x5f, 0x7a, 0x77, 0x3a, 0x66, 0x6c, 0x61, 0x67, 0x7a, 0x77 }; - -const small ReplacementWordLengths[] = { -8, 6, 5, 4, 9, 8, 5, 5, 3, 5, 8, 2, -7, 3, 4, 7, 5, 8, 4, 8, 7, 6, 5, 4, -4, 6, 4, 6, 4, 8, 4, 5, 5, 7, 7, 4, -7, 7, 6, 4, 7, 3, 3, 3, 5, 6, 7, 6, -4, 3, 5, 6, 3, 5, 6, 4, 5, 5, 5, 5, -4, 7, 7, 4, 4, 4, 10, 5, 4, 5, 6, 4, -3, 4, 6, 5, 8, 12, 7, 7, 8, 4, 8, 8, -5, 6, 4, 8, 5, 9, 9, 10, 4, 5, 5, 7, -5, 4, 5, 2, 4, 7, 14, 6, 8, 9, 5, 4, -10, 5, 4, 7, 6, 7, 4, 5, 3, 12, 8, 5, -8, 4, 3, 5, 6, 8, 4, 4, 7, 4, 4, 7, -3, 4, 8, 8, 4, 4, 5, 9, 4, 5, 6, 5, -6, 4, 4, 9, 6, 4, 8, 4, 4, 11, 4, 4, -11, 7, 4, 4, 4, 7, 4, 3, 7, 3, 8, 4, -6, 8, 3, 6, 4, 4, 5, 8, 5, 3, 10, 5, -10, 5, 5, 7, 5, 4, 5, 5, 4, 7, 1, 3, -6, 3, 5, 3, 3, 3, 4, 5, 3, 5, 3, 7, -3, 6, 3, 6, 4, 3, 7, 5, 4, 5, 6, 4, -4, 5, 7, 9, 4, 7, 2, 8, 7, 9, 2, 10, -5, 4, 4, 4, 6, 4, 4, 4, 5, 6, 4, 5, -3, 7, 6, 4, 5, 6, 4, 7, 7, 1, 5, 2, -4, 3, 5, 4, 2, 4, 5, 5, 5, 1, 5, 2, -4, 5, 5, 2, 4, 6, 4, 4, 2, 4, 4, 2, -6, 7, 4, 6, 7, 4, 4, 7, 3, 7, 7, 4, -6, 4, 6, 4, 4, 6, 4, 4, 4, 2, 4, 2, -6, 8, 6, 4, 6, 8, 4, 6, 6, 4, 7, 6, -4, 4, 4, 8, 4, 4, 6, 3, 4, 10, 3, 4, -4, 2, 10, 8, 4, 8, 4, 2, 10, 5, 2, 10, -4, 3, 4, 3, 5, 5, 6, 5, 5, 6, 3, 5, -4, 6, 4, 5, 6, 6, 3, 5, 7, 5, 5, 3, -3, 3, 2, 4, 3, 7, 3, 4, 6, 7, 5, 3, -6, 7, 3, 6, 4, 6, 6, 7, 7, 6, 5, 3, -7, 6, 3, 7, 6, 12, 5, 6, 12, 3, 6, 12, -6, 5, 5, 5, 3, 9, 5, 9, 5, 9, 3, 2, -6, 3, 3, 9, 6, 5, 6, 6, 3, 6, 6, 5, -6, 3, 4, 5, 4, 3, 7, 5, 3, 7, 6, 5, -3, 6, 7, 5, 3, 7, 7, 5, 6, 7, 3, 6, -12, 5, 3, 12, 6, 5, 6, 3, 6, 6, 8, 5, -3, 8, 9, 5, 3, 9, 6, 5, 6, 3, 11, 5, -11, 3, 5, 5, 3, 5, 9, 5, 9, 3, 5, 5, -5, 3, 9, 6, 5, 3, 5, 8, 6, 5, 4, 4, -2, 3, 6, 5, 9, 5, 8, 5, 6, 5, 6, 3, -3, 6, 6, 4, 7, 5, 4, 11, 6, 4, 6, 7, -4, 3, 7, 9, 2, 5, 4, 2, 9, 2, 6, 9, -3, 2, 9, 2, 5, 2, 5, 9, 2, 6, 9, 3, -2, 4, 7, 5, 4, 7, 4, 6, 7, 4, 3, 7, -11, 5, 11, 3, 8, 4, 4, 11, 6, 9, 5, 5, -6, 9, 3, 9, 7, 5, 4, 6, 7, 4, 6, 7, -3, 7, 8, 5, 8, 6, 8, 3, 7, 7, 5, 7, -7, 7, 6, 7, 7, 3, 4, 7, 7, 5, 7, 7, -7, 6, 4, 7, 3, 7, 8, 2, 10, 3, 4, 6, -6, 4, 7, 3, 5, 4, 8, 4, 5, 7, 5, 4, -8, 6, 4, 5, 4, 3, 8, 4, 7, 5, 3, 7, -7, 6, 7, 7, 5, 3, 7, 6, 6, 7, 6, 5, -7, 3, 5, 5, 7, 3, 3, 6, 5, 4, 6, 5, -3, 4, 5, 6, 5, 4, 2, 6, 2, 6, 5, 2, -4, 6, 2, 10, 4, 3, 5, 10, 2, 4, 2, 10, -2, 4, 2, 6, 3, 6, 3, 5, 6, 3, 6, 4, -6, 4, 6, 4, 6, 3, 6, 3, 6, 4, 6, 4, -6, 4, 6, 3, 6, 3, 6, 4, 6, 4, 6, 4, -3, 6, 5, 6, 4, 5, 3, 6, 4, 5, 3, 3, -6, 5, 6, 4, 4, 5, 3, 6, 3, 6, 4, 3, -3, 6, 4, 3, 3, 3, 6, 3, 6, 4, 4, 3, -7, 6, 5, 5, 7, 5, 6, 6, 4, 4, 6, 4, -4, 4, 8, 4, 3, 6, 6, 5, 6, 5, 5, 6, -5, 4, 5, 6, 4, 7, 6, 5, 5, 7, 9, 10, -4, 10, 6, 8, 9, 3, 3, 5, 7, 6, 4, 3, -3, 4, 4, 5, 5, 5, 4, 4, 4, 3, 3, 4, -3, 4, 4, 6, 4, 2, 3, 4, 4, 2, 4, 2, -5, 6, 7, 7, 4, 4, 5, 5, 8, 5, 7, 4, -5, 3, 3, 4, 4, 5, 4, 7, 7, 3, 3, 9, -5, 5, 6, 3, 6, 6, 3, 6, 5, 6, 8, 4, -5, 7, 6, 4, 8, 4, 8, 7, 5, 5, 6, 9, -7, 6, 7, 5, 2, 4, 4, 5, 9, 5, 8, 10, -5, 7, 9, 4, 4, 3, 5, 4, 6, 4, 7, 6, -4, 2, 5, 4, 7, 6, 3, 8, 3, 6, 4, 6, -6, 4, 6, 9, 4, 9, 4, 9, 4, 4, 4, 8, -4, 8, 6, 4, 4, 6, 8, 4, 6, 6, 4, 4, -5, 8, 3, 2, 4, 7, 5, 4, 6, 6, 4, 6, -9, 7, 7, 6, 8, 8, 5, 6, 5, 4, 5, 4, -4, 7, 4, 6, 4, 4, 7, 8, 4, 6, 4, 3, -8, 4, 6, 5, 4, 7, 7, 4, 6, 4, 4, 3, -4, 4, 4, 4, 4, 4, 3, 4, 4, 5, 4, 7, -4, 4, 4, 4, 7, 4, 8, 4, 5, 4, 5, 8, -3, 5, 4, 4, 5, 5, 5, 5, 3, 5, 4, 5, -5, 3, 5, 6, 5, 6, 5, 3, 5, 5, 3, 5, -6, 5, 4, 3, 5, 4, 5, 4, 3, 5, 7, 5, -5, 4, 4, 5, 4, 3, 5, 4, 7, 5, 4, 7, -5, 9, 4, 5, 9, 5, 4, 4, 5, 4, 8, 7, -9, 7, 4, 4, 4, 5, 7, 4, 5, 7, 3, 5, -7, 5, 5, 8, 5, 5, 5, 4, 9, 5, 6, 10, -6, 10, 5, 8, 5, 9, 9, 4, 7, 6, 8, 8, -6, 4, 3, 6, 6, 6, 5, 8, 6, 7, 7, 5, -3, 9, 5, 8, 5, 5, 6, 6, 5, 6, 3, 7, -5, 8, 5, 6, 3, 7, 4, 4, 2, 5, 3, 3, -6, 9, 5, 4, 7, 9, 7, 4, 7, 5, 5, 5, -6, 4, 2, 3, 7, 9, 5, 4, 4, 4, 5, 5, -5, 4, 4, 4, 7, 4, 4, 5, 3, 6, 5, 3, -8, 4, 8, 4, 7, 7, 8, 5, 3, 9, 7, 8, -6, 5, 4, 2, 4, 4, 6, 6, 3, 4, 4, 5, -8, 5, 9, 5, 5, 4, 6, 5, 7, 8, 5, 8, -6, 4, 7, 4, 9, 5, 3, 4, 5, 3, 4, 5, -5, 4, 4, 5, 5, 6, 10, 8, 8, 6, 10, 8, -5, 5, 5, 6, 4, 4, 9, 4, 3, 4, 6, 5, -6, 4, 3, 7, 7, 4, 4, 7, 3, 5, 3, 3, -4, 7, 4, 6, 6, 6, 5, 6, 7, 4, 7, 7, -3, 5, 3, 5, 11, 7, 7, 5, 7, 3, 7, 6, -6, 6, 7, 6, 7, 7, 6, 7, 6, 5, 9, 3, -9, 9, 9, 6, 9, 12, 5, 12, 3, 9, 9, 5, -6, 4, 8, 5, 4, 8, 3, 4, 6, 4, 10, 6, -4, 8, 6, 8, 7, 5, 8, 8, 6, 7, 8, 3, -7, 7, 5, 7, 3, 6, 7, 6, 7, 5, 3, 7, -6, 6, 7, 8, 5, 3, 8, 7, 6, 8, 7, 4, -5, 5, 3, 7, 4, 5, 4, 5, 6, 7, 4, 5, -4, 6, 5, 4, 3, 6, 7, 4, 6, 6, 5, 6, -6, 5, 6, 3, 9, 6, 6, 6, 8, 5, 6, 3, -8, 9, 8, 6, 8, 6, 7, 4, 5, 4, 5, 6, -5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 6, 5, -6, 5, 5, 5, 5, 5, 6, 7, 8, 6, 6, 9, -7, 7, 6, 4, 8, 5, 8, 3, 7, 8, 8, 6, -4, 10, 3, 7, 10, 10, 7, 5, 8, 7, 4, 10, -4, 4, 9, 7, 6, 6, 3, 4, 4, 7, 4, 5, -7, 4, 3, 3, 4, 4, 3, 3, 10, 3, 6, 3, -4, 3, 6, 9, 6, 4, 7, 5, 11, 5, 7, 7, -4, 9, 5, 7, 10, 6, 10, 5, 8, 3, 8, 6, -3, 8, 10, 8, 8, 4, 6, 7, 8, 8, 7, 10, -3, 7, 5, 8, 7, 8, 11, 4, 11, 5, 5, 4, -10, 5, 6, 5, 4, 7, 10, 8, 5, 8, 5, 8, -8, 9, 8, 8, 6, 7, 9, 4, 5, 5, 8, 9, -9, 9, 4, 6, 4, 5, 4, 6, 12, 8, 7, 5, -7, 8, 5, 7, 3, 5, 3, 5, 7, 2, 6, 8, -5, 5, 6, 8, 6, 8, 7, 6, 5, 7, 6, 8, -5, 6, 2, 8, 5, 8, 5, 8, 4, 5, 6, 6, -6, 8, 6, 8, 4, 8, 4, 4, 5, 7, 6, 7, -4, 8, 5, 7, 5, 8, 8, 12, 12, 4, 7, 5, -6, 5, 4, 9, 5, 5, 8, 8, 5, 9, 5, 6, -10, 5, 6, 4, 8, 6, 4, 8, 4, 5, 11, 5, -6, 5, 4, 7, 8, 9, 6, 6, 9, 5, 6, 6, -5, 4, 5, 8, 4, 4, 7, 9, 4, 7, 5, 8, -9, 4, 7, 4, 6, 4, 4, 9, 5, 5, 4, 5, -3, 2, 6, 5, 5, 5, 6, 7, 8, 8, 8, 7, -7, 7, 6, 5, 5, 6, 5, 5, 9, 8, 11, 8, -4, 6, 2, 3, 3, 6, 6, 5, 4, 6, 5, 6, -5, 4, 9, 9, 4, 6, 8, 9, 9, 5, 3, 2, -5, 10, 6, 11, 5, 6, 7, 5, 9, 5, 5, 5, -5, 5, 5, 11, 5, 9, 7, 9, 4, 9, 7, 8, -4, 4, 10, 6, 11, 4, 3, 3, 5, 5, 4, 6, -3, 4, 5, 8, 4, 6, 3, 6, 6, 6, 3, 6, -4, 6, 4, 3, 6, 6, 5, 4, 3, 4, 3, 4, -6, 3, 4, 5, 6, 5, 6, 7, 6, 6, 7, 6, -7, 3, 3, 7, 4, 7, 5, 6, 6, 7, 9, 10, -4, 4, 7, 11, 6, 7, 5, 6, 7, 4, 4, 7, -7, 3, 3, 3, 4, 4, 3, 5, 4, 5, 3, 13, -8, 5, 7, 4, 5, 5, 4, 8, 8, 7, 4, 8, -4, 7, 5, 6, 4, 8, 4, 5, 7, 7, 5, 4, -8, 5, 8, 4, 8, 8, 5, 1, 4, 6, 4, 5, -4, 6, 4, 7, 5, 6, 7, 7, 4, 7, 4, 4, -7, 2, 4, 7, 4, 6, 6, 4, 4, 4, 6, 4, -2, 8, 4, 3, 5, 5, 5, 7, 4, 5, 9, 5, -4, 4, 3, 6, 7, 6, 8, 3, 6, 8, 6, 8, -4, 4, 5, 3, 4, 4, 3, 4, 6, 6, 3, 4, -6, 3, 7, 4, 9, 4, 6, 4, 6, 4, 4, 8, -5, 8, 9, 6, 2, 10, 9, 8, 5, 10, 8, 4, -6, 4, 6, 4, 5, 4, 4, 4, 6, 5, 4, 8, -4, 9, 6, 10, 10, 5, 10, 5, 8, 7, 7, 5, -8, 9, 4, 5, 3, 9, 3, 8, 4, 5, 3, 8, -3, 5, 3, 4, 5, 10, 10, 6, 4, 5, 6, 4, -6, 7, 3, 3, 5, 3, 4, 3, 4, 6, 3, 4, -4, 4, 6, 5, 5, 6, 5, 5, 4, 5, 5, 6, -5, 5, 6, 5, 11, 5, 5, 4, 8, 11, 5, 6, -3, 6, 9, 9, 10, 5, 9, 5, 4, 5, 10, 5, -5, 6, 5, 5, 5, 5, 3, 8, 4, 2, 6, 6, -2, 5, 5, 2, 4, 7, 3, 4, 7, 4, 3, 5, -8, 6, 7, 2, 5, 7, 9, 5, 6, 6, 6, 3, -5, 5, 8, 11, 9, 8, 6, 2, 4, 6, 4, 6, -11, 4, 11, 9, 4, 9, 6, 3, 5, 4, 9, 5, -5, 5, 5, 5, 5, 5, 7, 4, 2, 6, 5, 9, -9, 6, 15, 5, 5, 5, 5, 1, 1, 2, 2, 2, -3, 1, 1, 4, 4, 9, 4, 5, 2, 5, 4, 5, -2, 4, 3, 5, 10, 2, 11, 2, 6, 3, 8, 2, -3, 7, 5, 8, 6, 2, 6, 2, 7, 11, 11, 4, -8, 4, 8, 8, 11, 10, 3, 10, 4, 11, 4, 4, -7, 8, 8, 7, 2, 5, 3, 8, 7, 5, 4, 5, -5, 5, 7, 8, 5, 6, 5, 4, 8, 7, 5, 9, -4, 1, 7, 3, 6, 5, 4, 1, 7, 3, 3, 2, -10, 7, 5, 2, 7, 8, 7, 7, 5, 4, 7, 4, -6, 4, 6, 8, 2, 3, 6, 5, 3, 6, 6, 8, -4, 7, 11, 6, 3, 4, 4, 7, 2, 2, 2, 4, -3, 4, 4, 3, 3, 5, 4, 4, 3, 5, 5, 4, -6, 3, 4, 4, 8, 6, 8, 5, 7, 3, 6, 8, -6, 5, 5, 4, 6, 4, 6, 6, 4, 5, 4, 5, -8, 5, 8, 5, 4, 7, 6, 5, 6, 2, 5, 6, -4, 5, 8, 5, 5, 2, 5, 4, 5, 5, 5, 5, -4, 5, 2, 5, 4, 5, 5, 5, 5, 5, 5, 5, -4, 5, 5, 4, 5, 5, 4, 2, 5, 4, 5, 5, -4, 5, 5, 4, 9, 4, 5, 7, 2, 5, 4, 7, -6, 10, 7, 6, 3, 6, 6, 16, 6, 9, 7, 4, -5, 5, 4, 4, 5, 5, 4, 8, 5, 4, 5, 14, -1, 6, 5, 4, 8, 8, 2, 9, 10, 4, 4, 5, -4, 4, 3, 4, 2, 3, 4, 5, 5, 4, 6, 3, -5, 4, 6, 5, 6, 5, 5, 6, 6, 3, 4, 6, -3, 5, 8, 4, 3, 5, 8, 7, 6, 5, 4, 7, -5, 7, 5, 6, 4, 7, 5, 6, 6, 5, 5, 6, -6, 5, 5, 6, 5, 6, 5, 5, 6, 5, 6, 6, -5, 6, 5, 5, 6, 6, 6, 6, 5, 5, 5, 6, -5, 6, 5, 7, 4, 5, 4, 5, 4, 4, 2, 4, -11, 6, 4, 6, 4, 6, 6, 3, 2, 6, 7, 6, -7, 7, 5, 6, 5, 5, 5, 6, 5, 6, 8, 5, -5, 5, 6, 7, 7, 6, 6, 6, 6, 6, 6, 6, -6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, -8, 8, 9, 9, 9, 4, 6, 5, 4, 5, 5, 4, -6, 5, 4, 9, 4, 4, 2, 4, 10, 4, 3, 5, -4, 7, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 4, 2, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -4, 2, 2, 2, 4, 2, 4, 2, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 4, 2, 2, -2, 4, 2, 2, 4, 2, 4, 2, 2, 2, 4, 2, -2, 4, 2, 4, 2, 2, 2, 4, 2, 4, 2, 5, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 4, 2, 2, 2, 4, 5, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 4, 2, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 2, 4, 2, 4, 2, 2, 4, 2, 2, -2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, -2, 4, 2, 4, 2, 2, 2, 4, 2, 2, 4, 2, -4, 2, 2, 4, 2, 2, 2, 4, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 2, 4, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 9, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 7, 5, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 7, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 2, 4, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, -2, 2, 4, 2, 2, 4, 2, 5, 11, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 2, 4, 2, 2, 4, 2, -4, 2, 2, 2, 4, 2, 4, 2, 2, 4, 2, 2, -2, 4, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 2, 4, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 12, 4, 2, 2, 4, 2, 6, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -2, 4, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, -4, 2, 2, 4, 2, 2, 4, 2, 2, 2, 4, 2, -4, 2, 2, 4, 2, 2, 4, 2 }; - -const ReplacementStruct ReplacementInitData[] = { - { small(2), small(10), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(31), small(5) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(23), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(18), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(22), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(5), small(1) }, - { small(2), small(30), small(5) }, - { small(2), small(30), small(5) }, - { small(2), small(18), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(22), small(4) }, - { small(2), small(8), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(14), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(24), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(21), small(3) }, - { small(2), small(11), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(16), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(12), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(23), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(24), small(4) }, - { small(2), small(14), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(23), small(3) }, - { small(2), small(18), small(2) }, - { small(2), small(24), small(4) }, - { small(2), small(14), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(22), small(3) }, - { small(2), small(18), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(16), small(3) }, - { small(2), small(12), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(9), small(2) }, - { small(2), small(16), small(3) }, - { small(2), small(11), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(17), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(18), small(3) }, - { small(2), small(12), small(2) }, - { small(2), small(19), small(3) }, - { small(2), small(43), small(7) }, - { small(2), small(17), small(2) }, - { small(2), small(3), small(1) }, - { small(2), small(19), small(4) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(3) }, - { small(2), small(12), small(2) }, - { small(2), small(10), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(14), small(3) }, - { small(2), small(21), small(4) }, - { small(2), small(34), small(5) }, - { small(2), small(14), small(2) }, - { small(2), small(55), small(9) }, - { small(2), small(8), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(14), small(3) }, - { small(2), small(9), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(43), small(6) }, - { small(2), small(15), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(29), small(4) }, - { small(2), small(15), small(2) }, - { small(2), small(20), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(6), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(5), small(20), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(24), small(4) }, - { small(2), small(21), small(3) }, - { small(2), small(11), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(21), small(5) }, - { small(2), small(22), small(4) }, - { small(5), small(22), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(17), small(3) }, - { small(2), small(23), small(3) }, - { small(5), small(22), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(5), small(1) }, - { small(2), small(16), small(2) }, - { small(5), small(27), small(3) }, - { small(2), small(25), small(3) }, - { small(2), small(21), small(2) }, - { small(5), small(13), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(6), small(17), small(2) }, - { small(3), small(15), small(2) }, - { small(3), small(15), small(3) }, - { small(3), small(5), small(1) }, - { small(3), small(11), small(1) }, - { small(5), small(21), small(3) }, - { small(5), small(19), small(3) }, - { small(5), small(14), small(2) }, - { small(5), small(12), small(2) }, - { small(5), small(12), small(2) }, - { small(5), small(10), small(2) }, - { small(5), small(15), small(2) }, - { small(5), small(13), small(2) }, - { small(5), small(14), small(2) }, - { small(5), small(12), small(2) }, - { small(5), small(15), small(2) }, - { small(5), small(13), small(2) }, - { small(5), small(22), small(3) }, - { small(5), small(20), small(3) }, - { small(5), small(20), small(2) }, - { small(5), small(18), small(2) }, - { small(5), small(21), small(3) }, - { small(5), small(19), small(3) }, - { small(5), small(16), small(2) }, - { small(5), small(14), small(2) }, - { small(5), small(17), small(2) }, - { small(5), small(15), small(2) }, - { small(5), small(14), small(2) }, - { small(5), small(12), small(2) }, - { small(5), small(19), small(2) }, - { small(5), small(17), small(2) }, - { small(5), small(13), small(2) }, - { small(5), small(11), small(2) }, - { small(5), small(17), small(2) }, - { small(5), small(15), small(2) }, - { small(5), small(13), small(2) }, - { small(5), small(11), small(2) }, - { small(2), small(18), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(17), small(3) }, - { small(2), small(15), small(3) }, - { small(2), small(7), small(1) }, - { small(2), small(17), small(2) }, - { small(2), small(16), small(2) }, - { small(5), small(14), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(20), small(3) }, - { small(2), small(25), small(3) }, - { small(2), small(21), small(3) }, - { small(5), small(18), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(9), small(2) }, - { small(2), small(21), small(3) }, - { small(5), small(18), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(10), small(2) }, - { small(2), small(21), small(3) }, - { small(5), small(18), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(21), small(3) }, - { small(5), small(18), small(3) }, - { small(5), small(19), small(2) }, - { small(5), small(17), small(2) }, - { small(5), small(10), small(1) }, - { small(5), small(11), small(2) }, - { small(5), small(20), small(2) }, - { small(5), small(17), small(2) }, - { small(5), small(7), small(1) }, - { small(5), small(18), small(2) }, - { small(5), small(15), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(26), small(4) }, - { small(2), small(16), small(2) }, - { small(5), small(13), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(17), small(2) }, - { small(5), small(14), small(2) }, - { small(2), small(23), small(3) }, - { small(2), small(9), small(1) }, - { small(2), small(24), small(3) }, - { small(5), small(21), small(3) }, - { small(2), small(28), small(4) }, - { small(2), small(9), small(1) }, - { small(2), small(24), small(3) }, - { small(5), small(26), small(4) }, - { small(2), small(33), small(5) }, - { small(2), small(8), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(32), small(5) }, - { small(2), small(9), small(1) }, - { small(2), small(33), small(5) }, - { small(5), small(30), small(5) }, - { small(5), small(15), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(16), small(2) }, - { small(5), small(15), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(25), small(4) }, - { small(2), small(23), small(4) }, - { small(2), small(19), small(3) }, - { small(2), small(29), small(5) }, - { small(8), small(22), small(4) }, - { small(8), small(11), small(2) }, - { small(8), small(22), small(4) }, - { small(8), small(11), small(2) }, - { small(2), small(12), small(1) }, - { small(2), small(16), small(3) }, - { small(11), small(15), small(2) }, - { small(11), small(9), small(2) }, - { small(11), small(15), small(2) }, - { small(11), small(9), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(22), small(4) }, - { small(8), small(12), small(2) }, - { small(11), small(13), small(2) }, - { small(11), small(13), small(2) }, - { small(11), small(13), small(2) }, - { small(8), small(12), small(2) }, - { small(8), small(12), small(2) }, - { small(11), small(13), small(2) }, - { small(11), small(13), small(2) }, - { small(11), small(13), small(2) }, - { small(8), small(12), small(2) }, - { small(8), small(12), small(2) }, - { small(11), small(13), small(2) }, - { small(11), small(13), small(2) }, - { small(11), small(13), small(2) }, - { small(5), small(18), small(3) }, - { small(5), small(19), small(3) }, - { small(8), small(23), small(4) }, - { small(8), small(22), small(4) }, - { small(8), small(24), small(4) }, - { small(5), small(16), small(3) }, - { small(5), small(17), small(3) }, - { small(8), small(21), small(4) }, - { small(8), small(20), small(4) }, - { small(8), small(22), small(4) }, - { small(2), small(16), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(7), small(1) }, - { small(1), small(25), small(4) }, - { small(1), small(19), small(3) }, - { small(2), small(16), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(17), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(13), small(3) }, - { small(2), small(14), small(3) }, - { small(2), small(15), small(3) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(4), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(17), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(3) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(18), small(3) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(3) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(21), small(3) }, - { small(2), small(19), small(3) }, - { small(2), small(22), small(3) }, - { small(2), small(10), small(2) }, - { small(2), small(22), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(20), small(4) }, - { small(2), small(21), small(4) }, - { small(2), small(15), small(3) }, - { small(2), small(30), small(5) }, - { small(2), small(29), small(5) }, - { small(2), small(15), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(1), small(10), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(28), small(5) }, - { small(2), small(23), small(4) }, - { small(2), small(14), small(2) }, - { small(2), small(24), small(4) }, - { small(2), small(17), small(3) }, - { small(2), small(34), small(6) }, - { small(2), small(22), small(4) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(17), small(3) }, - { small(2), small(12), small(2) }, - { small(1), small(24), small(4) }, - { small(1), small(20), small(3) }, - { small(2), small(22), small(3) }, - { small(2), small(17), small(2) }, - { small(2), small(17), small(3) }, - { small(2), small(12), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(6), small(1) }, - { small(2), small(20), small(3) }, - { small(2), small(15), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(14), small(3) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(19), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(21), small(4) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(3) }, - { small(2), small(6), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(26), small(4) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(16), small(3) }, - { small(2), small(27), small(5) }, - { small(2), small(18), small(3) }, - { small(2), small(8), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(18), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(15), small(3) }, - { small(2), small(23), small(4) }, - { small(2), small(15), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(22), small(3) }, - { small(1), small(11), small(2) }, - { small(2), small(5), small(1) }, - { small(1), small(7), small(1) }, - { small(2), small(13), small(1) }, - { small(6), small(23), small(3) }, - { small(3), small(21), small(3) }, - { small(3), small(15), small(2) }, - { small(3), small(8), small(1) }, - { small(3), small(24), small(3) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(16), small(2) }, - { small(5), small(17), small(2) }, - { small(5), small(15), small(2) }, - { small(5), small(11), small(1) }, - { small(5), small(11), small(1) }, - { small(5), small(18), small(2) }, - { small(5), small(20), small(2) }, - { small(5), small(18), small(2) }, - { small(5), small(11), small(1) }, - { small(5), small(24), small(3) }, - { small(5), small(21), small(3) }, - { small(2), small(19), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(19), small(2) }, - { small(2), small(22), small(3) }, - { small(5), small(24), small(3) }, - { small(5), small(10), small(1) }, - { small(5), small(25), small(3) }, - { small(5), small(22), small(3) }, - { small(6), small(15), small(2) }, - { small(3), small(13), small(2) }, - { small(3), small(8), small(1) }, - { small(3), small(16), small(2) }, - { small(5), small(15), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(16), small(2) }, - { small(5), small(16), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(17), small(2) }, - { small(5), small(26), small(4) }, - { small(5), small(24), small(4) }, - { small(5), small(12), small(2) }, - { small(5), small(27), small(4) }, - { small(5), small(19), small(3) }, - { small(2), small(17), small(3) }, - { small(2), small(9), small(1) }, - { small(2), small(20), small(3) }, - { small(2), small(14), small(2) }, - { small(5), small(14), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(15), small(2) }, - { small(5), small(23), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(20), small(2) }, - { small(2), small(24), small(3) }, - { small(2), small(25), small(4) }, - { small(2), small(14), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(19), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(20), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(19), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(17), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(19), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(13), small(2) }, - { small(5), small(16), small(2) }, - { small(5), small(14), small(2) }, - { small(5), small(9), small(1) }, - { small(5), small(10), small(1) }, - { small(5), small(17), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(18), small(2) }, - { small(2), small(22), small(3) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(9), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(10), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(19), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(19), small(2) }, - { small(2), small(12), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(21), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(21), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(19), small(2) }, - { small(2), small(20), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(18), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(18), small(2) }, - { small(2), small(19), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(18), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(20), small(2) }, - { small(2), small(19), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(19), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(13), small(2) }, - { small(1), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(14), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(24), small(3) }, - { small(2), small(15), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(16), small(2) }, - { small(1), small(20), small(3) }, - { small(1), small(16), small(2) }, - { small(2), small(21), small(3) }, - { small(2), small(7), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(8), small(1) }, - { small(1), small(10), small(1) }, - { small(2), small(22), small(3) }, - { small(2), small(15), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(23), small(2) }, - { small(2), small(19), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(17), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(25), small(3) }, - { small(2), small(17), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(18), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(22), small(3) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(19), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(20), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(1), small(15), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(24), small(3) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(18), small(3) }, - { small(2), small(11), small(2) }, - { small(2), small(17), small(3) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(18), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(20), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(11), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(4), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(14), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(20), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(19), small(2) }, - { small(2), small(13), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(15), small(2) }, - { small(1), small(11), small(1) }, - { small(1), small(13), small(2) }, - { small(1), small(7), small(1) }, - { small(1), small(13), small(2) }, - { small(2), small(19), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(11), small(1) }, - { small(1), small(24), small(3) }, - { small(2), small(11), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(13), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(18), small(3) }, - { small(2), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(1), small(17), small(3) }, - { small(1), small(13), small(2) }, - { small(2), small(19), small(3) }, - { small(2), small(7), small(1) }, - { small(1), small(6), small(1) }, - { small(2), small(14), small(3) }, - { small(2), small(6), small(1) }, - { small(1), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(13), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(9), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(16), small(3) }, - { small(2), small(7), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(24), small(2) }, - { small(2), small(20), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(18), small(2) }, - { small(2), small(15), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(17), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(21), small(3) }, - { small(2), small(19), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(22), small(4) }, - { small(2), small(9), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(16), small(3) }, - { small(2), small(16), small(3) }, - { small(2), small(15), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(26), small(4) }, - { small(2), small(28), small(4) }, - { small(2), small(17), small(3) }, - { small(2), small(16), small(2) }, - { small(2), small(21), small(3) }, - { small(2), small(17), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(15), small(3) }, - { small(2), small(10), small(2) }, - { small(2), small(24), small(4) }, - { small(2), small(12), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(18), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(10), small(1) }, - { small(2), small(21), small(3) }, - { small(2), small(12), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(32), small(4) }, - { small(2), small(8), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(19), small(2) }, - { small(2), small(12), small(1) }, - { small(2), small(18), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(26), small(4) }, - { small(2), small(15), small(2) }, - { small(2), small(25), small(4) }, - { small(2), small(14), small(2) }, - { small(2), small(11), small(2) }, - { small(2), small(23), small(3) }, - { small(2), small(12), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(8), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(19), small(4) }, - { small(2), small(22), small(4) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(39), small(5) }, - { small(2), small(19), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(18), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(17), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(18), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(7), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(11), small(2) }, - { small(2), small(17), small(3) }, - { small(2), small(15), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(9), small(1) }, - { small(2), small(10), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(18), small(3) }, - { small(1), small(11), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(18), small(2) }, - { small(2), small(13), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(11), small(1) }, - { small(2), small(18), small(3) }, - { small(2), small(16), small(2) }, - { small(2), small(7), small(1) }, - { small(3), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(26), small(4) }, - { small(2), small(4), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(21), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(17), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(3), small(3), small(1) }, - { small(3), small(3), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(4), small(1) }, - { small(3), small(4), small(1) }, - { small(2), small(5), small(1) }, - { small(1), small(3), small(1) }, - { small(2), small(3), small(1) }, - { small(2), small(11), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(10), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(15), small(3) }, - { small(2), small(5), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(12), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(15), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(19), small(3) }, - { small(2), small(10), small(1) }, - { small(2), small(18), small(3) }, - { small(2), small(12), small(2) }, - { small(2), small(13), small(1) }, - { small(1), small(18), small(2) }, - { small(1), small(10), small(1) }, - { small(1), small(15), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(1) }, - { small(2), small(16), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(23), small(3) }, - { small(2), small(9), small(1) }, - { small(2), small(19), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(14), small(3) }, - { small(2), small(10), small(1) }, - { small(2), small(9), small(1) }, - { small(1), small(18), small(3) }, - { small(3), small(7), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(23), small(3) }, - { small(1), small(29), small(4) }, - { small(2), small(22), small(3) }, - { small(2), small(33), small(6) }, - { small(2), small(3), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(12), small(1) }, - { small(3), small(9), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(18), small(2) }, - { small(2), small(9), small(1) }, - { small(2), small(15), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(10), small(1) }, - { small(2), small(25), small(5) }, - { small(2), small(8), small(1) }, - { small(2), small(17), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(20), small(2) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(14), small(2) }, - { small(2), small(4), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(3), small(6), small(1) }, - { small(3), small(5), small(1) }, - { small(3), small(5), small(1) }, - { small(3), small(7), small(1) }, - { small(3), small(6), small(1) }, - { small(3), small(6), small(1) }, - { small(3), small(5), small(1) }, - { small(3), small(7), small(1) }, - { small(3), small(7), small(1) }, - { small(3), small(6), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(6), small(1) }, - { small(3), small(6), small(1) }, - { small(3), small(17), small(2) }, - { small(3), small(10), small(1) }, - { small(2), small(15), small(2) }, - { small(1), small(21), small(3) }, - { small(1), small(14), small(2) }, - { small(1), small(12), small(2) }, - { small(1), small(13), small(2) }, - { small(1), small(15), small(2) }, - { small(1), small(12), small(2) }, - { small(1), small(12), small(2) }, - { small(1), small(16), small(2) }, - { small(1), small(16), small(2) }, - { small(1), small(14), small(2) }, - { small(1), small(8), small(1) }, - { small(1), small(17), small(3) }, - { small(1), small(19), small(3) }, - { small(2), small(16), small(2) }, - { small(2), small(16), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(10), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(19), small(3) }, - { small(2), small(19), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(15), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(18), small(3) }, - { small(2), small(27), small(4) }, - { small(2), small(18), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(27), small(3) }, - { small(2), small(8), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(25), small(2) }, - { small(2), small(18), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(7), small(1) }, - { small(1), small(17), small(3) }, - { small(1), small(18), small(3) }, - { small(1), small(21), small(3) }, - { small(2), small(24), small(3) }, - { small(2), small(19), small(3) }, - { small(2), small(19), small(2) }, - { small(1), small(4), small(1) }, - { small(1), small(11), small(1) }, - { small(1), small(12), small(1) }, - { small(1), small(11), small(2) }, - { small(1), small(12), small(2) }, - { small(1), small(6), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(4), small(1) }, - { small(2), small(5), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(18), small(3) }, - { small(2), small(23), small(4) }, - { small(2), small(14), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(14), small(2) }, - { small(2), small(12), small(2) }, - { small(2), small(13), small(2) }, - { small(2), small(20), small(3) }, - { small(2), small(25), small(4) }, - { small(2), small(22), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(22), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(27), small(4) }, - { small(2), small(27), small(4) }, - { small(2), small(21), small(3) }, - { small(2), small(21), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(20), small(3) }, - { small(2), small(9), small(1) }, - { small(2), small(6), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(12), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(9), small(2) }, - { small(2), small(6), small(1) }, - { small(2), small(13), small(1) }, - { small(2), small(20), small(3) }, - { small(2), small(13), small(2) }, - { small(5), small(22), small(4) }, - { small(2), small(16), small(2) }, - { small(2), small(17), small(2) }, - { small(2), small(20), small(3) }, - { small(2), small(13), small(2) }, - { small(2), small(8), small(1) }, - { small(2), small(7), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(13), small(2) }, - { small(2), small(22), small(3) }, - { small(3), small(9), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(8), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(9), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(10), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(11), small(1) }, - { small(2), small(19), small(3) }, - { small(2), small(12), small(2) }, - { small(2), small(19), small(3) }, - { small(2), small(12), small(2) }, - { small(2), small(16), small(2) }, - { small(2), small(25), small(4) }, - { small(6), small(16), small(3) }, - { small(6), small(14), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(7), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(7), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(11), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(2), small(15), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(9), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(7), small(1) }, - { small(4), small(13), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(14), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(8), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, - { small(4), small(4), small(1) }, - { small(4), small(9), small(2) }, -}; - -const medium ReplacementIndices[] = { -131, 135, 1208, 1284, 151, 671, 54, 61, 63, 107, 109, 143, -159, 240, 241, 246, 247, 257, 372, 431, 507, 508, 509, 545, -563, 564, 578, 661, 662, 682, 683, 684, 688, 762, 770, 771, -796, 800, 811, 813, 829, 830, 831, 832, 833, 846, 889, 922, -962, 987, 989, 992, 1006, 1010, 1028, 1031, 1047, 1147, 1158, 1168, -1171, 1172, 1173, 1188, 1195, 1197, 1209, 1226, 1237, 1240, 1244, 1264, -1265, 1266, 1286, 1287, 1288, 1300, 1301, 1302, 1303, 1304, 1305, 1306, -1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, -1319, 1322, 1323, 1379, 1380, 1420, 1421, 1422, 1423, 1424, 1425, 1428, -1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, -1441, 1442, 1443, 1444, 1445, 1448, 1449, 1450, 1451, 1452, 1453, 1850, -1851, 1906, 1907, 11, 94, 95, 155, 156, 159, 182, 183, 184, -185, 189, 190, 191, 192, 255, 260, 261, 262, 263, 304, 308, -310, 311, 336, 351, 353, 354, 356, 358, 359, 366, 370, 375, -383, 395, 412, 413, 419, 421, 425, 426, 427, 430, 444, 452, -491, 498, 504, 505, 531, 537, 539, 554, 568, 592, 593, 594, -599, 603, 612, 622, 624, 633, 639, 645, 649, 650, 658, 665, -667, 674, 679, 683, 685, 686, 710, 711, 712, 713, 714, 735, -736, 738, 740, 741, 742, 743, 744, 745, 746, 747, 785, 790, -791, 803, 810, 820, 821, 849, 865, 866, 867, 881, 886, 888, -895, 901, 922, 932, 933, 968, 970, 992, 996, 1007, 1008, 1009, -1020, 1021, 1022, 1023, 1030, 1034, 1038, 1041, 1065, 1066, 1076, 1077, -1078, 1079, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1108, 1109, 1112, -1129, 1131, 1132, 1176, 1177, 1185, 1196, 1206, 1213, 1222, 1224, 1225, -1231, 1252, 1256, 1289, 1290, 1292, 1293, 1302, 1339, 1344, 1345, 1347, -1349, 1353, 1355, 1356, 1357, 1358, 1360, 1362, 1364, 1370, 1371, 1374, -1376, 1377, 1378, 1379, 1385, 1414, 1415, 1454, 1455, 1456, 1457, 1458, -1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, -1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1488, -1489, 1490, 1491, 1492, 1493, 1494, 1495, 1506, 1507, 1763, 1764, 1844, -1845, 23, 26, 35, 36, 37, 38, 44, 50, 68, 69, 107, -108, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 143, -144, 162, 163, 169, 197, 204, 206, 207, 208, 222, 223, 250, -251, 320, 323, 324, 325, 326, 327, 328, 329, 331, 333, 361, -376, 377, 378, 386, 389, 401, 410, 413, 414, 415, 438, 449, -454, 456, 457, 469, 477, 482, 483, 490, 505, 513, 515, 523, -532, 534, 535, 537, 538, 539, 540, 542, 543, 544, 545, 546, -547, 548, 549, 550, 556, 557, 573, 581, 582, 583, 587, 591, -595, 596, 598, 620, 623, 626, 630, 632, 636, 638, 639, 642, -646, 651, 652, 656, 658, 659, 679, 680, 706, 707, 708, 709, -764, 772, 788, 790, 793, 794, 795, 809, 814, 816, 838, 843, -847, 858, 859, 862, 863, 871, 876, 881, 882, 897, 901, 902, -916, 917, 918, 919, 926, 927, 929, 936, 939, 942, 943, 944, -945, 958, 960, 962, 963, 964, 972, 982, 994, 1000, 1003, 1007, -1028, 1029, 1036, 1041, 1045, 1056, 1063, 1066, 1067, 1068, 1071, 1072, -1073, 1075, 1076, 1077, 1080, 1081, 1084, 1090, 1092, 1115, 1116, 1123, -1140, 1145, 1146, 1147, 1154, 1161, 1167, 1190, 1198, 1228, 1233, 1235, -1238, 1242, 1250, 1251, 1252, 1259, 1266, 1270, 1322, 1323, 1331, 1333, -1336, 1343, 1344, 1346, 1347, 1348, 1349, 1382, 1386, 1388, 1389, 1390, -1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, -1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1416, 1498, 1499, -1500, 1501, 1504, 1505, 1510, 1511, 1514, 1515, 1516, 1517, 1518, 1519, -1520, 1521, 1522, 1523, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, -1534, 1535, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1582, 1583, -1652, 1868, 1869, 15, 16, 41, 64, 70, 71, 72, 133, 152, -213, 214, 217, 265, 305, 306, 307, 309, 365, 385, 388, 416, -445, 455, 456, 467, 472, 473, 480, 481, 485, 524, 555, 560, -561, 605, 628, 641, 657, 709, 777, 778, 783, 784, 832, 868, -875, 888, 891, 918, 929, 930, 938, 940, 974, 977, 998, 999, -1027, 1043, 1068, 1074, 1084, 1085, 1090, 1142, 1149, 1150, 1212, 1230, -1240, 1289, 1300, 1301, 1304, 1308, 1313, 1318, 1328, 1330, 1335, 1351, -1352, 1353, 1354, 1355, 1384, 1426, 1427, 1484, 1485, 1546, 1547, 1548, -1549, 1550, 1551, 1552, 1553, 1596, 1597, 19, 22, 23, 25, 26, -58, 77, 78, 117, 165, 175, 178, 179, 258, 308, 310, 311, -384, 406, 407, 408, 417, 458, 484, 497, 507, 508, 509, 580, -597, 797, 858, 893, 969, 979, 1046, 1047, 1048, 1049, 1050, 1133, -1134, 1185, 1205, 1207, 1218, 1219, 1237, 1281, 1331, 1338, 1376, 1554, -1555, 1556, 1557, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1838, -1839, 1840, 1841, 1928, 1929, 8, 13, 15, 28, 30, 32, 35, -37, 45, 46, 47, 48, 51, 57, 60, 64, 65, 67, 72, -77, 80, 83, 85, 88, 90, 92, 93, 94, 111, 121, 138, -139, 140, 141, 142, 143, 144, 157, 159, 165, 166, 177, 220, -221, 230, 231, 242, 243, 280, 281, 282, 283, 284, 290, 293, -294, 295, 300, 303, 335, 336, 337, 338, 339, 340, 341, 342, -343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, -355, 356, 357, 358, 359, 360, 393, 394, 396, 400, 404, 405, -423, 442, 443, 479, 481, 490, 494, 501, 510, 516, 518, 519, -520, 521, 522, 529, 530, 554, 558, 594, 601, 608, 610, 616, -620, 634, 661, 662, 663, 666, 670, 678, 684, 698, 699, 700, -752, 753, 797, 821, 844, 848, 856, 861, 873, 883, 915, 923, -938, 943, 946, 948, 952, 966, 971, 1004, 1032, 1033, 1039, 1064, -1076, 1080, 1082, 1083, 1110, 1111, 1187, 1230, 1272, 1277, 1278, 1288, -1298, 1386, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1421, 1423, -1425, 1427, 1429, 1431, 1433, 1435, 1437, 1439, 1441, 1443, 1445, 1447, -1449, 1451, 1453, 1455, 1457, 1459, 1461, 1463, 1465, 1467, 1469, 1471, -1473, 1475, 1477, 1479, 1481, 1483, 1485, 1487, 1489, 1491, 1493, 1495, -1497, 1499, 1501, 1503, 1505, 1507, 1509, 1511, 1513, 1515, 1517, 1519, -1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, 1537, 1539, 1541, 1543, -1545, 1547, 1549, 1551, 1553, 1555, 1557, 1559, 1561, 1563, 1565, 1567, -1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1579, 1580, 1581, -1583, 1585, 1587, 1589, 1591, 1593, 1595, 1597, 1599, 1601, 1603, 1605, -1607, 1609, 1611, 1613, 1615, 1617, 1619, 1621, 1623, 1625, 1627, 1629, -1631, 1633, 1635, 1637, 1639, 1641, 1643, 1645, 1647, 1649, 1651, 1652, -1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, -1678, 1680, 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696, 1698, 1700, -1702, 1704, 1706, 1708, 1710, 1712, 1714, 1715, 1716, 1718, 1720, 1722, -1724, 1726, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, -1748, 1750, 1752, 1754, 1756, 1758, 1760, 1762, 1764, 1766, 1768, 1770, -1772, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1790, 1792, 1794, -1796, 1798, 1800, 1802, 1804, 1806, 1809, 1811, 1813, 1815, 1817, 1819, -1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1841, 1843, -1845, 1847, 1849, 1851, 1853, 1855, 1857, 1859, 1861, 1863, 1865, 1867, -1869, 1871, 1873, 1875, 1877, 1879, 1881, 1883, 1885, 1887, 1889, 1891, -1893, 1895, 1897, 1899, 1901, 1903, 1905, 1907, 1909, 1911, 1913, 1915, -1917, 1919, 1921, 1923, 1925, 1927, 1929, 1931, 1933, 1935, 0, 3, -84, 99, 104, 186, 194, 196, 209, 210, 211, 212, 268, 269, -270, 271, 272, 274, 275, 296, 298, 299, 300, 302, 303, 352, -353, 355, 357, 358, 360, 461, 464, 511, 517, 563, 570, 613, -643, 651, 652, 653, 655, 675, 676, 680, 681, 685, 686, 719, -720, 721, 722, 781, 783, 786, 864, 885, 983, 993, 995, 1037, -1093, 1128, 1141, 1160, 1219, 1221, 1239, 1418, 1560, 1561, 1584, 1585, -1590, 1591, 1592, 1593, 1594, 1595, 1598, 1599, 1600, 1601, 1602, 1603, -1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, -1616, 1617, 1618, 1619, 1620, 1621, 1826, 1827, 1908, 1909, 19, 20, -30, 31, 37, 59, 79, 94, 95, 101, 117, 123, 124, 127, -128, 143, 146, 148, 154, 155, 156, 157, 158, 159, 162, 165, -167, 180, 181, 189, 190, 191, 192, 218, 219, 264, 266, 267, -276, 277, 278, 279, 296, 297, 298, 299, 321, 322, 323, 324, -325, 327, 368, 373, 377, 378, 382, 391, 407, 414, 415, 422, -488, 506, 584, 590, 605, 606, 607, 677, 678, 715, 716, 717, -718, 739, 774, 828, 863, 884, 885, 886, 887, 888, 889, 894, -896, 899, 965, 966, 986, 987, 988, 989, 1013, 1061, 1126, 1127, -1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, -1141, 1142, 1210, 1225, 1285, 1315, 1316, 1317, 1318, 1326, 1327, 1328, -1329, 1330, 1343, 1383, 1446, 1447, 1536, 1537, 1622, 1623, 1624, 1625, -1626, 1627, 1628, 1629, 12, 96, 97, 110, 143, 180, 182, 183, -256, 265, 304, 629, 630, 631, 689, 868, 869, 925, 1044, 1048, -1052, 1075, 1084, 1122, 1170, 1188, 1223, 1240, 1258, 1263, 1376, 1482, -1483, 1502, 1503, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, -1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 7, 98, 99, -113, 116, 248, 249, 363, 765, 766, 767, 768, 769, 859, 907, -935, 1385, 1648, 1649, 1650, 1651, 1653, 1654, 1655, 1656, 20, 21, -22, 23, 119, 172, 330, 332, 334, 367, 397, 576, 577, 661, -662, 663, 687, 776, 837, 905, 928, 958, 997, 998, 1024, 1025, -1026, 1123, 1261, 1283, 1286, 1496, 1497, 1508, 1509, 1524, 1525, 1657, -1658, 1659, 1660, 1661, 1662, 1665, 1666, 1667, 1668, 1755, 1756, 1834, -1835, 1852, 1853, 5, 8, 82, 83, 113, 129, 139, 140, 149, -171, 173, 304, 399, 400, 436, 450, 490, 493, 494, 495, 512, -522, 547, 548, 567, 602, 637, 693, 694, 695, 696, 697, 800, -808, 822, 823, 850, 851, 855, 899, 957, 1028, 1044, 1051, 1055, -1091, 1099, 1101, 1108, 1110, 1113, 1115, 1122, 1123, 1124, 1145, 1162, -1164, 1212, 1224, 1230, 1253, 1258, 1306, 1310, 1311, 1312, 1314, 1316, -1336, 1337, 1354, 1355, 1364, 1365, 1369, 1373, 1374, 1375, 1669, 1670, -1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, -1683, 1684, 1685, 1686, 1842, 1843, 1854, 1855, 28, 29, 56, 62, -85, 86, 91, 143, 147, 159, 162, 163, 164, 165, 166, 187, -190, 193, 196, 197, 199, 200, 203, 207, 210, 214, 219, 221, -223, 225, 227, 229, 231, 233, 235, 236, 237, 239, 241, 243, -245, 247, 249, 250, 251, 256, 261, 267, 271, 275, 279, 281, -288, 292, 295, 299, 300, 301, 302, 303, 304, 306, 307, 311, -313, 317, 322, 324, 327, 328, 330, 333, 334, 336, 337, 338, -339, 340, 346, 347, 348, 349, 350, 356, 357, 358, 359, 360, -371, 375, 390, 405, 409, 475, 495, 496, 510, 511, 512, 513, -514, 515, 516, 517, 518, 519, 521, 522, 523, 572, 603, 643, -644, 688, 694, 702, 707, 711, 718, 720, 724, 728, 732, 736, -741, 744, 745, 746, 747, 749, 750, 751, 752, 754, 756, 766, -773, 775, 776, 787, 798, 804, 805, 806, 807, 814, 818, 819, -825, 840, 852, 853, 854, 870, 871, 872, 873, 880, 903, 912, -921, 932, 933, 937, 945, 955, 956, 963, 976, 981, 1012, 1050, -1056, 1057, 1058, 1059, 1117, 1120, 1121, 1133, 1152, 1178, 1179, 1216, -1226, 1233, 1238, 1239, 1241, 1254, 1324, 1327, 1329, 1343, 1360, 1361, -1362, 1363, 1367, 1372, 1387, 1578, 1579, 1687, 1688, 1689, 1690, 1691, -1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, -1704, 1705, 1706, 1707, 1708, 1709, 1710, 1713, 1714, 1717, 1718, 1719, -1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, -1732, 1757, 1758, 32, 33, 56, 57, 88, 169, 176, 268, 269, -270, 271, 364, 403, 406, 407, 408, 514, 518, 675, 909, 920, -922, 992, 1059, 1069, 1070, 1086, 1087, 1088, 1089, 1090, 1112, 1205, -1206, 1207, 1211, 1212, 1213, 1214, 1216, 1217, 1238, 1267, 1271, 1282, -1294, 1295, 1324, 1325, 1371, 1733, 1734, 1735, 1736, 1737, 1738, 1739, -1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, -1752, 1753, 1754, 1761, 1762, 8, 25, 26, 27, 62, 98, 113, -123, 146, 148, 155, 156, 193, 195, 202, 203, 205, 215, 234, -235, 272, 273, 274, 275, 418, 440, 453, 472, 497, 559, 603, -616, 627, 643, 809, 810, 811, 812, 835, 855, 864, 890, 892, -893, 912, 974, 975, 1025, 1053, 1083, 1095, 1133, 1148, 1149, 1150, -1154, 1156, 1157, 1178, 1199, 1202, 1204, 1268, 1274, 1321, 1340, 1352, -1354, 1417, 1765, 1766, 42, 49, 100, 103, 122, 126, 137, 149, -150, 151, 152, 153, 159, 191, 192, 196, 201, 202, 203, 205, -244, 245, 253, 254, 259, 263, 265, 266, 270, 274, 278, 283, -284, 287, 289, 290, 291, 292, 294, 298, 302, 308, 310, 311, -315, 319, 380, 381, 396, 402, 403, 411, 463, 468, 472, 478, -486, 536, 565, 574, 575, 584, 585, 586, 588, 589, 590, 600, -602, 604, 609, 615, 616, 635, 640, 658, 662, 663, 673, 684, -697, 700, 705, 709, 712, 713, 714, 715, 717, 718, 722, 726, -730, 731, 732, 733, 734, 738, 743, 747, 752, 753, 754, 755, -756, 757, 769, 770, 795, 809, 842, 892, 893, 909, 910, 931, -946, 947, 951, 969, 980, 987, 988, 991, 1008, 1014, 1018, 1032, -1033, 1054, 1060, 1061, 1063, 1064, 1069, 1071, 1100, 1101, 1102, 1105, -1106, 1108, 1109, 1110, 1111, 1113, 1114, 1118, 1119, 1122, 1130, 1143, -1144, 1151, 1156, 1169, 1178, 1185, 1211, 1214, 1216, 1226, 1247, 1250, -1258, 1290, 1291, 1296, 1297, 1326, 1386, 1417, 1418, 1586, 1587, 1767, -1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, -1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1856, -1857, 512, 516, 521, 522, 1220, 1221, 1791, 1792, 8, 9, 10, -18, 55, 70, 77, 78, 111, 112, 124, 141, 142, 150, 154, -156, 157, 159, 165, 170, 276, 277, 278, 279, 316, 317, 318, -319, 392, 459, 460, 462, 465, 470, 474, 476, 497, 500, 502, -539, 540, 541, 543, 544, 545, 546, 618, 624, 625, 626, 670, -735, 736, 737, 738, 739, 748, 759, 760, 788, 793, 794, 806, -808, 815, 816, 818, 822, 834, 862, 878, 879, 908, 949, 954, -1040, 1086, 1103, 1104, 1106, 1121, 1136, 1174, 1175, 1232, 1257, 1293, -1299, 1305, 1309, 1310, 1314, 1315, 1319, 1320, 1321, 1334, 1345, 1348, -1350, 1351, 1379, 1380, 1419, 1793, 1794, 1795, 1796, 1797, 1798, 1799, -1800, 1812, 1813, 1, 2, 4, 6, 13, 14, 22, 25, 26, -27, 34, 39, 45, 46, 66, 68, 73, 74, 75, 76, 87, -89, 90, 96, 102, 105, 106, 107, 108, 110, 114, 115, 118, -120, 127, 146, 157, 158, 168, 180, 181, 182, 183, 215, 216, -224, 225, 226, 227, 238, 239, 252, 285, 286, 287, 288, 304, -362, 369, 371, 372, 379, 385, 406, 408, 428, 429, 432, 433, -435, 437, 439, 441, 446, 466, 487, 489, 503, 520, 525, 526, -527, 533, 534, 535, 536, 537, 538, 539, 540, 549, 550, 551, -552, 553, 561, 571, 586, 588, 601, 609, 610, 613, 614, 616, -617, 619, 621, 629, 648, 660, 664, 689, 690, 691, 692, 723, -724, 725, 726, 727, 728, 729, 730, 748, 749, 754, 755, 775, -779, 787, 802, 805, 815, 820, 823, 827, 829, 830, 835, 836, -839, 841, 842, 843, 845, 855, 860, 871, 872, 882, 891, 897, -898, 904, 906, 908, 911, 912, 913, 914, 916, 917, 920, 955, -957, 959, 966, 967, 984, 1000, 1001, 1002, 1015, 1019, 1031, 1034, -1035, 1036, 1062, 1069, 1070, 1071, 1072, 1104, 1107, 1139, 1143, 1147, -1148, 1150, 1151, 1155, 1165, 1166, 1171, 1174, 1176, 1185, 1189, 1200, -1203, 1204, 1207, 1217, 1236, 1237, 1238, 1240, 1249, 1256, 1260, 1262, -1263, 1279, 1280, 1292, 1303, 1304, 1326, 1327, 1328, 1330, 1342, 1350, -1351, 1352, 1353, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, -1365, 1366, 1368, 1369, 1374, 1375, 1376, 1377, 1381, 1558, 1559, 1759, -1760, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1814, 1815, -1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1828, 1829, -1830, 1831, 1836, 1837, 1848, 1849, 1860, 1861, 1862, 1863, 1864, 1865, -1866, 1867, 1870, 1871, 8, 25, 26, 27, 51, 53, 80, 81, -92, 93, 130, 132, 134, 136, 146, 174, 198, 199, 200, 201, -228, 229, 232, 233, 256, 264, 266, 267, 321, 322, 374, 398, -434, 442, 451, 471, 483, 484, 485, 486, 492, 499, 545, 546, -556, 557, 566, 579, 611, 647, 655, 657, 668, 672, 756, 757, -758, 761, 762, 763, 764, 780, 789, 792, 799, 801, 812, 813, -817, 824, 826, 850, 851, 857, 877, 878, 879, 932, 933, 934, -949, 950, 953, 960, 961, 990, 1011, 1016, 1017, 1035, 1042, 1052, -1053, 1065, 1067, 1068, 1103, 1135, 1159, 1229, 1275, 1276, 1283, 1294, -1295, 1296, 1297, 1319, 1332, 1341, 1350, 1351, 1378, 1417, 1512, 1513, -1588, 1589, 1846, 1847, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, -1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, -1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 15, 16, 40, 151, -153, 386, 387, 423, 424, 562, 687, 688, 864, 865, 866, 1004, -1005, 1064, 1067, 1086, 1125, 1180, 1181, 1182, 1183, 1184, 1191, 1192, -1193, 1194, 1215, 1234, 1248, 1269, 1300, 1303, 1307, 1309, 1312, 1313, -1317, 1902, 1903, 1904, 1905, 1910, 1911, 1912, 1913, 1914, 1915, 1916, -1917, 145, 160, 255, 669, 782, 786, 850, 874, 941, 944, 1163, -1179, 1186, 1289, 1486, 1487, 1858, 1859, 1900, 1901, 1918, 1919, 1920, -1921, 1922, 1923, 1924, 1925, 17, 25, 37, 43, 47, 52, 77, -92, 94, 143, 157, 159, 161, 165, 167, 188, 189, 191, 195, -196, 197, 198, 199, 200, 201, 202, 206, 207, 208, 209, 213, -218, 219, 220, 222, 224, 226, 228, 230, 231, 232, 234, 235, -236, 238, 240, 242, 244, 246, 248, 255, 258, 259, 260, 264, -268, 272, 273, 276, 280, 285, 289, 290, 293, 296, 300, 308, -310, 311, 312, 313, 314, 315, 316, 321, 323, 324, 325, 326, -327, 330, 331, 332, 336, 341, 342, 343, 344, 345, 351, 352, -353, 354, 355, 361, 373, 377, 378, 420, 433, 447, 448, 452, -501, 502, 511, 513, 515, 517, 518, 519, 520, 521, 522, 534, -535, 537, 538, 539, 540, 543, 547, 549, 554, 556, 569, 595, -653, 654, 658, 662, 693, 694, 695, 697, 701, 702, 703, 704, -705, 706, 710, 712, 715, 719, 723, 727, 731, 732, 733, 734, -735, 740, 744, 748, 765, 777, 852, 861, 866, 885, 900, 920, -921, 924, 943, 973, 976, 985, 989, 1018, 1032, 1045, 1047, 1058, -1059, 1063, 1067, 1068, 1078, 1090, 1122, 1123, 1149, 1155, 1156, 1187, -1214, 1227, 1233, 1239, 1240, 1245, 1246, 1255, 1316, 1335, 1344, 1346, -1356, 1359, 1361, 1363, 1365, 1412, 1413, 1414, 1801, 1802, 1926, 1927, -1201, 1329, 1663, 1664, 24, 978, 1127, 1153, 1711, 1712, 1930, 1931, -85, 86, 528, 1243, 1273, 1832, 1833, 1932, 1933, 1934, 1935 }; - -struct ReplacementIndexStruct { - utf16char ch; - medium count; -}; - -const internal::checksum ReplacementChecksums[] = { - -0xAE1DAB16U, 0x8F27A2AU, 0x465496D5U, 0x892E9135U, 0xD621DD31U, 0x40D5B583U, 0x23598B8CU, 0x174C4A14U, 0x9739B1DAU, 0xF448853DU, 0xF3DF7DF2U, 0x15D5108FU, -0xE8A0D4E8U, 0x8FBCAF62U, 0x95F9E2A9U, 0x47CEA738U, 0x839E1EBCU, 0xA58AFD2AU, 0xAAA850BDU, 0xBBEE1755U, 0x4F9A8CDDU, 0x77C2915FU, 0x42B9AA72U, 0xABB65511U, -0x984E9DE9U, 0x229620B8U, 0x11744AD7U, 0xDEA4DF8BU, 0x3DDDF327U, 0xC9016AA9U, 0xDD058F8EU, 0x33167FFDU, 0xCF4EB7B4U, 0x5E990F1U, 0xB6610B6U, 0xF3DA224AU, -0xDDF16CC9U, 0x26FBBFD8U, 0xF0D58D6U, 0x9F57820DU, 0xCAEFB5CCU, 0x868C5775U, 0x36F0B13EU, 0xC2104FC3U, 0x635ED438U, 0xFE76A6BFU, 0xAF98DEFEU, 0xC4A1CE0BU, -0x24A144DU, 0xA07F4113U, 0xA1B56E69U, 0x7AC6D4C1U, 0xA6737D27U, 0x3841C7E7U, 0x7BD9C74BU, 0x57960B20U, 0xA3016C3FU, 0x47DE3B8DU, 0x347522B4U, 0x3DD97630U, -0x283C812CU, 0x62FCCC72U, 0x2A8707F7U, 0x4CAAF872U, 0x7DE5251FU, 0xA1CE4738U, 0x65284ADEU, 0x3CAC3D83U, 0xBBB37EE8U, 0xB74B407AU, 0xBB721077U, 0xD5827C60U, -0xE79C25ACU, 0xF3A0B08AU, 0x754CB19FU, 0xC53F5EC8U, 0x2FB36C45U, 0x8A111CA0U, 0x16625752U, 0xC7DA2CAAU, 0x50A359D4U, 0x9E85659AU, 0xA6832DF5U, 0x7F7A32B5U, -0x349608E1U, 0x3CA5EFD1U, 0xBEEDA352U, 0x10FF4E8EU, 0x5A37598EU, 0x92500B16U, 0xD5E5CEF4U, 0xF9ABE6FBU, 0xEF0313FDU, 0x5D682C8AU, 0xD1D48498U, 0x4DA7CF6AU, -0x2B17F5C6U, 0xA903A376U, 0xCA823961U, 0x829E9619U, 0x8F456FB4U, 0xCC6B224AU, 0x75B42ABFU, 0xCD7DECEFU, 0x73290221U, 0xDF8E5CD8U, 0x1D568D7CU, 0x7F2FCD63U, -0x539DB28DU, 0xB9BB5841U, 0x88EB5D8DU, 0x30B6C9CCU, 0xEA5F5485U, 0xF282B417U, 0x46508060U, 0x8C9D5E3EU, 0xBC04162BU, 0xFA329E5DU, 0xC885E4CCU, 0xDCBF9DCAU, -0x4715B337U, 0x2FDC1366U, 0x3E3BBA50U, 0x9F2BF2CU, 0x73F18BAU, 0xB561B097U, 0x6DC1E6EFU, 0x9000A7E8U, 0xEE613496U, 0xCAD661B5U, 0xADEFBC1EU, 0x717A2494U, -0x10ED817CU, 0xD5497538U, 0xC264618U, 0xA723C789U, 0x365CA2E0U, 0xC4AE628U, 0xDAD44170U, 0x69B2A699U, 0xFA94A82BU, 0x9500E45FU, 0x641EDBEU, 0xBBC0F4D2U, -0xE21AA1F5U, 0x7FDEA451U, 0x5F8E4A17U, 0x9682906DU, 0x41B84148U, 0x6659DDC9U, 0xBA4A5BADU, 0x14B31920U, 0x1360E730U, 0x590C5708U, 0xF019A4AAU, 0x5089CA96U, -0xF0B0E775U, 0xFDD90E49U, 0x1BF1824BU, 0xE13025FCU, 0xEF137B9DU, 0x7935115AU, 0x718BD26AU, 0xF09E5811U, 0x7BA332A6U, 0xA7615393U, 0x73FAF11U, 0x55936B7CU, -0x141AF304U, 0x65E071DDU, 0x97589D6U, 0x73A15F22U, 0xB2FDF279U, 0xD6B59BAEU, 0x27ABA3E6U, 0x2367BEC9U, 0xE7C938F9U, 0x560FEC09U, 0x12C5119U, 0x5001267U, -0x85080CCDU, 0xA3B79EC5U, 0x960F8445U, 0xF895CC46U, 0x3A3AF35CU, 0xC4A951A1U, 0x6BE7869BU, 0xEA4D4D5BU, 0xAE72E7B2U, 0x4282D2C1U, 0x33ECB6EBU, 0x4415ADC3U, -0xC78A4A6EU, 0xA58D62B2U, 0xF3E3048EU, 0x1B8D6392U, 0x147A0701U, 0xE63DAAF0U, 0x8DDD9273U, 0xF5A4B231U, 0x9FF25F7FU, 0xDDEA0DB3U, 0x5CEB285U, 0x7DB792C7U, -0x750B1EB5U, 0x57AE509CU, 0xC8F777C2U, 0xBCD1360BU, 0x632D2CA8U, 0xBC462336U, 0x602E733DU, 0x2194100DU, 0x2FB69E71U, 0x58D9C98U, 0xD3907616U, 0x40B025B8U, -0x8638D05AU, 0xE4433DD5U, 0xB399E080U, 0xEB05158DU, 0x21E41D29U, 0xA97B497EU, 0x7DF9E406U, 0x2B2DDA74U, 0xBA0D8072U, 0x23F15693U, 0x69AB4478U, 0xE134102FU, -0x8522D229U, 0x1CDE04C8U, 0x1021B3B1U, 0x685893F3U, 0x548FAB48U, 0x3926C75EU, 0xCD7FFCC1U, 0x95E309CCU, 0x70DCC40DU, 0x5809E8BDU, 0xC3D9F1CBU, 0x15C41B45U, -0x461F4802U, 0xCE801C55U, 0x39156F0DU, 0x3AE08EU, 0x8D001528U, 0x51684523U, 0x85F53FF7U, 0x53E8D579U, 0x81AED8F1U, 0x5DC688FAU, 0x88B16330U, 0x43104043U, -0x364A68E3U, 0xA3F2B218U, 0x84AC213BU, 0x752D5FFCU, 0xA15A7026U, 0x2CD52C5U, 0x8C136450U, 0x1A32A58U, 0xBE1AD3FCU, 0x368587ABU, 0x24762692U, 0xDB6866FU, -0xDBFE03C1U, 0x32805E0BU, 0xBDB344CU, 0xB6576FD7U, 0xCE602BD5U, 0xD9A1C5D8U, 0x1E451C58U, 0xA3C947C3U, 0x8A5E6F27U, 0xA76375AEU, 0x5A7B58AAU, 0xE7F70331U, -0x9E18A785U, 0x5E2B2BB3U, 0x4E3D9008U, 0xF3B1CB93U, 0xFE1D8CFCU, 0xC732037FU, 0xE5F2028FU, 0x922F93ECU, 0x3B1CD1U, 0x489442A4U, 0xF7CEB34U, 0xE3308006U, -0x9E89A82AU, 0x88E25FD7U, 0xBA9183F8U, 0xC98F90D9U, 0x111E8936U, 0xAB056753U, 0x3E5DD491U, 0x83D04BE3U, 0x7419BEF7U, 0xDEC343D9U, 0xDF53B75BU, 0x8D38CBC1U, -0x9E65B31DU, 0x49E9647BU, 0x487990F9U, 0x8586DA3AU, 0x8D4BA4A5U, 0xE27A2FD3U, 0xCF0F75B3U, 0x506B7DCCU, 0x7729EE20U, 0x83A892CEU, 0x1724B686U, 0x1D5443E6U, -0xF994FF2AU, 0x606829CBU, 0x4F6BD1AEU, 0xB8F93024U, 0xF6C1C490U, 0x6F3D1271U, 0xE8119B5BU, 0xB7AC0B9EU, 0xA93D2434U, 0x9CBC7723U, 0x5384167CU, 0x6CC02C32U, -0xE3AEFA3BU, 0x96ACCCB8U, 0x93EDFEB5U, 0xB455ABEU, 0xE0468B3U, 0xD2638E77U, 0x85F33C85U, 0x53C0FE60U, 0x40A0CF69U, 0xCE296866U, 0xDD49596FU, 0x89ED9A7CU, -0xB2168218U, 0x2A16FE9FU, 0xC6158813U, 0x96D819A0U, 0xF1CB7821U, 0xF0B3234EU, 0xC76DD37CU, 0xF6999932U, 0xA6540881U, 0xC1476900U, 0xBF852F50U, 0x885BDF62U, -0x2B6EA5F0U, 0x7BA33443U, 0x1CB055C2U, 0x406B945CU, 0x21FBAB96U, 0x25A9EEF7U, 0x29D0280DU, 0xDCD83354U, 0x95D847CAU, 0x193AD0D7U, 0x65149603U, 0x875F1D51U, -0xF2D6AE5EU, 0x9E89C614U, 0x71040E80U, 0x2F6DB3B1U, 0x4FBD2D4DU, 0x382CE581U, 0x8682E54AU, 0xC6CE3C16U, 0xD0CDB310U, 0xC097D2DCU, 0x61442A6DU, 0x803FC77EU, -0xBFABF3D6U, 0x2AB83F69U, 0xB70E7066U, 0x1BED886U, 0xE496DD92U, 0x125067C1U, 0xF2BDF6E8U, 0xA1E56DA4U, 0x1D17DA74U, 0xD6E2180AU, 0x96AAE39BU, 0x9E79ED3CU, -0xFE814EF2U, 0x55E387B6U, 0x38A8B47FU, 0x1BD7ADCCU, 0xB200788AU, 0xC063E892U, 0x7E1CEC20U, 0x62C476EDU, 0xF83527BEU, 0xCB64655U, 0xF85F383EU, 0xEFE50809U, -0xA32D4B9DU, 0x14325108U, 0xC46CF3FCU, 0x8646A4A2U, 0x24231E6EU, 0xE8DC260CU, 0x9CA8A446U, 0x4A5517EBU, 0xCDBD569CU, 0xB4C0F066U, 0xF1C615D9U, 0x14C9784FU, -0xC35ACFA4U, 0xA1F99F39U, 0xDB5D327U, 0x16208387U, 0x487A6530U, 0x8B83FB15U, 0x47AA297BU, 0xA6838556U, 0xFE99F07BU, 0xAAC72C75U, 0xD7EE632BU, 0xCC9E80CU, -0xDC478D7BU, 0x7E2514C1U, 0xEC7A9229U, 0x7EFF1AE2U, 0xDA58F332U, 0x7FFD9AE0U, 0xD62250F0U, 0x36FF2FD3U, 0x5343E85AU, 0x8ADA0754U, 0x7DE1A231U, 0x73105D3AU, -0x9EA10A8CU, 0x454632DU, 0x2AFBA286U, 0x638306DBU, 0xD0EE5B94U, 0xBDBA49B8U, 0x26400C9AU, 0xB8A32501U, 0xED50973AU, 0x96A4B4A6U, 0x532A2EC9U, 0xC01BA957U, -0x11CDDFF8U, 0x38F60BF1U, 0xAA9B52FCU, 0x709E7D5BU, 0xD63F1DE9U, 0xE5D7E3BU, 0xF7AF95C2U, 0x3D792D12U, 0x77418D32U, 0x3AF7B59U, 0xDF7CC644U, 0x796A3A58U, -0x2A0F1115U, 0x8E3D8B1FU, 0x3EE734ECU, 0xA157B457U, 0x19AD5091U, 0xA348A4DCU, 0x4F107817U, 0xD65CF7B3U, 0xBD678059U, 0x5D63C132U, 0xB71ABEBBU, 0x3E76DFA6U, -0x7B931373U, 0x4C62A6D8U, 0x57F03940U, 0xB2A038EEU, 0x5FDF9A23U, 0xA0263983U, 0x7E882A01U, 0x9DFC1084U, 0x7072D927U, 0xD8FDE69FU, 0xE0E7157BU, 0x58F4B5B9U, -0x57E98EE9U, 0x2B7F17D5U, 0xBF5D536FU, 0x19B4B8DDU, 0x670EE546U, 0x759F5B56U, 0x521D3385U, 0x54FF4F92U, 0x2D9CBF6AU, 0xD0F0ACFBU, 0x41F4137CU, 0x3ECD73DCU, -0xD98F534U, 0xAFC9093DU, 0x11EB63E2U, 0x69341E0FU, 0x45C58EDBU, 0xDFF71D29U, 0xBACC8D3CU, 0x795F863CU, 0xDA5B599FU, 0x756A6CFCU, 0x492FD69AU, 0x29F01476U, -0x6E924FB3U, 0xE8B85ECU, 0x2AC4EC3FU, 0xF77C2327U, 0x4D7BA0B7U, 0xC9C38BCEU, 0xC46345A2U, 0xA8C65A6U, 0x1A0CBBA0U, 0xC6B953FBU, 0xF469483CU, 0xE8DBA058U, -0x55E1E9EDU, 0x220DF006U, 0x752BEE8CU, 0xFBB8B0D5U, 0x16F0C1B5U, 0x6F47CA15U, 0xE7DF0A66U, 0x93AA672CU, 0xA4B0DB5U, 0x9798D36AU, 0x210C73B2U, 0x2D884E0BU, -0x2CF555C5U, 0x2594AF17U, 0xF92DA22FU, 0x4C553278U, 0x559C4DCU, 0x2FEF17FCU, 0xF479A777U, 0x13EC6D08U, 0x507AFB0FU, 0x3DBD6B73U, 0xD3DAA910U, 0x56D07CCDU, -0x76F544DDU, 0x8D972880U, 0xFF842DA6U, 0xAB51C2E8U, 0xFE925847U, 0x1266FB35U, 0x9951A06U, 0xD3FF1DF6U, 0x51D302CEU, 0x66FB4072U, 0x3338DADDU, 0x67610EA3U, -0x8FD669ECU, 0xE3411213U, 0xA28A9DA9U, 0x170B62DFU, 0x46D9B7D7U, 0x3BAA86EEU, 0xF0257FF7U, 0x6DBF878BU, 0x520CEC4CU, 0x4A7596BEU, 0x732E55FDU, 0x36069DA1U, -0x17D3C5EEU, 0xCCBE59DCU, 0xF17154B8U, 0xFED05FF9U, 0x70F66BAAU, 0x668A255FU, 0x5E1E3F24U, 0xC6AA9101U, 0xA9DF1308U, 0x1CE8989FU, 0xF2C4756CU, 0x606CB509U, -0x2394B2A6U, 0x16C80794U, 0x2A219240U, 0xAE1222A3U, 0x8CB97B86U, 0x4CACE737U, 0x8EC4A97AU, 0xE6AE7EDU, 0xB911D42CU, 0x6C05079AU, 0x2A97030AU, 0x1E97978CU, -0xA9209129U, 0x859AA93BU, 0xC97EF510U, 0x66821408U, 0x54C18CD7U, 0x66B85367U, 0x5C604485U, 0x3A9FAE2U, 0x3CD0C352U, 0x92F9FA79U, 0xC17824C7U, 0xB803EAFU, -0x538FB0D3U, 0x948FC967U, 0x41D70FEBU, 0x8F21EB7FU, 0x90F8A446U, 0xD768A2BEU, 0xDDABF113U, 0xD17178C2U, 0x56378FD7U, 0xBED2C72U, 0x93D47BEAU, 0xAEA4D915U, -0xF5601C83U, 0x317F54CBU, 0x10AA0C84U, 0xD907DC46U, 0xE342A78AU, 0xBD65E28U, 0xB389E207U, 0x3BD7614EU, 0xC08B5199U, 0x4E118784U, 0x48C31E39U, 0x7CF71C84U, -0xB0B24B2CU, 0x1FE25283U, 0x629F7C2DU, 0x57EF2916U, 0x2B576B96U, 0xCE051BEAU, 0xEC16C919U, 0xBFF3A0CBU, 0xE838218DU, 0xEE352A21U, 0xE38E5B7FU, 0x3A8BB7DFU, -0x1F0ECE93U, 0x5385D9B7U, 0xAC29F8F4U, 0x575DB2ADU, 0xACBF183FU, 0x567EEE14U, 0xE8AD89DBU, 0xE3E9CEBBU, 0xD8CE4D00U, 0xBA789F5AU, 0xF87F77BBU, 0x4A4B351BU, -0xCF96A065U, 0x74744A1FU, 0xD93F0955U, 0x4F6722B3U, 0xFDCD24EEU, 0xE6A9F921U, 0x166CC0D6U, 0xB92186A0U, 0x29211071U, 0xD978BCDDU, 0xB14992FCU, 0x19854E77U, -0x3FE60A5U, 0x58FC1E58U, 0x10475664U, 0xDAFCA3E6U, 0xFDCAE1D1U, 0x82D2915DU, 0xE3DFF22AU, 0x130FDF55U, 0xD3B59A0FU, 0xD5F60290U, 0x6CCD0385U, 0x58438A99U, -0xDE26F199U, 0x3E40DEB9U, 0x706B5E46U, 0x3B8DBFD5U, 0x28CAFF29U, 0xD0A47AE4U, 0x3AA9B57AU, 0x8504AFF7U, 0x5E28BCA3U, 0xFBE90C93U, 0xEAD04C12U, 0xCB24B726U, -0xF6C65A18U, 0x2A34D380U, 0x62E270A6U, 0x6E546C36U, 0x31006A54U, 0x29503BFAU, 0xBF30759DU, 0xA18BD87CU, 0xA2D5259U, 0x34D4508EU, 0xCDF525B8U, 0xD28710F0U, -0xB2863FDDU, 0x9F9E5922U, 0xE1642FD1U, 0x12D001U, 0x16F6CE5BU, 0x70B1EF12U, 0xA6AC059CU, 0xBBEBD881U, 0x472BCFE6U, 0xE62890CU, 0xA80B1464U, 0xC5A27872U, -0x3BEA65ABU, 0xA8392847U, 0x279F356AU, 0x7F03C067U, 0x7D764E6CU, 0xA208B04BU, 0x110FA646U, 0xFC591AA1U, 0x4B671A82U, 0x8737FAAAU, 0x552AF746U, 0x21D61F84U, -0xB82AC965U, 0x3B3F074FU, 0x60BBD08AU, 0x426CB588U, 0xDB906369U, 0x9B6900FEU, 0x3017A86U, 0xEEDF7292U, 0xC60A5E22U, 0x19DDB430U, 0x7B87C150U, 0x49FFE8C2U, -0x875E3C9U, 0xEFB8D540U, 0xBB551FEU, 0x485E57B1U, 0x7171D832U, 0xAA37823U, 0xB678C79CU, 0x9AD6EC38U, 0x6CB5177AU, 0xE42A432DU, 0xA711D2F5U, 0xDF1942E9U, -0x92D028AU, 0xF00C77BCU, 0x7049BC1CU, 0xA2670B26U, 0x20B4D99EU, 0x8BEAF43BU, 0xEA39A146U, 0x14F38D7U, 0x3A72453FU, 0x464E138BU, 0xC1B90DE8U, 0x9EAD10B7U, -0x1E4CB9E4U, 0x2CF77C5BU, 0x8927E59AU, 0x7116D68AU, 0xBB545FEBU, 0x81B4AA98U, 0xD01859CAU, 0xDF71061U, 0x479A64C4U, 0x71B1C5DBU, 0x5964E96BU, 0xF1560394U, -0xF28823A4U, 0xE4E97619U, 0x1295A088U, 0x7049FDAU, 0xE592D573U, 0x3535BE69U, 0x1619B844U, 0xD727F3DEU, 0x13232E2BU, 0x51338796U, 0x4B84738U, 0xF482392DU, -0xAB40F973U, 0x9E36BDD6U, 0x3845F022U, 0xA2F40E8BU, 0xC698595DU, 0x87D8352DU, 0xEEB9CC7FU, 0xC644164DU, 0x4CDBDEAFU, 0xE2DE7491U, 0x31F7EB3DU, 0x9599038U, -0x9D918DA1U, 0x65E89B01U, 0x886E82A6U, 0xFFFE534AU, 0xE151673CU, 0x2026F087U, 0x6D682B4EU, 0xDEF444BDU, 0xF1416D33U, 0xBA2D6D03U, 0xEEFF589AU, 0xD41F5106U, -0xDE088E4CU, 0x999A79F6U, 0xE8AEA3D0U, 0xE93324AEU, 0xAD49F7U, 0x5FE7A23DU, 0xC1728CACU, 0x60B9C80EU, 0xE3F2AFEBU, 0x95F0722U, 0xA039D72EU, 0xD6262CCFU, -0x76C373F8U, 0xB040A838U, 0xCF9DD85FU, 0x89EE399BU, 0x4280BC28U, 0xFC69FC63U, 0x3D05B634U, 0x49B5C357U, 0x6E56C308U, 0x1754FB6U, 0xBB51865DU, 0x8715888CU, -0x1D1552DU, 0xB7351D91U, 0x4537E08EU, 0xAD2738D0U, 0xAE6891D3U, 0x3D480692U, 0x964B44CEU, 0x7F89BA71U, 0x2E2BD03U, 0x7686B89FU, 0xDC21E010U, 0xC76B9756U, -0x51599457U, 0x9E6B1EDU, 0x9A6FBFC1U, 0xBBC871A0U, 0xC3FAEA7CU, 0xFAD6BDE8U, 0x1D426A4FU, 0x54E93201U, 0x23516287U, 0x7D2AAB9U, 0x3D14944U, 0x20F91670U, -0x7A1502CDU, 0x5A8B6DF7U, 0x2D7BE547U, 0xC7686672U, 0x6101B9D7U, 0x6D9E58AFU, 0xEB0B3F26U, 0x92FD1CE6U, 0x10438777U, 0xB9A6DF98U, 0x8F21D6D6U, 0xA5DC42D9U, -0xAA8A7A11U, 0x97ABDF97U, 0xF820B371U, 0x12E7060FU, 0x7898B7E6U, 0xECC6032BU, 0x9CD6CAB9U, 0x3BC2405BU, 0x16974E59U, 0xB1168D81U, 0x2F1E6611U, 0xCEFB7A8CU, -0x399695C7U, 0x116814AFU, 0x588FA645U, 0xC9B298CDU, 0xC2BC200U, 0x264CB5CEU, 0x9C43107EU, 0xA1A8D07EU, 0xE6BF9B30U, 0xDAAEEB22U, 0x9AE019F0U, 0xE91C586BU, -0x2C799952U, 0xE5A1E7CEU, 0x405A2DB6U, 0x804346D2U, 0xBE708250U, 0x67B107D0U, 0xC596A1FBU, 0xB7E8AC33U, 0x829235A2U, 0xA0D9823DU, 0x46D24122U, 0x2B9EA93U, -0xA1C073C6U, 0xC4EAFBEU, 0x9CBCA0CEU, 0x87CB523EU, 0x93F53F24U, 0x30F100CBU, 0xC76E5C71U, 0xC5B21FE9U, 0xEEEE5BF8U, 0xBB647D0EU, 0xE0A73F06U, 0xC685C32DU, -0x1C5C9B9BU, 0x2A44CEAU, 0x9534296EU, 0x5A5EC350U, 0xB3780B29U, 0xE8A4B00U, 0xF8327784U, 0x996FC0C8U, 0xD67C8539U, 0x621659DDU, 0x1FD6996U, 0xB398D6D2U, -0xBBEC03D6U, 0x3F8504F6U, 0x9FA1B8CEU, 0x83ADB8A5U, 0x9004789FU, 0x99ED15F4U, 0x6883E2DU, 0x3C75FFACU, 0xD2391F74U, 0x66EE73F1U, 0x8FA89A21U, 0x801A7503U, -0x522E1784U, 0x36392E2EU, 0x19DF8128U, 0x6EA25305U, 0x846C8437U, 0x4EE0BEACU, 0xF690FDC5U, 0xF6832E1EU, 0xA48C9379U, 0x5F8921B0U, 0xFE3D1F9CU, 0x4B6BADFEU, -0x2DDBBD52U, 0xFA227036U, 0xFE4FE03AU, 0xD4BD8877U, 0xC255594EU, 0x8A61FE32U, 0x63B85E32U, 0xC24637DFU, 0x39229F39U, 0xF9B405A4U, 0x3EBF9329U, 0xF28B6E98U, -0x81DAA8C9U, 0x55ACEF34U, 0x296DE97FU, 0x5953C3AU, 0x7268DC76U, 0x49C2BAAAU, 0x1FD82E79U, 0xE54C1803U, 0x9CD98442U, 0x4C57DE89U, 0x7FD97D63U, 0x5B3CB6F5U, -0x67B3B2E4U, 0x3F4D318AU, 0x3EC0ABB7U, 0xEE3200C0U, 0x3FA3D082U, 0x4D0F7C4AU, 0x892D309CU, 0x56B3DD2CU, 0xEB5F7612U, 0x2EE42882U, 0xCF07E495U, 0xF2A9BC6BU, -0x9DA909A4U, 0x937B3A8U, 0x363217CFU, 0x9AED0006U, 0x60362015U, 0x5226B280U, 0x8524AEA3U, 0xFBC8F58DU, 0x7B172312U, 0x9CCC34DU, 0xA8AE6F61U, 0xE3CA111EU, -0x59FE8325U, 0x6EC95B2U, 0xF676DCD9U, 0x9A250AE3U, 0x99E585E7U, 0xA62C89BU, 0xC631DEF4U, 0x58BC30C1U, 0x470412E1U, 0xC05117F0U, 0xA51D983CU, 0x1E629C01U, -0x541C0E33U, 0xEB80059DU, 0x129D07E0U, 0x48EDAAD6U, 0x8397F485U, 0x1857F8F0U, 0x97497FE1U, 0xA8AEC1F6U, 0xC8027F76U, 0x736E96A8U, 0x1A578E1AU, 0x6B9FD701U, -0x8B4734B7U, 0x7102220U, 0x13FE645BU, 0xE25D1A59U, 0x7A7D69ECU, 0x9295838AU, 0x6761FB08U, 0x493105F6U, 0x13BF90E3U, 0x6691E578U, 0xC741FD85U, 0x62E01643U, -0xE782CAB0U, 0x3223B5F4U, 0xB36E1464U, 0x2C04AA45U, 0x9260D4CBU, 0x660DB966U, 0x41F2BCF7U, 0xF17D8432U, 0x17C405A6U, 0x87274585U, 0x537E9E9EU, 0x7B344BCU, -0x1E023531U, 0xDD6783A8U, 0xFA37738DU, 0xD7D7F72CU, 0xEAADB26BU, 0x5B511B45U, 0x240A687DU, 0x44E66B55U, 0xD0808C97U, 0xF31BFF35U, 0x9EE5345CU, 0x258906C2U, -0x9860CC4AU, 0xB9CCB14FU, 0x5580726EU, 0x26B182EU, 0x4F6C5C89U, 0x5D26775DU, 0xF0CA22ADU, 0x2DD7CAC5U, 0xD0EDAF27U, 0x8C09D6DU, 0xDCFB88F2U, 0x71C63BCFU, -0xAEC8C854U, 0xC3ADC8F6U, 0xE93C7B65U, 0xC698C893U, 0x8E574092U, 0x92FF3CB6U, 0xF8648ABAU, 0xB5BC2991U, 0x5E05BD9DU, 0xB09A78A0U, 0x15AB67C0U, 0x3FADF7CEU, -0x2927A3FDU, 0x445BA5DBU, 0xFA3008B2U, 0x2891DB6BU, 0xDBB845FU, 0x573B85ECU, 0x18F54327U, 0x74F4356BU, 0x95971E70U, 0x4470A211U, 0xB905173DU, 0x414D94A9U, -0xE929B3ADU, 0xAE3B8A7AU, 0xFF18EB1U, 0xEE383B0CU, 0x7B04D607U, 0x693E6DA4U, 0xC3FB577EU, 0x7AC48735U, 0x1A99C4ADU, 0x45B0C657U, 0x5CC05A5U, 0xE24AE587U, -0x884FA08EU, 0x5BCE0610U, 0xCCBADA00U, 0xEEBE62E2U, 0x1BED96D4U, 0xFF9731C4U, 0x5644B2A0U, 0x9119ABCAU, 0x28FC1FE4U, 0x983CF251U, 0xF92F5A3BU, 0xDC9DC061U, -0x5B150730U, 0xCB5F1CBDU, 0x5966470CU, 0xE5C92630U, 0x974502D1U, 0x2047F98CU, 0x444D6B88U, 0xFB8235EU, 0x359D6CU, 0xC34153C2U, 0x2A95D777U, 0x5B6E4E6FU, -0xB408F38U, 0x2423E46EU, 0x4C85DCE9U, 0xBBEEC84BU, 0xE9D46305U, 0x30187C97U, 0x181599U, 0xF4F90026U, 0x952F111CU, 0x5B9D9750U, 0x624304BEU, 0xCE566F2EU, -0xF5B066E3U, 0xC84AEDC4U, 0x26984E70U, 0xD637245CU, 0xAEADB1U, 0x7F65D377U, 0xDD7410C6U, 0xE156A6E8U, 0x2BDB808BU, 0x3107D6E5U, 0xA654151FU, 0x5DBD1349U, -0x29676B1CU, 0xD9B9A12BU, 0x559571C7U, 0x17D9B1EFU, 0x8EBB69EAU, 0x6E834FD7U, 0x22AF6658U, 0x50FD3DEBU, 0xA35B6E1U, 0x87B78513U, 0x5CA68B6U, 0xF3B77C65U, -0xDAE7ACC8U, 0xBD84E707U, 0xC0B1F2EEU, 0x7C5B280BU, 0x3C82C2A7U, 0xF1848767U, 0xCF397063U, 0x11293CECU, 0x86B3A406U, 0xCF0391E2U, 0xCAE6F488U, 0xA2130914U, -0x80443800U, 0x75A52C98U, 0x255D3BC5U, 0x70B8141FU, 0x52A6D7E8U, 0xF3773CB5U, 0x16682961U, 0xE291D23CU, 0xEA1AB08DU, 0x3AF6AC29U, 0xF077AF0BU, 0xDB42975FU, -0xE4B5A5C3U, 0x828767D9U, 0xCE511DFDU, 0x8FA20C6DU, 0xD4FEEEB4U, 0x3B75D536U, 0x81090466U, 0xB210CB77U, 0xA0A56499U, 0x601ADD2U, 0xAB167BEAU, 0xF706C300U, -0x1B058070U, 0x9F01D362U, 0x52CFBC44U, 0x96A9AB7BU, 0x966588D6U, 0xB899A286U, 0x5EE0407AU, 0x681CEAFFU, 0x4C40811U, 0xB20B7269U, 0x367237BFU, 0x428A0B94U, -0xD691C645U, 0xB12CFF27U, 0x9E6383BEU, 0x6176461EU, 0xFDB47228U, 0x51A94E60U, 0xFBD6A3E0U, 0xF187D05EU, 0x4DA143CFU, 0x49C7CCE6U, 0xB4B52BF7U, 0x3BA3A346U, -0xA803AAFEU, 0x9FC8C67BU, 0xA639766CU, 0x4C6B2408U, 0xED09AD3DU, 0xDBBD48U, 0xE0E2196DU, 0xE9FFEE62U, 0xB50384FU, 0xDFE188A2U, 0x3633AE21U, 0xAEF9F8C9U, -0x80178502U, 0xED42BC9CU, 0x85653DDDU, 0x394C79C4U, 0x71477B3DU, 0xF8C674CFU, 0xD4B8C4E9U, 0x2A5947F9U, 0xFC4C64D2U, 0x6B322B31U, 0xB9B20DFBU, 0x57BB1739U, -0x3D915162U, 0x5AAAA1ACU, 0x91EB2A66U, 0x35CA03C9U, 0xDE6D0202U, 0xCB2E089FU, 0x57048634U, 0xEEBBC058U, 0x3813A5F6U, 0x722CE848U, 0x8479A8A6U, 0xE92B8076U, -0x1B1F3F83U, 0x81D8932FU, 0xFDDDB092U, 0x30D5B4C9U, 0xC91CF267U, 0x36AD135BU, 0x71F52515U, 0xC089EF35U, 0x41038328U, 0x6456724BU, 0x1B2B3E23U, 0xD24210BBU, -0xC62FBD71U, 0xFCAD3662U, 0x8E3F7FF2U, 0xE48AE1B8U, 0xD23BC8ABU, 0xEF89F436U, 0x62BCE039U, 0x1A5DE46CU, 0x16236FU, 0xCA241E6DU, 0x9EEE203BU, 0x3D3879E4U, -0x1D1C6180U, 0xD378251U, 0xE2BA4A87U, 0x66DFA1A0U, 0x7418FB2CU, 0x6CB7295CU, 0x9F7002F9U, 0x1F7DE611U, 0x5FA0D6B3U, 0xA466F742U, 0x8E097065U, 0x7F7B3458U, -0x25360EB8U, 0xE8ADA4B0U, 0x18B1FE00U, 0x2AC22D1CU, 0x4186B027U, 0x959C76EAU, 0x8872FA1EU, 0x486317D3U, 0xED35E29BU, 0xB17E878U, 0x8F6CC5FCU, 0x2E8831DBU, -0xFA55FF05U, 0x6FEFF36U, 0xBE942D00U, 0x36B6480EU, 0x4C5D91EFU, 0xEB2C7AC2U, 0xEA33683AU, 0xB8A51C5EU, 0x8BF2227BU, 0xF37E24F6U, 0x864012FU, 0x5DE7786U, -0x3EFEC660U, 0xE2761ACU, 0x54A6C4ABU, 0x4047D505U, 0x37FBD45CU, 0x65D5D78BU, 0xBE3CF030U, 0x4A150EFBU, 0x2F283083U, 0xCB47C04DU, 0x973EDABU, 0xD6BC301FU, -0xD792EACU, 0xEEA55E7U, 0xAB40BD74U, 0x2CAC2CA8U, 0x9B8691CAU, 0xF0EF8D89U, 0xA743045FU, 0xB76BFEDU, 0x76DD731AU, 0x3752687U, 0x968C7740U, 0x770D8687U, -0xF6DE8D96U, 0x91B3A983U, 0x7228545U, 0xA8134914U, 0xFD9A01E6U, 0x72386ADDU, 0x845A80A6U, 0x10675D75U, 0x31032835U, 0xB6510D2AU, 0x67E9C2D9U, 0x8C073B5FU, -0x348F2BA5U, 0xE4DF38ECU, 0x535EDE00U, 0xE31FD2EFU, 0xAA5BD7DCU, 0x9D963F06U, 0x8D26D2E9U, 0x5D76C1A0U, 0x95131597U, 0x25521978U, 0xA549BA78U, 0xFC809EA1U, -0x9CC1A4E2U, 0x58043720U, 0xE3BD3B7BU, 0xED684815U, 0x8A1B48E8U, 0x9C5BFCA1U, 0x1C5A009AU, 0x7485B1C1U, 0xCA86F28AU, 0x32FA853AU, 0xB3626483U, 0x972DA82DU, -0xE492749AU, 0x35CA2D1DU, 0xC1E25D40U, 0xFAA559E2U, 0x27472E18U, 0xEA8FB72AU, 0x5D846824U, 0x77540CDAU, 0x45717960U, 0x57C4D68EU, 0xEF78B1EBU, 0x72AF8952U, -0xCA13EE37U, 0xD8A641D9U, 0x601A26BCU, 0x387936EAU, 0x80C5518FU, 0x47E9CBACU, 0xFF55ACC9U, 0xEDE00327U, 0x835DF178U, 0xDD2F69BU, 0xC178F605U, 0xCBBDFF1CU, -0x717FF82U, 0x8998F861U, 0x4532F8FFU, 0x9C12EA53U, 0x50B8EACDU, 0x2E8AEB86U, 0xE220EB18U, 0x6CAFECFBU, 0x6D9D258CU, 0xBC42E87CU, 0x61A4E33U, 0xCFB8C4FU, -0x81664E1AU, 0x13BBA529U, 0x5BFB8755U, 0x5B9E60F1U, 0x89633A85U, 0x3E0560D0U, 0x39A51A29U, 0x8EC3407CU, 0xE6DEDAE1U, 0x51B880B4U, 0xC3614311U, 0x74071944U, -0xEEA49D28U, 0x59C2C77DU, 0x236AF20EU, 0x940CA85BU, 0xF46B750FU, 0x430D2F5AU, 0xD1002AD3U, 0x66667086U, 0x44AD55A3U, 0xF3CB0FF6U, 0x31DF5DE0U, 0x86B907B5U, -0x5618FA4DU, 0xE17EA018U, 0x5E62BD84U, 0xE904E7D1U, 0x61C60A7FU, 0xD6A0502AU, 0x796DEC4CU, 0xCE0BB619U, 0xCBCFC2F4U, 0x7CA998A1U, 0x7373A591U, 0xC415FFC4U, -0x93ACD2A2U, 0x24CA88F7U, 0x6830EF86U, 0xDF56B5D3U, 0xEF283F18U, 0x584E654DU, 0xA5FE80A0U, 0x1298DAF5U, 0x8095DF7CU, 0x37F38529U, 0x78D0FE2U, 0xB0EB55B7U, -0x1D42E7C5U, 0xAA24BD90U, 0x1538A00CU, 0xA25EFA59U, 0x4521F793U, 0xF247ADC6U, 0xD8F6CF2AU, 0x6F90957FU, 0xF5E7D73FU, 0x42818D6AU, 0x72FF07A1U, 0xC5995DF4U, -0x92207092U, 0x25462AC7U, 0xE75278D1U, 0x50342284U, 0xD08C88E3U, 0x67EAD2B6U, 0x1838F762U, 0xAF5EAD37U, 0x6112CC53U, 0xD6749606U, 0x2F0C6FC3U, 0x986A3596U, -0xCA4360C4U, 0x7D253A91U, 0xB74B2F4EU, 0x2D751BU, 0xFF7482BU, 0xB891127EU, 0x5794587DU, 0xE0F20228U, 0xC8276ED0U, 0x7F413485U, 0x13AA1C8FU, 0xA4CC46DAU, -0x597CA337U, 0xEE1AF962U, 0x52EE48DAU, 0xE588128FU, 0x94B2CC11U, 0x23D49644U, 0xC239270DU, 0x755F7D58U, 0x20825E2AU, 0x97E4047FU, 0xC4AB9B8EU, 0x73CDC1DBU, -0x70716126U, 0xC7173B73U, 0xAC65B06DU, 0x1C7021BFU, 0x11FB361U, 0xB679E934U, 0x746DBB22U, 0xC30BE177U, 0xF3756BBCU, 0x441331E9U, 0xB9A3D404U, 0xEC58E51U, -0xFFF99EE2U, 0x489FC4B7U, 0x7C17FCEBU, 0xCB71A6BEU, 0x4106B2AAU, 0xD9C40950U, 0x36C14353U, 0x81A71906U, 0x1BD05B46U, 0xACB60113U, 0x9CC88BD8U, 0x2BAED18DU, -0x7117AB85U, 0xC671F1D0U, 0x860763FFU, 0x316139AAU, 0x2C0EAB74U, 0x9B68F121U, 0xCCD1DC47U, 0x7BB78612U, 0xDE6473A9U, 0x690229FCU, 0x2BC473EBU, 0x9CA229BEU, -0x9378148EU, 0x241E4EDBU, 0xEAF2C37U, 0xB9C97662U, 0xA4A6E4BCU, 0x13C0BEE9U, 0x252C88A1U, 0x924AD2F4U, 0xAA4E1FF6U, 0x1D2845A3U, 0x9764CE8AU, 0x200294DFU, -0x92F4B6BEU, 0x2592ECEBU, 0xCD89B85BU, 0x7AEFE20EU, 0x47D77DU, 0xB7218D28U, 0xE8E2E787U, 0x5F84BDD2U, 0x505E80E2U, 0xE738DAB7U, 0x660CD2E0U, 0xD16A88B5U, -0xE96E45B7U, 0x5E081FE2U, 0xDEB0B585U, 0x69D6EFD0U, 0xCC051A6BU, 0x7B63403EU, 0xFEA1FAFEU, 0x49C7A0ABU, 0x4B1DCAF5U, 0xFC7B90A0U, 0xB1D993CDU, 0x6BFC998U, -0x5F3AD998U, 0xE85C83CDU, 0x41E9EBBBU, 0xF68FB1EEU, 0xDA78A9ADU, 0x6D1EF3F8U, 0xC2EDE121U, 0x758BBB74U, 0x883B5E99U, 0x3F5D04CCU, 0x4D8F7676U, 0xFAE92C23U, -0xCB1B04D8U, 0x7C7D5E8DU, 0xBFE5AEABU, 0x883F4FEU, 0x759C9CEU, 0xB03F939BU, 0x80411950U, 0x37274305U, 0x308739FCU, 0x87E163A9U, 0xF5331113U, 0x42554B46U, -0x2A48D1DBU, 0x9D2E8B8EU, 0x1D9621E9U, 0xAAF07BBCU, 0xA52A468CU, 0x124C1CD9U, 0xE786BEFDU, 0x50E0E4A8U, 0x9A8EF177U, 0x2DE8AB22U, 0xB79FE962U, 0xF9B337U, -0x57409E51U, 0xE026C404U, 0x547CF459U, 0xE31AAE0CU, 0x6BD843A2U, 0xDCBE19F7U, 0x5C06B390U, 0xEB60E9C5U, 0xECC0933CU, 0x5BA6C969U, 0x2F71F45U, 0xB5914510U, -0xA0849007U, 0x17E2CA52U, 0x5D8F4DD1U, 0x785F2A36U, 0xBA4B7820U, 0xD2D2275U, 0xA8FED7CEU, 0x1F988D9BU, 0x77851706U, 0xC0E34D53U, 0xB2313FE9U, 0x55765BCU, -0xA8D588CU, 0xBDEB02D9U, 0x9F2027FCU, 0x28467DA9U, 0x34A54D47U, 0x83C31712U, 0x96D6C205U, 0x21B09850U, 0x335DBD17U, 0xF11165A8U, 0x46773FFDU, 0x9EAC85CCU, -0x29CADF99U, 0x3237F1C4U, 0x8551AB91U, 0x3A4DB60DU, 0x8D2BEC58U, 0x709B09B5U, 0xC7FD53E0U, 0x5FD0B10BU, 0xE8B6EB5EU, 0xC05D2919U, 0x773B734CU, 0x90447E86U, -0x272224D3U, 0xA82A11E2U, 0x1F4C4BB7U, 0x65E47EC4U, 0xD2822491U, 0xBA9FBE0CU, 0xDF9E459U, 0x523A8EF6U, 0xE55CD4A3U, 0xEA86E993U, 0x5DE0B3C6U, 0x3D876E92U, -0x8AE134C7U, 0x6D9E390DU, 0xDAF86358U, 0xCFEDB64FU, 0x788BEC1AU, 0x7751D12AU, 0xC0378B7FU, 0x83A9B574U, 0x34CFEF21U, 0xCCB2223U, 0xBBAD7876U, 0x461D9D9BU, -0xF17BC7CEU, 0x1604CA04U, 0xA1629051U, 0xF6DBBD37U, 0x41BDE762U, 0xAEB8AD61U, 0x19DEF734U, 0x911C1A9AU, 0x267A40CFU, 0x4B165EAU, 0xB3D73FBFU, 0x1E7E8DCDU, -0xA918D798U, 0x336F95D8U, 0x8409CF8DU, 0x21DA3A36U, 0x96BC6063U, 0xBC0D028FU, 0xB6B58DAU, 0x9CF62567U, 0x2B907F32U, 0x4E67DA52U, 0xF9018007U, 0x43678D3CU, -0xF401D769U, 0x54A83275U, 0xE3CE6820U, 0xC97F0ACCU, 0x7E195099U, 0x3B15D211U, 0x8C738844U, 0xEC145510U, 0x5B720F45U, 0x99665D53U, 0x2E000706U, 0x6376C247U, -0xD4109812U, 0xE46E12D9U, 0x5308488CU, 0x29A07DFFU, 0x9EC627AAU, 0xE5E2B0E9U, 0x5284EABCU, 0xA74E4898U, 0x102812CDU, 0xD478013U, 0xBA21DA46U, 0x17886834U, -0xA0EE3261U, 0x4FEB7862U, 0xF88D2237U, 0x62FA6077U, 0xD59C3A22U, 0x20569806U, 0x9730C253U, 0x6A8027BEU, 0xDDE67DEBU, 0x318A297CU, 0x77EFB560U, 0x3A997021U, -0x8DFF2A74U, 0x78358850U, 0xCF53D205U, 0x5D8A11A0U, 0xEAEC4BF5U, 0x8BD3F2BDU, 0x3CB5A8E8U, 0x8DAB26ADU, 0x3ACD7CF8U, 0x53DC7DAU, 0xB25B9D8FU, 0x5FEE1FB4U, -0xE88845E1U, 0x6468DCF4U, 0xD30E86A1U, 0xB3833366U, 0x4E56933U, 0xA94CDB41U, 0x1E2A8114U, 0x262E4C16U, 0x91481643U, 0xDC3ED302U, 0x6B588957U, 0xF9558CDEU, -0x4E33D68BU, 0x4993AC72U, 0xFEF5F627U, 0x535C4455U, 0xE43A1E00U, 0xA1369C88U, 0x1650C6DDU, 0x845DC354U, 0x333B9901U, 0x2E540BDFU, 0x9932518AU, 0xBBF974AFU, -0xC9F2EFAU, 0x9E922B73U, 0x29F47126U, 0x176200A7U, 0xA0045AF2U, 0x1E94E55EU, 0xA9F2BF0BU, 0x7129053AU, 0xC64F5F6FU, 0x4E8DB2C1U, 0xF9EBE894U, 0xE4847A4AU, -0x53E2201FU, 0x3B2B7CAEU, 0x8C4D26FBU, 0x107C1E14U, 0xA71A4441U, 0x3D6D0601U, 0x8A0B5C54U, 0xD1F96FEAU, 0x701F8A2FU, 0xEDCCFBF9U, 0x2C9B1FAU, 0xB5AFEBAFU, -0x6BE6ED1DU, 0xDC80B748U, 0xF0A36927U, 0x47C53372U, 0xA8C07971U, 0x1FA62324U, 0x7FC1FE70U, 0xC8A7A425U, 0x77BBB9B9U, 0xC0DDE3ECU, 0x351741C8U, 0x82711B9DU, -0x9F1E8943U, 0x2878D316U, 0x38FD7E35U, 0x8F9B2460U, 0x481F0E42U, 0xFF795417U, 0xBA75D69FU, 0xD138CCAU, 0x7DA5F064U, 0xCAC3AA31U, 0xF783D92BU, 0x40E5837EU, -0xA0BA3EB8U, 0x17DC64EDU, 0x7535DF3EU, 0xC253856BU, 0x8F25402AU, 0x38431A7FU, 0xC797F186U, 0x70F1ABD3U, 0x604AA84FU, 0xD72CF21AU, 0x47AF9114U, 0xF0C9CB41U, -0x27A2EE26U, 0x90C4B473U, 0xBEBDCAB7U, 0x9DB90E2U, 0xED4C310CU, 0x5A2A6B59U, 0x223D969U, 0xB545833CU, 0x96E86CBAU, 0x218E36EFU, 0xA06EF894U, 0x1708A2C1U, -0x6D74519EU, 0xDA120BCBU, 0x180659DDU, 0xAF600388U, 0xDDB27132U, 0x6AD42B67U, 0xD5C836FBU, 0x62AE6CAEU, 0x2474ECBDU, 0x9312B6E8U, 0xCF07DEDCU, 0x78618489U, -0x32DD9957U, 0x85BBC302U, 0x90AE1615U, 0x27C84C40U, 0xC0B7418AU, 0x77D11BDFU, 0x3AA7DE9EU, 0x8DC184CBU, 0xB5C549C9U, 0x2A3139CU, 0x62C4CEC8U, 0xD5A2949DU, -0x28127170U, 0x9F742B25U, 0xA770E627U, 0x1016BC72U, 0x206836B9U, 0x970E6CECU, 0x1FCC8142U, 0xA8AADB17U, 0x5036965U, 0xB2653330U, 0x52862C08U, 0xBA1F74F9U, -0xEDA6599FU, 0x5AC003CAU, 0x47526A2CU, 0x3D07A467U, 0xCFD318F0U, 0x78B542A5U, 0xA9981D6DU, 0x1EFE4738U, 0x8CF342B1U, 0x3B9518E4U, 0x9BD6956BU, 0x2CB0CF3EU, -0xD0584ECFU, 0x673E149AU, 0x76E3DDA5U, 0xC18587F0U, 0xC625FD09U, 0x7143A75CU, 0x195E3DC1U, 0xAE386794U, 0xBEB922FU, 0xBC8DC87AU, 0xD51CF0D7U, 0x627AAA82U, -0xA67301FU, 0xBD016A4AU, 0x8505A748U, 0x3263FD1DU, 0x52042049U, 0xE5627A1CU, 0x5CECDB03U, 0xEB8A8156U, 0xF22D0FA0U, 0x454B55F5U, 0x7453159DU, 0xC3354FC8U, -0x37734FDCU, 0x80151589U, 0x8D7F827U, 0xBFB1A272U }; - -const ReplacementIndexStruct ReplacementIndexData[] = { - { utf16char(43), medium(1) }, - { utf16char(45), medium(1) }, - { utf16char(49), medium(2) }, - { utf16char(50), medium(1) }, - { utf16char(56), medium(1) }, - { utf16char(97), medium(129) }, - { utf16char(98), medium(226) }, - { utf16char(99), medium(290) }, - { utf16char(100), medium(100) }, - { utf16char(101), medium(70) }, - { utf16char(102), medium(437) }, - { utf16char(103), medium(108) }, - { utf16char(104), medium(138) }, - { utf16char(105), medium(53) }, - { utf16char(106), medium(25) }, - { utf16char(107), medium(53) }, - { utf16char(108), medium(101) }, - { utf16char(109), medium(247) }, - { utf16char(110), medium(74) }, - { utf16char(111), medium(71) }, - { utf16char(112), medium(201) }, - { utf16char(113), medium(8) }, - { utf16char(114), medium(114) }, - { utf16char(115), medium(289) }, - { utf16char(116), medium(148) }, - { utf16char(117), medium(53) }, - { utf16char(118), medium(28) }, - { utf16char(119), medium(211) }, - { utf16char(120), medium(4) }, - { utf16char(121), medium(8) }, - { utf16char(122), medium(11) }, -}; - -std::vector Replacements; -std::map> ReplacementsMap; -std::map ReplacementsHash; - -} // namespace - -void InitReplacements() { - if (!Replacements.empty()) { - return; - } - auto data = ReplacementData; - auto takeString = [&data](int size) { - auto result = utf16string(data, size); - data += size; - return result; - }; - auto wordSize = ReplacementWordLengths; - - Replacements.reserve(1936); - for (auto item : ReplacementInitData) { - auto emoji = takeString(item.emojiSize); - auto replacement = takeString(item.replacementSize); - auto words = std::vector(); - words.reserve(item.wordsCount); - for (auto i = 0; i != item.wordsCount; ++i) { - words.push_back(takeString(*wordSize++)); - } - Replacements.push_back({ std::move(emoji), std::move(replacement), std::move(words) }); - } - - auto indices = ReplacementIndices; - auto items = &Replacements[0]; - for (auto item : ReplacementIndexData) { - auto index = std::vector(); - index.reserve(item.count); - for (auto i = 0; i != item.count; ++i) { - index.push_back(items + (*indices++)); - } - ReplacementsMap.emplace(item.ch, std::move(index)); - } - - for (auto checksum : ReplacementChecksums) { - ReplacementsHash.emplace(checksum, items++); - } -} - -const std::vector *GetReplacements(utf16char first) { - if (ReplacementsMap.empty()) { - InitReplacements(); - } - auto it = ReplacementsMap.find(first); - return (it == ReplacementsMap.cend()) ? nullptr : &it->second; -} - -utf16string GetReplacementEmoji(utf16string replacement) { - auto code = internal::countChecksum(replacement.data(), replacement.size() * sizeof(utf16char)); - auto it = ReplacementsHash.find(code); - return (it == ReplacementsHash.cend()) ? utf16string() : it->second->emoji; -} - -} // namespace internal -} // namespace Emoji -} // namespace Ui diff --git a/submodules/TelegramUI/TelegramUI/emoji_suggestions_data.h b/submodules/TelegramUI/TelegramUI/emoji_suggestions_data.h deleted file mode 100755 index fcf44ca85c..0000000000 --- a/submodules/TelegramUI/TelegramUI/emoji_suggestions_data.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -WARNING! All changes made in this file will be lost! -Created from 'empty' by 'codegen_emoji' - -This file is part of Telegram Desktop, -the official desktop version of Telegram messaging app, see https://telegram.org - -Telegram Desktop is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -It is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -In addition, as a special exception, the copyright holders give permission -to link the code of portions of this program with the OpenSSL library. - -Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE -Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org -*/ -#pragma once - -#include "emoji_suggestions.h" - -namespace Ui { -namespace Emoji { -namespace internal { - -struct Replacement { - utf16string emoji; - utf16string replacement; - std::vector words; -}; - -constexpr auto kReplacementMaxLength = 55; - -void InitReplacements(); -const std::vector *GetReplacements(utf16char first); -utf16string GetReplacementEmoji(utf16string replacement); - -} // namespace internal -} // namespace Emoji -} // namespace Ui diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index a18cf50d05..b6758ebd22 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -16,11 +16,11 @@ 090E63E62195880F00E3C035 /* ContactAddItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E63E52195880F00E3C035 /* ContactAddItem.swift */; }; 090E63EE2196FE3A00E3C035 /* OpenAddContact.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E63ED2196FE3A00E3C035 /* OpenAddContact.swift */; }; 090E777922A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E777822A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift */; }; - 090E778622A9B95A00CD99F5 /* PeopleNearbyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E778522A9B95A00CD99F5 /* PeopleNearbyController.swift */; }; - 090E778822A9B96100CD99F5 /* PeopleNearbyHeaderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E778722A9B96000CD99F5 /* PeopleNearbyHeaderItem.swift */; }; + 090E778622A9B95A00CD99F5 /* PeersNearbyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E778522A9B95A00CD99F5 /* PeersNearbyController.swift */; }; + 090E778822A9B96100CD99F5 /* PeersNearbyHeaderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E778722A9B96000CD99F5 /* PeersNearbyHeaderItem.swift */; }; 090E778A22A9F23C00CD99F5 /* ChannelOwnershipTransferController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E778922A9F23C00CD99F5 /* ChannelOwnershipTransferController.swift */; }; 090E778C22AA842300CD99F5 /* anim_success.json in Resources */ = {isa = PBXBuildFile; fileRef = 090E778B22AA842200CD99F5 /* anim_success.json */; }; - 090E778E22AA863A00CD99F5 /* PeopleNearbyIconNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E778D22AA863A00CD99F5 /* PeopleNearbyIconNode.swift */; }; + 090E778E22AA863A00CD99F5 /* PeersNearbyIconNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090E778D22AA863A00CD99F5 /* PeersNearbyIconNode.swift */; }; 0910B0ED21FA178C00F8F87D /* WallpaperPreviewMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0910B0EC21FA178C00F8F87D /* WallpaperPreviewMedia.swift */; }; 0910B0EF21FA532D00F8F87D /* WallpaperResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0910B0EE21FA532D00F8F87D /* WallpaperResources.swift */; }; 0910B0F121FB3DE100F8F87D /* WallpaperPatternPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0910B0F021FB3DE100F8F87D /* WallpaperPatternPanelNode.swift */; }; @@ -36,14 +36,12 @@ 091954792294754E00E11046 /* AnimatedStickerUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091954782294754E00E11046 /* AnimatedStickerUtils.swift */; }; 0919547B2294788200E11046 /* AnimatedStickerVideoCompositor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0919547A2294788200E11046 /* AnimatedStickerVideoCompositor.swift */; }; 091BEAB3214552D9003AEA30 /* Vision.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02DADBE2138D76F00116225 /* Vision.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 0921F5FF228B09D2001A13D7 /* GZip.m in Sources */ = {isa = PBXBuildFile; fileRef = 0921F5FC228B01B6001A13D7 /* GZip.m */; }; 0921F60B228C8765001A13D7 /* ItemListPlaceholderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0921F60A228C8765001A13D7 /* ItemListPlaceholderItem.swift */; }; 0921F60E228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0921F60D228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift */; }; 092F368D2154AAEA001A9F49 /* SFCompactRounded-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 092F368C2154AAE9001A9F49 /* SFCompactRounded-Semibold.otf */; }; 092F36902157AB46001A9F49 /* ItemListCallListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F368F2157AB46001A9F49 /* ItemListCallListItem.swift */; }; 09310D32213ED5FC0020033A /* anim_ungroup.json in Resources */ = {isa = PBXBuildFile; fileRef = 09310D1A213BC5DE0020033A /* anim_ungroup.json */; }; 09310D33213ED5FC0020033A /* anim_group.json in Resources */ = {isa = PBXBuildFile; fileRef = 09310D1B213BC5DE0020033A /* anim_group.json */; }; - 0935F8EF22197FBF0070AE70 /* LegacyAutomaticMediaDownloadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0935F8EE22197FBF0070AE70 /* LegacyAutomaticMediaDownloadSettings.swift */; }; 0941A9A0210B057200EBE194 /* OpenInActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A99F210B057200EBE194 /* OpenInActionSheetController.swift */; }; 0941A9A4210B0E2E00EBE194 /* OpenInAppIconResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A9A3210B0E2E00EBE194 /* OpenInAppIconResources.swift */; }; 0941A9A6210B822D00EBE194 /* OpenInOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A9A5210B822D00EBE194 /* OpenInOptions.swift */; }; @@ -62,7 +60,6 @@ 0947FCAE224043450086741C /* SettingsSearchRecentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0947FCAD224043450086741C /* SettingsSearchRecentItem.swift */; }; 0947FCB0224055990086741C /* StringHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0947FCAF224055990086741C /* StringHash.swift */; }; 0952D1752176DEB500194860 /* NotificationMuteSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0952D1742176DEB500194860 /* NotificationMuteSettingsController.swift */; }; - 0952D1772177FB5400194860 /* WatchPresetSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0952D1762177FB5400194860 /* WatchPresetSettings.swift */; }; 0958FBB9218AD6AF00E0CBD8 /* InstantPageFeedbackItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0958FBB8218AD6AF00E0CBD8 /* InstantPageFeedbackItem.swift */; }; 0958FBBB218AD6BC00E0CBD8 /* InstantPageFeedbackNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0958FBBA218AD6BC00E0CBD8 /* InstantPageFeedbackNode.swift */; }; 0958FBBD218B03CA00E0CBD8 /* InstantPageDetailsNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0958FBBC218B03CA00E0CBD8 /* InstantPageDetailsNode.swift */; }; @@ -77,13 +74,7 @@ 0962E67721B673AF00245FD9 /* Permission.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67621B673AF00245FD9 /* Permission.swift */; }; 0962E67921B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67821B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift */; }; 0962E67B21BA00C900245FD9 /* WebSearchInterfaceState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67A21BA00C900245FD9 /* WebSearchInterfaceState.swift */; }; - 0962E67D21BA048D00245FD9 /* WebSearchSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67C21BA048D00245FD9 /* WebSearchSettings.swift */; }; 0962E67F21BA786A00245FD9 /* WebSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0962E67E21BA786A00245FD9 /* WebSearchItem.swift */; }; - 096C98BA21787A5C00C211FF /* LegacyBridgeAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 096C98B921787A5C00C211FF /* LegacyBridgeAudio.swift */; }; - 096C98BF21787C6700C211FF /* TGBridgeAudioEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 096C98BB21787C6600C211FF /* TGBridgeAudioEncoder.m */; }; - 096C98C021787C6700C211FF /* TGBridgeAudioEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 096C98BC21787C6600C211FF /* TGBridgeAudioEncoder.h */; }; - 096C98C121787C6700C211FF /* TGBridgeAudioDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 096C98BD21787C6700C211FF /* TGBridgeAudioDecoder.h */; }; - 096C98C221787C6700C211FF /* TGBridgeAudioDecoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 096C98BE21787C6700C211FF /* TGBridgeAudioDecoder.mm */; }; 09749BC521F0E024008FDDE9 /* StickersChatInputContextPanelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09749BC421F0E024008FDDE9 /* StickersChatInputContextPanelItem.swift */; }; 09749BC921F1BBA1008FDDE9 /* CallFeedbackController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09749BC821F1BBA1008FDDE9 /* CallFeedbackController.swift */; }; 09749BCD21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09749BCC21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift */; }; @@ -102,6 +93,7 @@ 09874E5721078FA100E190B8 /* YoutubeUserScript.js in Resources */ = {isa = PBXBuildFile; fileRef = 0979788121065F8B0077D77F /* YoutubeUserScript.js */; }; 09874E582107A4C300E190B8 /* VimeoEmbedImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09874E3A21075BF400E190B8 /* VimeoEmbedImplementation.swift */; }; 09874E592107BD4100E190B8 /* GenericEmbedImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09874E4021075C1700E190B8 /* GenericEmbedImplementation.swift */; }; + 098CF79222B924E200AF6134 /* ThemeSettingsAccentColorItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 098CF79122B924E200AF6134 /* ThemeSettingsAccentColorItem.swift */; }; 099529AA21CDB27900805E13 /* ShareProxyServerActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529A921CDB27900805E13 /* ShareProxyServerActionSheetController.swift */; }; 099529AC21CDBBB200805E13 /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529AB21CDBBB200805E13 /* QRCode.swift */; }; 099529B021D2123E00805E13 /* ChatMessageUnsupportedBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099529AF21D2123E00805E13 /* ChatMessageUnsupportedBubbleContentNode.swift */; }; @@ -208,7 +200,6 @@ 9F06830B21A404C4001D8EDB /* NotificationExceptionSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F06830A21A404C4001D8EDB /* NotificationExceptionSettingsController.swift */; }; D000CABA21EE130D0011B15D /* MapResourceToAvatarSizes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D000CAB921EE130D0011B15D /* MapResourceToAvatarSizes.swift */; }; D000CABC21F158AD0011B15D /* PrepareSecretThumbnailData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D000CABB21F158AD0011B15D /* PrepareSecretThumbnailData.swift */; }; - D005808B21CAB8F000CB7CD3 /* VoipDerivedState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D005808A21CAB8F000CB7CD3 /* VoipDerivedState.swift */; }; D00580B321E4B51600CB7CD3 /* DeleteChatPeerActionSheetItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00580B221E4B51600CB7CD3 /* DeleteChatPeerActionSheetItem.swift */; }; D00580B621E4C02100CB7CD3 /* UndoOverlayController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00580B521E4C02100CB7CD3 /* UndoOverlayController.swift */; }; D00580B821E4C03400CB7CD3 /* UndoOverlayControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00580B721E4C03400CB7CD3 /* UndoOverlayControllerNode.swift */; }; @@ -218,10 +209,43 @@ D00701A12029F6D0006B9E34 /* TGMimeTypeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = D007019F2029F6D0006B9E34 /* TGMimeTypeMap.h */; }; D00701A22029F6D0006B9E34 /* TGMimeTypeMap.m in Sources */ = {isa = PBXBuildFile; fileRef = D00701A02029F6D0006B9E34 /* TGMimeTypeMap.m */; }; D00781052084DFB100369A39 /* UrlEscaping.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00781042084DFB100369A39 /* UrlEscaping.swift */; }; + D008177922B46B7E008A895F /* ShareItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = D008177222B46B7D008A895F /* ShareItems.swift */; }; + D008177A22B46B7E008A895F /* TGShareLocationSignals.h in Headers */ = {isa = PBXBuildFile; fileRef = D008177322B46B7E008A895F /* TGShareLocationSignals.h */; }; + D008177B22B46B7E008A895F /* TGContactModel.h in Headers */ = {isa = PBXBuildFile; fileRef = D008177422B46B7E008A895F /* TGContactModel.h */; }; + D008177C22B46B7E008A895F /* TGItemProviderSignals.h in Headers */ = {isa = PBXBuildFile; fileRef = D008177522B46B7E008A895F /* TGItemProviderSignals.h */; }; + D008177D22B46B7E008A895F /* TGContactModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D008177622B46B7E008A895F /* TGContactModel.m */; }; + D008177E22B46B7E008A895F /* TGItemProviderSignals.m in Sources */ = {isa = PBXBuildFile; fileRef = D008177722B46B7E008A895F /* TGItemProviderSignals.m */; }; + D008177F22B46B7E008A895F /* TGShareLocationSignals.m in Sources */ = {isa = PBXBuildFile; fileRef = D008177822B46B7E008A895F /* TGShareLocationSignals.m */; }; + D008178222B47464008A895F /* NotificationContentContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D008178122B47464008A895F /* NotificationContentContext.swift */; }; + D00817CA22B47A14008A895F /* WatchRequestHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B022B47A12008A895F /* WatchRequestHandlers.swift */; }; + D00817CB22B47A14008A895F /* WatchBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B122B47A12008A895F /* WatchBridge.swift */; }; + D00817CC22B47A14008A895F /* WatchCommunicationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B222B47A12008A895F /* WatchCommunicationManager.swift */; }; + D00817CD22B47A14008A895F /* TGAutoDownloadPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817B322B47A12008A895F /* TGAutoDownloadPreferences.h */; }; + D00817CE22B47A14008A895F /* TGProxyItem.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817B422B47A12008A895F /* TGProxyItem.h */; }; + D00817CF22B47A14008A895F /* LegacyFileImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B522B47A12008A895F /* LegacyFileImport.swift */; }; + D00817D022B47A14008A895F /* WakeupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B622B47A12008A895F /* WakeupManager.swift */; }; + D00817D122B47A14008A895F /* LegacyDataImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B722B47A12008A895F /* LegacyDataImport.swift */; }; + D00817D222B47A14008A895F /* LegacyPreferencesImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B822B47A12008A895F /* LegacyPreferencesImport.swift */; }; + D00817D322B47A14008A895F /* LegacyResourceImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817B922B47A12008A895F /* LegacyResourceImport.swift */; }; + D00817D422B47A14008A895F /* LegacyUserDataImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817BA22B47A12008A895F /* LegacyUserDataImport.swift */; }; + D00817D522B47A14008A895F /* ApplicationShortcutItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817BB22B47A13008A895F /* ApplicationShortcutItem.swift */; }; + D00817D622B47A14008A895F /* TGProxyItem.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817BC22B47A13008A895F /* TGProxyItem.m */; }; + D00817D722B47A14008A895F /* TGBridgeServer.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817BD22B47A13008A895F /* TGBridgeServer.h */; }; + D00817D822B47A14008A895F /* TGAutoDownloadPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817BE22B47A13008A895F /* TGAutoDownloadPreferences.m */; }; + D00817D922B47A14008A895F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817BF22B47A13008A895F /* AppDelegate.swift */; }; + D00817DA22B47A14008A895F /* TGPresentationAutoNightPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817C022B47A13008A895F /* TGPresentationAutoNightPreferences.h */; }; + D00817DB22B47A14008A895F /* LegacyChatImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817C122B47A13008A895F /* LegacyChatImport.swift */; }; + D00817DC22B47A14008A895F /* ManageSharedAccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817C222B47A13008A895F /* ManageSharedAccountInfo.swift */; }; + D00817DD22B47A14008A895F /* LockedWindowCoveringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817C322B47A13008A895F /* LockedWindowCoveringView.swift */; }; + D00817DE22B47A14008A895F /* TGBridgeServer.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817C422B47A13008A895F /* TGBridgeServer.m */; }; + D00817DF22B47A14008A895F /* LegacyDataImportSplash.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00817C522B47A13008A895F /* LegacyDataImportSplash.swift */; }; + D00817E022B47A14008A895F /* UIImage+ImageEffects.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817C622B47A13008A895F /* UIImage+ImageEffects.h */; }; + D00817E222B47A14008A895F /* UIImage+ImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817C822B47A14008A895F /* UIImage+ImageEffects.m */; }; + D00817E322B47A14008A895F /* TGPresentationAutoNightPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817C922B47A14008A895F /* TGPresentationAutoNightPreferences.m */; }; + D008184A22B57225008A895F /* WatchCommon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008184922B57225008A895F /* WatchCommon.framework */; }; + D00818CD22B595CB008A895F /* LightweightAccountData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00818CC22B595CB008A895F /* LightweightAccountData.framework */; }; D00ACA4B20222C280045D427 /* libtgvoip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00ACA4C20222C280045D427 /* libtgvoip.framework */; }; D00ACA5A2022897D0045D427 /* ProcessedPeerRestrictionText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */; }; - D00ADFD91EBA2E9D00873D2E /* OngoingCallThreadLocalContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D0EC6FFA1EBA1DE900EBF1C3 /* OngoingCallThreadLocalContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D00ADFDB1EBA2EAF00873D2E /* OngoingCallContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ADFDA1EBA2EAF00873D2E /* OngoingCallContext.swift */; }; D00ADFDD1EBB73C200873D2E /* OverlayMediaManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ADFDC1EBB73C200873D2E /* OverlayMediaManager.swift */; }; D00BDA1F1EE5B69200C64C5E /* ChannelAdminController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BDA1E1EE5B69200C64C5E /* ChannelAdminController.swift */; }; D00BED201F73F60F00922292 /* ShareSearchContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00BED1F1F73F60F00922292 /* ShareSearchContainerNode.swift */; }; @@ -236,6 +260,11 @@ D0147BA7206E8B4F00E40378 /* SecureIdAuthAcceptNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0147BA6206E8B4F00E40378 /* SecureIdAuthAcceptNode.swift */; }; D0147BA9206EA35000E40378 /* SecureIdDocumentGalleryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0147BA8206EA35000E40378 /* SecureIdDocumentGalleryController.swift */; }; D0147BAB206EA6C100E40378 /* SecureIdDocumentImageGalleryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0147BAA206EA6C100E40378 /* SecureIdDocumentImageGalleryItem.swift */; }; + D01590A622BD460C0017C33E /* MetalAnimationRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01590A522BD460C0017C33E /* MetalAnimationRenderer.swift */; }; + D01590A822BD462C0017C33E /* SoftwareAnimationRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01590A722BD462C0017C33E /* SoftwareAnimationRenderer.swift */; }; + D01590AB22BD467B0017C33E /* AnimationRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01590AA22BD467B0017C33E /* AnimationRenderer.swift */; }; + D01590AE22BD58AD0017C33E /* YUV.h in Headers */ = {isa = PBXBuildFile; fileRef = D01590AC22BD58AD0017C33E /* YUV.h */; }; + D01590AF22BD58AD0017C33E /* YUV.m in Sources */ = {isa = PBXBuildFile; fileRef = D01590AD22BD58AD0017C33E /* YUV.m */; }; D015E04F225D2E5900CB9E8A /* WebP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D015E04E225D2E5900CB9E8A /* WebP.framework */; }; D017734C22049BF800DA06A7 /* UpgradedAccounts.swift in Sources */ = {isa = PBXBuildFile; fileRef = D017734B22049BF800DA06A7 /* UpgradedAccounts.swift */; }; D01776B31F1D69A80044446D /* RadialStatusNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01776B21F1D69A80044446D /* RadialStatusNode.swift */; }; @@ -293,19 +322,15 @@ D02D60B1206C189900FEFE1E /* SecureIdPlaintextFormController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02D60B0206C189900FEFE1E /* SecureIdPlaintextFormController.swift */; }; D02D60B3206C18A600FEFE1E /* SecureIdPlaintextFormControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02D60B2206C18A600FEFE1E /* SecureIdPlaintextFormControllerNode.swift */; }; D02D60C8206E705D00FEFE1E /* SecureIdValueFormPhoneItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02D60C7206E705D00FEFE1E /* SecureIdValueFormPhoneItem.swift */; }; + D02D634A22B85B94006BE519 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D02D634922B85B94006BE519 /* PushKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; D02F4AE91FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02F4AE81FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift */; }; D02F4AF01FD4C46D004DFBAE /* SystemVideoContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02F4AEF1FD4C46D004DFBAE /* SystemVideoContent.swift */; }; + D035734B22B5CCCA00F0920D /* LegacyBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734A22B5CCCA00F0920D /* LegacyBuffer.swift */; }; D0380DA9204E9C81000414AB /* SecretMediaPreviewFooterContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0380DA8204E9C81000414AB /* SecretMediaPreviewFooterContentNode.swift */; }; D0380DAB204EA72F000414AB /* RadialStatusSecretTimeoutContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0380DAA204EA72F000414AB /* RadialStatusSecretTimeoutContentNode.swift */; }; D0380DAD204ED434000414AB /* LegacyLiveUploadInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0380DAC204ED434000414AB /* LegacyLiveUploadInterface.swift */; }; D0380DB8204EE0A5000414AB /* ChatInstantVideoMessageDurationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0380DB7204EE0A5000414AB /* ChatInstantVideoMessageDurationNode.swift */; }; D0383ED4207CFBB900C45548 /* GalleryThumbnailContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0383ED3207CFBB900C45548 /* GalleryThumbnailContainerNode.swift */; }; - D0383EDC207D1A1600C45548 /* emoji_suggestions_data.h in Headers */ = {isa = PBXBuildFile; fileRef = D0383ED6207D1A1500C45548 /* emoji_suggestions_data.h */; }; - D0383EDD207D1A1600C45548 /* TGEmojiSuggestions.h in Headers */ = {isa = PBXBuildFile; fileRef = D0383ED7207D1A1500C45548 /* TGEmojiSuggestions.h */; }; - D0383EDE207D1A1600C45548 /* emoji_suggestions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0383ED8207D1A1600C45548 /* emoji_suggestions.cpp */; }; - D0383EDF207D1A1600C45548 /* emoji_suggestions_data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0383ED9207D1A1600C45548 /* emoji_suggestions_data.cpp */; }; - D0383EE0207D1A1600C45548 /* TGEmojiSuggestions.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0383EDA207D1A1600C45548 /* TGEmojiSuggestions.mm */; }; - D0383EE1207D1A1600C45548 /* emoji_suggestions.h in Headers */ = {isa = PBXBuildFile; fileRef = D0383EDB207D1A1600C45548 /* emoji_suggestions.h */; }; D0383EE4207D292800C45548 /* EmojisChatInputContextPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0383EE3207D292800C45548 /* EmojisChatInputContextPanelNode.swift */; }; D0383EE6207D299600C45548 /* EmojisChatInputPanelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0383EE5207D299600C45548 /* EmojisChatInputPanelItem.swift */; }; D039FB152170D99D00BD1BAD /* RadialCloudProgressContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D039FB142170D99D00BD1BAD /* RadialCloudProgressContentNode.swift */; }; @@ -313,6 +338,8 @@ D03AA4DF202DBF6F0056C405 /* ChatContextResultPeekContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03AA4DE202DBF6F0056C405 /* ChatContextResultPeekContentNode.swift */; }; D03AA4E5202DF8840056C405 /* StickerPreviewPeekContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03AA4E4202DF8840056C405 /* StickerPreviewPeekContent.swift */; }; D03AA4E7202DFB160056C405 /* ItemListEditableReorderControlNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03AA4E6202DFB160056C405 /* ItemListEditableReorderControlNode.swift */; }; + D03AE67322B9459C0078411C /* HockeySDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03AE67222B9459C0078411C /* HockeySDK.framework */; }; + D03AE67522B945D30078411C /* BuildConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03AE67422B945D30078411C /* BuildConfig.framework */; }; D04203152037162700490EA5 /* MediaInputPaneTrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04203142037162700490EA5 /* MediaInputPaneTrendingItem.swift */; }; D04281ED200E3B28009DDE36 /* ItemListControllerSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04281EC200E3B28009DDE36 /* ItemListControllerSearch.swift */; }; D04281EF200E3D88009DDE36 /* GroupInfoSearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04281EE200E3D88009DDE36 /* GroupInfoSearchItem.swift */; }; @@ -327,7 +354,6 @@ D0430B001FF4570500A35ADD /* WebController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0430AFF1FF4570500A35ADD /* WebController.swift */; }; D0430B021FF4584100A35ADD /* WebControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0430B011FF4584100A35ADD /* WebControllerNode.swift */; }; D0439B5B228EC4A00067E026 /* ChatMessagePhoneNumberRequestContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0439B5A228EC4A00067E026 /* ChatMessagePhoneNumberRequestContentNode.swift */; }; - D044A0F320BDA05800326FAC /* ThrottledValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D044A0F220BDA05800326FAC /* ThrottledValue.swift */; }; D044A0FB20BDC40C00326FAC /* CachedChannelAdmins.swift in Sources */ = {isa = PBXBuildFile; fileRef = D044A0FA20BDC40C00326FAC /* CachedChannelAdmins.swift */; }; D04554A421B42982007A6DD9 /* ConfirmPhoneNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04554A321B42982007A6DD9 /* ConfirmPhoneNumberController.swift */; }; D046142E2004DB3700EC0EF2 /* LiveLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D046142D2004DB3700EC0EF2 /* LiveLocationManager.swift */; }; @@ -351,7 +377,6 @@ D0477D1F1F619E0700412B44 /* GalleryVideoDecoration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0477D1E1F619E0700412B44 /* GalleryVideoDecoration.swift */; }; D0477D211F61A47600412B44 /* UniversalVideoContentManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0477D201F61A47600412B44 /* UniversalVideoContentManager.swift */; }; D048B339203C532800038D05 /* ChatMediaInputPane.swift in Sources */ = {isa = PBXBuildFile; fileRef = D048B338203C532800038D05 /* ChatMediaInputPane.swift */; }; - D048B33B203C777500038D05 /* RenderedTotalUnreadCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = D048B33A203C777500038D05 /* RenderedTotalUnreadCount.swift */; }; D048EA851F4F295300188713 /* InstantPageSettingsBacklightItemNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D048EA841F4F295300188713 /* InstantPageSettingsBacklightItemNode.swift */; }; D048EA871F4F296400188713 /* InstantPageSettingsFontSizeItemNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D048EA861F4F296400188713 /* InstantPageSettingsFontSizeItemNode.swift */; }; D048EA891F4F297500188713 /* InstantPageSettingsFontFamilyItemNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D048EA881F4F297500188713 /* InstantPageSettingsFontFamilyItemNode.swift */; }; @@ -371,7 +396,6 @@ D05677511F4CA0C2001B723E /* InstantPagePeerReferenceItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05677501F4CA0C2001B723E /* InstantPagePeerReferenceItem.swift */; }; D05677531F4CA0D0001B723E /* InstantPagePeerReferenceNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05677521F4CA0D0001B723E /* InstantPagePeerReferenceNode.swift */; }; D056CD701FF147B000880D28 /* IconButtonNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056CD6F1FF147B000880D28 /* IconButtonNode.swift */; }; - D056CD721FF1569800880D28 /* MusicPlaybackSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056CD711FF1569800880D28 /* MusicPlaybackSettings.swift */; }; D056CD741FF2996B00880D28 /* ExternalMusicAlbumArtResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056CD731FF2996B00880D28 /* ExternalMusicAlbumArtResources.swift */; }; D056CD761FF2A30900880D28 /* ChatSwipeToReplyRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056CD751FF2A30900880D28 /* ChatSwipeToReplyRecognizer.swift */; }; D056CD781FF2A6EE00880D28 /* ChatMessageSwipeToReplyNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056CD771FF2A6EE00880D28 /* ChatMessageSwipeToReplyNode.swift */; }; @@ -388,9 +412,6 @@ D0642EFC1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0642EFB1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift */; }; D064EF871F69A06F00AC0398 /* MessageContentKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = D064EF861F69A06F00AC0398 /* MessageContentKind.swift */; }; D0671F2D2145AB28000A8AE7 /* LegacyAvatarPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0671F2C2145AB28000A8AE7 /* LegacyAvatarPicker.swift */; }; - D067B4A5211C911C00796039 /* LegacyChannelIntroController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D067B4A4211C911C00796039 /* LegacyChannelIntroController.swift */; }; - D067B4AA211C916300796039 /* TGChannelIntroController.h in Headers */ = {isa = PBXBuildFile; fileRef = D067B4A6211C916200796039 /* TGChannelIntroController.h */; }; - D067B4AD211C916300796039 /* TGChannelIntroController.m in Sources */ = {isa = PBXBuildFile; fileRef = D067B4A9211C916200796039 /* TGChannelIntroController.m */; }; D0684A041F6C3AD50059F570 /* ChatListTypingNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0684A031F6C3AD50059F570 /* ChatListTypingNode.swift */; }; D06887F01F72DEE6000AB936 /* ShareInputFieldNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06887EF1F72DEE6000AB936 /* ShareInputFieldNode.swift */; }; D069F5D0212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D069F5CF212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift */; }; @@ -404,17 +425,22 @@ D06E4C312134910400088087 /* ChatListEmptyNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E4C302134910400088087 /* ChatListEmptyNode.swift */; }; D06E4C332134A59700088087 /* ThemeAccentColorActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E4C322134A59700088087 /* ThemeAccentColorActionSheet.swift */; }; D06E4C352134AE3C00088087 /* ThemeAutoNightSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06E4C342134AE3C00088087 /* ThemeAutoNightSettingsController.swift */; }; - D06ECFCB20B8448E00C576C2 /* ContactSynchronizationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06ECFCA20B8448E00C576C2 /* ContactSynchronizationSettings.swift */; }; D06F1EA41F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06F1EA31F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift */; }; - D06F31E12135829B001A0F12 /* EDSunriseSet.m in Sources */ = {isa = PBXBuildFile; fileRef = D06F31DF2135829A001A0F12 /* EDSunriseSet.m */; }; - D06F31E22135829B001A0F12 /* EDSunriseSet.h in Headers */ = {isa = PBXBuildFile; fileRef = D06F31E02135829A001A0F12 /* EDSunriseSet.h */; }; D06F31E4213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06F31E3213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift */; }; D06F31E62135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06F31E52135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift */; }; - D073D2DB1FB61DA9009E1DA2 /* CallListSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D073D2DA1FB61DA9009E1DA2 /* CallListSettings.swift */; }; + 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 */; }; + D0750C7E22B2A14300BE5F6E /* TelegramVoip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0750C7D22B2A14300BE5F6E /* TelegramVoip.framework */; }; + D0750C8222B2E4EE00BE5F6E /* SharedWakeupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C8022B2E4EE00BE5F6E /* SharedWakeupManager.swift */; }; + D0750C8322B2E4EE00BE5F6E /* SharedNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C8122B2E4EE00BE5F6E /* SharedNotificationManager.swift */; }; + D0750C8522B2E52400BE5F6E /* ClearNotificationsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C8422B2E52300BE5F6E /* ClearNotificationsManager.swift */; }; + D0750C8722B2E76300BE5F6E /* ShareExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C8622B2E76300BE5F6E /* ShareExtensionContext.swift */; }; D0754D1E1EEDDF6200884F6E /* ChatMessageAttachedContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0754D1D1EEDDF6200884F6E /* ChatMessageAttachedContentNode.swift */; }; D0754D201EEDEBA000884F6E /* ChatMessageGameBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0754D1F1EEDEBA000884F6E /* ChatMessageGameBubbleContentNode.swift */; }; D0754D221EEDF89900884F6E /* ChatMessageInvoiceBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0754D211EEDF89900884F6E /* ChatMessageInvoiceBubbleContentNode.swift */; }; D0754D271EEE10C800884F6E /* BotCheckoutController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0754D261EEE10C800884F6E /* BotCheckoutController.swift */; }; + D077C5C122B59A800097D617 /* ApplicationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D077C5C022B59A800097D617 /* ApplicationContext.swift */; }; D079FCD91F05A5550038FADE /* BotCheckoutPasswordEntryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCD81F05A5550038FADE /* BotCheckoutPasswordEntryController.swift */; }; D079FCDD1F05C4F20038FADE /* LocalAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCDC1F05C4F20038FADE /* LocalAuth.swift */; }; D079FCDF1F05C9280038FADE /* BotReceiptController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCDE1F05C9280038FADE /* BotReceiptController.swift */; }; @@ -438,15 +464,11 @@ D08803C51F6064CF00DD7951 /* TelegramUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D0FC40821D5B8E7400261D9D /* TelegramUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; D08984EE2114964700918162 /* GroupPreHistorySetupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08984ED2114964700918162 /* GroupPreHistorySetupController.swift */; }; D08984F02114AE0C00918162 /* DataPrivacySettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08984EF2114AE0C00918162 /* DataPrivacySettingsController.swift */; }; - D089F78A1F4E0C14000E934D /* InstantPagePresentationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D089F7891F4E0C14000E934D /* InstantPagePresentationSettings.swift */; }; - D08A10BB211DF7A80077488B /* StickerSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08A10BA211DF7A80077488B /* StickerSettings.swift */; }; D08BDF641FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08BDF631FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift */; }; D08BDF661FA8CB10009D08E1 /* EditSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08BDF651FA8CB10009D08E1 /* EditSettingsController.swift */; }; D08D7E79209FA2930005D80C /* SecureIdValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08D7E78209FA2930005D80C /* SecureIdValues.swift */; }; - D08D7E8420A0F6020005D80C /* ExperimentalUISettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08D7E8320A0F6020005D80C /* ExperimentalUISettings.swift */; }; D091C7A41F8EBB1E00D7DE13 /* ChatPresentationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D091C7A31F8EBB1E00D7DE13 /* ChatPresentationData.swift */; }; D091C7A61F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D091C7A51F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift */; }; - D09250041FE5363D003F693F /* ExperimentalSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09250031FE5363D003F693F /* ExperimentalSettings.swift */; }; D09250061FE5371D003F693F /* GlobalExperimentalSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09250051FE5371D003F693F /* GlobalExperimentalSettings.swift */; }; D09394132007F5BB00997F31 /* LocationBroadcastNavigationAccessoryPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09394122007F5BB00997F31 /* LocationBroadcastNavigationAccessoryPanel.swift */; }; D093D7D92062A9CA00BC3599 /* SecureIdAuthControllerState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D093D7D82062A9CA00BC3599 /* SecureIdAuthControllerState.swift */; }; @@ -481,7 +503,6 @@ D09E63B01F1010FE003444CD /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E63AF1F1010FE003444CD /* Contacts.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; D09E63B21F11289A003444CD /* PassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E63B11F11289A003444CD /* PassKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; D09F9DCF20768DAF00DB4DE1 /* SecureIdLocalResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09F9DCE20768DAF00DB4DE1 /* SecureIdLocalResource.swift */; }; - D0A24D281F92C27100584D24 /* DefaultDarkAccentPresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A24D271F92C27100584D24 /* DefaultDarkAccentPresentationTheme.swift */; }; D0A723541FC3B40E0094D167 /* RadialCheckContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A723531FC3B40E0094D167 /* RadialCheckContentNode.swift */; }; D0A8998D217A294100759EE6 /* SaveIncomingMediaController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A8998C217A294100759EE6 /* SaveIncomingMediaController.swift */; }; D0A8BBA11F61EE83000F03FD /* UniversalVideoGalleryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A8BBA01F61EE83000F03FD /* UniversalVideoGalleryItem.swift */; }; @@ -498,6 +519,15 @@ D0AD02EA1FFFEBEF00C1DCFF /* ChatMessageLiveLocationTextNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AD02E91FFFEBEF00C1DCFF /* ChatMessageLiveLocationTextNode.swift */; }; D0AD02EC20000D0100C1DCFF /* ChatMessageLiveLocationPositionNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AD02EB20000D0100C1DCFF /* ChatMessageLiveLocationPositionNode.swift */; }; D0ADF966212E05A300310BBC /* TonePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ADF965212E05A300310BBC /* TonePlayer.swift */; }; + D0AE303522B1D3620058D3BC /* TGBridgeAudioEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = D0AE2FDC22B1D3610058D3BC /* TGBridgeAudioEncoder.m */; }; + D0AE303622B1D3620058D3BC /* TGBridgeAudioDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE2FDD22B1D3610058D3BC /* TGBridgeAudioDecoder.h */; }; + D0AE303722B1D3620058D3BC /* TGBridgeAudioEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE2FDE22B1D3610058D3BC /* TGBridgeAudioEncoder.h */; }; + D0AE303822B1D3620058D3BC /* TGBridgeAudioDecoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0AE2FDF22B1D3610058D3BC /* TGBridgeAudioDecoder.mm */; }; + D0AE303922B1D3620058D3BC /* LegacyBridgeAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE2FE022B1D3610058D3BC /* LegacyBridgeAudio.swift */; }; + D0AE30CF22B1D9980058D3BC /* RMIntro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE30CE22B1D9980058D3BC /* RMIntro.framework */; }; + D0AE30EB22B1DBD10058D3BC /* GZip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE30EA22B1DBD10058D3BC /* GZip.framework */; }; + D0AE311222B1DD4D0058D3BC /* TelegramCallsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE311122B1DD4D0058D3BC /* TelegramCallsUI.framework */; }; + D0AE315422B1DEE30058D3BC /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE315322B1DEE30058D3BC /* TelegramUIPreferences.framework */; }; D0AEAE252080D6830013176E /* PaneSearchContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AEAE242080D6830013176E /* PaneSearchContainerNode.swift */; }; D0AEAE272080D6970013176E /* PaneSearchBarNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AEAE262080D6970013176E /* PaneSearchBarNode.swift */; }; D0AEAE292080FD660013176E /* StickerPaneSearchGlobaltem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AEAE282080FD660013176E /* StickerPaneSearchGlobaltem.swift */; }; @@ -509,7 +539,6 @@ D0B21B17220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B16220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift */; }; D0B21B1F22156D92003F741D /* LegacyCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B1E22156D92003F741D /* LegacyCache.swift */; }; D0B21B212215B539003F741D /* LogoutOptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B21B202215B539003F741D /* LogoutOptionsController.swift */; }; - D0B2F76220506E2A00D3BFB9 /* MediaInputSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B2F76120506E2A00D3BFB9 /* MediaInputSettings.swift */; }; D0B2F76820528E3D00D3BFB9 /* UserInfoEditingPhoneActionItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B2F76720528E3D00D3BFB9 /* UserInfoEditingPhoneActionItem.swift */; }; D0B2F76A2052920D00D3BFB9 /* UserInfoEditingPhoneItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B2F7692052920D00D3BFB9 /* UserInfoEditingPhoneItem.swift */; }; D0B2F76C2052A7D600D3BFB9 /* SinglePhoneInputNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B2F76B2052A7D600D3BFB9 /* SinglePhoneInputNode.swift */; }; @@ -522,9 +551,7 @@ D0B3AC802142E2E900CD1374 /* ResetPasswordController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B3AC7F2142E2E900CD1374 /* ResetPasswordController.swift */; }; D0B4AF861EC111FA00D51FF6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D0AB0BBA1D6719B5002C78E7 /* Images.xcassets */; }; D0B4AF881EC112EE00D51FF6 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B4AF871EC112ED00D51FF6 /* CallKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - D0B4AF8B1EC1133600D51FF6 /* CallKitIntergation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B4AF8A1EC1133600D51FF6 /* CallKitIntergation.swift */; }; D0B69C3920EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B69C3820EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift */; }; - D0B69C3C20EBD8C8003632C7 /* CheckDeviceAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B69C3B20EBD8C8003632C7 /* CheckDeviceAccess.swift */; }; D0B85C1C1FF6F76000E795B4 /* AuthorizationSequencePasswordRecoveryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B85C1B1FF6F76000E795B4 /* AuthorizationSequencePasswordRecoveryController.swift */; }; D0B85C1E1FF6F76600E795B4 /* AuthorizationSequencePasswordRecoveryControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B85C1D1FF6F76600E795B4 /* AuthorizationSequencePasswordRecoveryControllerNode.swift */; }; D0B85C211FF70BEC00E795B4 /* AuthorizationSequenceAwaitingAccountResetControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B85C201FF70BEC00E795B4 /* AuthorizationSequenceAwaitingAccountResetControllerNode.swift */; }; @@ -570,7 +597,6 @@ D0CE6F70213EEE5000BCD44B /* CreatePasswordController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE6F6F213EEE5000BCD44B /* CreatePasswordController.swift */; }; D0CE8CE51F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE8CE41F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift */; }; D0CE8CE71F6F35A300AA2DB0 /* ChatTextInputPanelState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE8CE61F6F35A300AA2DB0 /* ChatTextInputPanelState.swift */; }; - D0CE8CEC1F6FCCA300AA2DB0 /* TransformImageArguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CE8CEB1F6FCCA300AA2DB0 /* TransformImageArguments.swift */; }; D0CFBB861FD715E700B65C0D /* LegacyHTTPOperationImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFBB851FD715E700B65C0D /* LegacyHTTPOperationImpl.swift */; }; D0CFBB911FD881A600B65C0D /* AudioRecordningToneData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFBB901FD881A600B65C0D /* AudioRecordningToneData.swift */; }; D0CFBB951FD8B05000B65C0D /* OverlayInstantVideoDecoration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFBB941FD8B05000B65C0D /* OverlayInstantVideoDecoration.swift */; }; @@ -602,7 +628,6 @@ D0E8175720122DAD00B82BBB /* ChatRecentActionsSearchNavigationContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8175620122DAD00B82BBB /* ChatRecentActionsSearchNavigationContentNode.swift */; }; D0E8175920122FE100B82BBB /* ChatRecentActionsFilterController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8175820122FE100B82BBB /* ChatRecentActionsFilterController.swift */; }; D0E8175B201254FA00B82BBB /* ChatRecentActionsEmptyNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8175A201254FA00B82BBB /* ChatRecentActionsEmptyNode.swift */; }; - D0E8B8A72044339500605593 /* PresentationCallToneData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8B8A62044339500605593 /* PresentationCallToneData.swift */; }; D0E8B8B9204477B600605593 /* SecretChatKeyVisualization.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8B8B8204477B600605593 /* SecretChatKeyVisualization.swift */; }; D0E8B8BB2044780600605593 /* ItemListSecretChatKeyItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8B8BA2044780600605593 /* ItemListSecretChatKeyItem.swift */; }; D0E8B8BD204479A500605593 /* SecretChatKeyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8B8BC204479A500605593 /* SecretChatKeyController.swift */; }; @@ -732,20 +757,6 @@ D0EB42051F3143AB00838FE6 /* LegacyComponentsResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D0EB42041F3143AB00838FE6 /* LegacyComponentsResources.bundle */; }; D0EB5ADF1F798033004E89B6 /* PeerMediaCollectionEmptyNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EB5ADE1F798033004E89B6 /* PeerMediaCollectionEmptyNode.swift */; }; D0EC55A3210231D600D1992C /* SearchPeerMembers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC55A2210231D600D1992C /* SearchPeerMembers.swift */; }; - D0EC6CAE1EB9F58800EBF1C3 /* animations.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2CC1E48797500650E93 /* animations.c */; }; - D0EC6CAF1EB9F58800EBF1C3 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2CE1E48797500650E93 /* buffer.c */; }; - D0EC6CB01EB9F58800EBF1C3 /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2D41E48797500650E93 /* objects.c */; }; - D0EC6CB11EB9F58800EBF1C3 /* program.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2D61E48797500650E93 /* program.c */; }; - D0EC6CB21EB9F58800EBF1C3 /* rngs.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2D81E48797500650E93 /* rngs.c */; }; - D0EC6CB31EB9F58800EBF1C3 /* shader.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2DA1E48797500650E93 /* shader.c */; }; - D0EC6CB41EB9F58800EBF1C3 /* timing.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2DC1E48797500650E93 /* timing.c */; }; - D0EC6CB51EB9F58800EBF1C3 /* platform_log.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2E01E48797500650E93 /* platform_log.c */; }; - D0EC6CB61EB9F58800EBF1C3 /* RMGeometry.m in Sources */ = {isa = PBXBuildFile; fileRef = D04BB31D1E48797500650E93 /* RMGeometry.m */; }; - D0EC6CB71EB9F58800EBF1C3 /* RMIntroPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D04BB3211E48797500650E93 /* RMIntroPageView.m */; }; - D0EC6CB81EB9F58800EBF1C3 /* RMIntroViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D04BB3231E48797500650E93 /* RMIntroViewController.m */; }; - D0EC6CB91EB9F58800EBF1C3 /* RMLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D04BB3251E48797500650E93 /* RMLoginViewController.m */; }; - D0EC6CBA1EB9F58800EBF1C3 /* RMRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D04BB3271E48797500650E93 /* RMRootViewController.m */; }; - D0EC6CBB1EB9F58800EBF1C3 /* texture_helper.m in Sources */ = {isa = PBXBuildFile; fileRef = D04BB3291E48797500650E93 /* texture_helper.m */; }; D0EC6CBC1EB9F58800EBF1C3 /* LegacyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D075518A1DDA4D7D0073E051 /* LegacyController.swift */; }; D0EC6CBD1EB9F58800EBF1C3 /* LegacyControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D075518C1DDA4E0B0073E051 /* LegacyControllerNode.swift */; }; D0EC6CBE1EB9F58800EBF1C3 /* TelegramInitializeLegacyComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07551921DDA540F0073E051 /* TelegramInitializeLegacyComponents.swift */; }; @@ -768,41 +779,22 @@ D0EC6CD31EB9F58800EBF1C3 /* GenerateTextEntities.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F917B41E0DA396003687E6 /* GenerateTextEntities.swift */; }; D0EC6CD41EB9F58800EBF1C3 /* StringWithAppliedEntities.swift in Sources */ = {isa = PBXBuildFile; fileRef = D017494D1E1059570057C89A /* StringWithAppliedEntities.swift */; }; D0EC6CD51EB9F58800EBF1C3 /* StoredMessageFromSearchPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01749541E1082770057C89A /* StoredMessageFromSearchPeer.swift */; }; - D0EC6CD61EB9F58800EBF1C3 /* PostboxKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = D087750B1E3E7B7600A97350 /* PostboxKeys.swift */; }; D0EC6CD71EB9F58800EBF1C3 /* EmojiUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01D6BFB1E42AB3C006151C6 /* EmojiUtils.swift */; }; D0EC6CD81EB9F58800EBF1C3 /* ShakeAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DA44551E4E7F43005FDCA7 /* ShakeAnimation.swift */; }; D0EC6CD91EB9F58800EBF1C3 /* ValidateAddressNameInteractive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E305A41E5B2BFB00D7A3A2 /* ValidateAddressNameInteractive.swift */; }; - D0EC6CDA1EB9F58800EBF1C3 /* NumericFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05A32DB1E6EFCC2002760B4 /* NumericFormat.swift */; }; D0EC6CDB1EB9F58800EBF1C3 /* Markdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01C2AAC1E768404001F6F9A /* Markdown.swift */; }; D0EC6CDC1EB9F58800EBF1C3 /* TelegramAccountAuxiliaryMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F3A8AA1E82D83E00B4C64C /* TelegramAccountAuxiliaryMethods.swift */; }; - D0EC6CDD1EB9F58800EBF1C3 /* PresentationCallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B3E1EB8F3E500EBF1C3 /* PresentationCallManager.swift */; }; - D0EC6CDE1EB9F58800EBF1C3 /* ComponentsThemes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05174C51EAE58FC00A1BF36 /* ComponentsThemes.swift */; }; D0EC6CDF1EB9F58800EBF1C3 /* PresentationResourceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05BFB5E1EAA22F900909D38 /* PresentationResourceKey.swift */; }; D0EC6CE01EB9F58800EBF1C3 /* PresentationResourcesRootController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05174BD1EAE161C00A1BF36 /* PresentationResourcesRootController.swift */; }; D0EC6CE11EB9F58800EBF1C3 /* PresentationResourcesItemList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05174BB1EAE156500A1BF36 /* PresentationResourcesItemList.swift */; }; D0EC6CE21EB9F58800EBF1C3 /* PresentationResourcesChatList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03AADA81EAF931300D23738 /* PresentationResourcesChatList.swift */; }; D0EC6CE31EB9F58800EBF1C3 /* PresentationResourcesChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06FFBA91EAFAD2500CB53D4 /* PresentationResourcesChat.swift */; }; - D0EC6CE41EB9F58800EBF1C3 /* PresentationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B724F1E720597000BD3AD /* PresentationData.swift */; }; - D0EC6CE51EB9F58800EBF1C3 /* PresentationStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D096A47A1EA6A2F00000A7AE /* PresentationStrings.swift */; }; - D0EC6CE61EB9F58800EBF1C3 /* PresentationsResourceCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D096A4611EA681A90000A7AE /* PresentationsResourceCache.swift */; }; - D0EC6CE71EB9F58800EBF1C3 /* PresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D096A4631EA683C90000A7AE /* PresentationTheme.swift */; }; - D0EC6CE81EB9F58800EBF1C3 /* DefaultPresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D010C2CB1EA7D74800F41B96 /* DefaultPresentationTheme.swift */; }; - D0EC6CE91EB9F58800EBF1C3 /* DefaultDarkPresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05174BF1EAE3AD400A1BF36 /* DefaultDarkPresentationTheme.swift */; }; - D0EC6CEA1EB9F58800EBF1C3 /* DefaultPresentationStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D010C2CD1EA7DDD600F41B96 /* DefaultPresentationStrings.swift */; }; D0EC6CEC1EB9F58800EBF1C3 /* PresentationThemeEssentialGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06FFBA71EAFAC4F00CB53D4 /* PresentationThemeEssentialGraphics.swift */; }; - D0EC6CED1EB9F58800EBF1C3 /* StringPluralization.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EAE09F1EB21256005296C1 /* StringPluralization.swift */; }; - D0EC6CEE1EB9F58800EBF1C3 /* InAppNotificationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01B279E1E394BD70022A4C0 /* InAppNotificationSettings.swift */; }; - D0EC6CEF1EB9F58800EBF1C3 /* PresentationPasscodeSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01B27A31E394FC90022A4C0 /* PresentationPasscodeSettings.swift */; }; - D0EC6CF01EB9F58800EBF1C3 /* MediaAutoDownloadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A8F1EA53E6000211D94 /* MediaAutoDownloadSettings.swift */; }; - D0EC6CF11EB9F58800EBF1C3 /* GeneratedMediaStoreSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A911EA5420C00211D94 /* GeneratedMediaStoreSettings.swift */; }; - D0EC6CF21EB9F58800EBF1C3 /* VoiceCallSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A931EA5442C00211D94 /* VoiceCallSettings.swift */; }; - D0EC6CF31EB9F58800EBF1C3 /* PresentationThemeSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D010C2C91EA7A59F00F41B96 /* PresentationThemeSettings.swift */; }; D0EC6CF41EB9F58800EBF1C3 /* ManagedMediaId.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099EA261DE765DB001AF5A8 /* ManagedMediaId.swift */; }; D0EC6CF51EB9F58800EBF1C3 /* PeerMessageManagedMediaId.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099EA2C1DE76782001AF5A8 /* PeerMessageManagedMediaId.swift */; }; D0EC6CF61EB9F58800EBF1C3 /* ChatContextResultManagedMediaId.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099EA2E1DE775BB001AF5A8 /* ChatContextResultManagedMediaId.swift */; }; D0EC6CF71EB9F58800EBF1C3 /* RecentGifManagedMediaId.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F02CD81E97ED080065DEE2 /* RecentGifManagedMediaId.swift */; }; D0EC6CF91EB9F58800EBF1C3 /* MediaManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CD61D6B87D30046BCD6 /* MediaManager.swift */; }; - D0EC6CFA1EB9F58800EBF1C3 /* ManagedAudioSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D03AE21DECACB700220C46 /* ManagedAudioSession.swift */; }; D0EC6CFB1EB9F58800EBF1C3 /* ManagedAudioRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D03AE41DECAE8900220C46 /* ManagedAudioRecorder.swift */; }; D0EC6CFD1EB9F58800EBF1C3 /* AudioWaveform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D03B2B1DED9B8900220C46 /* AudioWaveform.swift */; }; D0EC6CFF1EB9F58800EBF1C3 /* OverlayMediaController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B421EB92DF600EBF1C3 /* OverlayMediaController.swift */; }; @@ -818,24 +810,6 @@ D0EC6D0A1EB9F58800EBF1C3 /* internal.c in Sources */ = {isa = PBXBuildFile; fileRef = D0D03B031DECB0FE00220C46 /* internal.c */; }; D0EC6D0B1EB9F58800EBF1C3 /* opusfile.c in Sources */ = {isa = PBXBuildFile; fileRef = D0D03B051DECB0FE00220C46 /* opusfile.c */; }; D0EC6D0C1EB9F58800EBF1C3 /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = D0D03B071DECB0FE00220C46 /* stream.c */; }; - D0EC6D0D1EB9F58800EBF1C3 /* MediaFrameSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CE51D6B87D30046BCD6 /* MediaFrameSource.swift */; }; - D0EC6D0E1EB9F58800EBF1C3 /* MediaPlaybackData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D7F1D6B87EC0046BCD6 /* MediaPlaybackData.swift */; }; - D0EC6D0F1EB9F58800EBF1C3 /* MediaPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D021D6B87D30046BCD6 /* MediaPlayer.swift */; }; - D0EC6D101EB9F58800EBF1C3 /* MediaPlayerAudioRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CD41D6B87D30046BCD6 /* MediaPlayerAudioRenderer.swift */; }; - D0EC6D111EB9F58800EBF1C3 /* MediaPlayerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CDC1D6B87D30046BCD6 /* MediaPlayerNode.swift */; }; - D0EC6D121EB9F58800EBF1C3 /* VideoPlayerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D058E0CE1E8AD57300A442DE /* VideoPlayerProxy.swift */; }; - D0EC6D131EB9F58800EBF1C3 /* MediaTrackDecodableFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D1D1D6B87D30046BCD6 /* MediaTrackDecodableFrame.swift */; }; - D0EC6D141EB9F58800EBF1C3 /* MediaTrackFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D711D6B87DE0046BCD6 /* MediaTrackFrame.swift */; }; - D0EC6D151EB9F58800EBF1C3 /* MediaTrackFrameBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D701D6B87DE0046BCD6 /* MediaTrackFrameBuffer.swift */; }; - D0EC6D161EB9F58800EBF1C3 /* MediaTrackFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D881D6B87EC0046BCD6 /* MediaTrackFrameDecoder.swift */; }; - D0EC6D171EB9F58800EBF1C3 /* FFMpegAudioFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CD71D6B87D30046BCD6 /* FFMpegAudioFrameDecoder.swift */; }; - D0EC6D181EB9F58800EBF1C3 /* FFMpegMediaFrameSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CE11D6B87D30046BCD6 /* FFMpegMediaFrameSource.swift */; }; - D0EC6D191EB9F58800EBF1C3 /* FFMpegMediaFrameSourceContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CD31D6B87D30046BCD6 /* FFMpegMediaFrameSourceContext.swift */; }; - D0EC6D1A1EB9F58800EBF1C3 /* FFMpegMediaFrameSourceContextHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D161D6B87D30046BCD6 /* FFMpegMediaFrameSourceContextHelpers.swift */; }; - D0EC6D1B1EB9F58800EBF1C3 /* FFMpegMediaVideoFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D871D6B87EC0046BCD6 /* FFMpegMediaVideoFrameDecoder.swift */; }; - D0EC6D1C1EB9F58800EBF1C3 /* FFMpegMediaPassthroughVideoFrameDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69D6F1D6B87DE0046BCD6 /* FFMpegMediaPassthroughVideoFrameDecoder.swift */; }; - D0EC6D1E1EB9F58800EBF1C3 /* MediaPlayerScrubbingNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03922A61DF70E3F000F2CE9 /* MediaPlayerScrubbingNode.swift */; }; - D0EC6D1F1EB9F58800EBF1C3 /* MediaPlayerTimeTextNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0177B7F1DFAE18500A5083A /* MediaPlayerTimeTextNode.swift */; }; D0EC6D201EB9F58800EBF1C3 /* PeerAvatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CDE1D6B87D30046BCD6 /* PeerAvatar.swift */; }; D0EC6D221EB9F58800EBF1C3 /* PhotoResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69E9F1D6B8E380046BCD6 /* PhotoResources.swift */; }; D0EC6D231EB9F58800EBF1C3 /* StickerResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69EA01D6B8E380046BCD6 /* StickerResources.swift */; }; @@ -849,8 +823,6 @@ D0EC6D2B1EB9F58800EBF1C3 /* FileMediaResourceStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0177B831DFB095000A5083A /* FileMediaResourceStatus.swift */; }; D0EC6D2C1EB9F58800EBF1C3 /* TouchDownGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69CFB1D6B87D30046BCD6 /* TouchDownGestureRecognizer.swift */; }; D0EC6D2D1EB9F58800EBF1C3 /* TapLongTapOrDoubleTapGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02958011D6F0D5F00360E5E /* TapLongTapOrDoubleTapGestureRecognizer.swift */; }; - D0EC6D2E1EB9F58800EBF1C3 /* ImageNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69DC81D6B89EB0046BCD6 /* ImageNode.swift */; }; - D0EC6D2F1EB9F58800EBF1C3 /* TransformImageNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69DC61D6B89E70046BCD6 /* TransformImageNode.swift */; }; D0EC6D301EB9F58800EBF1C3 /* RadialProgressNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69DC41D6B89E10046BCD6 /* RadialProgressNode.swift */; }; D0EC6D311EB9F58800EBF1C3 /* RadialTimeoutNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CE51E378FD00080C3D5 /* RadialTimeoutNode.swift */; }; D0EC6D321EB9F58800EBF1C3 /* TextNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69DC21D6B89DA0046BCD6 /* TextNode.swift */; }; @@ -1162,10 +1134,7 @@ D0EC6E851EB9F58900EBF1C3 /* ChatMessageNotificationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C50E3F1E93D3B000F62E39 /* ChatMessageNotificationItem.swift */; }; D0EC6E871EB9F58900EBF1C3 /* FastBlur.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F69E801D6B8C850046BCD6 /* FastBlur.m */; }; D0EC6E891EB9F58900EBF1C3 /* FrameworkBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69E831D6B8C850046BCD6 /* FrameworkBundle.swift */; }; - D0EC6E8B1EB9F58900EBF1C3 /* RingBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F69E861D6B8C850046BCD6 /* RingBuffer.m */; }; - D0EC6E8C1EB9F58900EBF1C3 /* RingByteBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F69E871D6B8C850046BCD6 /* RingByteBuffer.swift */; }; D0EC6E8D1EB9F58900EBF1C3 /* SecretChatKeyVisualization.m in Sources */ = {isa = PBXBuildFile; fileRef = D00C7CF61E37BF680080C3D5 /* SecretChatKeyVisualization.m */; }; - D0EC6E8E1EB9F58900EBF1C3 /* NumberPluralizationForm.m in Sources */ = {isa = PBXBuildFile; fileRef = D0EAE0A21EB212DE005296C1 /* NumberPluralizationForm.m */; }; D0EC6E8F1EB9F5B200EBF1C3 /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08D45291D5E340300A7428A /* AsyncDisplayKit.framework */; }; D0EC6E901EB9F5B200EBF1C3 /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08D452A1D5E340300A7428A /* Display.framework */; }; D0EC6E911EB9F5B200EBF1C3 /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D08D452B1D5E340300A7428A /* Postbox.framework */; }; @@ -1178,15 +1147,12 @@ D0EC6EA51EB9FBD300EBF1C3 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AB0BB01D6718DA002C78E7 /* libiconv.tbd */; }; D0EC6EA61EB9FC2400EBF1C3 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D07551901DDA4FC70073E051 /* libc++.tbd */; }; D0EC6EBD1EBA100F00EBF1C3 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0EC6EBC1EBA100F00EBF1C3 /* CoreAudio.framework */; }; - D0EC6FFD1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6FFC1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm */; }; D0EEE9A12165585F001292A6 /* DocumentPreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EEE9A02165585F001292A6 /* DocumentPreviewController.swift */; }; - D0F0AAE01EC1E12C005EE2A5 /* PresentationCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F0AADF1EC1E12C005EE2A5 /* PresentationCall.swift */; }; D0F0AAE21EC20EF8005EE2A5 /* CallControllerStatusNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F0AAE11EC20EF8005EE2A5 /* CallControllerStatusNode.swift */; }; D0F0AAE41EC21AAA005EE2A5 /* CallControllerButtonsNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F0AAE31EC21AAA005EE2A5 /* CallControllerButtonsNode.swift */; }; D0F0AAE61EC21B68005EE2A5 /* CallControllerButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F0AAE51EC21B68005EE2A5 /* CallControllerButton.swift */; }; D0F19F6220E5694D00EEC860 /* GroupStickerPackCurrentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F19F6120E5694D00EEC860 /* GroupStickerPackCurrentItem.swift */; }; D0F19F6420E5A15B00EEC860 /* ChatMediaInputPeerSpecificItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F19F6320E5A15B00EEC860 /* ChatMediaInputPeerSpecificItem.swift */; }; - D0F339372269D83500CFF53F /* ChatArchiveSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F339362269D83500CFF53F /* ChatArchiveSettings.swift */; }; D0F4B01A211073C500912B92 /* DeviceContactInfoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F4B019211073C500912B92 /* DeviceContactInfoController.swift */; }; D0F4B0222110972300912B92 /* ContactInfoStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F4B0212110972300912B92 /* ContactInfoStrings.swift */; }; D0F67FF01EE6B8A8000E5906 /* ChannelMembersSearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F67FEF1EE6B8A8000E5906 /* ChannelMembersSearchController.swift */; }; @@ -1223,11 +1189,11 @@ 090E63E52195880F00E3C035 /* ContactAddItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactAddItem.swift; sourceTree = ""; }; 090E63ED2196FE3A00E3C035 /* OpenAddContact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenAddContact.swift; sourceTree = ""; }; 090E777822A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsThemeItem.swift; sourceTree = ""; }; - 090E778522A9B95A00CD99F5 /* PeopleNearbyController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeopleNearbyController.swift; sourceTree = ""; }; - 090E778722A9B96000CD99F5 /* PeopleNearbyHeaderItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeopleNearbyHeaderItem.swift; sourceTree = ""; }; + 090E778522A9B95A00CD99F5 /* PeersNearbyController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeersNearbyController.swift; sourceTree = ""; }; + 090E778722A9B96000CD99F5 /* PeersNearbyHeaderItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeersNearbyHeaderItem.swift; sourceTree = ""; }; 090E778922A9F23C00CD99F5 /* ChannelOwnershipTransferController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelOwnershipTransferController.swift; sourceTree = ""; }; 090E778B22AA842200CD99F5 /* anim_success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_success.json; sourceTree = ""; }; - 090E778D22AA863A00CD99F5 /* PeopleNearbyIconNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeopleNearbyIconNode.swift; sourceTree = ""; }; + 090E778D22AA863A00CD99F5 /* PeersNearbyIconNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersNearbyIconNode.swift; sourceTree = ""; }; 0910B0EC21FA178C00F8F87D /* WallpaperPreviewMedia.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperPreviewMedia.swift; sourceTree = ""; }; 0910B0EE21FA532D00F8F87D /* WallpaperResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperResources.swift; sourceTree = ""; }; 0910B0F021FB3DE100F8F87D /* WallpaperPatternPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperPatternPanelNode.swift; sourceTree = ""; }; @@ -1242,15 +1208,12 @@ 091954762294752C00E11046 /* AnimatedStickerPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimatedStickerPlayer.swift; sourceTree = ""; }; 091954782294754E00E11046 /* AnimatedStickerUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimatedStickerUtils.swift; sourceTree = ""; }; 0919547A2294788200E11046 /* AnimatedStickerVideoCompositor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimatedStickerVideoCompositor.swift; sourceTree = ""; }; - 0921F5FB228B01B6001A13D7 /* GZip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GZip.h; sourceTree = ""; }; - 0921F5FC228B01B6001A13D7 /* GZip.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GZip.m; sourceTree = ""; }; 0921F60A228C8765001A13D7 /* ItemListPlaceholderItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListPlaceholderItem.swift; sourceTree = ""; }; 0921F60D228EE000001A13D7 /* ChatMessageActionUrlAuthController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageActionUrlAuthController.swift; sourceTree = ""; }; 092F368C2154AAE9001A9F49 /* SFCompactRounded-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SFCompactRounded-Semibold.otf"; sourceTree = ""; }; 092F368F2157AB46001A9F49 /* ItemListCallListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListCallListItem.swift; sourceTree = ""; }; 09310D1A213BC5DE0020033A /* anim_ungroup.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_ungroup.json; sourceTree = ""; }; 09310D1B213BC5DE0020033A /* anim_group.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_group.json; sourceTree = ""; }; - 0935F8EE22197FBF0070AE70 /* LegacyAutomaticMediaDownloadSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyAutomaticMediaDownloadSettings.swift; sourceTree = ""; }; 0941A99F210B057200EBE194 /* OpenInActionSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInActionSheetController.swift; sourceTree = ""; }; 0941A9A3210B0E2E00EBE194 /* OpenInAppIconResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInAppIconResources.swift; sourceTree = ""; }; 0941A9A5210B822D00EBE194 /* OpenInOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInOptions.swift; sourceTree = ""; }; @@ -1269,7 +1232,6 @@ 0947FCAD224043450086741C /* SettingsSearchRecentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchRecentItem.swift; sourceTree = ""; }; 0947FCAF224055990086741C /* StringHash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringHash.swift; sourceTree = ""; }; 0952D1742176DEB500194860 /* NotificationMuteSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationMuteSettingsController.swift; sourceTree = ""; }; - 0952D1762177FB5400194860 /* WatchPresetSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchPresetSettings.swift; sourceTree = ""; }; 0958FBB8218AD6AF00E0CBD8 /* InstantPageFeedbackItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageFeedbackItem.swift; sourceTree = ""; }; 0958FBBA218AD6BC00E0CBD8 /* InstantPageFeedbackNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageFeedbackNode.swift; sourceTree = ""; }; 0958FBBC218B03CA00E0CBD8 /* InstantPageDetailsNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageDetailsNode.swift; sourceTree = ""; }; @@ -1284,13 +1246,7 @@ 0962E67621B673AF00245FD9 /* Permission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Permission.swift; sourceTree = ""; }; 0962E67821B67A9800245FD9 /* ChatMessageAnimatedStickerItemNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageAnimatedStickerItemNode.swift; sourceTree = ""; }; 0962E67A21BA00C900245FD9 /* WebSearchInterfaceState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebSearchInterfaceState.swift; sourceTree = ""; }; - 0962E67C21BA048D00245FD9 /* WebSearchSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebSearchSettings.swift; sourceTree = ""; }; 0962E67E21BA786A00245FD9 /* WebSearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebSearchItem.swift; sourceTree = ""; }; - 096C98B921787A5C00C211FF /* LegacyBridgeAudio.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyBridgeAudio.swift; sourceTree = ""; }; - 096C98BB21787C6600C211FF /* TGBridgeAudioEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeAudioEncoder.m; sourceTree = ""; }; - 096C98BC21787C6600C211FF /* TGBridgeAudioEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeAudioEncoder.h; sourceTree = ""; }; - 096C98BD21787C6700C211FF /* TGBridgeAudioDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeAudioDecoder.h; sourceTree = ""; }; - 096C98BE21787C6700C211FF /* TGBridgeAudioDecoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TGBridgeAudioDecoder.mm; sourceTree = ""; }; 09749BC421F0E024008FDDE9 /* StickersChatInputContextPanelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickersChatInputContextPanelItem.swift; sourceTree = ""; }; 09749BC821F1BBA1008FDDE9 /* CallFeedbackController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallFeedbackController.swift; sourceTree = ""; }; 09749BCC21F23139008FDDE9 /* WallpaperGalleryDecorationNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryDecorationNode.swift; sourceTree = ""; }; @@ -1309,6 +1265,7 @@ 0979788821065F8C0077D77F /* GenericUserScript.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = GenericUserScript.js; sourceTree = ""; }; 09874E3A21075BF400E190B8 /* VimeoEmbedImplementation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VimeoEmbedImplementation.swift; sourceTree = ""; }; 09874E4021075C1700E190B8 /* GenericEmbedImplementation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenericEmbedImplementation.swift; sourceTree = ""; }; + 098CF79122B924E200AF6134 /* ThemeSettingsAccentColorItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsAccentColorItem.swift; sourceTree = ""; }; 099529A921CDB27900805E13 /* ShareProxyServerActionSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareProxyServerActionSheetController.swift; sourceTree = ""; }; 099529AB21CDBBB200805E13 /* QRCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCode.swift; sourceTree = ""; }; 099529AF21D2123E00805E13 /* ChatMessageUnsupportedBubbleContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageUnsupportedBubbleContentNode.swift; sourceTree = ""; }; @@ -1425,7 +1382,6 @@ D003702D1DA43052004308D3 /* ItemListAvatarAndNameItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListAvatarAndNameItem.swift; sourceTree = ""; }; D003702F1DA43077004308D3 /* ItemListItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListItem.swift; sourceTree = ""; }; D00370311DA46C06004308D3 /* ItemListTextWithLabelItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListTextWithLabelItem.swift; sourceTree = ""; }; - D005808A21CAB8F000CB7CD3 /* VoipDerivedState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoipDerivedState.swift; sourceTree = ""; }; D00580B221E4B51600CB7CD3 /* DeleteChatPeerActionSheetItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteChatPeerActionSheetItem.swift; sourceTree = ""; }; D00580B521E4C02100CB7CD3 /* UndoOverlayController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UndoOverlayController.swift; sourceTree = ""; }; D00580B721E4C03400CB7CD3 /* UndoOverlayControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UndoOverlayControllerNode.swift; sourceTree = ""; }; @@ -1435,9 +1391,43 @@ D007019F2029F6D0006B9E34 /* TGMimeTypeMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMimeTypeMap.h; sourceTree = ""; }; D00701A02029F6D0006B9E34 /* TGMimeTypeMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMimeTypeMap.m; sourceTree = ""; }; D00781042084DFB100369A39 /* UrlEscaping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UrlEscaping.swift; sourceTree = ""; }; + D008177222B46B7D008A895F /* ShareItems.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareItems.swift; sourceTree = ""; }; + D008177322B46B7E008A895F /* TGShareLocationSignals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGShareLocationSignals.h; sourceTree = ""; }; + D008177422B46B7E008A895F /* TGContactModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGContactModel.h; sourceTree = ""; }; + D008177522B46B7E008A895F /* TGItemProviderSignals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGItemProviderSignals.h; sourceTree = ""; }; + D008177622B46B7E008A895F /* TGContactModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGContactModel.m; sourceTree = ""; }; + D008177722B46B7E008A895F /* TGItemProviderSignals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGItemProviderSignals.m; sourceTree = ""; }; + D008177822B46B7E008A895F /* TGShareLocationSignals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGShareLocationSignals.m; sourceTree = ""; }; + D008178122B47464008A895F /* NotificationContentContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationContentContext.swift; sourceTree = ""; }; + D00817B022B47A12008A895F /* WatchRequestHandlers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchRequestHandlers.swift; sourceTree = ""; }; + D00817B122B47A12008A895F /* WatchBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchBridge.swift; sourceTree = ""; }; + D00817B222B47A12008A895F /* WatchCommunicationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchCommunicationManager.swift; sourceTree = ""; }; + D00817B322B47A12008A895F /* TGAutoDownloadPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGAutoDownloadPreferences.h; sourceTree = ""; }; + D00817B422B47A12008A895F /* TGProxyItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGProxyItem.h; sourceTree = ""; }; + D00817B522B47A12008A895F /* LegacyFileImport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyFileImport.swift; sourceTree = ""; }; + D00817B622B47A12008A895F /* WakeupManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WakeupManager.swift; sourceTree = ""; }; + D00817B722B47A12008A895F /* LegacyDataImport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyDataImport.swift; sourceTree = ""; }; + D00817B822B47A12008A895F /* LegacyPreferencesImport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyPreferencesImport.swift; sourceTree = ""; }; + D00817B922B47A12008A895F /* LegacyResourceImport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyResourceImport.swift; sourceTree = ""; }; + D00817BA22B47A12008A895F /* LegacyUserDataImport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyUserDataImport.swift; sourceTree = ""; }; + D00817BB22B47A13008A895F /* ApplicationShortcutItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationShortcutItem.swift; sourceTree = ""; }; + D00817BC22B47A13008A895F /* TGProxyItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGProxyItem.m; sourceTree = ""; }; + D00817BD22B47A13008A895F /* TGBridgeServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeServer.h; sourceTree = ""; }; + D00817BE22B47A13008A895F /* TGAutoDownloadPreferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGAutoDownloadPreferences.m; sourceTree = ""; }; + D00817BF22B47A13008A895F /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + D00817C022B47A13008A895F /* TGPresentationAutoNightPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGPresentationAutoNightPreferences.h; sourceTree = ""; }; + D00817C122B47A13008A895F /* LegacyChatImport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyChatImport.swift; sourceTree = ""; }; + D00817C222B47A13008A895F /* ManageSharedAccountInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManageSharedAccountInfo.swift; sourceTree = ""; }; + D00817C322B47A13008A895F /* LockedWindowCoveringView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LockedWindowCoveringView.swift; sourceTree = ""; }; + D00817C422B47A13008A895F /* TGBridgeServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeServer.m; sourceTree = ""; }; + D00817C522B47A13008A895F /* LegacyDataImportSplash.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyDataImportSplash.swift; sourceTree = ""; }; + D00817C622B47A13008A895F /* UIImage+ImageEffects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+ImageEffects.h"; sourceTree = ""; }; + D00817C822B47A14008A895F /* UIImage+ImageEffects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+ImageEffects.m"; sourceTree = ""; }; + D00817C922B47A14008A895F /* TGPresentationAutoNightPreferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGPresentationAutoNightPreferences.m; sourceTree = ""; }; + D008184922B57225008A895F /* WatchCommon.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WatchCommon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D00818CC22B595CB008A895F /* LightweightAccountData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LightweightAccountData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D00ACA4C20222C280045D427 /* libtgvoip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = libtgvoip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessedPeerRestrictionText.swift; sourceTree = ""; }; - D00ADFDA1EBA2EAF00873D2E /* OngoingCallContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OngoingCallContext.swift; sourceTree = ""; }; D00ADFDC1EBB73C200873D2E /* OverlayMediaManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaManager.swift; sourceTree = ""; }; D00B3F9D1E3A4847003872C3 /* ItemListSectionHeaderItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListSectionHeaderItem.swift; sourceTree = ""; }; D00B3F9F1E3A76D4003872C3 /* ItemListSwitchItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListSwitchItem.swift; sourceTree = ""; }; @@ -1465,15 +1455,17 @@ D0104F2B1F471EEB004E4881 /* InstantPageGalleryFooterContentNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstantPageGalleryFooterContentNode.swift; sourceTree = ""; }; D0105D591D80B957008755D8 /* ChatChannelSubscriberInputPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatChannelSubscriberInputPanelNode.swift; sourceTree = ""; }; D0105D672182680E007C04A7 /* IsMediaStreamable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsMediaStreamable.swift; sourceTree = ""; }; - D010C2C91EA7A59F00F41B96 /* PresentationThemeSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationThemeSettings.swift; sourceTree = ""; }; - D010C2CB1EA7D74800F41B96 /* DefaultPresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultPresentationTheme.swift; sourceTree = ""; }; - D010C2CD1EA7DDD600F41B96 /* DefaultPresentationStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultPresentationStrings.swift; sourceTree = ""; }; D0119CCF20CAE75F00895300 /* LegacySecureIdAttachmentMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacySecureIdAttachmentMenu.swift; sourceTree = ""; }; D0127A0C1E6424AC003BFF2E /* ChatPinnedMessageTitlePanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatPinnedMessageTitlePanelNode.swift; sourceTree = ""; }; D013630B208FA62400EB3653 /* SecureIdDocumentGalleryFooterContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdDocumentGalleryFooterContentNode.swift; sourceTree = ""; }; D0147BA6206E8B4F00E40378 /* SecureIdAuthAcceptNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdAuthAcceptNode.swift; sourceTree = ""; }; D0147BA8206EA35000E40378 /* SecureIdDocumentGalleryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdDocumentGalleryController.swift; sourceTree = ""; }; D0147BAA206EA6C100E40378 /* SecureIdDocumentImageGalleryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdDocumentImageGalleryItem.swift; sourceTree = ""; }; + D01590A522BD460C0017C33E /* MetalAnimationRenderer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetalAnimationRenderer.swift; sourceTree = ""; }; + D01590A722BD462C0017C33E /* SoftwareAnimationRenderer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftwareAnimationRenderer.swift; sourceTree = ""; }; + D01590AA22BD467B0017C33E /* AnimationRenderer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimationRenderer.swift; sourceTree = ""; }; + D01590AC22BD58AD0017C33E /* YUV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YUV.h; sourceTree = ""; }; + D01590AD22BD58AD0017C33E /* YUV.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YUV.m; sourceTree = ""; }; D015E04E225D2E5900CB9E8A /* WebP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WebP.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D017494D1E1059570057C89A /* StringWithAppliedEntities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringWithAppliedEntities.swift; sourceTree = ""; }; D01749501E1067E40057C89A /* HashtagSearchController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashtagSearchController.swift; sourceTree = ""; }; @@ -1488,7 +1480,6 @@ D01776B91F1D704F0044446D /* RadialStatusIconContentNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadialStatusIconContentNode.swift; sourceTree = ""; }; D01776BB1F1E21AF0044446D /* RadialStatusBackgroundNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadialStatusBackgroundNode.swift; sourceTree = ""; }; D01776BD1F1E76920044446D /* PeerMediaCollectionSectionsNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMediaCollectionSectionsNode.swift; sourceTree = ""; }; - D0177B7F1DFAE18500A5083A /* MediaPlayerTimeTextNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerTimeTextNode.swift; sourceTree = ""; }; D0177B831DFB095000A5083A /* FileMediaResourceStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileMediaResourceStatus.swift; sourceTree = ""; }; D018477F1FFBD12E00075256 /* ChatListPresentationData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListPresentationData.swift; sourceTree = ""; }; D01848E721A03BDA00B6DEBD /* ChatSearchState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatSearchState.swift; sourceTree = ""; }; @@ -1509,8 +1500,6 @@ D01B27981E39144C0022A4C0 /* ItemListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListController.swift; sourceTree = ""; }; D01B279A1E39386C0022A4C0 /* SettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsController.swift; sourceTree = ""; }; D01B279C1E394A500022A4C0 /* NotificationsAndSounds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationsAndSounds.swift; sourceTree = ""; }; - D01B279E1E394BD70022A4C0 /* InAppNotificationSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InAppNotificationSettings.swift; sourceTree = ""; }; - D01B27A31E394FC90022A4C0 /* PresentationPasscodeSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationPasscodeSettings.swift; sourceTree = ""; }; D01BAA171ECC8E0000295217 /* CallListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListController.swift; sourceTree = ""; }; D01BAA191ECC8E0D00295217 /* CallListControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListControllerNode.swift; sourceTree = ""; }; D01BAA1B1ECC92F700295217 /* CallListViewTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListViewTransition.swift; sourceTree = ""; }; @@ -1566,9 +1555,6 @@ D021E0CF1DB413BC00C6B04F /* ChatInputNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInputNode.swift; sourceTree = ""; }; D021E0D11DB4147500C6B04F /* ChatInterfaceInputNodes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInterfaceInputNodes.swift; sourceTree = ""; }; D021E0E41DB55D0A00C6B04F /* ChatMediaInputStickerPackItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputStickerPackItem.swift; sourceTree = ""; }; - D0223A8F1EA53E6000211D94 /* MediaAutoDownloadSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaAutoDownloadSettings.swift; sourceTree = ""; }; - D0223A911EA5420C00211D94 /* GeneratedMediaStoreSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedMediaStoreSettings.swift; sourceTree = ""; }; - D0223A931EA5442C00211D94 /* VoiceCallSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoiceCallSettings.swift; sourceTree = ""; }; D0223A951EA54D0D00211D94 /* VoiceCallDataSavingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoiceCallDataSavingController.swift; sourceTree = ""; }; D0223A9D1EA5732300211D94 /* NetworkUsageStatsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkUsageStatsController.swift; sourceTree = ""; }; D02298361E0C34E900707F91 /* ChatMessageBackground.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageBackground.swift; sourceTree = ""; }; @@ -1598,24 +1584,19 @@ D02D60B0206C189900FEFE1E /* SecureIdPlaintextFormController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdPlaintextFormController.swift; sourceTree = ""; }; D02D60B2206C18A600FEFE1E /* SecureIdPlaintextFormControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdPlaintextFormControllerNode.swift; sourceTree = ""; }; D02D60C7206E705D00FEFE1E /* SecureIdValueFormPhoneItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdValueFormPhoneItem.swift; sourceTree = ""; }; + D02D634922B85B94006BE519 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; D02DADBE2138D76F00116225 /* Vision.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Vision.framework; path = System/Library/Frameworks/Vision.framework; sourceTree = SDKROOT; }; D02F4AE81FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageInteractiveMediaBadge.swift; sourceTree = ""; }; D02F4AEF1FD4C46D004DFBAE /* SystemVideoContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemVideoContent.swift; sourceTree = ""; }; D03120F51DA534C1006A2A60 /* ItemListActionItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListActionItem.swift; sourceTree = ""; }; + D035734A22B5CCCA00F0920D /* LegacyBuffer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyBuffer.swift; sourceTree = ""; }; D0380DA8204E9C81000414AB /* SecretMediaPreviewFooterContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretMediaPreviewFooterContentNode.swift; sourceTree = ""; }; D0380DAA204EA72F000414AB /* RadialStatusSecretTimeoutContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadialStatusSecretTimeoutContentNode.swift; sourceTree = ""; }; D0380DAC204ED434000414AB /* LegacyLiveUploadInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyLiveUploadInterface.swift; sourceTree = ""; }; D0380DB7204EE0A5000414AB /* ChatInstantVideoMessageDurationNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInstantVideoMessageDurationNode.swift; sourceTree = ""; }; D0383ED3207CFBB900C45548 /* GalleryThumbnailContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryThumbnailContainerNode.swift; sourceTree = ""; }; - D0383ED6207D1A1500C45548 /* emoji_suggestions_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emoji_suggestions_data.h; sourceTree = ""; }; - D0383ED7207D1A1500C45548 /* TGEmojiSuggestions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGEmojiSuggestions.h; sourceTree = ""; }; - D0383ED8207D1A1600C45548 /* emoji_suggestions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emoji_suggestions.cpp; sourceTree = ""; }; - D0383ED9207D1A1600C45548 /* emoji_suggestions_data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emoji_suggestions_data.cpp; sourceTree = ""; }; - D0383EDA207D1A1600C45548 /* TGEmojiSuggestions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TGEmojiSuggestions.mm; sourceTree = ""; }; - D0383EDB207D1A1600C45548 /* emoji_suggestions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emoji_suggestions.h; sourceTree = ""; }; D0383EE3207D292800C45548 /* EmojisChatInputContextPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojisChatInputContextPanelNode.swift; sourceTree = ""; }; D0383EE5207D299600C45548 /* EmojisChatInputPanelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojisChatInputPanelItem.swift; sourceTree = ""; }; - D03922A61DF70E3F000F2CE9 /* MediaPlayerScrubbingNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerScrubbingNode.swift; sourceTree = ""; }; D039EB021DEAEFEE00886EBC /* ChatTextInputAudioRecordingOverlayButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatTextInputAudioRecordingOverlayButton.swift; sourceTree = ""; }; D039EB071DEC725600886EBC /* ChatTextInputAudioRecordingTimeNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatTextInputAudioRecordingTimeNode.swift; sourceTree = ""; }; D039EB091DEC7A8700886EBC /* ChatTextInputAudioRecordingCancelIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatTextInputAudioRecordingCancelIndicator.swift; sourceTree = ""; }; @@ -1629,6 +1610,8 @@ D03ADB4A1D70443F005A521C /* ReplyAccessoryPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReplyAccessoryPanelNode.swift; sourceTree = ""; }; D03ADB4C1D7045C9005A521C /* ChatInterfaceStateAccessoryPanels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInterfaceStateAccessoryPanels.swift; sourceTree = ""; }; D03ADB4E1D70546B005A521C /* AccessoryPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessoryPanelNode.swift; sourceTree = ""; }; + D03AE67222B9459C0078411C /* HockeySDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = HockeySDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D03AE67422B945D30078411C /* BuildConfig.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BuildConfig.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D03E5E081E55C49C0029569A /* DebugAccountsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugAccountsController.swift; sourceTree = ""; }; D03E5E0E1E55F8B90029569A /* ChannelVisibilityController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelVisibilityController.swift; sourceTree = ""; }; D04203142037162700490EA5 /* MediaInputPaneTrendingItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaInputPaneTrendingItem.swift; sourceTree = ""; }; @@ -1649,7 +1632,6 @@ D0430AFF1FF4570500A35ADD /* WebController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebController.swift; sourceTree = ""; }; D0430B011FF4584100A35ADD /* WebControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebControllerNode.swift; sourceTree = ""; }; D0439B5A228EC4A00067E026 /* ChatMessagePhoneNumberRequestContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessagePhoneNumberRequestContentNode.swift; sourceTree = ""; }; - D044A0F220BDA05800326FAC /* ThrottledValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThrottledValue.swift; sourceTree = ""; }; D044A0FA20BDC40C00326FAC /* CachedChannelAdmins.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedChannelAdmins.swift; sourceTree = ""; }; D045549921B2F173007A6DD9 /* libturbojpeg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libturbojpeg.a; path = "third-party/libjpeg-turbo/libturbojpeg.a"; sourceTree = ""; }; D04554A321B42982007A6DD9 /* ConfirmPhoneNumberController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmPhoneNumberController.swift; sourceTree = ""; }; @@ -1677,7 +1659,6 @@ D04791661E79A22000F18979 /* ItemListStickerPackItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListStickerPackItem.swift; sourceTree = ""; }; D0486F091E523C8500091F0C /* GroupInfoController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupInfoController.swift; sourceTree = ""; }; D048B338203C532800038D05 /* ChatMediaInputPane.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMediaInputPane.swift; sourceTree = ""; }; - D048B33A203C777500038D05 /* RenderedTotalUnreadCount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenderedTotalUnreadCount.swift; sourceTree = ""; }; D048EA841F4F295300188713 /* InstantPageSettingsBacklightItemNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageSettingsBacklightItemNode.swift; sourceTree = ""; }; D048EA861F4F296400188713 /* InstantPageSettingsFontSizeItemNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageSettingsFontSizeItemNode.swift; sourceTree = ""; }; D048EA881F4F297500188713 /* InstantPageSettingsFontFamilyItemNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageSettingsFontFamilyItemNode.swift; sourceTree = ""; }; @@ -1700,66 +1681,6 @@ D04BB2BF1E44FD3100650E93 /* AuthorizationSequenceCodeEntryControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationSequenceCodeEntryControllerNode.swift; sourceTree = ""; }; D04BB2C21E45020A00650E93 /* AuthorizationSequencePasswordEntryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationSequencePasswordEntryController.swift; sourceTree = ""; }; D04BB2C41E45022C00650E93 /* AuthorizationSequencePasswordEntryControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizationSequencePasswordEntryControllerNode.swift; sourceTree = ""; }; - D04BB2CA1E48797500650E93 /* linmath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linmath.h; sourceTree = ""; }; - D04BB2CC1E48797500650E93 /* animations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = animations.c; sourceTree = ""; }; - D04BB2CD1E48797500650E93 /* animations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = animations.h; sourceTree = ""; }; - D04BB2CE1E48797500650E93 /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = ""; }; - D04BB2CF1E48797500650E93 /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; - D04BB2D11E48797500650E93 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; - D04BB2D21E48797500650E93 /* math_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math_helper.h; sourceTree = ""; }; - D04BB2D31E48797500650E93 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matrix.h; sourceTree = ""; }; - D04BB2D41E48797500650E93 /* objects.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = objects.c; sourceTree = ""; }; - D04BB2D51E48797500650E93 /* objects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = ""; }; - D04BB2D61E48797500650E93 /* program.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = program.c; sourceTree = ""; }; - D04BB2D71E48797500650E93 /* program.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = program.h; sourceTree = ""; }; - D04BB2D81E48797500650E93 /* rngs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rngs.c; sourceTree = ""; }; - D04BB2D91E48797500650E93 /* rngs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rngs.h; sourceTree = ""; }; - D04BB2DA1E48797500650E93 /* shader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = shader.c; sourceTree = ""; }; - D04BB2DB1E48797500650E93 /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = ""; }; - D04BB2DC1E48797500650E93 /* timing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timing.c; sourceTree = ""; }; - D04BB2DD1E48797500650E93 /* timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timing.h; sourceTree = ""; }; - D04BB2E01E48797500650E93 /* platform_log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = platform_log.c; sourceTree = ""; }; - D04BB2E11E48797500650E93 /* platform_log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_log.h; sourceTree = ""; }; - D04BB2E21E48797500650E93 /* platform_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_macros.h; sourceTree = ""; }; - D04BB2FE1E48797500650E93 /* platform_gl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_gl.h; sourceTree = ""; }; - D04BB3001E48797500650E93 /* fast_arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_arrow@2x.png"; sourceTree = ""; }; - D04BB3011E48797500650E93 /* fast_arrow_shadow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_arrow_shadow@2x.png"; sourceTree = ""; }; - D04BB3021E48797500650E93 /* fast_body@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_body@2x.png"; sourceTree = ""; }; - D04BB3031E48797500650E93 /* fast_spiral@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_spiral@2x.png"; sourceTree = ""; }; - D04BB3041E48797500650E93 /* ic_bubble@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_bubble@2x.png"; sourceTree = ""; }; - D04BB3051E48797500650E93 /* ic_bubble_dot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_bubble_dot@2x.png"; sourceTree = ""; }; - D04BB3061E48797500650E93 /* ic_cam@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_cam@2x.png"; sourceTree = ""; }; - D04BB3071E48797500650E93 /* ic_cam_lens@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_cam_lens@2x.png"; sourceTree = ""; }; - D04BB3081E48797500650E93 /* ic_pencil@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pencil@2x.png"; sourceTree = ""; }; - D04BB3091E48797500650E93 /* ic_pin@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pin@2x.png"; sourceTree = ""; }; - D04BB30A1E48797500650E93 /* ic_smile@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_smile@2x.png"; sourceTree = ""; }; - D04BB30B1E48797500650E93 /* ic_smile_eye@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_smile_eye@2x.png"; sourceTree = ""; }; - D04BB30C1E48797500650E93 /* ic_videocam@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_videocam@2x.png"; sourceTree = ""; }; - D04BB30D1E48797500650E93 /* knot_down@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "knot_down@2x.png"; sourceTree = ""; }; - D04BB30E1E48797500650E93 /* knot_up@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "knot_up@2x.png"; sourceTree = ""; }; - D04BB30F1E48797500650E93 /* powerful_infinity@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_infinity@2x.png"; sourceTree = ""; }; - D04BB3101E48797500650E93 /* powerful_infinity_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_infinity_white@2x.png"; sourceTree = ""; }; - D04BB3111E48797500650E93 /* powerful_mask@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_mask@2x.png"; sourceTree = ""; }; - D04BB3121E48797500650E93 /* powerful_star@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_star@2x.png"; sourceTree = ""; }; - D04BB3131E48797500650E93 /* private_door@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "private_door@2x.png"; sourceTree = ""; }; - D04BB3141E48797500650E93 /* private_screw@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "private_screw@2x.png"; sourceTree = ""; }; - D04BB3151E48797500650E93 /* start_arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start_arrow@2x.png"; sourceTree = ""; }; - D04BB3161E48797500650E93 /* start_arrow_ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = start_arrow_ipad.png; sourceTree = ""; }; - D04BB3171E48797500650E93 /* start_arrow_ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start_arrow_ipad@2x.png"; sourceTree = ""; }; - D04BB3181E48797500650E93 /* telegram_plane@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_plane@2x.png"; sourceTree = ""; }; - D04BB3191E48797500650E93 /* telegram_sphere@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_sphere@2x.png"; sourceTree = ""; }; - D04BB31C1E48797500650E93 /* RMGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMGeometry.h; sourceTree = ""; }; - D04BB31D1E48797500650E93 /* RMGeometry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMGeometry.m; sourceTree = ""; }; - D04BB3201E48797500650E93 /* RMIntroPageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMIntroPageView.h; sourceTree = ""; }; - D04BB3211E48797500650E93 /* RMIntroPageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMIntroPageView.m; sourceTree = ""; }; - D04BB3221E48797500650E93 /* RMIntroViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMIntroViewController.h; sourceTree = ""; }; - D04BB3231E48797500650E93 /* RMIntroViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMIntroViewController.m; sourceTree = ""; }; - D04BB3241E48797500650E93 /* RMLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMLoginViewController.h; sourceTree = ""; }; - D04BB3251E48797500650E93 /* RMLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMLoginViewController.m; sourceTree = ""; }; - D04BB3261E48797500650E93 /* RMRootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMRootViewController.h; sourceTree = ""; }; - D04BB3271E48797500650E93 /* RMRootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMRootViewController.m; sourceTree = ""; }; - D04BB3281E48797500650E93 /* texture_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = texture_helper.h; sourceTree = ""; }; - D04BB3291E48797500650E93 /* texture_helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = texture_helper.m; sourceTree = ""; }; D04ECD711FFBF22B00DE9029 /* OpenUrl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenUrl.swift; sourceTree = ""; }; D050A463229C052A0044F11A /* ChannelDiscussionGroupSetupSearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelDiscussionGroupSetupSearchItem.swift; sourceTree = ""; }; D050A465229C06460044F11A /* ChannelDiscussionGroupSearchContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelDiscussionGroupSearchContainerNode.swift; sourceTree = ""; }; @@ -1769,9 +1690,7 @@ D05174AA1EAA5B4700A1BF36 /* WallpaperGalleryToolbarNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WallpaperGalleryToolbarNode.swift; sourceTree = ""; }; D05174BB1EAE156500A1BF36 /* PresentationResourcesItemList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationResourcesItemList.swift; sourceTree = ""; }; D05174BD1EAE161C00A1BF36 /* PresentationResourcesRootController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationResourcesRootController.swift; sourceTree = ""; }; - D05174BF1EAE3AD400A1BF36 /* DefaultDarkPresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultDarkPresentationTheme.swift; sourceTree = ""; }; D05174C21EAE583800A1BF36 /* TelegramRootController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramRootController.swift; sourceTree = ""; }; - D05174C51EAE58FC00A1BF36 /* ComponentsThemes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComponentsThemes.swift; sourceTree = ""; }; D0528E551E65750600E2FEF5 /* SecretChatHandshakeStatusInputPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatHandshakeStatusInputPanelNode.swift; sourceTree = ""; }; D0528E571E65773300E2FEF5 /* DeleteChatInputPanelNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeleteChatInputPanelNode.swift; sourceTree = ""; }; D0528E621E65BECA00E2FEF5 /* UserInfoController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserInfoController.swift; sourceTree = ""; }; @@ -1788,7 +1707,6 @@ D05677521F4CA0D0001B723E /* InstantPagePeerReferenceNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPagePeerReferenceNode.swift; sourceTree = ""; }; D0568AAC1DF198130022E7DA /* AudioWaveformNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioWaveformNode.swift; sourceTree = ""; }; D056CD6F1FF147B000880D28 /* IconButtonNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconButtonNode.swift; sourceTree = ""; }; - D056CD711FF1569800880D28 /* MusicPlaybackSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicPlaybackSettings.swift; sourceTree = ""; }; D056CD731FF2996B00880D28 /* ExternalMusicAlbumArtResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalMusicAlbumArtResources.swift; sourceTree = ""; }; D056CD751FF2A30900880D28 /* ChatSwipeToReplyRecognizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatSwipeToReplyRecognizer.swift; sourceTree = ""; }; D056CD771FF2A6EE00880D28 /* ChatMessageSwipeToReplyNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageSwipeToReplyNode.swift; sourceTree = ""; }; @@ -1801,8 +1719,6 @@ D0575AF91EA0FDA7006F2541 /* AvatarGalleryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarGalleryController.swift; sourceTree = ""; }; D0575AFB1EA104A6006F2541 /* PeerAvatarImageGalleryItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerAvatarImageGalleryItem.swift; sourceTree = ""; }; D05811931DD5F9380057C769 /* AccountContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountContext.swift; sourceTree = ""; }; - D058E0CE1E8AD57300A442DE /* VideoPlayerProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerProxy.swift; sourceTree = ""; }; - D05A32DB1E6EFCC2002760B4 /* NumericFormat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericFormat.swift; sourceTree = ""; }; D05A32DD1E6F0097002760B4 /* PrivacyAndSecurityController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyAndSecurityController.swift; sourceTree = ""; }; D05A32E91E6F143C002760B4 /* RecentSessionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentSessionsController.swift; sourceTree = ""; }; D05A32EB1E6F1462002760B4 /* BlockedPeersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockedPeersController.swift; sourceTree = ""; }; @@ -1810,7 +1726,6 @@ D05B077121BFB9F600B1D27C /* FFMpeg.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = FFMpeg.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D05B077321BFC38600B1D27C /* FFMpeg.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = FFMpeg.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D05B724C1E720393000BD3AD /* SelectivePrivacySettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectivePrivacySettingsController.swift; sourceTree = ""; }; - D05B724F1E720597000BD3AD /* PresentationData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationData.swift; sourceTree = ""; }; D05BFB5E1EAA22F900909D38 /* PresentationResourceKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationResourceKey.swift; sourceTree = ""; }; D05D8B392192FC460064586F /* LocalizationListController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationListController.swift; sourceTree = ""; }; D05D8B3E2192FC6E0064586F /* LocalizationListControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationListControllerNode.swift; sourceTree = ""; }; @@ -1825,9 +1740,6 @@ D0642EFB1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatHistoryNavigationButtons.swift; sourceTree = ""; }; D064EF861F69A06F00AC0398 /* MessageContentKind.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageContentKind.swift; sourceTree = ""; }; D0671F2C2145AB28000A8AE7 /* LegacyAvatarPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyAvatarPicker.swift; sourceTree = ""; }; - D067B4A4211C911C00796039 /* LegacyChannelIntroController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyChannelIntroController.swift; sourceTree = ""; }; - D067B4A6211C916200796039 /* TGChannelIntroController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGChannelIntroController.h; sourceTree = ""; }; - D067B4A9211C916200796039 /* TGChannelIntroController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGChannelIntroController.m; sourceTree = ""; }; D0684A031F6C3AD50059F570 /* ChatListTypingNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListTypingNode.swift; sourceTree = ""; }; D06879541DB8F1FC00424BBD /* CachedResourceRepresentations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedResourceRepresentations.swift; sourceTree = ""; }; D06879561DB8F22200424BBD /* FetchCachedRepresentations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchCachedRepresentations.swift; sourceTree = ""; }; @@ -1844,10 +1756,7 @@ D06E4C302134910400088087 /* ChatListEmptyNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListEmptyNode.swift; sourceTree = ""; }; D06E4C322134A59700088087 /* ThemeAccentColorActionSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAccentColorActionSheet.swift; sourceTree = ""; }; D06E4C342134AE3C00088087 /* ThemeAutoNightSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAutoNightSettingsController.swift; sourceTree = ""; }; - D06ECFCA20B8448E00C576C2 /* ContactSynchronizationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactSynchronizationSettings.swift; sourceTree = ""; }; D06F1EA31F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatHistorySearchContainerNode.swift; sourceTree = ""; }; - D06F31DF2135829A001A0F12 /* EDSunriseSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EDSunriseSet.m; sourceTree = ""; }; - D06F31E02135829A001A0F12 /* EDSunriseSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EDSunriseSet.h; sourceTree = ""; }; D06F31E3213597FF001A0F12 /* ThemeAutoNightTimeSelectionActionSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeAutoNightTimeSelectionActionSheet.swift; sourceTree = ""; }; D06F31E52135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsBrightnessItem.swift; sourceTree = ""; }; D06FFBA71EAFAC4F00CB53D4 /* PresentationThemeEssentialGraphics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationThemeEssentialGraphics.swift; sourceTree = ""; }; @@ -1859,7 +1768,14 @@ 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 = ""; }; - D073D2DA1FB61DA9009E1DA2 /* CallListSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallListSettings.swift; sourceTree = ""; }; + D0750C7722B2A13300BE5F6E /* UniversalMediaPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UniversalMediaPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0750C7922B2A14300BE5F6E /* DeviceAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeviceAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0750C7B22B2A14300BE5F6E /* TelegramPresentationData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramPresentationData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0750C7D22B2A14300BE5F6E /* TelegramVoip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramVoip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0750C8022B2E4EE00BE5F6E /* SharedWakeupManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedWakeupManager.swift; sourceTree = ""; }; + D0750C8122B2E4EE00BE5F6E /* SharedNotificationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedNotificationManager.swift; sourceTree = ""; }; + D0750C8422B2E52300BE5F6E /* ClearNotificationsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ClearNotificationsManager.swift; sourceTree = ""; }; + D0750C8622B2E76300BE5F6E /* ShareExtensionContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareExtensionContext.swift; sourceTree = ""; }; D0754D1D1EEDDF6200884F6E /* ChatMessageAttachedContentNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageAttachedContentNode.swift; sourceTree = ""; }; D0754D1F1EEDEBA000884F6E /* ChatMessageGameBubbleContentNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageGameBubbleContentNode.swift; sourceTree = ""; }; D0754D211EEDF89900884F6E /* ChatMessageInvoiceBubbleContentNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessageInvoiceBubbleContentNode.swift; sourceTree = ""; }; @@ -1871,6 +1787,7 @@ D07551901DDA4FC70073E051 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; D07551921DDA540F0073E051 /* TelegramInitializeLegacyComponents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramInitializeLegacyComponents.swift; sourceTree = ""; }; D0760B231E9D015D00F1F3C4 /* PasscodeOptionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasscodeOptionsController.swift; sourceTree = ""; }; + D077C5C022B59A800097D617 /* ApplicationContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationContext.swift; sourceTree = ""; }; D07827BC1E004A3400071108 /* ChatListSearchItemHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatListSearchItemHeader.swift; sourceTree = ""; }; D07827C61E01CD5900071108 /* VerticalListContextResultsChatInputPanelButtonItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerticalListContextResultsChatInputPanelButtonItem.swift; sourceTree = ""; }; D079FCD81F05A5550038FADE /* BotCheckoutPasswordEntryController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BotCheckoutPasswordEntryController.swift; sourceTree = ""; }; @@ -1901,7 +1818,6 @@ D08774F71E3DE7BF00A97350 /* ItemListEditableDeleteControlNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListEditableDeleteControlNode.swift; sourceTree = ""; }; D08774F91E3E2A5600A97350 /* ItemListCheckboxItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListCheckboxItem.swift; sourceTree = ""; }; D08775081E3E59DE00A97350 /* PeerNotificationSoundStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerNotificationSoundStrings.swift; sourceTree = ""; }; - D087750B1E3E7B7600A97350 /* PostboxKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostboxKeys.swift; sourceTree = ""; }; D087750F1E3F46A400A97350 /* ComposeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposeController.swift; sourceTree = ""; }; D08775111E3F46AB00A97350 /* ComposeControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposeControllerNode.swift; sourceTree = ""; }; D08775131E3F4A7700A97350 /* ContactListNameIndexHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactListNameIndexHeader.swift; sourceTree = ""; }; @@ -1915,8 +1831,6 @@ D087BFB21F748752003FD209 /* ShareControllerRecentPeersGridItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareControllerRecentPeersGridItem.swift; sourceTree = ""; }; D08984ED2114964700918162 /* GroupPreHistorySetupController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupPreHistorySetupController.swift; sourceTree = ""; }; D08984EF2114AE0C00918162 /* DataPrivacySettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataPrivacySettingsController.swift; sourceTree = ""; }; - D089F7891F4E0C14000E934D /* InstantPagePresentationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPagePresentationSettings.swift; sourceTree = ""; }; - D08A10BA211DF7A80077488B /* StickerSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerSettings.swift; sourceTree = ""; }; D08BDF631FA37BEA009D08E1 /* ChatRecordingPreviewInputPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecordingPreviewInputPanelNode.swift; sourceTree = ""; }; D08BDF651FA8CB10009D08E1 /* EditSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditSettingsController.swift; sourceTree = ""; }; D08C367E1DB66A820064C744 /* ChatMediaInputPanelEntries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputPanelEntries.swift; sourceTree = ""; }; @@ -1928,10 +1842,8 @@ D08D452C1D5E340300A7428A /* SwiftSignalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftSignalKit.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/SwiftSignalKit.framework"; sourceTree = ""; }; D08D452D1D5E340300A7428A /* TelegramCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TelegramCore.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/TelegramCore.framework"; sourceTree = ""; }; D08D7E78209FA2930005D80C /* SecureIdValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdValues.swift; sourceTree = ""; }; - D08D7E8320A0F6020005D80C /* ExperimentalUISettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperimentalUISettings.swift; sourceTree = ""; }; D091C7A31F8EBB1E00D7DE13 /* ChatPresentationData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatPresentationData.swift; sourceTree = ""; }; D091C7A51F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsThemeWallpaperNode.swift; sourceTree = ""; }; - D09250031FE5363D003F693F /* ExperimentalSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperimentalSettings.swift; sourceTree = ""; }; D09250051FE5371D003F693F /* GlobalExperimentalSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalExperimentalSettings.swift; sourceTree = ""; }; D09394122007F5BB00997F31 /* LocationBroadcastNavigationAccessoryPanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationBroadcastNavigationAccessoryPanel.swift; sourceTree = ""; }; D093D7D82062A9CA00BC3599 /* SecureIdAuthControllerState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureIdAuthControllerState.swift; sourceTree = ""; }; @@ -1952,9 +1864,6 @@ D0943B041FDDFDA0001522CC /* OverlayInstantVideoNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayInstantVideoNode.swift; sourceTree = ""; }; D0943B061FDEC528001522CC /* InstantVideoRadialStatusNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantVideoRadialStatusNode.swift; sourceTree = ""; }; D0955FB32191278C00F89427 /* PresentationStrings.mapping */ = {isa = PBXFileReference; lastKnownFileType = file; name = PresentationStrings.mapping; path = TelegramUI/Resources/PresentationStrings.mapping; sourceTree = ""; }; - D096A4611EA681A90000A7AE /* PresentationsResourceCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationsResourceCache.swift; sourceTree = ""; }; - D096A4631EA683C90000A7AE /* PresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationTheme.swift; sourceTree = ""; }; - D096A47A1EA6A2F00000A7AE /* PresentationStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationStrings.swift; sourceTree = ""; }; D097C26720DD0A1D007BB4B8 /* PeerReportController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerReportController.swift; sourceTree = ""; }; D097C26B20DD1EA5007BB4B8 /* OverlayStatusController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayStatusController.swift; sourceTree = ""; }; D099261E1E69791E00D95539 /* GroupsInCommonController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupsInCommonController.swift; sourceTree = ""; }; @@ -1979,7 +1888,6 @@ D0A11BF91E7836C20081CE03 /* ChangePhoneNumberIntroController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberIntroController.swift; sourceTree = ""; }; D0A11BFB1E7840750081CE03 /* ChangePhoneNumberController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberController.swift; sourceTree = ""; }; D0A11BFD1E7840A50081CE03 /* ChangePhoneNumberControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangePhoneNumberControllerNode.swift; sourceTree = ""; }; - D0A24D271F92C27100584D24 /* DefaultDarkAccentPresentationTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultDarkAccentPresentationTheme.swift; sourceTree = ""; }; D0A723531FC3B40E0094D167 /* RadialCheckContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadialCheckContentNode.swift; sourceTree = ""; }; D0A749961E3AA25200AD786E /* NotificationSoundSelection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationSoundSelection.swift; sourceTree = ""; }; D0A8998C217A294100759EE6 /* SaveIncomingMediaController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveIncomingMediaController.swift; sourceTree = ""; }; @@ -2003,6 +1911,15 @@ D0AD02E91FFFEBEF00C1DCFF /* ChatMessageLiveLocationTextNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageLiveLocationTextNode.swift; sourceTree = ""; }; D0AD02EB20000D0100C1DCFF /* ChatMessageLiveLocationPositionNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageLiveLocationPositionNode.swift; sourceTree = ""; }; D0ADF965212E05A300310BBC /* TonePlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TonePlayer.swift; sourceTree = ""; }; + D0AE2FDC22B1D3610058D3BC /* TGBridgeAudioEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeAudioEncoder.m; sourceTree = ""; }; + D0AE2FDD22B1D3610058D3BC /* TGBridgeAudioDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeAudioDecoder.h; sourceTree = ""; }; + D0AE2FDE22B1D3610058D3BC /* TGBridgeAudioEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeAudioEncoder.h; sourceTree = ""; }; + D0AE2FDF22B1D3610058D3BC /* TGBridgeAudioDecoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TGBridgeAudioDecoder.mm; sourceTree = ""; }; + D0AE2FE022B1D3610058D3BC /* LegacyBridgeAudio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyBridgeAudio.swift; sourceTree = ""; }; + D0AE30CE22B1D9980058D3BC /* RMIntro.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RMIntro.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE30EA22B1DBD10058D3BC /* GZip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GZip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE311122B1DD4D0058D3BC /* TelegramCallsUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCallsUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE315322B1DEE30058D3BC /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0AEAE242080D6830013176E /* PaneSearchContainerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaneSearchContainerNode.swift; sourceTree = ""; }; D0AEAE262080D6970013176E /* PaneSearchBarNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaneSearchBarNode.swift; sourceTree = ""; }; D0AEAE282080FD660013176E /* StickerPaneSearchGlobaltem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerPaneSearchGlobaltem.swift; sourceTree = ""; }; @@ -2014,7 +1931,6 @@ D0B21B16220D85E7003F741D /* TabBarAccountSwitchControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarAccountSwitchControllerNode.swift; sourceTree = ""; }; D0B21B1E22156D92003F741D /* LegacyCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyCache.swift; sourceTree = ""; }; D0B21B202215B539003F741D /* LogoutOptionsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoutOptionsController.swift; sourceTree = ""; }; - D0B2F76120506E2A00D3BFB9 /* MediaInputSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaInputSettings.swift; sourceTree = ""; }; D0B2F76720528E3D00D3BFB9 /* UserInfoEditingPhoneActionItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEditingPhoneActionItem.swift; sourceTree = ""; }; D0B2F7692052920D00D3BFB9 /* UserInfoEditingPhoneItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEditingPhoneItem.swift; sourceTree = ""; }; D0B2F76B2052A7D600D3BFB9 /* SinglePhoneInputNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SinglePhoneInputNode.swift; sourceTree = ""; }; @@ -2027,9 +1943,7 @@ D0B3AC7F2142E2E900CD1374 /* ResetPasswordController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPasswordController.swift; sourceTree = ""; }; D0B417C21D7DE54E004562A4 /* ChatPresentationInterfaceState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatPresentationInterfaceState.swift; sourceTree = ""; }; D0B4AF871EC112ED00D51FF6 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; }; - D0B4AF8A1EC1133600D51FF6 /* CallKitIntergation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallKitIntergation.swift; sourceTree = ""; }; D0B69C3820EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageInteractiveInstantVideoNode.swift; sourceTree = ""; }; - D0B69C3B20EBD8C8003632C7 /* CheckDeviceAccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckDeviceAccess.swift; sourceTree = ""; }; D0B7F8E11D8A18070045D939 /* PeerMediaCollectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMediaCollectionController.swift; sourceTree = ""; }; D0B7F8E71D8A1F5F0045D939 /* PeerMediaCollectionControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMediaCollectionControllerNode.swift; sourceTree = ""; }; D0B843911DA7F13E005F29E1 /* ItemListDisclosureItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListDisclosureItem.swift; sourceTree = ""; }; @@ -2105,12 +2019,10 @@ D0CE6F6F213EEE5000BCD44B /* CreatePasswordController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatePasswordController.swift; sourceTree = ""; }; D0CE8CE41F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTextInputAccessoryItem.swift; sourceTree = ""; }; D0CE8CE61F6F35A300AA2DB0 /* ChatTextInputPanelState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatTextInputPanelState.swift; sourceTree = ""; }; - D0CE8CEB1F6FCCA300AA2DB0 /* TransformImageArguments.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransformImageArguments.swift; sourceTree = ""; }; D0CFBB851FD715E700B65C0D /* LegacyHTTPOperationImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyHTTPOperationImpl.swift; sourceTree = ""; }; D0CFBB901FD881A600B65C0D /* AudioRecordningToneData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordningToneData.swift; sourceTree = ""; }; D0CFBB941FD8B05000B65C0D /* OverlayInstantVideoDecoration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayInstantVideoDecoration.swift; sourceTree = ""; }; D0CFBB961FD8B0F700B65C0D /* ChatBubbleInstantVideoDecoration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatBubbleInstantVideoDecoration.swift; sourceTree = ""; }; - D0D03AE21DECACB700220C46 /* ManagedAudioSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedAudioSession.swift; sourceTree = ""; }; D0D03AE41DECAE8900220C46 /* ManagedAudioRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedAudioRecorder.swift; sourceTree = ""; }; D0D03AE81DECB0FE00220C46 /* diag_range.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = diag_range.c; sourceTree = ""; }; D0D03AE91DECB0FE00220C46 /* diag_range.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = diag_range.h; sourceTree = ""; }; @@ -2207,7 +2119,6 @@ D0E8175620122DAD00B82BBB /* ChatRecentActionsSearchNavigationContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecentActionsSearchNavigationContentNode.swift; sourceTree = ""; }; D0E8175820122FE100B82BBB /* ChatRecentActionsFilterController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecentActionsFilterController.swift; sourceTree = ""; }; D0E8175A201254FA00B82BBB /* ChatRecentActionsEmptyNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRecentActionsEmptyNode.swift; sourceTree = ""; }; - D0E8B8A62044339500605593 /* PresentationCallToneData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationCallToneData.swift; sourceTree = ""; }; D0E8B8B8204477B600605593 /* SecretChatKeyVisualization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretChatKeyVisualization.swift; sourceTree = ""; }; D0E8B8BA2044780600605593 /* ItemListSecretChatKeyItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListSecretChatKeyItem.swift; sourceTree = ""; }; D0E8B8BC204479A500605593 /* SecretChatKeyController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretChatKeyController.swift; sourceTree = ""; }; @@ -2327,9 +2238,6 @@ D0E9BADB1F0574D800F079A4 /* STPBankAccountParams.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STPBankAccountParams.m; sourceTree = ""; }; D0E9BAE51F0574FF00F079A4 /* STPCustomer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STPCustomer.h; sourceTree = ""; }; D0E9BAE61F0574FF00F079A4 /* STPCustomer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STPCustomer.m; sourceTree = ""; }; - D0EAE09F1EB21256005296C1 /* StringPluralization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringPluralization.swift; sourceTree = ""; }; - D0EAE0A11EB212DE005296C1 /* NumberPluralizationForm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberPluralizationForm.h; sourceTree = ""; }; - D0EAE0A21EB212DE005296C1 /* NumberPluralizationForm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NumberPluralizationForm.m; sourceTree = ""; }; D0EB41F21F2FEAB800838FE6 /* LegacyComponentsStickers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyComponentsStickers.swift; sourceTree = ""; }; D0EB41F41F30D26A00838FE6 /* LegacySuggestionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacySuggestionContext.swift; sourceTree = ""; }; D0EB41F61F30D4A800838FE6 /* LegacyMediaLocations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyMediaLocations.swift; sourceTree = ""; }; @@ -2344,7 +2252,6 @@ D0EC6B371EB88D1600EBF1C3 /* ThemeGridControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeGridControllerNode.swift; sourceTree = ""; }; D0EC6B3A1EB8CF2B00EBF1C3 /* CallController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallController.swift; sourceTree = ""; }; D0EC6B3C1EB8CF3500EBF1C3 /* CallControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallControllerNode.swift; sourceTree = ""; }; - D0EC6B3E1EB8F3E500EBF1C3 /* PresentationCallManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationCallManager.swift; sourceTree = ""; }; D0EC6B401EB8F7D700EBF1C3 /* VoipDynamic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VoipDynamic.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/VoipDynamic.framework"; sourceTree = ""; }; D0EC6B421EB92DF600EBF1C3 /* OverlayMediaController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaController.swift; sourceTree = ""; }; D0EC6B441EB92E5A00EBF1C3 /* OverlayMediaControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaControllerNode.swift; sourceTree = ""; }; @@ -2352,8 +2259,6 @@ D0EC6E941EB9F5B300EBF1C3 /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MtProtoKitDynamic.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/MtProtoKitDynamic.framework"; sourceTree = ""; }; D0EC6E951EB9F5B300EBF1C3 /* TelegramLegacyComponents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TelegramLegacyComponents.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/TelegramLegacyComponents.framework"; sourceTree = ""; }; D0EC6EBC1EBA100F00EBF1C3 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; - D0EC6FFA1EBA1DE900EBF1C3 /* OngoingCallThreadLocalContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OngoingCallThreadLocalContext.h; sourceTree = ""; }; - D0EC6FFC1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = OngoingCallThreadLocalContext.mm; sourceTree = ""; }; D0EE97191D88BCA0006C18E1 /* ChatInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatInfo.swift; sourceTree = ""; }; D0EEE9A02165585F001292A6 /* DocumentPreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPreviewController.swift; sourceTree = ""; }; D0EF40DC1E72F00E000DFCD4 /* SelectivePrivacySettingsPeersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectivePrivacySettingsPeersController.swift; sourceTree = ""; }; @@ -2362,13 +2267,11 @@ D0F02CCB1E96EF350065DEE2 /* ChatMediaInputStickerPane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputStickerPane.swift; sourceTree = ""; }; D0F02CCD1E96FACE0065DEE2 /* ChatMediaInputGifPane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMediaInputGifPane.swift; sourceTree = ""; }; D0F02CD81E97ED080065DEE2 /* RecentGifManagedMediaId.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentGifManagedMediaId.swift; sourceTree = ""; }; - D0F0AADF1EC1E12C005EE2A5 /* PresentationCall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationCall.swift; sourceTree = ""; }; D0F0AAE11EC20EF8005EE2A5 /* CallControllerStatusNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallControllerStatusNode.swift; sourceTree = ""; }; D0F0AAE31EC21AAA005EE2A5 /* CallControllerButtonsNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallControllerButtonsNode.swift; sourceTree = ""; }; D0F0AAE51EC21B68005EE2A5 /* CallControllerButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallControllerButton.swift; sourceTree = ""; }; D0F19F6120E5694D00EEC860 /* GroupStickerPackCurrentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupStickerPackCurrentItem.swift; sourceTree = ""; }; D0F19F6320E5A15B00EEC860 /* ChatMediaInputPeerSpecificItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMediaInputPeerSpecificItem.swift; sourceTree = ""; }; - D0F339362269D83500CFF53F /* ChatArchiveSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatArchiveSettings.swift; sourceTree = ""; }; D0F3A8AA1E82D83E00B4C64C /* TelegramAccountAuxiliaryMethods.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramAccountAuxiliaryMethods.swift; sourceTree = ""; }; D0F3A8B51E83120A00B4C64C /* FetchResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchResource.swift; sourceTree = ""; }; D0F3A8B71E83125C00B4C64C /* MediaResources.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaResources.swift; sourceTree = ""; }; @@ -2382,30 +2285,13 @@ D0F67FF11EE6B915000E5906 /* ChannelMembersSearchControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelMembersSearchControllerNode.swift; sourceTree = ""; }; D0F67FF31EE6C10F000E5906 /* ChannelMembersSearchContainerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelMembersSearchContainerNode.swift; sourceTree = ""; }; D0F680091EE750EE000E5906 /* ChannelBannedMemberController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelBannedMemberController.swift; sourceTree = ""; }; - D0F69CD31D6B87D30046BCD6 /* FFMpegMediaFrameSourceContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaFrameSourceContext.swift; sourceTree = ""; }; - D0F69CD41D6B87D30046BCD6 /* MediaPlayerAudioRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerAudioRenderer.swift; sourceTree = ""; }; D0F69CD61D6B87D30046BCD6 /* MediaManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaManager.swift; sourceTree = ""; }; - D0F69CD71D6B87D30046BCD6 /* FFMpegAudioFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegAudioFrameDecoder.swift; sourceTree = ""; }; - D0F69CDC1D6B87D30046BCD6 /* MediaPlayerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayerNode.swift; sourceTree = ""; }; D0F69CDE1D6B87D30046BCD6 /* PeerAvatar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerAvatar.swift; sourceTree = ""; }; - D0F69CE11D6B87D30046BCD6 /* FFMpegMediaFrameSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaFrameSource.swift; sourceTree = ""; }; - D0F69CE51D6B87D30046BCD6 /* MediaFrameSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaFrameSource.swift; sourceTree = ""; }; D0F69CFB1D6B87D30046BCD6 /* TouchDownGestureRecognizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TouchDownGestureRecognizer.swift; sourceTree = ""; }; - D0F69D021D6B87D30046BCD6 /* MediaPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlayer.swift; sourceTree = ""; }; - D0F69D161D6B87D30046BCD6 /* FFMpegMediaFrameSourceContextHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaFrameSourceContextHelpers.swift; sourceTree = ""; }; - D0F69D1D1D6B87D30046BCD6 /* MediaTrackDecodableFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackDecodableFrame.swift; sourceTree = ""; }; - D0F69D6F1D6B87DE0046BCD6 /* FFMpegMediaPassthroughVideoFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaPassthroughVideoFrameDecoder.swift; sourceTree = ""; }; - D0F69D701D6B87DE0046BCD6 /* MediaTrackFrameBuffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackFrameBuffer.swift; sourceTree = ""; }; - D0F69D711D6B87DE0046BCD6 /* MediaTrackFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackFrame.swift; sourceTree = ""; }; - D0F69D7F1D6B87EC0046BCD6 /* MediaPlaybackData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPlaybackData.swift; sourceTree = ""; }; - D0F69D871D6B87EC0046BCD6 /* FFMpegMediaVideoFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFMpegMediaVideoFrameDecoder.swift; sourceTree = ""; }; - D0F69D881D6B87EC0046BCD6 /* MediaTrackFrameDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackFrameDecoder.swift; sourceTree = ""; }; D0F69DB91D6B88190046BCD6 /* TelegramUI.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = TelegramUI.xcconfig; path = TelegramUI/Config/TelegramUI.xcconfig; sourceTree = ""; }; D0F69DC01D6B89D30046BCD6 /* ListSectionHeaderNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListSectionHeaderNode.swift; sourceTree = ""; }; D0F69DC21D6B89DA0046BCD6 /* TextNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextNode.swift; sourceTree = ""; }; D0F69DC41D6B89E10046BCD6 /* RadialProgressNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadialProgressNode.swift; sourceTree = ""; }; - D0F69DC61D6B89E70046BCD6 /* TransformImageNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransformImageNode.swift; sourceTree = ""; }; - D0F69DC81D6B89EB0046BCD6 /* ImageNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageNode.swift; sourceTree = ""; }; D0F69DCB1D6B8A0D0046BCD6 /* SearchBarNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBarNode.swift; sourceTree = ""; }; D0F69DCC1D6B8A0D0046BCD6 /* SearchBarPlaceholderNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBarPlaceholderNode.swift; sourceTree = ""; }; D0F69DCD1D6B8A0D0046BCD6 /* SearchDisplayController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchDisplayController.swift; sourceTree = ""; }; @@ -2463,14 +2349,10 @@ D0F69E7F1D6B8C850046BCD6 /* FastBlur.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FastBlur.h; sourceTree = ""; }; D0F69E801D6B8C850046BCD6 /* FastBlur.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FastBlur.m; sourceTree = ""; }; D0F69E831D6B8C850046BCD6 /* FrameworkBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FrameworkBundle.swift; sourceTree = ""; }; - D0F69E851D6B8C850046BCD6 /* RingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RingBuffer.h; sourceTree = ""; }; - D0F69E861D6B8C850046BCD6 /* RingBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RingBuffer.m; sourceTree = ""; }; - D0F69E871D6B8C850046BCD6 /* RingByteBuffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RingByteBuffer.swift; sourceTree = ""; }; D0F69E931D6B8C9B0046BCD6 /* ProgressiveImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressiveImage.swift; sourceTree = ""; }; D0F69E941D6B8C9B0046BCD6 /* WebP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebP.swift; sourceTree = ""; }; D0F69E9F1D6B8E380046BCD6 /* PhotoResources.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoResources.swift; sourceTree = ""; }; D0F69EA01D6B8E380046BCD6 /* StickerResources.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerResources.swift; sourceTree = ""; }; - D0F69EA51D6B8F3E0046BCD6 /* TelegramUIIncludes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramUIIncludes.h; sourceTree = ""; }; D0F69EA61D6B9BBC0046BCD6 /* libwebp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebp.a; path = "third-party/libwebp/lib/libwebp.a"; sourceTree = ""; }; D0F69EA81D6B9BCB0046BCD6 /* libavcodec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavcodec.a; path = "third-party/FFmpeg-iOS/lib/libavcodec.a"; sourceTree = ""; }; D0F69EA91D6B9BCB0046BCD6 /* libavformat.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavformat.a; path = "third-party/FFmpeg-iOS/lib/libavformat.a"; sourceTree = ""; }; @@ -2511,6 +2393,19 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D03AE67522B945D30078411C /* BuildConfig.framework in Frameworks */, + D03AE67322B9459C0078411C /* HockeySDK.framework in Frameworks */, + D02D634A22B85B94006BE519 /* PushKit.framework in Frameworks */, + D00818CD22B595CB008A895F /* LightweightAccountData.framework in Frameworks */, + D008184A22B57225008A895F /* WatchCommon.framework in Frameworks */, + D0750C7A22B2A14300BE5F6E /* DeviceAccess.framework in Frameworks */, + D0750C7C22B2A14300BE5F6E /* TelegramPresentationData.framework in Frameworks */, + D0750C7E22B2A14300BE5F6E /* TelegramVoip.framework in Frameworks */, + D0750C7822B2A13300BE5F6E /* UniversalMediaPlayer.framework in Frameworks */, + D0AE315422B1DEE30058D3BC /* TelegramUIPreferences.framework in Frameworks */, + D0AE311222B1DD4D0058D3BC /* TelegramCallsUI.framework in Frameworks */, + D0AE30EB22B1DBD10058D3BC /* GZip.framework in Frameworks */, + D0AE30CF22B1D9980058D3BC /* RMIntro.framework in Frameworks */, D015E04F225D2E5900CB9E8A /* WebP.framework in Frameworks */, D05B077421BFC38600B1D27C /* FFMpeg.framework in Frameworks */, 091BEAB3214552D9003AEA30 /* Vision.framework in Frameworks */, @@ -2554,14 +2449,14 @@ name = "Language Suggestion"; sourceTree = ""; }; - 090E778422A9B94700CD99F5 /* People Nearby */ = { + 090E778422A9B94700CD99F5 /* Peers Nearby */ = { isa = PBXGroup; children = ( - 090E778522A9B95A00CD99F5 /* PeopleNearbyController.swift */, - 090E778722A9B96000CD99F5 /* PeopleNearbyHeaderItem.swift */, - 090E778D22AA863A00CD99F5 /* PeopleNearbyIconNode.swift */, + 090E778522A9B95A00CD99F5 /* PeersNearbyController.swift */, + 090E778722A9B96000CD99F5 /* PeersNearbyHeaderItem.swift */, + 090E778D22AA863A00CD99F5 /* PeersNearbyIconNode.swift */, ); - name = "People Nearby"; + name = "Peers Nearby"; sourceTree = ""; }; 0919546D229458E900E11046 /* Animated Stickers */ = { @@ -2637,18 +2532,6 @@ name = "Web Search"; sourceTree = ""; }; - 0965C7152178738A007C94D0 /* Bridge Audio */ = { - isa = PBXGroup; - children = ( - 096C98BD21787C6700C211FF /* TGBridgeAudioDecoder.h */, - 096C98BE21787C6700C211FF /* TGBridgeAudioDecoder.mm */, - 096C98BC21787C6600C211FF /* TGBridgeAudioEncoder.h */, - 096C98BB21787C6600C211FF /* TGBridgeAudioEncoder.m */, - 096C98B921787A5C00C211FF /* LegacyBridgeAudio.swift */, - ); - name = "Bridge Audio"; - sourceTree = ""; - }; 0979787F21065EAA0077D77F /* Web Embed */ = { isa = PBXGroup; children = ( @@ -2773,7 +2656,6 @@ 09E4A7FE223ADFD80038140F /* Data */ = { isa = PBXGroup; children = ( - D087750B1E3E7B7600A97350 /* PostboxKeys.swift */, D079FCE81F06A76C0038FADE /* Notices.swift */, D09250051FE5371D003F693F /* GlobalExperimentalSettings.swift */, D0CAD8FC20AE467D00ACD96E /* PeerChannelMemberCategoriesContextsManager.swift */, @@ -2823,6 +2705,56 @@ name = "Undo Overlay"; sourceTree = ""; }; + D008178022B47450008A895F /* Notification Content */ = { + isa = PBXGroup; + children = ( + D008178122B47464008A895F /* NotificationContentContext.swift */, + ); + name = "Notification Content"; + sourceTree = ""; + }; + D008179822B478FE008A895F /* App */ = { + isa = PBXGroup; + children = ( + D077C5C022B59A800097D617 /* ApplicationContext.swift */, + D00817E422B47A2E008A895F /* Legacy Data Import */, + D00817BF22B47A13008A895F /* AppDelegate.swift */, + D00817BB22B47A13008A895F /* ApplicationShortcutItem.swift */, + D00817C322B47A13008A895F /* LockedWindowCoveringView.swift */, + D00817C222B47A13008A895F /* ManageSharedAccountInfo.swift */, + D00817BD22B47A13008A895F /* TGBridgeServer.h */, + D00817C422B47A13008A895F /* TGBridgeServer.m */, + D00817C622B47A13008A895F /* UIImage+ImageEffects.h */, + D00817C822B47A14008A895F /* UIImage+ImageEffects.m */, + D00817B622B47A12008A895F /* WakeupManager.swift */, + D00817B122B47A12008A895F /* WatchBridge.swift */, + D00817B222B47A12008A895F /* WatchCommunicationManager.swift */, + D00817B022B47A12008A895F /* WatchRequestHandlers.swift */, + ); + name = App; + sourceTree = ""; + }; + D00817E422B47A2E008A895F /* Legacy Data Import */ = { + isa = PBXGroup; + children = ( + D00817C122B47A13008A895F /* LegacyChatImport.swift */, + D00817B722B47A12008A895F /* LegacyDataImport.swift */, + D00817C522B47A13008A895F /* LegacyDataImportSplash.swift */, + D00817B522B47A12008A895F /* LegacyFileImport.swift */, + D00817B822B47A12008A895F /* LegacyPreferencesImport.swift */, + D00817B922B47A12008A895F /* LegacyResourceImport.swift */, + D00817BA22B47A12008A895F /* LegacyUserDataImport.swift */, + D00817B322B47A12008A895F /* TGAutoDownloadPreferences.h */, + D00817BE22B47A13008A895F /* TGAutoDownloadPreferences.m */, + D00817C022B47A13008A895F /* TGPresentationAutoNightPreferences.h */, + D00817C922B47A14008A895F /* TGPresentationAutoNightPreferences.m */, + D00817B422B47A12008A895F /* TGProxyItem.h */, + D00817BC22B47A13008A895F /* TGProxyItem.m */, + D035734A22B5CCCA00F0920D /* LegacyBuffer.swift */, + ); + name = "Legacy Data Import"; + sourceTree = ""; + }; D00C7CDA1E3776CA0080C3D5 /* Secret Preview */ = { isa = PBXGroup; children = ( @@ -2846,6 +2778,14 @@ D087BFAE1F741BB7003FD209 /* ShareLoadingContainerNode.swift */, D00BED211F73F82400922292 /* SharePeersContainerNode.swift */, D00BED1F1F73F60F00922292 /* ShareSearchContainerNode.swift */, + D0750C8622B2E76300BE5F6E /* ShareExtensionContext.swift */, + D008177222B46B7D008A895F /* ShareItems.swift */, + D008177422B46B7E008A895F /* TGContactModel.h */, + D008177622B46B7E008A895F /* TGContactModel.m */, + D008177522B46B7E008A895F /* TGItemProviderSignals.h */, + D008177722B46B7E008A895F /* TGItemProviderSignals.m */, + D008177322B46B7E008A895F /* TGShareLocationSignals.h */, + D008177822B46B7E008A895F /* TGShareLocationSignals.m */, ); name = Share; sourceTree = ""; @@ -2858,6 +2798,18 @@ name = "Instant Page Gallery"; sourceTree = ""; }; + D01590A922BD46690017C33E /* Animation */ = { + isa = PBXGroup; + children = ( + D01590AA22BD467B0017C33E /* AnimationRenderer.swift */, + D01590A522BD460C0017C33E /* MetalAnimationRenderer.swift */, + D01590A722BD462C0017C33E /* SoftwareAnimationRenderer.swift */, + D01590AC22BD58AD0017C33E /* YUV.h */, + D01590AD22BD58AD0017C33E /* YUV.m */, + ); + name = Animation; + sourceTree = ""; + }; D017494F1E1067C00057C89A /* Hashtag Search */ = { isa = PBXGroup; children = ( @@ -2888,7 +2840,6 @@ children = ( D00781042084DFB100369A39 /* UrlEscaping.swift */, D0B844551DAC3AEE005F29E1 /* PresenceStrings.swift */, - D05A32DB1E6EFCC2002760B4 /* NumericFormat.swift */, D0C26D5D1FDF49E7004ABF18 /* DateFormat.swift */, D0BCC3D1203F0A6C008126C2 /* StringForMessageTimestampStatus.swift */, D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */, @@ -3031,6 +2982,9 @@ D02B198821F1DA8A0094A764 /* Account Management */ = { isa = PBXGroup; children = ( + D0750C8422B2E52300BE5F6E /* ClearNotificationsManager.swift */, + D0750C8122B2E4EE00BE5F6E /* SharedNotificationManager.swift */, + D0750C8022B2E4EE00BE5F6E /* SharedWakeupManager.swift */, D02B198921F1DA9E0094A764 /* SharedAccountContext.swift */, D05811931DD5F9380057C769 /* AccountContext.swift */, D017734B22049BF800DA06A7 /* UpgradedAccounts.swift */, @@ -3068,19 +3022,6 @@ name = "Plaintext Fields"; sourceTree = ""; }; - D0383ED5207D19BC00C45548 /* Emoji */ = { - isa = PBXGroup; - children = ( - D0383ED9207D1A1600C45548 /* emoji_suggestions_data.cpp */, - D0383ED6207D1A1500C45548 /* emoji_suggestions_data.h */, - D0383ED8207D1A1600C45548 /* emoji_suggestions.cpp */, - D0383EDB207D1A1600C45548 /* emoji_suggestions.h */, - D0383ED7207D1A1500C45548 /* TGEmojiSuggestions.h */, - D0383EDA207D1A1600C45548 /* TGEmojiSuggestions.mm */, - ); - name = Emoji; - sourceTree = ""; - }; D0383EE2207D291100C45548 /* Emojis */ = { isa = PBXGroup; children = ( @@ -3150,8 +3091,6 @@ D04614352005093B00EC0EF2 /* Location */ = { isa = PBXGroup; children = ( - D06F31E02135829A001A0F12 /* EDSunriseSet.h */, - D06F31DF2135829A001A0F12 /* EDSunriseSet.m */, D04614362005094E00EC0EF2 /* DeviceLocationManager.swift */, D046142D2004DB3700EC0EF2 /* LiveLocationManager.swift */, D0461438200514F000EC0EF2 /* LiveLocationSummaryManager.swift */, @@ -3245,130 +3184,6 @@ name = "Password Entry"; sourceTree = ""; }; - D04BB2C61E48797500650E93 /* RMIntro */ = { - isa = PBXGroup; - children = ( - D04BB2C71E48797500650E93 /* 3rdparty */, - D04BB2CB1E48797500650E93 /* core */, - D04BB2DE1E48797500650E93 /* platform */, - ); - name = RMIntro; - path = "third-party/RMIntro"; - sourceTree = SOURCE_ROOT; - }; - D04BB2C71E48797500650E93 /* 3rdparty */ = { - isa = PBXGroup; - children = ( - D04BB2C91E48797500650E93 /* linmath */, - ); - path = 3rdparty; - sourceTree = ""; - }; - D04BB2C91E48797500650E93 /* linmath */ = { - isa = PBXGroup; - children = ( - D04BB2CA1E48797500650E93 /* linmath.h */, - ); - path = linmath; - sourceTree = ""; - }; - D04BB2CB1E48797500650E93 /* core */ = { - isa = PBXGroup; - children = ( - D04BB2CC1E48797500650E93 /* animations.c */, - D04BB2CD1E48797500650E93 /* animations.h */, - D04BB2CE1E48797500650E93 /* buffer.c */, - D04BB2CF1E48797500650E93 /* buffer.h */, - D04BB2D11E48797500650E93 /* macros.h */, - D04BB2D21E48797500650E93 /* math_helper.h */, - D04BB2D31E48797500650E93 /* matrix.h */, - D04BB2D41E48797500650E93 /* objects.c */, - D04BB2D51E48797500650E93 /* objects.h */, - D04BB2D61E48797500650E93 /* program.c */, - D04BB2D71E48797500650E93 /* program.h */, - D04BB2D81E48797500650E93 /* rngs.c */, - D04BB2D91E48797500650E93 /* rngs.h */, - D04BB2DA1E48797500650E93 /* shader.c */, - D04BB2DB1E48797500650E93 /* shader.h */, - D04BB2DC1E48797500650E93 /* timing.c */, - D04BB2DD1E48797500650E93 /* timing.h */, - ); - path = core; - sourceTree = ""; - }; - D04BB2DE1E48797500650E93 /* platform */ = { - isa = PBXGroup; - children = ( - D04BB2DF1E48797500650E93 /* common */, - D04BB2E31E48797500650E93 /* ios */, - ); - path = platform; - sourceTree = ""; - }; - D04BB2DF1E48797500650E93 /* common */ = { - isa = PBXGroup; - children = ( - D04BB2E01E48797500650E93 /* platform_log.c */, - D04BB2E11E48797500650E93 /* platform_log.h */, - D04BB2E21E48797500650E93 /* platform_macros.h */, - ); - path = common; - sourceTree = ""; - }; - D04BB2E31E48797500650E93 /* ios */ = { - isa = PBXGroup; - children = ( - D04BB2FE1E48797500650E93 /* platform_gl.h */, - D04BB2FF1E48797500650E93 /* Resources */, - D04BB31C1E48797500650E93 /* RMGeometry.h */, - D04BB31D1E48797500650E93 /* RMGeometry.m */, - D04BB3201E48797500650E93 /* RMIntroPageView.h */, - D04BB3211E48797500650E93 /* RMIntroPageView.m */, - D04BB3221E48797500650E93 /* RMIntroViewController.h */, - D04BB3231E48797500650E93 /* RMIntroViewController.m */, - D04BB3241E48797500650E93 /* RMLoginViewController.h */, - D04BB3251E48797500650E93 /* RMLoginViewController.m */, - D04BB3261E48797500650E93 /* RMRootViewController.h */, - D04BB3271E48797500650E93 /* RMRootViewController.m */, - D04BB3281E48797500650E93 /* texture_helper.h */, - D04BB3291E48797500650E93 /* texture_helper.m */, - ); - path = ios; - sourceTree = ""; - }; - D04BB2FF1E48797500650E93 /* Resources */ = { - isa = PBXGroup; - children = ( - D04BB3001E48797500650E93 /* fast_arrow@2x.png */, - D04BB3011E48797500650E93 /* fast_arrow_shadow@2x.png */, - D04BB3021E48797500650E93 /* fast_body@2x.png */, - D04BB3031E48797500650E93 /* fast_spiral@2x.png */, - D04BB3041E48797500650E93 /* ic_bubble@2x.png */, - D04BB3051E48797500650E93 /* ic_bubble_dot@2x.png */, - D04BB3061E48797500650E93 /* ic_cam@2x.png */, - D04BB3071E48797500650E93 /* ic_cam_lens@2x.png */, - D04BB3081E48797500650E93 /* ic_pencil@2x.png */, - D04BB3091E48797500650E93 /* ic_pin@2x.png */, - D04BB30A1E48797500650E93 /* ic_smile@2x.png */, - D04BB30B1E48797500650E93 /* ic_smile_eye@2x.png */, - D04BB30C1E48797500650E93 /* ic_videocam@2x.png */, - D04BB30D1E48797500650E93 /* knot_down@2x.png */, - D04BB30E1E48797500650E93 /* knot_up@2x.png */, - D04BB30F1E48797500650E93 /* powerful_infinity@2x.png */, - D04BB3101E48797500650E93 /* powerful_infinity_white@2x.png */, - D04BB3111E48797500650E93 /* powerful_mask@2x.png */, - D04BB3121E48797500650E93 /* powerful_star@2x.png */, - D04BB3131E48797500650E93 /* private_door@2x.png */, - D04BB3141E48797500650E93 /* private_screw@2x.png */, - D04BB3151E48797500650E93 /* start_arrow@2x.png */, - D04BB3161E48797500650E93 /* start_arrow_ipad.png */, - D04BB3171E48797500650E93 /* start_arrow_ipad@2x.png */, - D04BB3181E48797500650E93 /* telegram_plane@2x.png */, - D04BB3191E48797500650E93 /* telegram_sphere@2x.png */, - ); - path = Resources; - sourceTree = ""; - }; D050F2141E48D9C200988324 /* Country Selection */ = { isa = PBXGroup; children = ( @@ -3387,14 +3202,6 @@ name = Root; sourceTree = ""; }; - D05174C41EAE58E900A1BF36 /* Utils */ = { - isa = PBXGroup; - children = ( - D05174C51EAE58FC00A1BF36 /* ComponentsThemes.swift */, - ); - name = Utils; - sourceTree = ""; - }; D0575AF81EA0FD94006F2541 /* Avatar Gallery */ = { isa = PBXGroup; children = ( @@ -3423,6 +3230,7 @@ D0B37C5F1F8D286E004252DF /* ThemeSettingsFontSizeItem.swift */, D06F31E52135A41C001A0F12 /* ThemeSettingsBrightnessItem.swift */, 09A218F422A15F1400DE6898 /* ThemeSettingsAppIconItem.swift */, + 098CF79122B924E200AF6134 /* ThemeSettingsAccentColorItem.swift */, 090E777822A6A32E00CD99F5 /* ThemeSettingsThemeItem.swift */, D06E4C322134A59700088087 /* ThemeAccentColorActionSheet.swift */, D06E4C342134AE3C00088087 /* ThemeAutoNightSettingsController.swift */, @@ -3475,16 +3283,6 @@ name = "Setup Two Step Verification"; sourceTree = ""; }; - D067B4AE211C916D00796039 /* Channel Intro */ = { - isa = PBXGroup; - children = ( - D067B4A4211C911C00796039 /* LegacyChannelIntroController.swift */, - D067B4A6211C916200796039 /* TGChannelIntroController.h */, - D067B4A9211C916200796039 /* TGChannelIntroController.m */, - ); - name = "Channel Intro"; - sourceTree = ""; - }; D0736F261DF4D2F300F2C02A /* Telegram Controller */ = { isa = PBXGroup; children = ( @@ -3544,9 +3342,7 @@ D07551891DDA4C7C0073E051 /* Legacy Components */ = { isa = PBXGroup; children = ( - 0965C7152178738A007C94D0 /* Bridge Audio */, - D04BB2C61E48797500650E93 /* RMIntro */, - D067B4AE211C916D00796039 /* Channel Intro */, + D0AE2FDB22B1D3610058D3BC /* Bridge Audio */, D075518A1DDA4D7D0073E051 /* LegacyController.swift */, D075518C1DDA4E0B0073E051 /* LegacyControllerNode.swift */, D07551921DDA540F0073E051 /* TelegramInitializeLegacyComponents.swift */, @@ -3672,33 +3468,6 @@ name = "Language Link Preview"; sourceTree = ""; }; - D087750A1E3E7A6D00A97350 /* Settings */ = { - isa = PBXGroup; - children = ( - D01B279E1E394BD70022A4C0 /* InAppNotificationSettings.swift */, - D01B27A31E394FC90022A4C0 /* PresentationPasscodeSettings.swift */, - D0223A8F1EA53E6000211D94 /* MediaAutoDownloadSettings.swift */, - 0935F8EE22197FBF0070AE70 /* LegacyAutomaticMediaDownloadSettings.swift */, - D0223A911EA5420C00211D94 /* GeneratedMediaStoreSettings.swift */, - D0223A931EA5442C00211D94 /* VoiceCallSettings.swift */, - D010C2C91EA7A59F00F41B96 /* PresentationThemeSettings.swift */, - D089F7891F4E0C14000E934D /* InstantPagePresentationSettings.swift */, - D073D2DA1FB61DA9009E1DA2 /* CallListSettings.swift */, - D09250031FE5363D003F693F /* ExperimentalSettings.swift */, - D056CD711FF1569800880D28 /* MusicPlaybackSettings.swift */, - D0B2F76120506E2A00D3BFB9 /* MediaInputSettings.swift */, - D08D7E8320A0F6020005D80C /* ExperimentalUISettings.swift */, - D048B33A203C777500038D05 /* RenderedTotalUnreadCount.swift */, - D06ECFCA20B8448E00C576C2 /* ContactSynchronizationSettings.swift */, - D08A10BA211DF7A80077488B /* StickerSettings.swift */, - 0952D1762177FB5400194860 /* WatchPresetSettings.swift */, - 0962E67C21BA048D00245FD9 /* WebSearchSettings.swift */, - D005808A21CAB8F000CB7CD3 /* VoipDerivedState.swift */, - D0F339362269D83500CFF53F /* ChatArchiveSettings.swift */, - ); - name = Settings; - sourceTree = ""; - }; D087750D1E3F214200A97350 /* Contact List Node */ = { isa = PBXGroup; children = ( @@ -3734,6 +3503,19 @@ D08D45281D5E340200A7428A /* Frameworks */ = { isa = PBXGroup; children = ( + D03AE67422B945D30078411C /* BuildConfig.framework */, + D03AE67222B9459C0078411C /* HockeySDK.framework */, + D02D634922B85B94006BE519 /* PushKit.framework */, + D00818CC22B595CB008A895F /* LightweightAccountData.framework */, + D008184922B57225008A895F /* WatchCommon.framework */, + D0750C7922B2A14300BE5F6E /* DeviceAccess.framework */, + D0750C7B22B2A14300BE5F6E /* TelegramPresentationData.framework */, + D0750C7D22B2A14300BE5F6E /* TelegramVoip.framework */, + D0750C7722B2A13300BE5F6E /* UniversalMediaPlayer.framework */, + D0AE315322B1DEE30058D3BC /* TelegramUIPreferences.framework */, + D0AE311122B1DD4D0058D3BC /* TelegramCallsUI.framework */, + D0AE30EA22B1DBD10058D3BC /* GZip.framework */, + D0AE30CE22B1D9980058D3BC /* RMIntro.framework */, D015E04E225D2E5900CB9E8A /* WebP.framework */, D05B077321BFC38600B1D27C /* FFMpeg.framework */, D05B077121BFB9F600B1D27C /* FFMpeg.framework */, @@ -3809,18 +3591,8 @@ D096A4601EA681720000A7AE /* Presentation Data */ = { isa = PBXGroup; children = ( - D05174C41EAE58E900A1BF36 /* Utils */, D05BFB5C1EAA22E200909D38 /* Resources */, - D05B724F1E720597000BD3AD /* PresentationData.swift */, - D096A47A1EA6A2F00000A7AE /* PresentationStrings.swift */, - D096A4611EA681A90000A7AE /* PresentationsResourceCache.swift */, - D096A4631EA683C90000A7AE /* PresentationTheme.swift */, - D010C2CB1EA7D74800F41B96 /* DefaultPresentationTheme.swift */, - D05174BF1EAE3AD400A1BF36 /* DefaultDarkPresentationTheme.swift */, - D0A24D271F92C27100584D24 /* DefaultDarkAccentPresentationTheme.swift */, - D010C2CD1EA7DDD600F41B96 /* DefaultPresentationStrings.swift */, D06FFBA71EAFAC4F00CB53D4 /* PresentationThemeEssentialGraphics.swift */, - D0EAE09F1EB21256005296C1 /* StringPluralization.swift */, ); name = "Presentation Data"; sourceTree = ""; @@ -3864,6 +3636,18 @@ name = Poll; sourceTree = ""; }; + D0AE2FDB22B1D3610058D3BC /* Bridge Audio */ = { + isa = PBXGroup; + children = ( + D0AE2FDC22B1D3610058D3BC /* TGBridgeAudioEncoder.m */, + D0AE2FDD22B1D3610058D3BC /* TGBridgeAudioDecoder.h */, + D0AE2FDE22B1D3610058D3BC /* TGBridgeAudioEncoder.h */, + D0AE2FDF22B1D3610058D3BC /* TGBridgeAudioDecoder.mm */, + D0AE2FE022B1D3610058D3BC /* LegacyBridgeAudio.swift */, + ); + path = "Bridge Audio"; + sourceTree = ""; + }; D0AF7C441ED84BB000CD8E0F /* Language Selection */ = { isa = PBXGroup; children = ( @@ -3874,17 +3658,6 @@ name = "Language Selection"; sourceTree = ""; }; - D0B4AF891EC1132400D51FF6 /* Calls */ = { - isa = PBXGroup; - children = ( - D0EC6B3E1EB8F3E500EBF1C3 /* PresentationCallManager.swift */, - D0B4AF8A1EC1133600D51FF6 /* CallKitIntergation.swift */, - D0F0AADF1EC1E12C005EE2A5 /* PresentationCall.swift */, - D0E8B8A62044339500605593 /* PresentationCallToneData.swift */, - ); - name = Calls; - sourceTree = ""; - }; D0B69C3A20EBD8B3003632C7 /* Device */ = { isa = PBXGroup; children = ( @@ -3892,7 +3665,6 @@ D0FA08BD20481EA300DD23FC /* Locale.swift */, 09DD5D4F21ECC3C400D7007A /* SuppressContactsWarning.swift */, 099529B321D3E5D800805E13 /* CheckDiskSpace.swift */, - D0B69C3B20EBD8C8003632C7 /* CheckDeviceAccess.swift */, D079FCDC1F05C4F20038FADE /* LocalAuth.swift */, D0208ADB1FA346A4001F0D5F /* RaiseToListen.swift */, 09D304142173C0E900C00567 /* WatchManager.swift */, @@ -4071,15 +3843,6 @@ name = "Terms of Service"; sourceTree = ""; }; - D0CE8CEA1F6FCC8200AA2DB0 /* Transform Image */ = { - isa = PBXGroup; - children = ( - D0F69DC61D6B89E70046BCD6 /* TransformImageNode.swift */, - D0CE8CEB1F6FCCA300AA2DB0 /* TransformImageArguments.swift */, - ); - name = "Transform Image"; - sourceTree = ""; - }; D0D03AE61DECB0D200220C46 /* Audio Recorder */ = { isa = PBXGroup; children = ( @@ -4454,16 +4217,6 @@ name = Call; sourceTree = ""; }; - D0EC6FF71EBA1DAE00EBF1C3 /* Calls */ = { - isa = PBXGroup; - children = ( - D0EC6FFA1EBA1DE900EBF1C3 /* OngoingCallThreadLocalContext.h */, - D0EC6FFC1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm */, - D00ADFDA1EBA2EAF00873D2E /* OngoingCallContext.swift */, - ); - name = Calls; - sourceTree = ""; - }; D0EE97131D88BB1A006C18E1 /* Peer Info */ = { isa = PBXGroup; children = ( @@ -4534,7 +4287,6 @@ D080B27E1F4C7C6000AA3847 /* InstantPageManagedMediaId.swift */, D099EA2E1DE775BB001AF5A8 /* ChatContextResultManagedMediaId.swift */, D0F02CD81E97ED080065DEE2 /* RecentGifManagedMediaId.swift */, - D0D03AE21DECACB700220C46 /* ManagedAudioSession.swift */, D0D03AE41DECAE8900220C46 /* ManagedAudioRecorder.swift */, D0CFBB901FD881A600B65C0D /* AudioRecordningToneData.swift */, D0D03B2B1DED9B8900220C46 /* AudioWaveform.swift */, @@ -4546,8 +4298,6 @@ D09E63A91F0FC681003444CD /* PictureInPictureVideoControlsNode.swift */, D09E637D1F0E8C66003444CD /* Shared Media Player */, D0D03AE61DECB0D200220C46 /* Audio Recorder */, - D0F69DBC1D6B886C0046BCD6 /* Player */, - D0EC6FF71EBA1DAE00EBF1C3 /* Calls */, 0919546D229458E900E11046 /* Animated Stickers */, D0F69CDE1D6B87D30046BCD6 /* PeerAvatar.swift */, D0F69E9D1D6B8E240046BCD6 /* Resources */, @@ -4560,31 +4310,6 @@ name = Media; sourceTree = ""; }; - D0F69DBC1D6B886C0046BCD6 /* Player */ = { - isa = PBXGroup; - children = ( - D0F69CE51D6B87D30046BCD6 /* MediaFrameSource.swift */, - D0F69D7F1D6B87EC0046BCD6 /* MediaPlaybackData.swift */, - D0F69D021D6B87D30046BCD6 /* MediaPlayer.swift */, - D0F69CD41D6B87D30046BCD6 /* MediaPlayerAudioRenderer.swift */, - D0F69CDC1D6B87D30046BCD6 /* MediaPlayerNode.swift */, - D058E0CE1E8AD57300A442DE /* VideoPlayerProxy.swift */, - D0F69D1D1D6B87D30046BCD6 /* MediaTrackDecodableFrame.swift */, - D0F69D711D6B87DE0046BCD6 /* MediaTrackFrame.swift */, - D0F69D701D6B87DE0046BCD6 /* MediaTrackFrameBuffer.swift */, - D0F69D881D6B87EC0046BCD6 /* MediaTrackFrameDecoder.swift */, - D0F69CD71D6B87D30046BCD6 /* FFMpegAudioFrameDecoder.swift */, - D0F69CE11D6B87D30046BCD6 /* FFMpegMediaFrameSource.swift */, - D0F69CD31D6B87D30046BCD6 /* FFMpegMediaFrameSourceContext.swift */, - D0F69D161D6B87D30046BCD6 /* FFMpegMediaFrameSourceContextHelpers.swift */, - D0F69D871D6B87EC0046BCD6 /* FFMpegMediaVideoFrameDecoder.swift */, - D0F69D6F1D6B87DE0046BCD6 /* FFMpegMediaPassthroughVideoFrameDecoder.swift */, - D03922A61DF70E3F000F2CE9 /* MediaPlayerScrubbingNode.swift */, - D0177B7F1DFAE18500A5083A /* MediaPlayerTimeTextNode.swift */, - ); - name = Player; - sourceTree = ""; - }; D0F69DBD1D6B897A0046BCD6 /* Components */ = { isa = PBXGroup; children = ( @@ -4615,8 +4340,6 @@ D01776B61F1D6CCF0044446D /* Radial Status */, D0F69DCA1D6B89F20046BCD6 /* Search */, D0477D191F617E4B00412B44 /* Video */, - D0CE8CEA1F6FCC8200AA2DB0 /* Transform Image */, - D0F69DC81D6B89EB0046BCD6 /* ImageNode.swift */, D0F69DC41D6B89E10046BCD6 /* RadialProgressNode.swift */, D00C7CE51E378FD00080C3D5 /* RadialTimeoutNode.swift */, D0F69DC21D6B89DA0046BCD6 /* TextNode.swift */, @@ -4675,6 +4398,7 @@ D04281F2200E5A70009DDE36 /* Chat Recent Actions */, D0AB262D21C3D3CE008F6685 /* Poll */, D00DE6961E8E8E21003F0D76 /* Share */, + D008178022B47450008A895F /* Notification Content */, D0F69E4E1D6B8BB90046BCD6 /* Media */, D0F69E6C1D6B8C220046BCD6 /* Contacts */, D0BC38681E3FB92B0044D6FE /* Compose */, @@ -4691,7 +4415,7 @@ 0941A99E210B053300EBE194 /* Open In */, 09F215982263E61400AEDF6D /* Passcode */, 09B4EE5721A82F5900847FA6 /* Permissions */, - 090E778422A9B94700CD99F5 /* People Nearby */, + 090E778422A9B94700CD99F5 /* Peers Nearby */, ); name = Controllers; sourceTree = ""; @@ -4792,6 +4516,7 @@ D0F69E181D6B8AD10046BCD6 /* Items */ = { isa = PBXGroup; children = ( + D01590A922BD46690017C33E /* Animation */, D0F69E1B1D6B8B030046BCD6 /* ChatMessageActionItemNode.swift */, D0F69E1C1D6B8B030046BCD6 /* ChatMessageAvatarAccessoryItem.swift */, D0F69E1D1D6B8B030046BCD6 /* ChatMessageBubbleContentCalclulateImageCorners.swift */, @@ -4982,14 +4707,8 @@ D0F69E7F1D6B8C850046BCD6 /* FastBlur.h */, D0F69E801D6B8C850046BCD6 /* FastBlur.m */, D0F69E831D6B8C850046BCD6 /* FrameworkBundle.swift */, - D0F69E851D6B8C850046BCD6 /* RingBuffer.h */, - D0F69E861D6B8C850046BCD6 /* RingBuffer.m */, - D0F69E871D6B8C850046BCD6 /* RingByteBuffer.swift */, - D0F69EA51D6B8F3E0046BCD6 /* TelegramUIIncludes.h */, D00C7CF51E37BF680080C3D5 /* SecretChatKeyVisualization.h */, D00C7CF61E37BF680080C3D5 /* SecretChatKeyVisualization.m */, - D0EAE0A11EB212DE005296C1 /* NumberPluralizationForm.h */, - D0EAE0A21EB212DE005296C1 /* NumberPluralizationForm.m */, D0208AD31FA33D14001F0D5F /* RaiseToListenActivator.h */, D0208AD41FA33D14001F0D5F /* RaiseToListenActivator.m */, D0208AD71FA34017001F0D5F /* DeviceProximityManager.h */, @@ -5005,7 +4724,6 @@ 09E4A7FE223ADFD80038140F /* Data */, D0B69C3A20EBD8B3003632C7 /* Device */, D01C7EFE1EF9D434008305F1 /* Device Contacts */, - D0383ED5207D19BC00C45548 /* Emoji */, D025A4241F79428300563950 /* Fetch Manager */, 09E4A7FC223ADF300038140F /* Images */, D04614352005093B00EC0EF2 /* Location */, @@ -5021,15 +4739,12 @@ D0F3A8AA1E82D83E00B4C64C /* TelegramAccountAuxiliaryMethods.swift */, D01DBA9A209CC6AD00C64E64 /* ChatLinkPreview.swift */, D0BFAE5C20AB426300793CF2 /* PeerTitle.swift */, - D044A0F220BDA05800326FAC /* ThrottledValue.swift */, D000CAB921EE130D0011B15D /* MapResourceToAvatarSizes.swift */, 090B48C72200BCA8005083FA /* WallpaperUploadManager.swift */, 09D96898221DE92600B1458A /* ID3ArtworkReader.swift */, 09E4A800223AE1B30038140F /* PeerType.swift */, 09E4A806223D4B860038140F /* AccountUtils.swift */, D099E21F229405BB00561B75 /* Weak.swift */, - 0921F5FB228B01B6001A13D7 /* GZip.h */, - 0921F5FC228B01B6001A13D7 /* GZip.m */, ); name = Utils; sourceTree = ""; @@ -5123,11 +4838,10 @@ D0FC40811D5B8E7400261D9D /* TelegramUI */ = { isa = PBXGroup; children = ( + D008179822B478FE008A895F /* App */, D07551891DDA4C7C0073E051 /* Legacy Components */, D0F69E911D6B8C8E0046BCD6 /* Utils */, - D0B4AF891EC1132400D51FF6 /* Calls */, D096A4601EA681720000A7AE /* Presentation Data */, - D087750A1E3E7A6D00A97350 /* Settings */, D0F69DBB1D6B88330046BCD6 /* Media */, D0F69DBD1D6B897A0046BCD6 /* Components */, D0F69DE61D6B8A4E0046BCD6 /* Controllers */, @@ -5155,42 +4869,43 @@ buildActionMask = 2147483647; files = ( D0E9BA221F05577700F079A4 /* STPCard.h in Headers */, - 096C98C021787C6700C211FF /* TGBridgeAudioEncoder.h in Headers */, D0E9BA591F055A2200F079A4 /* STPWeakStrongMacros.h in Headers */, D0E9BADE1F0574D800F079A4 /* STPBackendAPIAdapter.h in Headers */, D0E9BAD11F0573C000F079A4 /* STPToken.h in Headers */, + D0AE303622B1D3620058D3BC /* TGBridgeAudioDecoder.h in Headers */, D0E9BAE71F0574FF00F079A4 /* STPCustomer.h in Headers */, D0208AD51FA33D14001F0D5F /* RaiseToListenActivator.h in Headers */, + D00817DA22B47A14008A895F /* TGPresentationAutoNightPreferences.h in Headers */, D0E9BAE31F0574D800F079A4 /* STPBankAccountParams.h in Headers */, - D0383EE1207D1A1600C45548 /* emoji_suggestions.h in Headers */, D0E9BA361F05585000F079A4 /* STPPhoneNumberValidator.h in Headers */, D0E9BA511F0559DA00F079A4 /* STPImageLibrary.h in Headers */, D0E9BA4C1F0559C700F079A4 /* NSString+Stripe_CardBrands.h in Headers */, + D00817E022B47A14008A895F /* UIImage+ImageEffects.h in Headers */, D0E9BAE11F0574D800F079A4 /* STPBankAccount.h in Headers */, D0E9BACE1F0573AF00F079A4 /* STPBlocks.h in Headers */, D0E9BA2A1F0557A600F079A4 /* STPFormEncoder.h in Headers */, D0E9BA321F05583A00F079A4 /* STPPostalCodeValidator.h in Headers */, D0E9BADC1F0574D800F079A4 /* PKPayment+Stripe.h in Headers */, - D0383EDC207D1A1600C45548 /* emoji_suggestions_data.h in Headers */, D0E9BA491F0559B600F079A4 /* STPPaymentMethod.h in Headers */, D08803C51F6064CF00DD7951 /* TelegramUI.h in Headers */, D0E9BA171F05574500F079A4 /* STPPaymentCardTextFieldViewModel.h in Headers */, D0EB42001F30ED4F00838FE6 /* LegacyImageProcessors.h in Headers */, + D01590AE22BD58AD0017C33E /* YUV.h in Headers */, + D008177B22B46B7E008A895F /* TGContactModel.h in Headers */, D0E9BA291F0557A600F079A4 /* STPFormEncodable.h in Headers */, D0E9BA141F05574500F079A4 /* STPCardValidationState.h in Headers */, D00701A12029F6D0006B9E34 /* TGMimeTypeMap.h in Headers */, D0E9BA461F0559A500F079A4 /* NSDictionary+Stripe.h in Headers */, D0208AD91FA34017001F0D5F /* DeviceProximityManager.h in Headers */, + D0AE303722B1D3620058D3BC /* TGBridgeAudioEncoder.h in Headers */, D0E9BAC61F05738600F079A4 /* STPAPIClient.h in Headers */, - D00ADFD91EBA2E9D00873D2E /* OngoingCallThreadLocalContext.h in Headers */, - D06F31E22135829B001A0F12 /* EDSunriseSet.h in Headers */, D0E9BA531F0559DA00F079A4 /* STPImageLibrary+Private.h in Headers */, D0E9BA601F055A4300F079A4 /* STPDelegateProxy.h in Headers */, - 096C98C121787C6700C211FF /* TGBridgeAudioDecoder.h in Headers */, D0E9BADF1F0574D800F079A4 /* STPDispatchFunctions.h in Headers */, + D00817CD22B47A14008A895F /* TGAutoDownloadPreferences.h in Headers */, D0E9BACB1F05738600F079A4 /* STPAPIPostRequest.h in Headers */, D0E9BA561F055A0B00F079A4 /* STPFormTextField.h in Headers */, - D067B4AA211C916300796039 /* TGChannelIntroController.h in Headers */, + D008177C22B46B7E008A895F /* TGItemProviderSignals.h in Headers */, D0E9BABE1F05735F00F079A4 /* STPPaymentConfiguration+Private.h in Headers */, D0E9BACA1F05738600F079A4 /* STPAPIClient+Private.h in Headers */, D0E9BA251F05578900F079A4 /* STPCardBrand.h in Headers */, @@ -5198,10 +4913,12 @@ D0E9BA451F0559A500F079A4 /* STPAPIResponseDecodable.h in Headers */, D0E9BA201F05577700F079A4 /* STPCardParams.h in Headers */, D0E9BA151F05574500F079A4 /* STPCardValidator.h in Headers */, + D00817D722B47A14008A895F /* TGBridgeServer.h in Headers */, + D00817CE22B47A14008A895F /* TGProxyItem.h in Headers */, D0E9BA401F0558FE00F079A4 /* StripeError.h in Headers */, D0E9BA191F05574500F079A4 /* STPPaymentCardTextField.h in Headers */, - D0383EDD207D1A1600C45548 /* TGEmojiSuggestions.h in Headers */, D0E9BA3F1F0558FE00F079A4 /* STPSource.h in Headers */, + D008177A22B46B7E008A895F /* TGShareLocationSignals.h in Headers */, D0E9BABC1F05735F00F079A4 /* STPPaymentConfiguration.h in Headers */, D0E9BA2E1F0557D400F079A4 /* STPAddress.h in Headers */, D0E9BA5C1F055A3300F079A4 /* STPBINRange.h in Headers */, @@ -5389,44 +5106,31 @@ files = ( D0684A041F6C3AD50059F570 /* ChatListTypingNode.swift in Sources */, D0383EE6207D299600C45548 /* EmojisChatInputPanelItem.swift in Sources */, - D0EC6CAE1EB9F58800EBF1C3 /* animations.c in Sources */, + D00817E322B47A14008A895F /* TGPresentationAutoNightPreferences.m in Sources */, D0FE4DDC1F09AD0400E8A0B3 /* PresentationSurfaceLevels.swift in Sources */, D0119CD020CAE75F00895300 /* LegacySecureIdAttachmentMenu.swift in Sources */, - D0EC6CAF1EB9F58800EBF1C3 /* buffer.c in Sources */, - D0EC6CB01EB9F58800EBF1C3 /* objects.c in Sources */, - D0EC6CB11EB9F58800EBF1C3 /* program.c in Sources */, D0E412DA206A894800BEE4A2 /* SecureIdValueFormFileItem.swift in Sources */, 09B4EE6221AD791600847FA6 /* InstantPageStoredState.swift in Sources */, D0E1199E229809B6008CAE3A /* ChannelDiscussionGroupActionSheetItem.swift in Sources */, - D0EC6CB21EB9F58800EBF1C3 /* rngs.c in Sources */, 09EDAD2A220DA6A40012A50B /* VolumeButtons.swift in Sources */, 09D968A9221F804700B1458A /* ChatRecordingVideoActivityContentNode.swift in Sources */, D0E1199A2297F9C6008CAE3A /* ChannelDiscussionGroupSetupController.swift in Sources */, D083491C209361DC008CFD52 /* AvatarGalleryItemFooterContentNode.swift in Sources */, - D0EC6CB31EB9F58800EBF1C3 /* shader.c in Sources */, 090E778A22A9F23C00CD99F5 /* ChannelOwnershipTransferController.swift in Sources */, D06E4C352134AE3C00088087 /* ThemeAutoNightSettingsController.swift in Sources */, D0F0AAE21EC20EF8005EE2A5 /* CallControllerStatusNode.swift in Sources */, - D0EC6CB41EB9F58800EBF1C3 /* timing.c in Sources */, - D0EC6CB51EB9F58800EBF1C3 /* platform_log.c in Sources */, D0B2F76C2052A7D600D3BFB9 /* SinglePhoneInputNode.swift in Sources */, D04281F6200E5AC2009DDE36 /* ChatRecentActionsControllerNode.swift in Sources */, - D0EC6CB61EB9F58800EBF1C3 /* RMGeometry.m in Sources */, 0941A9A0210B057200EBE194 /* OpenInActionSheetController.swift in Sources */, D079FCDD1F05C4F20038FADE /* LocalAuth.swift in Sources */, 09DD5D5221ED175300D7007A /* WallpaperColorPickerNode.swift in Sources */, D0B2F76820528E3D00D3BFB9 /* UserInfoEditingPhoneActionItem.swift in Sources */, - D0EC6CB71EB9F58800EBF1C3 /* RMIntroPageView.m in Sources */, - D0EC6CB81EB9F58800EBF1C3 /* RMIntroViewController.m in Sources */, 09F79A0321C8225600820234 /* WebSearchVideoGalleryItem.swift in Sources */, - D0EC6CB91EB9F58800EBF1C3 /* RMLoginViewController.m in Sources */, D0E9BA631F055AD200F079A4 /* BotPaymentCardInputItemNode.swift in Sources */, D01848E821A03BDA00B6DEBD /* ChatSearchState.swift in Sources */, - D0EC6CBA1EB9F58800EBF1C3 /* RMRootViewController.m in Sources */, D0E412CA206A5B0B00BEE4A2 /* FormControllerTextInputItem.swift in Sources */, D0208ADC1FA346A4001F0D5F /* RaiseToListen.swift in Sources */, D0EB41F91F30E5B700838FE6 /* LegacyPeerAvatarPlaceholderDataSource.swift in Sources */, - D0EC6CBB1EB9F58800EBF1C3 /* texture_helper.m in Sources */, 09D304182173C15700C00567 /* WatchSettingsController.swift in Sources */, D0EC6CBC1EB9F58800EBF1C3 /* LegacyController.swift in Sources */, D0EC6CBD1EB9F58800EBF1C3 /* LegacyControllerNode.swift in Sources */, @@ -5442,7 +5146,6 @@ D0754D1E1EEDDF6200884F6E /* ChatMessageAttachedContentNode.swift in Sources */, D0E9BAC71F05738600F079A4 /* STPAPIClient.m in Sources */, D0CFBB911FD881A600B65C0D /* AudioRecordningToneData.swift in Sources */, - D089F78A1F4E0C14000E934D /* InstantPagePresentationSettings.swift in Sources */, D050A466229C06460044F11A /* ChannelDiscussionGroupSearchContainerNode.swift in Sources */, D01776B51F1D6CCC0044446D /* RadialStatusContentNode.swift in Sources */, D02F4AF01FD4C46D004DFBAE /* SystemVideoContent.swift in Sources */, @@ -5457,6 +5160,8 @@ D093D7DD2062D09A00BC3599 /* SecureIdAuthFormFieldNode.swift in Sources */, 092F36902157AB46001A9F49 /* ItemListCallListItem.swift in Sources */, D0EC6CC61EB9F58800EBF1C3 /* PresenceStrings.swift in Sources */, + D00817D522B47A14008A895F /* ApplicationShortcutItem.swift in Sources */, + D077C5C122B59A800097D617 /* ApplicationContext.swift in Sources */, D0EC6CC71EB9F58800EBF1C3 /* PeerNotificationSoundStrings.swift in Sources */, D01C06C01FBF118A001561AB /* MessageUtils.swift in Sources */, D0104F281F47171F004E4881 /* InstantPageGalleryController.swift in Sources */, @@ -5488,7 +5193,6 @@ D0EC6CD51EB9F58800EBF1C3 /* StoredMessageFromSearchPeer.swift in Sources */, 09CE950E2237E45E00A7D2C3 /* CachedFaqInstantPage.swift in Sources */, D0471B5E1EFEB5860074D609 /* BotPaymentHeaderItemNode.swift in Sources */, - D0EC6CD61EB9F58800EBF1C3 /* PostboxKeys.swift in Sources */, D0EC6CD71EB9F58800EBF1C3 /* EmojiUtils.swift in Sources */, D0EC6CD81EB9F58800EBF1C3 /* ShakeAnimation.swift in Sources */, D0EC6CD91EB9F58800EBF1C3 /* ValidateAddressNameInteractive.swift in Sources */, @@ -5497,7 +5201,6 @@ D0E412CC206A6B2300BEE4A2 /* FormControllerActionItem.swift in Sources */, D0471B5A1EFE70400074D609 /* BotCheckoutInfoControllerNode.swift in Sources */, 09F664CA21EB4F2700AB7E26 /* ThemeGridSearchColorsItem.swift in Sources */, - D0EC6CDA1EB9F58800EBF1C3 /* NumericFormat.swift in Sources */, D093D82220699A7C00BC3599 /* FormControllerNode.swift in Sources */, D0EC6CDB1EB9F58800EBF1C3 /* Markdown.swift in Sources */, D0E412D0206A75B200BEE4A2 /* FormControllerDetailActionItem.swift in Sources */, @@ -5506,9 +5209,7 @@ D0380DB8204EE0A5000414AB /* ChatInstantVideoMessageDurationNode.swift in Sources */, D0EC6CDC1EB9F58800EBF1C3 /* TelegramAccountAuxiliaryMethods.swift in Sources */, D01BAA1A1ECC8E0D00295217 /* CallListControllerNode.swift in Sources */, - D0EC6CDD1EB9F58800EBF1C3 /* PresentationCallManager.swift in Sources */, D0A8BBA11F61EE83000F03FD /* UniversalVideoGalleryItem.swift in Sources */, - D0EC6CDE1EB9F58800EBF1C3 /* ComponentsThemes.swift in Sources */, D0642EFC1F3E1E7B00792790 /* ChatHistoryNavigationButtons.swift in Sources */, D03AA4E5202DF8840056C405 /* StickerPreviewPeekContent.swift in Sources */, D01C06BC1FBBB0D8001561AB /* CheckNode.swift in Sources */, @@ -5523,37 +5224,22 @@ 09DD5D5021ECC3C400D7007A /* SuppressContactsWarning.swift in Sources */, D02B198A21F1DA9E0094A764 /* SharedAccountContext.swift in Sources */, D0F67FF21EE6B915000E5906 /* ChannelMembersSearchControllerNode.swift in Sources */, - D0EC6CE41EB9F58800EBF1C3 /* PresentationData.swift in Sources */, - D0EC6CE51EB9F58800EBF1C3 /* PresentationStrings.swift in Sources */, - D0EC6CE61EB9F58800EBF1C3 /* PresentationsResourceCache.swift in Sources */, D01776BA1F1D704F0044446D /* RadialStatusIconContentNode.swift in Sources */, - D0EC6CE71EB9F58800EBF1C3 /* PresentationTheme.swift in Sources */, D0E8B8BF20447A4600605593 /* SecretChatKeyControllerNode.swift in Sources */, - D0EC6CE81EB9F58800EBF1C3 /* DefaultPresentationTheme.swift in Sources */, - D0EC6CE91EB9F58800EBF1C3 /* DefaultDarkPresentationTheme.swift in Sources */, - D0EC6CEA1EB9F58800EBF1C3 /* DefaultPresentationStrings.swift in Sources */, D0C27B3B1F4B453700A4E170 /* InstantPagePlayableVideoItem.swift in Sources */, D0EC6CEC1EB9F58800EBF1C3 /* PresentationThemeEssentialGraphics.swift in Sources */, D01BAA1E1ECC931D00295217 /* CallListNodeEntries.swift in Sources */, - D0EC6CED1EB9F58800EBF1C3 /* StringPluralization.swift in Sources */, D02B2B9820810DA00062476B /* StickerPaneSearchStickerItem.swift in Sources */, D020A9DC1FEAE6E7008C66F7 /* OverlayPlayerControllerNode.swift in Sources */, D05D8B742195CD890064586F /* SetupTwoStepVerificationController.swift in Sources */, D04B26EC20082EB50053A58C /* LocationBroadcastPanelWavesNode.swift in Sources */, - D0EC6CEE1EB9F58800EBF1C3 /* InAppNotificationSettings.swift in Sources */, - D0EC6CEF1EB9F58800EBF1C3 /* PresentationPasscodeSettings.swift in Sources */, D06BEC8A1F6597A80035A545 /* OverlayVideoDecoration.swift in Sources */, - D0EC6CF01EB9F58800EBF1C3 /* MediaAutoDownloadSettings.swift in Sources */, - D0EC6CF11EB9F58800EBF1C3 /* GeneratedMediaStoreSettings.swift in Sources */, - D0EC6CF21EB9F58800EBF1C3 /* VoiceCallSettings.swift in Sources */, 09619B9621A4ABF600493558 /* InstantPageReferenceControllerNode.swift in Sources */, D0AB263321C3DFEA008F6685 /* CreatePollOptionActionItem.swift in Sources */, 09FFBCDB22849CB500C33B4B /* PDF.swift in Sources */, 09D968A1221F7FF100B1458A /* ChatTypingActivityContentNode.swift in Sources */, - D0EC6CF31EB9F58800EBF1C3 /* PresentationThemeSettings.swift in Sources */, - D067B4AD211C916300796039 /* TGChannelIntroController.m in Sources */, D0BE303220601FFC00FBE6D8 /* LocationBroadcastActionSheetItem.swift in Sources */, - 090E778E22AA863A00CD99F5 /* PeopleNearbyIconNode.swift in Sources */, + 090E778E22AA863A00CD99F5 /* PeersNearbyIconNode.swift in Sources */, D0EC6CF41EB9F58800EBF1C3 /* ManagedMediaId.swift in Sources */, 09D968A3221F800A00B1458A /* ChatUploadingActivityContentNode.swift in Sources */, D0CFBB971FD8B0F700B65C0D /* ChatBubbleInstantVideoDecoration.swift in Sources */, @@ -5561,8 +5247,7 @@ D0EC6CF51EB9F58800EBF1C3 /* PeerMessageManagedMediaId.swift in Sources */, D0E9BA521F0559DA00F079A4 /* STPImageLibrary.m in Sources */, D0EC6CF61EB9F58800EBF1C3 /* ChatContextResultManagedMediaId.swift in Sources */, - D048B33B203C777500038D05 /* RenderedTotalUnreadCount.swift in Sources */, - 090E778622A9B95A00CD99F5 /* PeopleNearbyController.swift in Sources */, + 090E778622A9B95A00CD99F5 /* PeersNearbyController.swift in Sources */, D04ECD721FFBF22B00DE9029 /* OpenUrl.swift in Sources */, D04B4D661EEA993A00711AF6 /* LegacyLocationController.swift in Sources */, D056CD7A1FF3CC2A00880D28 /* ListMessagePlaybackOverlayNode.swift in Sources */, @@ -5572,10 +5257,8 @@ D0E9BA611F055A4300F079A4 /* STPDelegateProxy.m in Sources */, D0EC6CF91EB9F58800EBF1C3 /* MediaManager.swift in Sources */, 0962E66521B3631100245FD9 /* WebSearchNavigationContentNode.swift in Sources */, - 096C98BF21787C6700C211FF /* TGBridgeAudioEncoder.m in Sources */, D01776B81F1D6FB30044446D /* RadialProgressContentNode.swift in Sources */, D05D8B762195CD930064586F /* SetupTwoStepVerificationControllerNode.swift in Sources */, - D0EC6CFA1EB9F58800EBF1C3 /* ManagedAudioSession.swift in Sources */, D0EB5ADF1F798033004E89B6 /* PeerMediaCollectionEmptyNode.swift in Sources */, D0EC6CFB1EB9F58800EBF1C3 /* ManagedAudioRecorder.swift in Sources */, D048B339203C532800038D05 /* ChatMediaInputPane.swift in Sources */, @@ -5595,12 +5278,12 @@ 0910B0EF21FA532D00F8F87D /* WallpaperResources.swift in Sources */, 09E4A807223D4B860038140F /* AccountUtils.swift in Sources */, D069F5D0212700B90000565A /* StickerPanePeerSpecificSetupGridItem.swift in Sources */, + D0750C8322B2E4EE00BE5F6E /* SharedNotificationManager.swift in Sources */, D0EC6D041EB9F58800EBF1C3 /* opusenc.m in Sources */, D0A8998D217A294100759EE6 /* SaveIncomingMediaController.swift in Sources */, D0185E8A208A01AF005E1A6C /* ProxySettingsActionItem.swift in Sources */, D0EC6D051EB9F58800EBF1C3 /* picture.c in Sources */, D0EC6D061EB9F58800EBF1C3 /* wav_io.c in Sources */, - D06ECFCB20B8448E00C576C2 /* ContactSynchronizationSettings.swift in Sources */, 09DE2F272269D5730045E975 /* PrivacyIntroController.swift in Sources */, D0EC6D071EB9F58800EBF1C3 /* bitwise.c in Sources */, D0EC6D081EB9F58800EBF1C3 /* framing.c in Sources */, @@ -5609,50 +5292,31 @@ D0EC6D0A1EB9F58800EBF1C3 /* internal.c in Sources */, D0EC6D0B1EB9F58800EBF1C3 /* opusfile.c in Sources */, D01847801FFBD12E00075256 /* ChatListPresentationData.swift in Sources */, - D0B4AF8B1EC1133600D51FF6 /* CallKitIntergation.swift in Sources */, D0FFF7F61F55B82500BEBC01 /* InstantPageAudioItem.swift in Sources */, D03AA4E7202DFB160056C405 /* ItemListEditableReorderControlNode.swift in Sources */, 09C500242142BA6400EF253E /* ItemListWebsiteItem.swift in Sources */, D0EC6D0C1EB9F58800EBF1C3 /* stream.c in Sources */, - D0EC6D0D1EB9F58800EBF1C3 /* MediaFrameSource.swift in Sources */, 09FFBCD72281BB2D00C33B4B /* ChatTextLinkEditController.swift in Sources */, - D0EC6D0E1EB9F58800EBF1C3 /* MediaPlaybackData.swift in Sources */, 09CE95042236C6B300A7D2C3 /* CachedInstantPages.swift in Sources */, D0AB269E21D56A12008F6685 /* ChannelPermissionsController.swift in Sources */, - D0EC6D0F1EB9F58800EBF1C3 /* MediaPlayer.swift in Sources */, - D0EC6D101EB9F58800EBF1C3 /* MediaPlayerAudioRenderer.swift in Sources */, - D0EC6D111EB9F58800EBF1C3 /* MediaPlayerNode.swift in Sources */, - D0EC6D121EB9F58800EBF1C3 /* VideoPlayerProxy.swift in Sources */, - D0EC6D131EB9F58800EBF1C3 /* MediaTrackDecodableFrame.swift in Sources */, - D0EC6D141EB9F58800EBF1C3 /* MediaTrackFrame.swift in Sources */, D0B69C3920EBB397003632C7 /* ChatMessageInteractiveInstantVideoNode.swift in Sources */, 09F79A0D21C88E8900820234 /* LegacyWebSearchEditor.swift in Sources */, - D0EC6D151EB9F58800EBF1C3 /* MediaTrackFrameBuffer.swift in Sources */, 09F21565225C83E100AEDF6D /* ChatListStatusNode.swift in Sources */, - D0EC6D161EB9F58800EBF1C3 /* MediaTrackFrameDecoder.swift in Sources */, D056CD701FF147B000880D28 /* IconButtonNode.swift in Sources */, - D0EC6D171EB9F58800EBF1C3 /* FFMpegAudioFrameDecoder.swift in Sources */, D0F760DB222034910074F7E5 /* ChannelStatsController.swift in Sources */, - D0EC6D181EB9F58800EBF1C3 /* FFMpegMediaFrameSource.swift in Sources */, - D0EC6D191EB9F58800EBF1C3 /* FFMpegMediaFrameSourceContext.swift in Sources */, D02D60AE206BD47300FEFE1E /* SecureIdDocumentTypeSelectionController.swift in Sources */, 09DD88ED21BDC8B7000766BC /* FormEditableBlockItemNode.swift in Sources */, D079FCE11F05C9380038FADE /* BotReceiptControllerNode.swift in Sources */, D0FA08CA2049BEAC00DD23FC /* ChatEmptyNode.swift in Sources */, 09CE95002232729A00A7D2C3 /* StickerPaneSearchContentNode.swift in Sources */, + D00817D122B47A14008A895F /* LegacyDataImport.swift in Sources */, D053DADC201AAAB100993D32 /* ChatTextInputMenu.swift in Sources */, 0962E66321B3513100245FD9 /* WebSearchControllerNode.swift in Sources */, 090A22172273713000694CB0 /* ChatAnimationGalleryItem.swift in Sources */, - D0EC6D1A1EB9F58800EBF1C3 /* FFMpegMediaFrameSourceContextHelpers.swift in Sources */, - D0EC6D1B1EB9F58800EBF1C3 /* FFMpegMediaVideoFrameDecoder.swift in Sources */, D01C06AF1FBB461E001561AB /* JoinLinkPreviewController.swift in Sources */, - D0EC6D1C1EB9F58800EBF1C3 /* FFMpegMediaPassthroughVideoFrameDecoder.swift in Sources */, - 0935F8EF22197FBF0070AE70 /* LegacyAutomaticMediaDownloadSettings.swift in Sources */, D0D9DE0D20EFEA2E00F20B06 /* InstantPageMediaPlaylist.swift in Sources */, D01C06B11FBB4643001561AB /* JoinLinkPreviewControllerNode.swift in Sources */, - D0EC6D1E1EB9F58800EBF1C3 /* MediaPlayerScrubbingNode.swift in Sources */, D0C0B59B1EE019E5000F4D2C /* ChatSearchNavigationContentNode.swift in Sources */, - D0EC6D1F1EB9F58800EBF1C3 /* MediaPlayerTimeTextNode.swift in Sources */, D0EC6D201EB9F58800EBF1C3 /* PeerAvatar.swift in Sources */, 09F664CC21EB552C00AB7E26 /* WallpaperSearchRecentQueries.swift in Sources */, D0461439200514F000EC0EF2 /* LiveLocationSummaryManager.swift in Sources */, @@ -5674,13 +5338,13 @@ 09C9EA3821A044B500E90146 /* StringForDuration.swift in Sources */, D0EC6D241EB9F58800EBF1C3 /* CachedResourceRepresentations.swift in Sources */, 09619B8E21A34C0100493558 /* InstantPageScrollableNode.swift in Sources */, + D01590A622BD460C0017C33E /* MetalAnimationRenderer.swift in Sources */, D01BAA201ECC9A2500295217 /* CallListNodeLocation.swift in Sources */, D0EC6D251EB9F58800EBF1C3 /* FetchCachedRepresentations.swift in Sources */, D0EC6D261EB9F58800EBF1C3 /* TransformOutgoingMessageMedia.swift in Sources */, D0EC6D271EB9F58800EBF1C3 /* FetchResource.swift in Sources */, D048EA8F1F4F2A9C00188713 /* InstantPageSettingsItemNode.swift in Sources */, 0913469C21883C3700846E49 /* InstantPageDetailsItem.swift in Sources */, - D056CD721FF1569800880D28 /* MusicPlaybackSettings.swift in Sources */, D0A723541FC3B40E0094D167 /* RadialCheckContentNode.swift in Sources */, D09D88731F86D56B00BEB4C9 /* AuthorizationLayout.swift in Sources */, D0EC6D281EB9F58800EBF1C3 /* MediaResources.swift in Sources */, @@ -5688,11 +5352,11 @@ D0EC6D291EB9F58800EBF1C3 /* FetchVideoMediaResource.swift in Sources */, 09EDAD2E221164440012A50B /* AutodownloadSizeLimitItem.swift in Sources */, D0AFCC791F4C8D2C000720C6 /* InstantPageSlideshowItem.swift in Sources */, + D008177E22B46B7E008A895F /* TGItemProviderSignals.m in Sources */, 099529B421D3E5D800805E13 /* CheckDiskSpace.swift in Sources */, D04281EF200E3D88009DDE36 /* GroupInfoSearchItem.swift in Sources */, D02660941F34CE5C000E2DC5 /* LegacyLocationVenueIconDataSource.swift in Sources */, D081E104217F57D2003CD921 /* LanguageLinkPreviewController.swift in Sources */, - D0EC6FFD1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm in Sources */, D0E9BAE21F0574D800F079A4 /* STPBankAccount.m in Sources */, D0104F2A1F471DA6004E4881 /* InstantImageGalleryItem.swift in Sources */, D0F67FF41EE6C10F000E5906 /* ChannelMembersSearchContainerNode.swift in Sources */, @@ -5703,12 +5367,10 @@ D0EC6D2C1EB9F58800EBF1C3 /* TouchDownGestureRecognizer.swift in Sources */, 09DD88FA21BFD70B000766BC /* ThemedTextAlertController.swift in Sources */, D0EC6D2D1EB9F58800EBF1C3 /* TapLongTapOrDoubleTapGestureRecognizer.swift in Sources */, - D0B69C3C20EBD8C8003632C7 /* CheckDeviceAccess.swift in Sources */, 09C3466D2167D63A00B76780 /* Accessibility.swift in Sources */, D0FA08C020483F9600DD23FC /* ExtractVideoData.swift in Sources */, + D008177D22B46B7E008A895F /* TGContactModel.m in Sources */, D0BE30492061C0F500FBE6D8 /* SecureIdAuthHeaderNode.swift in Sources */, - D0EC6D2E1EB9F58800EBF1C3 /* ImageNode.swift in Sources */, - D0EC6D2F1EB9F58800EBF1C3 /* TransformImageNode.swift in Sources */, D0EC6D301EB9F58800EBF1C3 /* RadialProgressNode.swift in Sources */, D0EC6D311EB9F58800EBF1C3 /* RadialTimeoutNode.swift in Sources */, D0EC6D321EB9F58800EBF1C3 /* TextNode.swift in Sources */, @@ -5718,9 +5380,10 @@ D087BFB31F748752003FD209 /* ShareControllerRecentPeersGridItem.swift in Sources */, 09CE950A2237B93500A7D2C3 /* SettingsSearchResultItem.swift in Sources */, D0EC6D341EB9F58800EBF1C3 /* AvatarNode.swift in Sources */, - D08D7E8420A0F6020005D80C /* ExperimentalUISettings.swift in Sources */, + D0AE303922B1D3620058D3BC /* LegacyBridgeAudio.swift in Sources */, 09F79A0921C829C700820234 /* GalleryNavigationRecipientNode.swift in Sources */, D0EC6D351EB9F58800EBF1C3 /* SearchBarNode.swift in Sources */, + D008177F22B46B7E008A895F /* TGShareLocationSignals.m in Sources */, D0EC6D361EB9F58800EBF1C3 /* SearchBarPlaceholderNode.swift in Sources */, D0E8B8B9204477B600605593 /* SecretChatKeyVisualization.swift in Sources */, D0EC6D371EB9F58800EBF1C3 /* SearchDisplayController.swift in Sources */, @@ -5745,7 +5408,6 @@ D0EC6D3F1EB9F58800EBF1C3 /* MediaNavigationAccessoryPanel.swift in Sources */, D0E9BA3B1F0558E800F079A4 /* NSString+Stripe.m in Sources */, D0CE8CE51F6F354400AA2DB0 /* ChatTextInputAccessoryItem.swift in Sources */, - 096C98BA21787A5C00C211FF /* LegacyBridgeAudio.swift in Sources */, D0EC6D401EB9F58800EBF1C3 /* MediaNavigationAccessoryContainerNode.swift in Sources */, 09F215AD2264DC4500AEDF6D /* PasscodeSetupController.swift in Sources */, D0E266FD1F66706500BFC79F /* ChatBubbleVideoDecoration.swift in Sources */, @@ -5772,14 +5434,12 @@ D0EC6D531EB9F58800EBF1C3 /* ChatHistoryViewForLocation.swift in Sources */, D06BB8821F58994B0084FC30 /* LegacyInstantVideoController.swift in Sources */, D0EC6D541EB9F58800EBF1C3 /* ChatHistoryEntriesForView.swift in Sources */, - 0921F5FF228B09D2001A13D7 /* GZip.m in Sources */, D0943B051FDDFDA0001522CC /* OverlayInstantVideoNode.swift in Sources */, D0EC6D551EB9F58800EBF1C3 /* PreparedChatHistoryViewTransition.swift in Sources */, D0EB41FB1F30E75000838FE6 /* LegacyImageDownloadActor.swift in Sources */, D0208ADA1FA34017001F0D5F /* DeviceProximityManager.m in Sources */, D04281FC200E61BC009DDE36 /* ChatRecentActionsInteraction.swift in Sources */, D0EC6D561EB9F58800EBF1C3 /* ChatHistoryNode.swift in Sources */, - 096C98C221787C6700C211FF /* TGBridgeAudioDecoder.mm in Sources */, D0EC6D571EB9F58800EBF1C3 /* ChatHistoryListNode.swift in Sources */, D0EC6D581EB9F58800EBF1C3 /* ChatHistoryGridNode.swift in Sources */, D0B2F76E2052B59F00D3BFB9 /* InviteContactsController.swift in Sources */, @@ -5800,6 +5460,7 @@ 09E4A801223AE1B30038140F /* PeerType.swift in Sources */, D048EA851F4F295300188713 /* InstantPageSettingsBacklightItemNode.swift in Sources */, 09F21563225C776100AEDF6D /* ChatListBadgeNode.swift in Sources */, + D00817CB22B47A14008A895F /* WatchBridge.swift in Sources */, D0EC6D601EB9F58800EBF1C3 /* GridHoleItem.swift in Sources */, D0EC6D611EB9F58800EBF1C3 /* GridMessageSelectionNode.swift in Sources */, D0754D201EEDEBA000884F6E /* ChatMessageGameBubbleContentNode.swift in Sources */, @@ -5813,7 +5474,6 @@ 09B4EE4721A6D33F00847FA6 /* RecentSessionsEmptyStateItem.swift in Sources */, 09F664C421EAB98300AB7E26 /* ThemeColorsGridControllerItem.swift in Sources */, D00BED201F73F60F00922292 /* ShareSearchContainerNode.swift in Sources */, - D0CE8CEC1F6FCCA300AA2DB0 /* TransformImageArguments.swift in Sources */, D0EC6D661EB9F58800EBF1C3 /* ContactsSectionHeaderAccessoryItem.swift in Sources */, D0EC6D671EB9F58800EBF1C3 /* ContactListNameIndexHeader.swift in Sources */, 09F2159C2263E63200AEDF6D /* PasscodeEntryControllerNode.swift in Sources */, @@ -5858,6 +5518,7 @@ D0F6800A1EE750EE000E5906 /* ChannelBannedMemberController.swift in Sources */, D0EC6D791EB9F58800EBF1C3 /* ChatListTitleLockView.swift in Sources */, D03AA4DF202DBF6F0056C405 /* ChatContextResultPeekContentNode.swift in Sources */, + D00817D622B47A14008A895F /* TGProxyItem.m in Sources */, D0EC6D7A1EB9F58800EBF1C3 /* ChatListSearchContainerNode.swift in Sources */, D0E9BACC1F05738600F079A4 /* STPAPIPostRequest.m in Sources */, D0EC6D7B1EB9F58800EBF1C3 /* ChatListRecentPeersListItem.swift in Sources */, @@ -5873,18 +5534,20 @@ D0EC6D811EB9F58800EBF1C3 /* ChatController.swift in Sources */, D0FFF7F81F55B83600BEBC01 /* InstantPageAudioNode.swift in Sources */, D0B37C5E1F8D26A8004252DF /* ThemeSettingsChatPreviewItem.swift in Sources */, + D01590A822BD462C0017C33E /* SoftwareAnimationRenderer.swift in Sources */, D093D7DB2062CFF500BC3599 /* SecureIdAuthFormContentNode.swift in Sources */, D0EC6D821EB9F58800EBF1C3 /* ChatControllerInteraction.swift in Sources */, D0EC6D831EB9F58800EBF1C3 /* ChatControllerNode.swift in Sources */, D0E9BA231F05577700F079A4 /* STPCard.m in Sources */, D0EC6D841EB9F58800EBF1C3 /* ChatHistoryEntry.swift in Sources */, + D00817DC22B47A14008A895F /* ManageSharedAccountInfo.swift in Sources */, D0EC6D851EB9F58800EBF1C3 /* ChatHistoryLocation.swift in Sources */, - D06F31E12135829B001A0F12 /* EDSunriseSet.m in Sources */, D0EC6D861EB9F58800EBF1C3 /* ChatAvatarNavigationNode.swift in Sources */, D0EC6D871EB9F58800EBF1C3 /* ChatTitleView.swift in Sources */, D04614372005094E00EC0EF2 /* DeviceLocationManager.swift in Sources */, D0EC6D881EB9F58800EBF1C3 /* ChatControllerTitlePanelNodeContainer.swift in Sources */, 9F06830B21A404C4001D8EDB /* NotificationExceptionSettingsController.swift in Sources */, + D008177922B46B7E008A895F /* ShareItems.swift in Sources */, D0EC6D891EB9F58800EBF1C3 /* ChatSecretAutoremoveTimerActionSheet.swift in Sources */, D05D8B782195E0050064586F /* SetupTwoStepVerificationContentNode.swift in Sources */, D0EC6D8A1EB9F58800EBF1C3 /* ChatInfo.swift in Sources */, @@ -5899,12 +5562,13 @@ D0EC6D8F1EB9F58800EBF1C3 /* ChatMessageBubbleContentCalclulateImageCorners.swift in Sources */, D01776BC1F1E21AF0044446D /* RadialStatusBackgroundNode.swift in Sources */, D0FE4DE61F0BA58A00E8A0B3 /* OverlayMediaItemNode.swift in Sources */, + D00817DD22B47A14008A895F /* LockedWindowCoveringView.swift in Sources */, 0902838821931D960067EFBD /* LanguageSuggestionController.swift in Sources */, - D0E8B8A72044339500605593 /* PresentationCallToneData.swift in Sources */, D0F19F6420E5A15B00EEC860 /* ChatMediaInputPeerSpecificItem.swift in Sources */, D0AEAE252080D6830013176E /* PaneSearchContainerNode.swift in Sources */, D01DBA9B209CC6AD00C64E64 /* ChatLinkPreview.swift in Sources */, D044A0FB20BDC40C00326FAC /* CachedChannelAdmins.swift in Sources */, + D01590AF22BD58AD0017C33E /* YUV.m in Sources */, D0EC6D901EB9F58900EBF1C3 /* ChatMessageBubbleContentNode.swift in Sources */, 09874E582107A4C300E190B8 /* VimeoEmbedImplementation.swift in Sources */, D0EC6D911EB9F58900EBF1C3 /* ChatMessageBubbleItemNode.swift in Sources */, @@ -5924,7 +5588,6 @@ D0B2F7722052D0DD00D3BFB9 /* InviteContactsCountPanelNode.swift in Sources */, D0EC6D971EB9F58900EBF1C3 /* ChatMessageItem.swift in Sources */, D0CCD61B222E8B4500EE1E08 /* TimeBasedVideoPreload.swift in Sources */, - D044A0F320BDA05800326FAC /* ThrottledValue.swift in Sources */, D08D7E79209FA2930005D80C /* SecureIdValues.swift in Sources */, D0E8175720122DAD00B82BBB /* ChatRecentActionsSearchNavigationContentNode.swift in Sources */, D0147BA7206E8B4F00E40378 /* SecureIdAuthAcceptNode.swift in Sources */, @@ -5935,7 +5598,7 @@ 9F06830921A404AB001D8EDB /* NotificationExceptionControllerNode.swift in Sources */, D039FB1921711B5D00BD1BAD /* PlatformVideoContent.swift in Sources */, D0CAD8FD20AE467D00ACD96E /* PeerChannelMemberCategoriesContextsManager.swift in Sources */, - D073D2DB1FB61DA9009E1DA2 /* CallListSettings.swift in Sources */, + D035734B22B5CCCA00F0920D /* LegacyBuffer.swift in Sources */, D0430B001FF4570500A35ADD /* WebController.swift in Sources */, 09D9689D221F74F000B1458A /* ChatTitleActivityNode.swift in Sources */, D0EC6D991EB9F58900EBF1C3 /* ChatMessageMediaBubbleContentNode.swift in Sources */, @@ -5944,9 +5607,11 @@ D0EC6D9B1EB9F58900EBF1C3 /* ChatMessageStickerItemNode.swift in Sources */, D017734C22049BF800DA06A7 /* UpgradedAccounts.swift in Sources */, D0EC6D9C1EB9F58900EBF1C3 /* ChatMessageInstantVideoItemNode.swift in Sources */, + D0750C8222B2E4EE00BE5F6E /* SharedWakeupManager.swift in Sources */, D0EC6D9D1EB9F58900EBF1C3 /* ChatMessageTextBubbleContentNode.swift in Sources */, D0E9BA2B1F0557A600F079A4 /* STPFormEncoder.m in Sources */, D01BAA1C1ECC92F700295217 /* CallListViewTransition.swift in Sources */, + D00817DE22B47A14008A895F /* TGBridgeServer.m in Sources */, D0FBE84F2273395C00B33B52 /* ChatListArchiveInfoItem.swift in Sources */, D0439B5B228EC4A00067E026 /* ChatMessagePhoneNumberRequestContentNode.swift in Sources */, 09F664D021EBCFB900AB7E26 /* WallpaperCropNode.swift in Sources */, @@ -5955,6 +5620,7 @@ D06CF82720D0080200AC4CFF /* SecureIdAuthListContentNode.swift in Sources */, D0C0B5901EDB505E000F4D2C /* ActivityIndicator.swift in Sources */, 09797873210633CD0077D77F /* InstantPageSettingsButtonItemNode.swift in Sources */, + D0750C8722B2E76300BE5F6E /* ShareExtensionContext.swift in Sources */, D0EC6D9F1EB9F58900EBF1C3 /* ChatUnreadItem.swift in Sources */, D0E9B9E81EFEFB9500F079A4 /* BotPaymentDisclosureItemNode.swift in Sources */, 091346962183496900846E49 /* InstantPageArticleItem.swift in Sources */, @@ -5971,7 +5637,6 @@ D0E412D3206A7DC100BEE4A2 /* DateSelectionActionSheetController.swift in Sources */, D06887F01F72DEE6000AB936 /* ShareInputFieldNode.swift in Sources */, D0EC6DA71EB9F58900EBF1C3 /* ChatMessageBackground.swift in Sources */, - D0F0AAE01EC1E12C005EE2A5 /* PresentationCall.swift in Sources */, D0EC6DA81EB9F58900EBF1C3 /* ChatInterfaceState.swift in Sources */, D08BDF661FA8CB10009D08E1 /* EditSettingsController.swift in Sources */, D0EC6DA91EB9F58900EBF1C3 /* ChatPresentationInterfaceState.swift in Sources */, @@ -5979,13 +5644,11 @@ D00FF2091F4E2414006FA332 /* InstantPageSettingsNode.swift in Sources */, D0BE3037206139F500FBE6D8 /* ImageCompression.swift in Sources */, 09AE3823214C110900850BFD /* LegacySecureIdScanController.swift in Sources */, - 0962E67D21BA048D00245FD9 /* WebSearchSettings.swift in Sources */, D0EC6DAB1EB9F58900EBF1C3 /* ChatInterfaceStateAccessoryPanels.swift in Sources */, D0EC6DAC1EB9F58900EBF1C3 /* ChatInterfaceStateInputPanels.swift in Sources */, D056CD761FF2A30900880D28 /* ChatSwipeToReplyRecognizer.swift in Sources */, D00580B321E4B51600CB7CD3 /* DeleteChatPeerActionSheetItem.swift in Sources */, D091C7A41F8EBB1E00D7DE13 /* ChatPresentationData.swift in Sources */, - D0383EE0207D1A1600C45548 /* TGEmojiSuggestions.mm in Sources */, 09A218F522A15F1400DE6898 /* ThemeSettingsAppIconItem.swift in Sources */, D013630C208FA62400EB3653 /* SecureIdDocumentGalleryFooterContentNode.swift in Sources */, D0EB41F31F2FEAB800838FE6 /* LegacyComponentsStickers.swift in Sources */, @@ -6018,7 +5681,7 @@ D0EC6DBD1EB9F58900EBF1C3 /* ChatMediaInputPanelEntries.swift in Sources */, D0471B4F1EFD84600074D609 /* BotCheckoutPriceItem.swift in Sources */, 0962E65D21B1486D00245FD9 /* CallDebugNode.swift in Sources */, - D00ADFDB1EBA2EAF00873D2E /* OngoingCallContext.swift in Sources */, + D008178222B47464008A895F /* NotificationContentContext.swift in Sources */, D0EC6DBE1EB9F58900EBF1C3 /* ChatMediaInputGridEntries.swift in Sources */, D0EC6DBF1EB9F58900EBF1C3 /* ChatMediaInputMetaSectionItemNode.swift in Sources */, D0EC6DC01EB9F58900EBF1C3 /* ChatMediaInputRecentGifsItem.swift in Sources */, @@ -6074,7 +5737,6 @@ D0EC6DD71EB9F58900EBF1C3 /* VerticalListContextResultsChatInputPanelItem.swift in Sources */, D0EC6DD81EB9F58900EBF1C3 /* VerticalListContextResultsChatInputPanelButtonItem.swift in Sources */, D04281F4200E5AB0009DDE36 /* ChatRecentActionsController.swift in Sources */, - D0B2F76220506E2A00D3BFB9 /* MediaInputSettings.swift in Sources */, 09FE756D2153F5F900A3120F /* CallRouteActionSheetItem.swift in Sources */, D0BFAE4E20AB1D7B00793CF2 /* DisabledContextResultsChatInputContextPanelNode.swift in Sources */, D064EF871F69A06F00AC0398 /* MessageContentKind.swift in Sources */, @@ -6154,6 +5816,7 @@ D0EC6DFD1EB9F58900EBF1C3 /* GalleryControllerNode.swift in Sources */, D0E9BA571F055A0B00F079A4 /* STPFormTextField.m in Sources */, D0EC6DFE1EB9F58900EBF1C3 /* GalleryControllerPresentationState.swift in Sources */, + D00817DB22B47A14008A895F /* LegacyChatImport.swift in Sources */, 09EDAD2C2211552F0012A50B /* AutodownloadMediaCategoryController.swift in Sources */, 090B48C82200BCA8005083FA /* WallpaperUploadManager.swift in Sources */, 09F21567225C8EF500AEDF6D /* ChatListOnlineNode.swift in Sources */, @@ -6171,6 +5834,8 @@ D0EC6E041EB9F58900EBF1C3 /* SecretMediaPreviewController.swift in Sources */, 09F2158D225CF5BC00AEDF6D /* Pasteboard.swift in Sources */, D0C26D571FDF2388004ABF18 /* OpenChatMessage.swift in Sources */, + D00817CA22B47A14008A895F /* WatchRequestHandlers.swift in Sources */, + D00817E222B47A14008A895F /* UIImage+ImageEffects.m in Sources */, 0919547B2294788200E11046 /* AnimatedStickerVideoCompositor.swift in Sources */, D0FA08BE20481EA300DD23FC /* Locale.swift in Sources */, D0E412CE206A707400BEE4A2 /* FormControllerTextItem.swift in Sources */, @@ -6205,18 +5870,18 @@ D0AD02EA1FFFEBEF00C1DCFF /* ChatMessageLiveLocationTextNode.swift in Sources */, D0EC6E141EB9F58900EBF1C3 /* InstantPageMedia.swift in Sources */, D0EC6E151EB9F58900EBF1C3 /* InstantPageLinkSelectionView.swift in Sources */, - D08A10BB211DF7A80077488B /* StickerSettings.swift in Sources */, D0EC6E161EB9F58900EBF1C3 /* InstantPageLayoutSpacings.swift in Sources */, D0EC6E171EB9F58900EBF1C3 /* InstantPageTextStyleStack.swift in Sources */, D0EC6E181EB9F58900EBF1C3 /* InstantPageTextItem.swift in Sources */, D01C06B51FBB7720001561AB /* ChatMediaInputSettingsItem.swift in Sources */, - 0952D1772177FB5400194860 /* WatchPresetSettings.swift in Sources */, D091C7A61F8ECEA300D7DE13 /* SettingsThemeWallpaperNode.swift in Sources */, D0EC6E191EB9F58900EBF1C3 /* InstantPageAnchorItem.swift in Sources */, 090E63E62195880F00E3C035 /* ContactAddItem.swift in Sources */, D05677531F4CA0D0001B723E /* InstantPagePeerReferenceNode.swift in Sources */, + D00817CC22B47A14008A895F /* WatchCommunicationManager.swift in Sources */, D0EC6E1A1EB9F58900EBF1C3 /* InstantPageImageItem.swift in Sources */, D0EC6E1B1EB9F58900EBF1C3 /* InstantPageImageNode.swift in Sources */, + D0AE303522B1D3620058D3BC /* TGBridgeAudioEncoder.m in Sources */, D0EC6E1C1EB9F58900EBF1C3 /* InstantPageWebEmbedItem.swift in Sources */, D0EC6E1D1EB9F58900EBF1C3 /* InstantPageWebEmbedNode.swift in Sources */, D04281F1200E4084009DDE36 /* GroupInfoSearchNavigationContentNode.swift in Sources */, @@ -6226,6 +5891,7 @@ D093D7E22062F40100BC3599 /* SecureIdDocumentFormControllerNode.swift in Sources */, D0B2F7702052B5A800D3BFB9 /* InviteContactsControllerNode.swift in Sources */, D0EC6E211EB9F58900EBF1C3 /* InstantPageController.swift in Sources */, + D00817D922B47A14008A895F /* AppDelegate.swift in Sources */, D0E1199C229808B8008CAE3A /* ChannelDiscussionGroupSetupHeaderItem.swift in Sources */, 091417F221EF4E5D00C8325A /* WallpaperGalleryController.swift in Sources */, D0EC6E221EB9F58900EBF1C3 /* InstantPageControllerNode.swift in Sources */, @@ -6236,6 +5902,7 @@ D0EC6E251EB9F58900EBF1C3 /* StickerPackPreviewGridItem.swift in Sources */, D0EC6E261EB9F58900EBF1C3 /* StickerPreviewController.swift in Sources */, 09B4EE6021AD4A0E00847FA6 /* InstantPageContentNode.swift in Sources */, + D00817D422B47A14008A895F /* LegacyUserDataImport.swift in Sources */, D0EC6E271EB9F58900EBF1C3 /* StickerPreviewControllerNode.swift in Sources */, D0EC6E281EB9F58900EBF1C3 /* ContactsController.swift in Sources */, D0EC6E291EB9F58900EBF1C3 /* ContactsControllerNode.swift in Sources */, @@ -6285,6 +5952,7 @@ D0EC6E3F1EB9F58900EBF1C3 /* ItemListTextItem.swift in Sources */, D0EC6E401EB9F58900EBF1C3 /* ItemListActivityTextItem.swift in Sources */, 0958FBB9218AD6AF00E0CBD8 /* InstantPageFeedbackItem.swift in Sources */, + D00817D022B47A14008A895F /* WakeupManager.swift in Sources */, D0EC6E411EB9F58900EBF1C3 /* ItemListEditableItem.swift in Sources */, D0EC6E421EB9F58900EBF1C3 /* ItemListRevealOptionsNode.swift in Sources */, D0E8175920122FE100B82BBB /* ChatRecentActionsFilterController.swift in Sources */, @@ -6299,7 +5967,7 @@ 091417F421EF4F5F00C8325A /* WallpaperGalleryItem.swift in Sources */, D02F4AE91FCF370B004DFBAE /* ChatMessageInteractiveMediaBadge.swift in Sources */, D0EC6E461EB9F58900EBF1C3 /* ItemListLoadingIndicatorEmptyStateItem.swift in Sources */, - D067B4A5211C911C00796039 /* LegacyChannelIntroController.swift in Sources */, + D00817CF22B47A14008A895F /* LegacyFileImport.swift in Sources */, D01A21AF1F39EA2E00DDA104 /* InstantPageTheme.swift in Sources */, D0EC6E471EB9F58900EBF1C3 /* ItemListTextEmptyStateItem.swift in Sources */, D0E412C62069B60600BEE4A2 /* FormControllerHeaderItem.swift in Sources */, @@ -6308,20 +5976,23 @@ D0EC6E491EB9F58900EBF1C3 /* ItemListControllerEmptyStateItem.swift in Sources */, D0EC6E4A1EB9F58900EBF1C3 /* ItemListControllerNode.swift in Sources */, D0147BA9206EA35000E40378 /* SecureIdDocumentGalleryController.swift in Sources */, + D00817DF22B47A14008A895F /* LegacyDataImportSplash.swift in Sources */, D0B37C5C1F8D22AE004252DF /* ThemeSettingsController.swift in Sources */, D05D8B412192FC8A0064586F /* LocalizationListItem.swift in Sources */, D0383ED4207CFBB900C45548 /* GalleryThumbnailContainerNode.swift in Sources */, 0962E67B21BA00C900245FD9 /* WebSearchInterfaceState.swift in Sources */, D0EC6E4B1EB9F58900EBF1C3 /* ItemListControllerSegmentedTitleView.swift in Sources */, 09DD88F521BF9730000766BC /* WebSearchRecentQueries.swift in Sources */, + D0AE303822B1D3620058D3BC /* TGBridgeAudioDecoder.mm in Sources */, D0EC6E4D1EB9F58900EBF1C3 /* PeerInfoController.swift in Sources */, D0EC6E4E1EB9F58900EBF1C3 /* GroupInfoController.swift in Sources */, + D00817D322B47A14008A895F /* LegacyResourceImport.swift in Sources */, D0380DAD204ED434000414AB /* LegacyLiveUploadInterface.swift in Sources */, + D00817D222B47A14008A895F /* LegacyPreferencesImport.swift in Sources */, D0185E882089ED5F005E1A6C /* ProxyListSettingsController.swift in Sources */, D0E9BA331F05583A00F079A4 /* STPPostalCodeValidator.m in Sources */, D0EC6E4F1EB9F58900EBF1C3 /* ChannelVisibilityController.swift in Sources */, D09250061FE5371D003F693F /* GlobalExperimentalSettings.swift in Sources */, - D0A24D281F92C27100584D24 /* DefaultDarkAccentPresentationTheme.swift in Sources */, D025A4231F79344500563950 /* FetchManager.swift in Sources */, 09F79A0121C8116C00820234 /* WebSearchBadgeNode.swift in Sources */, D0CB27CF20C17A4A001ACF93 /* TermsOfServiceController.swift in Sources */, @@ -6335,12 +6006,14 @@ D081E106217F5834003CD921 /* LanguageLinkPreviewControllerNode.swift in Sources */, D093D7E72063E57F00BC3599 /* BotPaymentActionItemNode.swift in Sources */, D01C06BA1FBBB076001561AB /* ItemListSelectableControlNode.swift in Sources */, + 098CF79222B924E200AF6134 /* ThemeSettingsAccentColorItem.swift in Sources */, D0EC6E541EB9F58900EBF1C3 /* ConvertToSupergroupController.swift in Sources */, D0EC6E561EB9F58900EBF1C3 /* UserInfoController.swift in Sources */, D0EC6E571EB9F58900EBF1C3 /* GroupsInCommonController.swift in Sources */, D0AB262F21C3D3DE008F6685 /* CreatePollController.swift in Sources */, D0EC6E581EB9F58900EBF1C3 /* PeerSelectionController.swift in Sources */, D093D7D92062A9CA00BC3599 /* SecureIdAuthControllerState.swift in Sources */, + D01590AB22BD467B0017C33E /* AnimationRenderer.swift in Sources */, D0EC6E591EB9F58900EBF1C3 /* PeerSelectionControllerNode.swift in Sources */, D0EC6E5B1EB9F58900EBF1C3 /* CallController.swift in Sources */, D0AB262921C307D7008F6685 /* ChatMessagePollBubbleContentNode.swift in Sources */, @@ -6365,14 +6038,12 @@ D0EC6E651EB9F58900EBF1C3 /* TwoStepVerificationResetController.swift in Sources */, D0EC6E661EB9F58900EBF1C3 /* PasscodeOptionsController.swift in Sources */, 09CE95082237A53900A7D2C3 /* SettingsSearchableItems.swift in Sources */, - D0383EDE207D1A1600C45548 /* emoji_suggestions.cpp in Sources */, D0EC6E671EB9F58900EBF1C3 /* DataAndStorageSettingsController.swift in Sources */, D0EC6E681EB9F58900EBF1C3 /* VoiceCallDataSavingController.swift in Sources */, D0EC6E691EB9F58900EBF1C3 /* NetworkUsageStatsController.swift in Sources */, D0EC6E6A1EB9F58900EBF1C3 /* StorageUsageController.swift in Sources */, D079FCDF1F05C9280038FADE /* BotReceiptController.swift in Sources */, D0EC6E6B1EB9F58900EBF1C3 /* InstalledStickerPacksController.swift in Sources */, - D0383EDF207D1A1600C45548 /* emoji_suggestions_data.cpp in Sources */, D0EC6E6C1EB9F58900EBF1C3 /* FeaturedStickerPacksController.swift in Sources */, D0B85C231FF70BF400E795B4 /* AuthorizationSequenceAwaitingAccountResetController.swift in Sources */, D0EC6E6D1EB9F58900EBF1C3 /* ItemListStickerPackItem.swift in Sources */, @@ -6399,10 +6070,7 @@ D0EC6E7B1EB9F58900EBF1C3 /* DebugAccountsController.swift in Sources */, D093D8262069A31700BC3599 /* FormControllerItem.swift in Sources */, D0EC6E7C1EB9F58900EBF1C3 /* UsernameSetupController.swift in Sources */, - D005808B21CAB8F000CB7CD3 /* VoipDerivedState.swift in Sources */, D0471B621EFEB5B70074D609 /* BotPaymentSwitchItemNode.swift in Sources */, - D09250041FE5363D003F693F /* ExperimentalSettings.swift in Sources */, - D0F339372269D83500CFF53F /* ChatArchiveSettings.swift in Sources */, D0E8175B201254FA00B82BBB /* ChatRecentActionsEmptyNode.swift in Sources */, D0C44B641FC64D0500227BE0 /* SwipeToDismissGestureRecognizer.swift in Sources */, D0EC6E7D1EB9F58900EBF1C3 /* ChangePhoneNumberIntroController.swift in Sources */, @@ -6413,8 +6081,9 @@ D0EC6E7F1EB9F58900EBF1C3 /* ChangePhoneNumberControllerNode.swift in Sources */, D0EC6E801EB9F58900EBF1C3 /* ChangePhoneNumberCodeController.swift in Sources */, D09E637C1F0E7C28003444CD /* SharedMediaPlayer.swift in Sources */, + D0750C8522B2E52400BE5F6E /* ClearNotificationsManager.swift in Sources */, D0EC6E811EB9F58900EBF1C3 /* NotificationContainerController.swift in Sources */, - 090E778822A9B96100CD99F5 /* PeopleNearbyHeaderItem.swift in Sources */, + 090E778822A9B96100CD99F5 /* PeersNearbyHeaderItem.swift in Sources */, D0754D271EEE10C800884F6E /* BotCheckoutController.swift in Sources */, D053DADA201A4C4400993D32 /* ChatTextInputAttributes.swift in Sources */, 0952D1752176DEB500194860 /* NotificationMuteSettingsController.swift in Sources */, @@ -6425,6 +6094,7 @@ D0EC6E841EB9F58900EBF1C3 /* NotificationItem.swift in Sources */, D0EC6E851EB9F58900EBF1C3 /* ChatMessageNotificationItem.swift in Sources */, D0EC6E871EB9F58900EBF1C3 /* FastBlur.m in Sources */, + D00817D822B47A14008A895F /* TGAutoDownloadPreferences.m in Sources */, D093D80820654A2900BC3599 /* BotPaymentDateItemNode.swift in Sources */, D04281FE200E639A009DDE36 /* ChatRecentActionsTitleView.swift in Sources */, D0ACCB1C1EC5FF4B0079D8BF /* ChatMessageCallBubbleContentNode.swift in Sources */, @@ -6432,15 +6102,12 @@ D05677511F4CA0C2001B723E /* InstantPagePeerReferenceItem.swift in Sources */, 09F664CE21EBB3A100AB7E26 /* ImageBlur.swift in Sources */, D0EC6E891EB9F58900EBF1C3 /* FrameworkBundle.swift in Sources */, - D0EC6E8B1EB9F58900EBF1C3 /* RingBuffer.m in Sources */, D0FA08C8204982DC00DD23FC /* ChatTextInputActionButtonsNode.swift in Sources */, - D0EC6E8C1EB9F58900EBF1C3 /* RingByteBuffer.swift in Sources */, D0E9BA181F05574500F079A4 /* STPPaymentCardTextFieldViewModel.m in Sources */, D0EC6E8D1EB9F58900EBF1C3 /* SecretChatKeyVisualization.m in Sources */, 09F664C221EAAFCB00AB7E26 /* ThemeColorsGridControllerNode.swift in Sources */, D0BCC3D420404CC7008126C2 /* ChatMessageActionSheetController.swift in Sources */, 09D9689F221F760900B1458A /* ChatTitleActivityContentNode.swift in Sources */, - D0EC6E8E1EB9F58900EBF1C3 /* NumberPluralizationForm.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6537,12 +6204,17 @@ D021D512219CB2240064BEBA /* DebugFork */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; HEADERMAP_USES_VFS = YES; @@ -6730,12 +6402,17 @@ D079FD281F06BEF70038FADE /* DebugAppStore */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; HEADERMAP_USES_VFS = YES; @@ -6844,13 +6521,17 @@ D0924FF01FE52C29003F693F /* ReleaseHockeyappInternal */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); HEADERMAP_USES_VFS = YES; HEADER_SEARCH_PATHS = "third-party/ogg"; INFOPLIST_FILE = "$(SRCROOT)/TelegramUI/Info.plist"; @@ -6964,12 +6645,17 @@ D0ADF94A212B3B0000310BBC /* DebugAppStoreLLC */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; HEADERMAP_USES_VFS = YES; @@ -7078,11 +6764,16 @@ D0CE6F04213DC32300BCD44B /* ReleaseAppStoreLLC */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); HEADERMAP_USES_VFS = YES; HEADER_SEARCH_PATHS = "third-party/ogg"; INFOPLIST_FILE = "$(SRCROOT)/TelegramUI/Info.plist"; @@ -7117,13 +6808,17 @@ D0EC6E9E1EB9F79800EBF1C3 /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; HEADERMAP_USES_VFS = YES; @@ -7151,6 +6846,7 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/third-party/FFmpeg-iOS/include"; }; @@ -7159,13 +6855,17 @@ D0EC6E9F1EB9F79800EBF1C3 /* ReleaseHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); HEADERMAP_USES_VFS = YES; HEADER_SEARCH_PATHS = "third-party/ogg"; INFOPLIST_FILE = "$(SRCROOT)/TelegramUI/Info.plist"; @@ -7200,11 +6900,16 @@ D0EC6EA01EB9F79800EBF1C3 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; + APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TelegramUI/Legacy\\ Components/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework", + ); HEADERMAP_USES_VFS = YES; HEADER_SEARCH_PATHS = "third-party/ogg"; INFOPLIST_FILE = "$(SRCROOT)/TelegramUI/Info.plist"; diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/.gitignore b/submodules/TelegramUI/third-party/RMIntro/platform/ios/.gitignore deleted file mode 100755 index 7b12c26077..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# Based from http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects - -# Temporary files -.DS_Store -.Trashes -*.swp -*.lock -*~.nib - -# Meta files -*._* - -# Build files -DerivedData/ -build/ - -# Private settings -# *.pbxuser should not be ignored if using "custom executables". -*.pbxuser -*.mode1v3 -*.mode2v3 -*.perspectivev3 - -# Some projects need the below -!default.pbxuser -!default.mode1v3 -!default.mode2v3 -!default.perspectivev3 - -# XCode 4 semi-personal settings -xcuserdata/ - -# Deprecated classes -*.moved-aside \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Base.lproj/LaunchScreen.xib b/submodules/TelegramUI/third-party/RMIntro/platform/ios/Base.lproj/LaunchScreen.xib deleted file mode 100644 index decac45f3a..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default-568h@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default-568h@2x.png deleted file mode 100755 index 0891b7aabf..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default-568h@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default.png deleted file mode 100755 index 4c8ca6f693..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default@2x.png deleted file mode 100755 index 35b84cffeb..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/Default@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/BuildAgent b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/BuildAgent deleted file mode 100755 index d97765168b..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/BuildAgent and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers deleted file mode 120000 index a177d2a6b9..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/HockeySDK b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/HockeySDK deleted file mode 120000 index 8b45692e61..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/HockeySDK +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/HockeySDK \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Modules/module.modulemap b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Modules/module.modulemap deleted file mode 100644 index 73fba6726e..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module HockeySDK { - umbrella header "HockeySDK.h" - - export * - module * { export * } -} diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Resources b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Resources deleted file mode 120000 index 953ee36f3b..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITAuthenticator.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITAuthenticator.h deleted file mode 100644 index 1653de788d..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITAuthenticator.h +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Author: Stephan Diederich, Andreas Linde - * - * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "BITHockeyBaseManager.h" - -/** - * Identification Types - */ -typedef NS_ENUM(NSUInteger, BITAuthenticatorIdentificationType) { - /** - * Assigns this app an anonymous user id. - *

- * The user will not be asked anything and an anonymous ID will be generated. - * This helps identifying this installation being unique but HockeyApp won't be able - * to identify who actually is running this installation and on which device - * the app is installed. - */ - BITAuthenticatorIdentificationTypeAnonymous, - /** - * Ask for the HockeyApp account email - *

- * This will present a user interface requesting the user to provide their - * HockeyApp user email address. - *

- * The provided email address has to match an email address of a registered - * HockeyApp user who is a member or tester of the app - */ - BITAuthenticatorIdentificationTypeHockeyAppEmail, - /** - * Ask for the HockeyApp account by email and password - *

- * This will present a user interface requesting the user to provide their - * HockeyApp user credentials. - *

- * The provided user account has to match a registered HockeyApp user who is - * a member or tester of the app - */ - BITAuthenticatorIdentificationTypeHockeyAppUser, - /** - * Identifies the current device - *

- * This will open the HockeyApp web page on the device in Safari and request the user - * to submit the device's unique identifier to the app. If the web page session is not aware - * of the current devices UDID, it will request the user to install the HockeyApp web clip - * which will provide the UDID to users session in the browser. - *

- * This requires the app to register an URL scheme. See the linked property and methods - * for further documentation on this. - */ - BITAuthenticatorIdentificationTypeDevice, - /** - * Ask for the HockeyApp account email. - *

- * This will present a user interface requesting the user to start a Safari based - * flow to login to HockeyApp (if not already logged in) and to share the hockeyapp - * account's email. - *

- * If restrictApplicationUsage is enabled, the provided user account has to match a - * registered HockeyApp user who is a member or tester of the app. - * For identification purpose any HockeyApp user is allowed. - */ - BITAuthenticatorIdentificationTypeWebAuth, -}; - -/** - * Restriction enforcement styles - * - * Specifies how often the Authenticator checks if the user is allowed to use - * this app. - */ -typedef NS_ENUM(NSUInteger, BITAuthenticatorAppRestrictionEnforcementFrequency) { - /** - * Checks if the user is allowed to use the app at the first time a version is started - */ - BITAuthenticatorAppRestrictionEnforcementOnFirstLaunch, - /** - * Checks if the user is allowed to use the app everytime the app becomes active - */ - BITAuthenticatorAppRestrictionEnforcementOnAppActive, -}; - -@protocol BITAuthenticatorDelegate; - - -/** - * Identify and authenticate users of Ad-Hoc or Enterprise builds - * - * `BITAuthenticator` serves 2 purposes: - * - * 1. Identifying who is running your Ad-Hoc or Enterprise builds - * `BITAuthenticator` provides an identifier for the rest of the HockeySDK - * to work with, e.g. in-app update checks and crash reports. - * - * 2. Optional regular checking if an identified user is still allowed - * to run this application. The `BITAuthenticator` can be used to make - * sure only users who are testers of your app are allowed to run it. - * - * This module automatically disables itself when running in an App Store build by default! - * - * @warning It is mandatory to call `authenticateInstallation` somewhen after calling - * `[[BITHockeyManager sharedHockeyManager] startManager]` or fully customize the identification - * and validation workflow yourself. - * If your app shows a modal view on startup, make sure to call `authenticateInstallation` - * either once your modal view is fully presented (e.g. its `viewDidLoad:` method is processed) - * or once your modal view is dismissed. - */ -@interface BITAuthenticator : BITHockeyBaseManager - -#pragma mark - Configuration - - -///----------------------------------------------------------------------------- -/// @name Configuration -///----------------------------------------------------------------------------- - - -/** - * Defines the identification mechanism to be used - * - * _Default_: `BITAuthenticatorIdentificationTypeAnonymous` - * - * @see BITAuthenticatorIdentificationType - */ -@property (nonatomic, assign) BITAuthenticatorIdentificationType identificationType; - - -/** - * Enables or disables checking if the user is allowed to run this app - * - * If disabled, the Authenticator never validates, besides initial identification, - * if the user is allowed to run this application. - * - * If enabled, the Authenticator checks depending on `restrictionEnforcementFrequency` - * if the user is allowed to use this application. - * - * Enabling this property and setting `identificationType` to `BITAuthenticatorIdentificationTypeHockeyAppEmail`, - * `BITAuthenticatorIdentificationTypeHockeyAppUser` or `BITAuthenticatorIdentificationTypeWebAuth` also allows - * to remove access for users by removing them from the app's users list on HockeyApp. - * - * _Default_: `NO` - * - * @warning if `identificationType` is set to `BITAuthenticatorIdentificationTypeAnonymous`, - * this property has no effect. - * - * @see BITAuthenticatorIdentificationType - * @see restrictionEnforcementFrequency - */ -@property (nonatomic, assign) BOOL restrictApplicationUsage; - -/** - * Defines how often the BITAuthenticator checks if the user is allowed - * to run this application - * - * This requires `restrictApplicationUsage` to be enabled. - * - * _Default_: `BITAuthenticatorAppRestrictionEnforcementOnFirstLaunch` - * - * @see BITAuthenticatorAppRestrictionEnforcementFrequency - * @see restrictApplicationUsage - */ -@property (nonatomic, assign) BITAuthenticatorAppRestrictionEnforcementFrequency restrictionEnforcementFrequency; - -/** - * The authentication secret from HockeyApp. To find the right secret, - * click on your app on the HockeyApp dashboard, then on Show next to - * "Secret:". - * - * This is only needed if `identificationType` is set to `BITAuthenticatorIdentificationTypeHockeyAppEmail` - * - * @see identificationType - */ -@property (nonatomic, copy) NSString *authenticationSecret; - - -#pragma mark - Device based identification - -///----------------------------------------------------------------------------- -/// @name Device based identification -///----------------------------------------------------------------------------- - - -/** - * The baseURL of the webpage the user is redirected to if `identificationType` is - * set to `BITAuthenticatorIdentificationTypeDevice`; defaults to https://rink.hockeyapp.net. - * - * @see identificationType - */ -@property (nonatomic, strong) NSURL *webpageURL; - -/** - * URL to query the device's id via external webpage - * Built with the baseURL set in `webpageURL`. - */ -- (NSURL*) deviceAuthenticationURL; - -/** - * The url-scheme used to idenfify via `BITAuthenticatorIdentificationTypeDevice` - * - * Please make sure that the URL scheme is unique and not shared with other apps. - * - * If set to nil, the default scheme is used which is `ha`. - * - * @see identificationType - * @see handleOpenURL:sourceApplication:annotation: - */ -@property (nonatomic, strong) NSString *urlScheme; - -/** - Should be used by the app-delegate to forward handle application:openURL:sourceApplication:annotation: calls. - - This is required if `identificationType` is set to `BITAuthenticatorIdentificationTypeDevice`. - Your app needs to implement the default `ha` URL scheme or register its own scheme - via `urlScheme`. - BITAuthenticator checks if the given URL is actually meant to be parsed by it and will - return NO if it doesn't think so. It does this by checking the 'host'-part of the URL to be 'authorize', as well - as checking the protocol part. - Please make sure that if you're using a custom URL scheme, it does _not_ conflict with BITAuthenticator's. - If BITAuthenticator thinks the URL was meant to be an authorization URL, but could not find a valid token, it will - reset the stored identification token and state. - - Sample usage (in AppDelegate): - - - (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { - if ([[BITHockeyManager sharedHockeyManager].authenticator handleOpenURL:url - sourceApplication:sourceApplication - annotation:annotation]) { - return YES; - } else { - //do your own URL handling, return appropriate value - } - return NO; - } - - @param url Param `url` that was passed to the app - @param sourceApplication Param `sourceApplication` that was passed to the app - @param annotation Param `annotation` that was passed to the app - - @return YES if the URL request was handled, NO if the URL could not be handled/identified. - - @see identificationType - @see urlScheme - */ -- (BOOL) handleOpenURL:(NSURL *) url - sourceApplication:(NSString *) sourceApplication - annotation:(id) annotation; - -#pragma mark - Authentication - -///----------------------------------------------------------------------------- -/// @name Authentication -///----------------------------------------------------------------------------- - -/** - * Invoked automatic identification and validation - * - * If the `BITAuthenticator` is in automatic mode this will initiate identifying - * the current user according to the type specified in `identificationType` and - * validate if the identified user is allowed to run this application. - * - * If the user is not yet identified it will present a modal view asking the user to - * provide the required information. - * - * If your app provides it's own startup modal screen, e.g. a guide or a login, then - * you might either call this method once that UI is fully presented or once - * the user e.g. did actually login already. - * - * @warning You need to call this method in your code even if automatic mode is enabled! - * - * @see identificationType - */ -- (void) authenticateInstallation; - -/** - * Identifies the user according to the type specified in `identificationType`. - * - * If the `BITAuthenticator` is in manual mode, it's your responsibility to call - * this method. Depending on the `identificationType`, this method - * might present a viewController to let the user enter his/her credentials. - * - * If the Authenticator is in auto-mode, this is called by the authenticator itself - * once needed. - * - * @see identificationType - * @see authenticateInstallation - * @see validateWithCompletion: - * - * @param completion Block being executed once identification completed - */ -- (void) identifyWithCompletion:(void(^)(BOOL identified, NSError *error)) completion; - -/** - * Returns YES if this app is identified according to the setting in `identificationType`. - * - * Since the identification process is done asynchronously (contacting the server), - * you need to observe the value change via KVO. - * - * @see identificationType - */ -@property (nonatomic, assign, readonly, getter = isIdentified) BOOL identified; - -/** - * Validates if the identified user is allowed to run this application. This checks - * with the HockeyApp backend and calls the completion-block once completed. - * - * If the `BITAuthenticator` is in manual mode, it's your responsibility to call - * this method. If the application is not yet identified, validation is not possible - * and the completion-block is called with an error set. - * - * If the `BITAuthenticator` is in auto-mode, this is called by the authenticator itself - * once needed. - * - * @see identificationType - * @see authenticateInstallation - * @see identifyWithCompletion: - * - * @param completion Block being executed once validation completed - */ -- (void) validateWithCompletion:(void(^)(BOOL validated, NSError *error)) completion; - -/** - * Indicates if this installation is validated. - */ -@property (nonatomic, assign, readonly, getter = isValidated) BOOL validated; - -/** - * Removes all previously stored authentication tokens, UDIDs, etc. - */ -- (void) cleanupInternalStorage; - -/** - * Returns different values depending on `identificationType`. This can be used - * by the application to identify the user. - * - * @see identificationType - */ -- (NSString*) publicInstallationIdentifier; -@end - -#pragma mark - Protocol - -/** - * `BITAuthenticator` protocol - */ -@protocol BITAuthenticatorDelegate - -@optional -/** - * If the authentication (or validation) needs to identify the user, - * this delegate method is called with the viewController that we'll present. - * - * @param authenticator `BITAuthenticator` object - * @param viewController `UIViewController` used to identify the user - * - */ -- (void) authenticator:(BITAuthenticator *)authenticator willShowAuthenticationController:(UIViewController*) viewController; -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashAttachment.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashAttachment.h deleted file mode 100644 index bf6f339b6e..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashAttachment.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import "BITHockeyAttachment.h" - -/** - Deprecated: Provides support to add binary attachments to crash reports - - This class is not needed any longer and exists for compatiblity purposes with - HockeySDK-iOS 3.5.5. - - It is a subclass of `BITHockeyAttachment` which only provides an initializer - that is compatible with the one of HockeySDK-iOS 3.5.5. - - This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]` - - @see BITHockeyAttachment - */ -@interface BITCrashAttachment : BITHockeyAttachment - -/** - Create an BITCrashAttachment instance with a given filename and NSData object - - @param filename The filename the attachment should get - @param crashAttachmentData The attachment data as NSData - @param contentType The content type of your data as MIME type - - @return An instsance of BITCrashAttachment - */ -- (instancetype)initWithFilename:(NSString *)filename - crashAttachmentData:(NSData *)crashAttachmentData - contentType:(NSString *)contentType; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashDetails.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashDetails.h deleted file mode 100644 index 989001c423..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashDetails.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -/** - * Provides details about the crash that occured in the previous app session - */ -@interface BITCrashDetails : NSObject - -/** - * UUID for the crash report - */ -@property (nonatomic, readonly, strong) NSString *incidentIdentifier; - -/** - * UUID for the app installation on the device - */ -@property (nonatomic, readonly, strong) NSString *reporterKey; - -/** - * Signal that caused the crash - */ -@property (nonatomic, readonly, strong) NSString *signal; - -/** - * Exception name that triggered the crash, nil if the crash was not caused by an exception - */ -@property (nonatomic, readonly, strong) NSString *exceptionName; - -/** - * Exception reason, nil if the crash was not caused by an exception - */ -@property (nonatomic, readonly, strong) NSString *exceptionReason; - -/** - * Date and time the app started, nil if unknown - */ -@property (nonatomic, readonly, strong) NSDate *appStartTime; - -/** - * Date and time the crash occured, nil if unknown - */ -@property (nonatomic, readonly, strong) NSDate *crashTime; - -/** - * Operation System version string the app was running on when it crashed. - */ -@property (nonatomic, readonly, strong) NSString *osVersion; - -/** - * Operation System build string the app was running on when it crashed - * - * This may be unavailable. - */ -@property (nonatomic, readonly, strong) NSString *osBuild; - -/** - * CFBundleVersion value of the app that crashed - */ -@property (nonatomic, readonly, strong) NSString *appBuild; - -/** - Indicates if the app was killed while being in foreground from the iOS - - If `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` is enabled, use this on startup - to check if the app starts the first time after it was killed by iOS in the previous session. - - This can happen if it consumed too much memory or the watchdog killed the app because it - took too long to startup or blocks the main thread for too long, or other reasons. See Apple - documentation: https://developer.apple.com/library/ios/qa/qa1693/_index.html - - See `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` for more details about which kind of kills can be detected. - - @warning This property only has a correct value, once `[BITHockeyManager startManager]` was - invoked! In addition, it is automatically disabled while a debugger session is active! - - @see `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` - @see `[BITCrashManager didReceiveMemoryWarningInLastSession]` - - @return YES if the details represent an app kill instead of a crash - */ -- (BOOL)isAppKill; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashManager.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashManager.h deleted file mode 100644 index fdc8e2f2cc..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashManager.h +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Author: Andreas Linde - * Kent Sutherland - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * Copyright (c) 2011 Andreas Linde & Kent Sutherland. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "BITHockeyBaseManager.h" - -@class BITCrashDetails; -@class BITCrashMetaData; - - -/** - * Custom block that handles the alert that prompts the user whether he wants to send crash reports - */ -typedef void(^BITCustomAlertViewHandler)(); - - -/** - * Crash Manager status - */ -typedef NS_ENUM(NSUInteger, BITCrashManagerStatus) { - /** - * Crash reporting is disabled - */ - BITCrashManagerStatusDisabled = 0, - /** - * User is asked each time before sending - */ - BITCrashManagerStatusAlwaysAsk = 1, - /** - * Each crash report is send automatically - */ - BITCrashManagerStatusAutoSend = 2 -}; - - -/** - * Prototype of a callback function used to execute additional user code. Called upon completion of crash - * handling, after the crash report has been written to disk. - * - * @param context The API client's supplied context value. - * - * @see `BITCrashManagerCallbacks` - * @see `[BITCrashManager setCrashCallbacks:]` - */ -typedef void (*BITCrashManagerPostCrashSignalCallback)(void *context); - -/** - * This structure contains callbacks supported by `BITCrashManager` to allow the host application to perform - * additional tasks prior to program termination after a crash has occured. - * - * @see `BITCrashManagerPostCrashSignalCallback` - * @see `[BITCrashManager setCrashCallbacks:]` - */ -typedef struct BITCrashManagerCallbacks { - /** An arbitrary user-supplied context value. This value may be NULL. */ - void *context; - - /** - * The callback used to report caught signal information. - */ - BITCrashManagerPostCrashSignalCallback handleSignal; -} BITCrashManagerCallbacks; - -/** - * Crash Manager alert user input - */ -typedef NS_ENUM(NSUInteger, BITCrashManagerUserInput) { - /** - * User chose not to send the crash report - */ - BITCrashManagerUserInputDontSend = 0, - /** - * User wants the crash report to be sent - */ - BITCrashManagerUserInputSend = 1, - /** - * User chose to always send crash reports - */ - BITCrashManagerUserInputAlwaysSend = 2 - -}; - - -@protocol BITCrashManagerDelegate; - -/** - The crash reporting module. - - This is the HockeySDK module for handling crash reports, including when distributed via the App Store. - As a foundation it is using the open source, reliable and async-safe crash reporting framework - [PLCrashReporter](https://code.google.com/p/plcrashreporter/). - - This module works as a wrapper around the underlying crash reporting framework and provides functionality to - detect new crashes, queues them if networking is not available, present a user interface to approve sending - the reports to the HockeyApp servers and more. - - It also provides options to add additional meta information to each crash report, like `userName`, `userEmail` - via `BITHockeyManagerDelegate` protocol, and additional textual log information via `BITCrashManagerDelegate` - protocol and a way to detect startup crashes so you can adjust your startup process to get these crash reports - too and delay your app initialization. - - Crashes are send the next time the app starts. If `crashManagerStatus` is set to `BITCrashManagerStatusAutoSend`, - crashes will be send without any user interaction, otherwise an alert will appear allowing the users to decide - whether they want to send the report or not. This module is not sending the reports right when the crash happens - deliberately, because if is not safe to implement such a mechanism while being async-safe (any Objective-C code - is _NOT_ async-safe!) and not causing more danger like a deadlock of the device, than helping. We found that users - do start the app again because most don't know what happened, and you will get by far most of the reports. - - Sending the reports on startup is done asynchronously (non-blocking). This is the only safe way to ensure - that the app won't be possibly killed by the iOS watchdog process, because startup could take too long - and the app could not react to any user input when network conditions are bad or connectivity might be - very slow. - - It is possible to check upon startup if the app crashed before using `didCrashInLastSession` and also how much - time passed between the app launch and the crash using `timeintervalCrashInLastSessionOccured`. This allows you - to add additional code to your app delaying the app start until the crash has been successfully send if the crash - occured within a critical startup timeframe, e.g. after 10 seconds. The `BITCrashManagerDelegate` protocol provides - various delegates to inform the app about it's current status so you can continue the remaining app startup setup - after sending has been completed. The documentation contains a guide - [How to handle Crashes on startup](HowTo-Handle-Crashes-On-Startup) with an example on how to do that. - - More background information on this topic can be found in the following blog post by Landon Fuller, the - developer of [PLCrashReporter](https://www.plcrashreporter.org), about writing reliable and - safe crash reporting: [Reliable Crash Reporting](http://goo.gl/WvTBR) - - @warning If you start the app with the Xcode debugger attached, detecting crashes will _NOT_ be enabled! - */ - -@interface BITCrashManager : BITHockeyBaseManager - - -///----------------------------------------------------------------------------- -/// @name Configuration -///----------------------------------------------------------------------------- - -/** Set the default status of the Crash Manager - - Defines if the crash reporting feature should be disabled, ask the user before - sending each crash report or send crash reportings automatically without - asking. - - The default value is `BITCrashManagerStatusAlwaysAsk`. The user can switch to - `BITCrashManagerStatusAutoSend` by choosing "Always" in the dialog (since - `showAlwaysButton` default is _YES_). - - The current value is always stored in User Defaults with the key - `BITCrashManagerStatus`. - - If you intend to implement a user setting to let them enable or disable - crash reporting, this delegate should be used to return that value. You also - have to make sure the new value is stored in the UserDefaults with the key - `BITCrashManagerStatus`. - - @see BITCrashManagerStatus - @see showAlwaysButton - */ -@property (nonatomic, assign) BITCrashManagerStatus crashManagerStatus; - - -/** - * Trap fatal signals via a Mach exception server. - * - * By default the SDK is using the safe and proven in-process BSD Signals for catching crashes. - * This option provides an option to enable catching fatal signals via a Mach exception server - * instead. - * - * We strongly advice _NOT_ to enable Mach exception handler in release versions of your apps! - * - * Default: _NO_ - * - * @warning The Mach exception handler executes in-process, and will interfere with debuggers when - * they attempt to suspend all active threads (which will include the Mach exception handler). - * Mach-based handling should _NOT_ be used when a debugger is attached. The SDK will not - * enabled catching exceptions if the app is started with the debugger running. If you attach - * the debugger during runtime, this may cause issues the Mach exception handler is enabled! - * @see isDebuggerAttached - */ -@property (nonatomic, assign, getter=isMachExceptionHandlerEnabled) BOOL enableMachExceptionHandler; - - -/** - * Enable on device symbolication for system symbols - * - * By default, the SDK does not symbolicate on the device, since this can - * take a few seconds at each crash. Also note that symbolication on the - * device might not be able to retrieve all symbols. - * - * Enable if you want to analyze crashes on unreleased OS versions. - * - * Default: _NO_ - */ -@property (nonatomic, assign, getter=isOnDeviceSymbolicationEnabled) BOOL enableOnDeviceSymbolication; - - -/** - * EXPERIMENTAL: Enable heuristics to detect the app not terminating cleanly - * - * This allows it to get a crash report if the app got killed while being in the foreground - * because of now of the following reasons: - * - The main thread was blocked for too long - * - The app took too long to start up - * - The app tried to allocate too much memory. If iOS did send a memory warning before killing the app because of this reason, `didReceiveMemoryWarningInLastSession` returns `YES`. - * - Permitted background duration if main thread is running in an endless loop - * - App failed to resume in time if main thread is running in an endless loop - * - If `enableMachExceptionHandler` is not activated, crashed due to stackoverflow will also be reported - * - * The following kills can _NOT_ be detected: - * - Terminating the app takes too long - * - Permitted background duration too long for all other cases - * - App failed to resume in time for all other cases - * - possibly more cases - * - * Crash reports triggered by this mechanisms do _NOT_ contain any stack traces since the time of the kill - * cannot be intercepted and hence no stack trace of the time of the kill event can't be gathered. - * - * The heuristic is implemented as follows: - * If the app never gets a `UIApplicationDidEnterBackgroundNotification` or `UIApplicationWillTerminateNotification` - * notification, PLCrashReporter doesn't detect a crash itself, and the app starts up again, it is assumed that - * the app got either killed by iOS while being in foreground or a crash occured that couldn't be detected. - * - * Default: _NO_ - * - * @warning This is a heuristic and it _MAY_ report false positives! It has been tested with iOS 6.1 and iOS 7. - * Depending on Apple changing notification events, new iOS version may cause more false positives! - * - * @see lastSessionCrashDetails - * @see didReceiveMemoryWarningInLastSession - * @see `BITCrashManagerDelegate considerAppNotTerminatedCleanlyReportForCrashManager:` - * @see [Apple Technical Note TN2151](https://developer.apple.com/library/ios/technotes/tn2151/_index.html) - * @see [Apple Technical Q&A QA1693](https://developer.apple.com/library/ios/qa/qa1693/_index.html) - */ -@property (nonatomic, assign, getter = isAppNotTerminatingCleanlyDetectionEnabled) BOOL enableAppNotTerminatingCleanlyDetection; - - -/** - * Set the callbacks that will be executed prior to program termination after a crash has occurred - * - * PLCrashReporter provides support for executing an application specified function in the context - * of the crash reporter's signal handler, after the crash report has been written to disk. - * - * Writing code intended for execution inside of a signal handler is exceptionally difficult, and is _NOT_ recommended! - * - * _Program Flow and Signal Handlers_ - * - * When the signal handler is called the normal flow of the program is interrupted, and your program is an unknown state. Locks may be held, the heap may be corrupt (or in the process of being updated), and your signal handler may invoke a function that was being executed at the time of the signal. This may result in deadlocks, data corruption, and program termination. - * - * _Async-Safe Functions_ - * - * A subset of functions are defined to be async-safe by the OS, and are safely callable from within a signal handler. If you do implement a custom post-crash handler, it must be async-safe. A table of POSIX-defined async-safe functions and additional information is available from the [CERT programming guide - SIG30-C](https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers). - * - * Most notably, the Objective-C runtime itself is not async-safe, and Objective-C may not be used within a signal handler. - * - * Documentation taken from PLCrashReporter: https://www.plcrashreporter.org/documentation/api/v1.2-rc2/async_safety.html - * - * @see BITCrashManagerPostCrashSignalCallback - * @see BITCrashManagerCallbacks - * - * @param callbacks A pointer to an initialized PLCrashReporterCallback structure, see https://www.plcrashreporter.org/documentation/api/v1.2-rc2/struct_p_l_crash_reporter_callbacks.html - */ -- (void)setCrashCallbacks: (BITCrashManagerCallbacks *) callbacks; - - -/** - Flag that determines if an "Always" option should be shown - - If enabled the crash reporting alert will also present an "Always" option, so - the user doesn't have to approve every single crash over and over again. - - If If `crashManagerStatus` is set to `BITCrashManagerStatusAutoSend`, this property - has no effect, since no alert will be presented. - - Default: _YES_ - - @see crashManagerStatus - */ -@property (nonatomic, assign, getter=shouldShowAlwaysButton) BOOL showAlwaysButton; - - -///----------------------------------------------------------------------------- -/// @name Crash Meta Information -///----------------------------------------------------------------------------- - -/** - Indicates if the app crash in the previous session - - Use this on startup, to check if the app starts the first time after it crashed - previously. You can use this also to disable specific events, like asking - the user to rate your app. - - @warning This property only has a correct value, once `[BITHockeyManager startManager]` was - invoked! - - @see lastSessionCrashDetails - */ -@property (nonatomic, readonly) BOOL didCrashInLastSession; - -/** - Provides an interface to pass user input from a custom alert to a crash report - - @param userInput Defines the users action wether to send, always send, or not to send the crash report. - @param userProvidedMetaData The content of this optional BITCrashMetaData instance will be attached to the crash report and allows to ask the user for e.g. additional comments or info. - - @return Returns YES if the input is a valid option and successfully triggered further processing of the crash report - - @see BITCrashManagerUserInput - @see BITCrashMetaData - */ -- (BOOL)handleUserInput:(BITCrashManagerUserInput)userInput withUserProvidedMetaData:(BITCrashMetaData *)userProvidedMetaData; - -/** - Lets you set a custom block which handles showing a custom UI and asking the user - whether he wants to send the crash report. - - This replaces the default alert the SDK would show! - - You can use this to present any kind of user interface which asks the user for additional information, - e.g. what they did in the app before the app crashed. - - In addition to this you should always ask your users if they agree to send crash reports, send them - always or not and return the result when calling `handleUserInput:withUserProvidedCrashDescription`. - - @param alertViewHandler A block that is responsible for loading, presenting and and dismissing your custom user interface which prompts the user if he wants to send crash reports. The block is also responsible for triggering further processing of the crash reports. - - @warning Block needs to call the `[BITCrashManager handleUserInput:withUserProvidedMetaData:]` method! - - @warning This needs to be set before calling `[BITHockeyManager startManager]`! - */ -- (void)setAlertViewHandler:(BITCustomAlertViewHandler)alertViewHandler; - -/** - * Provides details about the crash that occured in the last app session - */ -@property (nonatomic, readonly) BITCrashDetails *lastSessionCrashDetails; - - -/** - Indicates if the app did receive a low memory warning in the last session - - It may happen that low memory warning where send but couldn't be logged, since iOS - killed the app before updating the flag in the filesystem did complete. - - This property may be true in case of low memory kills, but it doesn't have to be! Apps - can also be killed without the app ever receiving a low memory warning. - - Also the app could have received a low memory warning, but the reason for being killed was - actually different. - - @warning This property only has a correct value, once `[BITHockeyManager startManager]` was - invoked! - - @see enableAppNotTerminatingCleanlyDetection - @see lastSessionCrashDetails - */ -@property (nonatomic, readonly) BOOL didReceiveMemoryWarningInLastSession; - - -/** - Provides the time between startup and crash in seconds - - Use this in together with `didCrashInLastSession` to detect if the app crashed very - early after startup. This can be used to delay app initialization until the crash - report has been sent to the server or if you want to do any other actions like - cleaning up some cache data etc. - - Note that sending a crash reports starts as early as 1.5 seconds after the application - did finish launching! - - The `BITCrashManagerDelegate` protocol provides some delegates to inform if sending - a crash report was finished successfully, ended in error or was cancelled by the user. - - *Default*: _-1_ - @see didCrashInLastSession - @see BITCrashManagerDelegate - */ -@property (nonatomic, readonly) NSTimeInterval timeintervalCrashInLastSessionOccured; - - -///----------------------------------------------------------------------------- -/// @name Helper -///----------------------------------------------------------------------------- - -/** - * Detect if a debugger is attached to the app process - * - * This is only invoked once on app startup and can not detect if the debugger is being - * attached during runtime! - * - * @return BOOL if the debugger is attached on app startup - */ -- (BOOL)isDebuggerAttached; - - -/** - * Lets the app crash for easy testing of the SDK - * - * The best way to use this is to trigger the crash with a button action. - * - * Make sure not to let the app crash in `applicationDidFinishLaunching` or any other - * startup method! Since otherwise the app would crash before the SDK could process it. - * - * Note that our SDK provides support for handling crashes that happen early on startup. - * Check the documentation for more information on how to use this. - * - * If the SDK detects an App Store environment, it will _NOT_ cause the app to crash! - */ -- (void)generateTestCrash; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashManagerDelegate.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashManagerDelegate.h deleted file mode 100644 index ab4d7b5aa4..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashManagerDelegate.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@class BITCrashManager; -@class BITHockeyAttachment; - -/** - The `BITCrashManagerDelegate` formal protocol defines methods further configuring - the behaviour of `BITCrashManager`. - */ - -@protocol BITCrashManagerDelegate - -@optional - - -///----------------------------------------------------------------------------- -/// @name Additional meta data -///----------------------------------------------------------------------------- - -/** Return any log string based data the crash report being processed should contain - - @param crashManager The `BITCrashManager` instance invoking this delegate - @see attachmentForCrashManager: - @see userNameForCrashManager: - @see userEmailForCrashManager: - */ --(NSString *)applicationLogForCrashManager:(BITCrashManager *)crashManager; - - -/** Return a BITHockeyAttachment object providing an NSData object the crash report - being processed should contain - - Please limit your attachments to reasonable files to avoid high traffic costs for your users. - - Example implementation: - - - (BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager { - NSData *data = [NSData dataWithContentsOfURL:@"mydatafile"]; - - BITHockeyAttachment *attachment = [[BITHockeyAttachment alloc] initWithFilename:@"myfile.data" - hockeyAttachmentData:data - contentType:@"'application/octet-stream"]; - return attachment; - } - - @param crashManager The `BITCrashManager` instance invoking this delegate - @see BITHockeyAttachment - @see applicationLogForCrashManager: - @see userNameForCrashManager: - @see userEmailForCrashManager: - */ --(BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager; - - - -/** Return the user name or userid that should be send along each crash report - - @param crashManager The `BITCrashManager` instance invoking this delegate - @see applicationLogForCrashManager: - @see attachmentForCrashManager: - @see userEmailForCrashManager: - @deprecated Please use `BITHockeyManagerDelegate userNameForHockeyManager:componentManager:` instead - @warning When returning a non nil value, crash reports are not anonymous any - more and the alerts will not show the "anonymous" word! - */ --(NSString *)userNameForCrashManager:(BITCrashManager *)crashManager DEPRECATED_ATTRIBUTE; - - - -/** Return the users email address that should be send along each crash report - - @param crashManager The `BITCrashManager` instance invoking this delegate - @see applicationLogForCrashManager: - @see attachmentForCrashManager: - @see userNameForCrashManager: - @deprecated Please use `BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:` instead - @warning When returning a non nil value, crash reports are not anonymous any - more and the alerts will not show the "anonymous" word! - */ --(NSString *)userEmailForCrashManager:(BITCrashManager *)crashManager DEPRECATED_ATTRIBUTE; - - - -///----------------------------------------------------------------------------- -/// @name Alert -///----------------------------------------------------------------------------- - -/** Invoked before the user is asked to send a crash report, so you can do additional actions. - E.g. to make sure not to ask the user for an app rating :) - - @param crashManager The `BITCrashManager` instance invoking this delegate - */ --(void)crashManagerWillShowSubmitCrashReportAlert:(BITCrashManager *)crashManager; - - -/** Invoked after the user did choose _NOT_ to send a crash in the alert - - @param crashManager The `BITCrashManager` instance invoking this delegate - */ --(void)crashManagerWillCancelSendingCrashReport:(BITCrashManager *)crashManager; - - -/** Invoked after the user did choose to send crashes always in the alert - - @param crashManager The `BITCrashManager` instance invoking this delegate - */ --(void)crashManagerWillSendCrashReportsAlways:(BITCrashManager *)crashManager; - - -///----------------------------------------------------------------------------- -/// @name Networking -///----------------------------------------------------------------------------- - -/** Invoked right before sending crash reports will start - - @param crashManager The `BITCrashManager` instance invoking this delegate - */ -- (void)crashManagerWillSendCrashReport:(BITCrashManager *)crashManager; - -/** Invoked after sending crash reports failed - - @param crashManager The `BITCrashManager` instance invoking this delegate - @param error The error returned from the NSURLConnection call or `kBITCrashErrorDomain` - with reason of type `BITCrashErrorReason`. - */ -- (void)crashManager:(BITCrashManager *)crashManager didFailWithError:(NSError *)error; - -/** Invoked after sending crash reports succeeded - - @param crashManager The `BITCrashManager` instance invoking this delegate - */ -- (void)crashManagerDidFinishSendingCrashReport:(BITCrashManager *)crashManager; - -///----------------------------------------------------------------------------- -/// @name Experimental -///----------------------------------------------------------------------------- - -/** Define if a report should be considered as a crash report - - Due to the risk, that these reports may be false positives, this delegates allows the - developer to influence which reports detected by the heuristic should actually be reported. - - The developer can use the following property to get more information about the crash scenario: - - `[BITCrashManager didReceiveMemoryWarningInLastSession]`: Did the app receive a low memory warning - - This allows only reports to be considered where at least one low memory warning notification was - received by the app to reduce to possibility of having false positives. - - @param crashManager The `BITCrashManager` instance invoking this delegate - @return `YES` if the heuristic based detected report should be reported, otherwise `NO` - @see `[BITCrashManager didReceiveMemoryWarningInLastSession]` - */ --(BOOL)considerAppNotTerminatedCleanlyReportForCrashManager:(BITCrashManager *)crashManager; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashMetaData.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashMetaData.h deleted file mode 100644 index a7c5a96c0c..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITCrashMetaData.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - - -/** - * This class provides properties that can be attached to a crash report via a custom alert view flow - */ -@interface BITCrashMetaData : NSObject - -/** - * User provided description that should be attached to the crash report as plain text - */ -@property (nonatomic, copy) NSString *userDescription; - -/** - * User name that should be attached to the crash report - */ -@property (nonatomic, copy) NSString *userName; - -/** - * User email that should be attached to the crash report - */ -@property (nonatomic, copy) NSString *userEmail; - -/** - * User ID that should be attached to the crash report - */ -@property (nonatomic, copy) NSString *userID; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackActivity.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackActivity.h deleted file mode 100644 index f9289c8df0..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackActivity.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "BITFeedbackComposeViewControllerDelegate.h" - -/** - UIActivity subclass allowing to use the feedback interface to share content with the developer - - This activity can be added into an UIActivityViewController and it will use the activity data - objects to prefill the content of `BITFeedbackComposeViewController`. - - This can be useful if you present some data that users can not only share but also - report back to the developer because they have some problems, e.g. webcams not working - any more. - - The activity provide a default title and image that can be further customized - via `customActivityImage` and `customActivityTitle`. - - */ - -@interface BITFeedbackActivity : UIActivity - -///----------------------------------------------------------------------------- -/// @name BITFeedbackActivity customisation -///----------------------------------------------------------------------------- - - -/** - Define the image shown when using `BITFeedbackActivity` - - If not set a default icon is being used. - - @see customActivityTitle - */ -@property (nonatomic, strong) UIImage *customActivityImage; - - -/** - Define the title shown when using `BITFeedbackActivity` - - If not set, a default string is shown by using the apps name - and adding the localized string "Feedback" to it. - - @see customActivityImage - */ -@property (nonatomic, strong) NSString *customActivityTitle; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackComposeViewController.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackComposeViewController.h deleted file mode 100644 index 9fff2fd831..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackComposeViewController.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import - -#import "BITFeedbackComposeViewControllerDelegate.h" - -/** - View controller allowing the user to write and send new feedback - - To add this view controller to your own app and push it onto a navigation stack, - don't create the intance yourself, but use the following code to get a correct instance: - - [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackComposeViewController] - - To show it modally, use the following code instead: - - [[BITHockeyManager sharedHockeyManager].feedbackManager showFeedbackComposeView] - - */ - -@interface BITFeedbackComposeViewController : UIViewController - - -///----------------------------------------------------------------------------- -/// @name Delegate -///----------------------------------------------------------------------------- - - -/** - Sets the `BITFeedbackComposeViewControllerDelegate` delegate. - - The delegate is automatically set by using `[BITHockeyManager setDelegate:]`. You - should not need to set this delegate individually. - - @see `[BITHockeyManager setDelegate:`] - */ -@property (nonatomic, weak) id delegate; - - -///----------------------------------------------------------------------------- -/// @name Presetting content -///----------------------------------------------------------------------------- - - -/** - An array of data objects that should be used to prefill the compose view content - - The follwoing data object classes are currently supported: - - NSString - - NSURL - - UIImage - - NSData - - `BITHockeyAttachment` - - These are automatically concatenated to one text string, while any images and NSData - objects are added as attachments to the feedback. - - @param items Array of data objects to prefill the feedback text message. - */ -- (void)prepareWithItems:(NSArray *)items; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackComposeViewControllerDelegate.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackComposeViewControllerDelegate.h deleted file mode 100644 index 58438d4fef..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackComposeViewControllerDelegate.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -/** - * The users action when composing a message - */ -typedef NS_ENUM(NSUInteger, BITFeedbackComposeResult) { - /** - * user hit cancel - */ - BITFeedbackComposeResultCancelled, - /** - * user hit submit - */ - BITFeedbackComposeResultSubmitted, -}; - -@class BITFeedbackComposeViewController; - -/** - * The `BITFeedbackComposeViewControllerDelegate` formal protocol defines methods further configuring - * the behaviour of `BITFeedbackComposeViewController`. - */ - -@protocol BITFeedbackComposeViewControllerDelegate - -@optional - -///----------------------------------------------------------------------------- -/// @name View Controller Management -///----------------------------------------------------------------------------- - -/** - * Invoked once the compose screen is finished via send or cancel - * - * If this is implemented, it's the responsibility of this method to dismiss the presented - * `BITFeedbackComposeViewController` - * - * @param composeViewController The `BITFeedbackComposeViewController` instance invoking this delegate - * @param composeResult The user action the lead to closing the compose view - */ -- (void)feedbackComposeViewController:(BITFeedbackComposeViewController *)composeViewController - didFinishWithResult:(BITFeedbackComposeResult) composeResult; - -#pragma mark - Deprecated methods - -/** - * This method is deprecated. If feedbackComposeViewController:didFinishWithResult: is implemented, this will not be called - * - * @param composeViewController The `BITFeedbackComposeViewController` instance invoking this delegate - */ -- (void)feedbackComposeViewControllerDidFinish:(BITFeedbackComposeViewController *)composeViewController __attribute__((deprecated("Use feedbackComposeViewController:didFinishWithResult: instead"))); -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackListViewController.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackListViewController.h deleted file mode 100644 index 8ee2b064d9..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackListViewController.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import -#import - -#import "BITHockeyBaseViewController.h" - -/** - View controller providing a default interface to manage feedback - - The message list interface contains options to locally delete single messages - by swiping over them, or deleting all messages. This will not delete the messages - on the server though! - - It is also integrates actions to invoke the user interface to compose a new messages, - reload the list content from the server and changing the users name or email if these - are allowed to be set. - - To add this view controller to your own app and push it onto a navigation stack, - don't create the intance yourself, but use the following code to get a correct instance: - - [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackListViewController:NO] - - To show it modally, use the following code instead: - - [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackListViewController:YES] - - This ensures that the presentation on iOS 6 and iOS 7 will use the corret design on each OS Version. - */ - -@interface BITFeedbackListViewController : BITHockeyBaseViewController { -} - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackManager.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackManager.h deleted file mode 100644 index c9fe10e383..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackManager.h +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import - -#import "BITHockeyBaseManager.h" -#import "BITFeedbackListViewController.h" -#import "BITFeedbackComposeViewController.h" - - -// Notification message which tells that loading messages finished -#define BITHockeyFeedbackMessagesLoadingStarted @"BITHockeyFeedbackMessagesLoadingStarted" - -// Notification message which tells that loading messages finished -#define BITHockeyFeedbackMessagesLoadingFinished @"BITHockeyFeedbackMessagesLoadingFinished" - - -/** - * Defines behavior of the user data field - */ -typedef NS_ENUM(NSInteger, BITFeedbackUserDataElement) { - /** - * don't ask for this user data element at all - */ - BITFeedbackUserDataElementDontShow = 0, - /** - * the user may provide it, but does not have to - */ - BITFeedbackUserDataElementOptional = 1, - /** - * the user has to provide this to continue - */ - BITFeedbackUserDataElementRequired = 2 -}; - -/** - * Available modes for opening the feedback compose interface with a screenshot attached - */ -typedef NS_ENUM(NSInteger, BITFeedbackObservationMode) { - /** - * No SDK provided trigger is active. - */ - BITFeedbackObservationNone = 0, - /** - * Triggers when the user takes a screenshot. This will grab the latest image from the camera roll. Requires iOS 7 or later! - */ - BITFeedbackObservationModeOnScreenshot = 1, - /** - * Triggers when the user taps with three fingers on the screen. - */ - BITFeedbackObservationModeThreeFingerTap = 2 -}; - - -@class BITFeedbackMessage; -@protocol BITFeedbackManagerDelegate; - -/** - The feedback module. - - This is the HockeySDK module for letting your users communicate directly with you via - the app and an integrated user interface. It provides a single threaded - discussion with a user running your app. - - You should never create your own instance of `BITFeedbackManager` but use the one provided - by the `[BITHockeyManager sharedHockeyManager]`: - - [BITHockeyManager sharedHockeyManager].feedbackManager - - The user interface provides a list view than can be presented modally using - `[BITFeedbackManager showFeedbackListView]` or adding - `[BITFeedbackManager feedbackListViewController:]` to push onto a navigation stack. - This list integrates all features to load new messages, write new messages, view messages - and ask the user for additional (optional) data like name and email. - - If the user provides the email address, all responses from the server will also be sent - to the user via email and the user is also able to respond directly via email, too. - - The message list interface also contains options to locally delete single messages - by swiping over them, or deleting all messages. This will not delete the messages - on the server, though! - - It also integrates actions to invoke the user interface to compose a new message, - reload the list content from the server and change the users name or email if these - are allowed to be set. - - It is also possible to invoke the user interface to compose a new message in your - own code, by calling `[BITFeedbackManager showFeedbackComposeView]` modally or adding - `[BITFeedbackManager feedbackComposeViewController]` to push onto a navigation stack. - - If new messages are written while the device is offline, the SDK automatically retries to - send them once the app starts again or gets active again, or if the notification - `BITHockeyNetworkDidBecomeReachableNotification` is fired. - - A third option is to include the `BITFeedbackActivity` into an UIActivityViewController. - This can be useful if you present some data that users can not only share but also - report back to the developer because they have some problems, e.g. webcams not working - any more. The activity provides a default title and image that can also be customized. - - New messages are automatically loaded on startup, when the app becomes active again - or when the notification `BITHockeyNetworkDidBecomeReachableNotification` is fired. This - only happens if the user ever did initiate a conversation by writing the first - feedback message. - - Implementing the `BITFeedbackManagerDelegate` protocol will notify your app when a new - message was received from the server. The `BITFeedbackComposeViewControllerDelegate` - protocol informs your app about events related to sending feedback messages. - - */ - -@interface BITFeedbackManager : BITHockeyBaseManager - -///----------------------------------------------------------------------------- -/// @name General settings -///----------------------------------------------------------------------------- - - -/** - Define if a name has to be provided by the user when providing feedback - - - `BITFeedbackUserDataElementDontShow`: Don't ask for this user data element at all - - `BITFeedbackUserDataElementOptional`: The user may provide it, but does not have to - - `BITFeedbackUserDataElementRequired`: The user has to provide this to continue - - The default value is `BITFeedbackUserDataElementOptional`. - - @warning If you provide a non nil value for the `BITFeedbackManager` class via - `[BITHockeyManagerDelegate userNameForHockeyManager:componentManager:]` then this - property will automatically be set to `BITFeedbackUserDataElementDontShow` - - @see BITFeedbackUserDataElement - @see requireUserEmail - @see `[BITHockeyManagerDelegate userNameForHockeyManager:componentManager:]` - */ -@property (nonatomic, readwrite) BITFeedbackUserDataElement requireUserName; - - -/** - Define if an email address has to be provided by the user when providing feedback - - If the user provides the email address, all responses from the server will also be send - to the user via email and the user is also able to respond directly via email too. - - - `BITFeedbackUserDataElementDontShow`: Don't ask for this user data element at all - - `BITFeedbackUserDataElementOptional`: The user may provide it, but does not have to - - `BITFeedbackUserDataElementRequired`: The user has to provide this to continue - - The default value is `BITFeedbackUserDataElementOptional`. - - @warning If you provide a non nil value for the `BITFeedbackManager` class via - `[BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:]` then this - property will automatically be set to `BITFeedbackUserDataElementDontShow` - - @see BITFeedbackUserDataElement - @see requireUserName - @see `[BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:]` - */ -@property (nonatomic, readwrite) BITFeedbackUserDataElement requireUserEmail; - - -/** - Indicates if an alert should be shown when new messages have arrived - - This lets the user view the new feedback by choosing the appropriate option - in the alert sheet, and the `BITFeedbackListViewController` will be shown. - - The alert is only shown, if the newest message didn't originate from the current user. - This requires the users email address to be present! The optional userid property - cannot be used, because users could also answer via email and then this information - is not available. - - Default is `YES` - @see feedbackListViewController: - @see requireUserEmail - @see `[BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:]` - */ -@property (nonatomic, readwrite) BOOL showAlertOnIncomingMessages; - - -/** - Define the trigger that opens the feedback composer and attaches a screenshot - - The following modes are available: - - - `BITFeedbackObservationNone`: No SDK based trigger is active. You can implement your - own trigger and then call `[[BITHockeyManager sharedHockeyManager].feedbackManager showFeedbackComposeViewWithGeneratedScreenshot];` to handle your custom events - that should trigger this. - - `BITFeedbackObservationModeOnScreenshot`: Triggers when the user takes a screenshot. - This will grab the latest image from the camera roll. Requires iOS 7 or later! - - `BITFeedbackObservationModeThreeFingerTap`: Triggers when the user taps on the screen for three seconds with three fingers. - - Default is `BITFeedbackObservationNone` - - @see showFeedbackComposeViewWithGeneratedScreenshot - */ -@property (nonatomic, readwrite) BITFeedbackObservationMode feedbackObservationMode; - - -///----------------------------------------------------------------------------- -/// @name User Interface -///----------------------------------------------------------------------------- - - -/** - Indicates if a forced user data UI presentation is shown modal - - If `requireUserName` and/or `requireUserEmail` are enabled, the first presentation - of `feedbackListViewController:` and subsequent `feedbackComposeViewController:` - will automatically present a UI that lets the user provide this data and compose - a message. By default this is shown (since SDK 3.1) as a modal sheet. - - If you want the SDK to push this UI onto the navigation stack in this specific scenario, - then change the property to `NO`. - - @warning If you are presenting the `BITFeedbackListViewController` in a popover, this property should not be changed! - - Default is `YES` - @see requireUserName - @see requireUserEmail - @see showFeedbackComposeView - @see feedbackComposeViewController - @see showFeedbackListView - @see feedbackListViewController: - */ -@property (nonatomic, readwrite) BOOL showFirstRequiredPresentationModal; - - -/** - Return a screenshot UIImage intance from the current visiable screen - - @return UIImage instance containing a screenshot of the current screen - */ -- (UIImage *)screenshot; - - -/** - Present the modal feedback list user interface. - */ -- (void)showFeedbackListView; - - -/** - Create an feedback list view - - @param modal Return a view ready for modal presentation with integrated navigation bar - @return `BITFeedbackListViewController` The feedback list view controller, - e.g. to push it onto a navigation stack. - */ -- (BITFeedbackListViewController *)feedbackListViewController:(BOOL)modal; - - -/** - Present the modal feedback compose message user interface. - */ -- (void)showFeedbackComposeView; - -/** - Present the modal feedback compose message user interface with the items given. - - All NSString-Content in the array will be concatenated and result in the message, - while all UIImage and NSData-instances will be turned into attachments. - - @param items an NSArray with objects that should be attached - @see `[BITFeedbackComposeViewController prepareWithItems:]` - */ -- (void)showFeedbackComposeViewWithPreparedItems:(NSArray *)items; - -/** - Presents a modal feedback compose interface with a screenshot attached which is taken at the time of calling this method. - - This should be used when your own trigger fires. The following code should be used: - - [[BITHockeyManager sharedHockeyManager].feedbackManager showFeedbackComposeViewWithGeneratedScreenshot]; - - @see feedbackObservationMode - */ -- (void)showFeedbackComposeViewWithGeneratedScreenshot; - - -/** - Create a feedback compose view - - Example to show a modal feedback compose UI with prefilled text - - BITFeedbackComposeViewController *feedbackCompose = [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackComposeViewController]; - - [feedbackCompose prepareWithItems: - @[@"Adding some example default text and also adding a link.", - [NSURL URLWithString:@"http://hockeayyp.net/"]]]; - - UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:feedbackCompose]; - navController.modalPresentationStyle = UIModalPresentationFormSheet; - [self presentViewController:navController animated:YES completion:nil]; - - @return `BITFeedbackComposeViewController` The compose feedback view controller, - e.g. to push it onto a navigation stack. - */ -- (BITFeedbackComposeViewController *)feedbackComposeViewController; - - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackManagerDelegate.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackManagerDelegate.h deleted file mode 100644 index 61b4c39652..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITFeedbackManagerDelegate.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Author: Stephan Diederich - * - * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@class BITFeedbackManager; -@protocol BITFeedbackComposeViewControllerDelegate; - -/** - * Delegate protocol which is notified about changes in the feedbackManager - * @TODO - * * move shouldShowUpdateAlert from feedbackManager here - */ -@protocol BITFeedbackManagerDelegate - -@optional - -/** - * can be implemented to know when new feedback from the server arrived - * - * @param feedbackManager The feedbackManager which did detect the new messages - */ -- (void) feedbackManagerDidReceiveNewFeedback:(BITFeedbackManager*) feedbackManager; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyAttachment.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyAttachment.h deleted file mode 100644 index ee579e050c..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyAttachment.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -/** - Provides support to add binary attachments to crash reports and feedback messages - - This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]`, - `[BITFeedbackComposeViewController prepareWithItems:]` and - `[BITFeedbackManager showFeedbackComposeViewWithPreparedItems:]` - */ -@interface BITHockeyAttachment : NSObject - -/** - The filename the attachment should get - */ -@property (nonatomic, readonly, strong) NSString *filename; - -/** - The attachment data as NSData object - */ -@property (nonatomic, readonly, strong) NSData *hockeyAttachmentData; - -/** - The content type of your data as MIME type - */ -@property (nonatomic, readonly, strong) NSString *contentType; - -/** - Create an BITHockeyAttachment instance with a given filename and NSData object - - @param filename The filename the attachment should get. If nil will get a automatically generated filename - @param hockeyAttachmentData The attachment data as NSData. The instance will be ignore if this is set to nil! - @param contentType The content type of your data as MIME type. If nil will be set to "application/octet-stream" - - @return An instsance of BITHockeyAttachment. - */ -- (instancetype)initWithFilename:(NSString *)filename - hockeyAttachmentData:(NSData *)hockeyAttachmentData - contentType:(NSString *)contentType; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyBaseManager.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyBaseManager.h deleted file mode 100644 index ed5284d4d2..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyBaseManager.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import - - -/** - The internal superclass for all component managers - - */ - -@interface BITHockeyBaseManager : NSObject - -///----------------------------------------------------------------------------- -/// @name Modules -///----------------------------------------------------------------------------- - - -/** - Defines the server URL to send data to or request data from - - By default this is set to the HockeyApp servers and there rarely should be a - need to modify that. - */ -@property (nonatomic, copy) NSString *serverURL; - - -///----------------------------------------------------------------------------- -/// @name User Interface -///----------------------------------------------------------------------------- - -/** - The UIBarStyle of the update user interface navigation bar. - - Default is UIBarStyleBlackOpaque - @see navigationBarTintColor - */ -@property (nonatomic, assign) UIBarStyle barStyle; - -/** - The navigationbar tint color of the update user interface navigation bar. - - The navigationBarTintColor is used by default, you can either overwrite it `navigationBarTintColor` - or define another `barStyle` instead. - - Default is RGB(25, 25, 25) - @see barStyle - */ -@property (nonatomic, strong) UIColor *navigationBarTintColor; - -/** - The UIModalPresentationStyle for showing the update user interface when invoked - with the update alert. - */ -@property (nonatomic, assign) UIModalPresentationStyle modalPresentationStyle; - - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyBaseViewController.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyBaseViewController.h deleted file mode 100644 index d7701036be..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyBaseViewController.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface BITHockeyBaseViewController : UITableViewController - -@property (nonatomic, readwrite) BOOL modalAnimated; - -- (instancetype)initWithModalStyle:(BOOL)modal; -- (instancetype)initWithStyle:(UITableViewStyle)style modal:(BOOL)modal; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyManager.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyManager.h deleted file mode 100644 index 7a8a5b80fa..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyManager.h +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Author: Andreas Linde - * Kent Sutherland - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import - - -@protocol BITHockeyManagerDelegate; - -@class BITHockeyBaseManager; -@class BITCrashManager; -@class BITUpdateManager; -@class BITStoreUpdateManager; -@class BITFeedbackManager; -@class BITAuthenticator; - -/** - The HockeySDK manager. Responsible for setup and management of all components - - This is the principal SDK class. It represents the entry point for the HockeySDK. The main promises of the class are initializing the SDK modules, providing access to global properties and to all modules. Initialization is divided into several distinct phases: - - 1. Setup the [HockeyApp](http://hockeyapp.net/) app identifier and the optional delegate: This is the least required information on setting up the SDK and using it. It does some simple validation of the app identifier and checks if the app is running from the App Store or not. - 2. Provides access to the SDK modules `BITCrashManager`, `BITUpdateManager`, and `BITFeedbackManager`. This way all modules can be further configured to personal needs, if the defaults don't fit the requirements. - 3. Configure each module. - 4. Start up all modules. - - The SDK is optimized to defer everything possible to a later time while making sure e.g. crashes on startup can also be caught and each module executes other code with a delay some seconds. This ensures that applicationDidFinishLaunching will process as fast as possible and the SDK will not block the startup sequence resulting in a possible kill by the watchdog process. - - All modules do **NOT** show any user interface if the module is not activated or not integrated. - `BITCrashManager`: Shows an alert on startup asking the user if he/she agrees on sending the crash report, if `[BITCrashManager crashManagerStatus]` is set to `BITCrashManagerStatusAlwaysAsk` (default) - `BITUpdateManager`: Is automatically deactivated when the SDK detects it is running from a build distributed via the App Store. Otherwise if it is not deactivated manually, it will show an alert after startup informing the user about a pending update, if one is available. If the user then decides to view the update another screen is presented with further details and an option to install the update. - `BITFeedbackManager`: If this module is deactivated or the user interface is nowhere added into the app, this module will not do anything. It will not fetch the server for data or show any user interface. If it is integrated, activated, and the user already used it to provide feedback, it will show an alert after startup if a new answer has been received from the server with the option to view it. - - Example: - - [[BITHockeyManager sharedHockeyManager] - configureWithIdentifier:@"" - delegate:nil]; - [[BITHockeyManager sharedHockeyManager] startManager]; - - @warning The SDK is **NOT** thread safe and has to be set up on the main thread! - - @warning Most properties of all components require to be set **BEFORE** calling`startManager`! - - */ - -@interface BITHockeyManager : NSObject - -#pragma mark - Public Methods - -///----------------------------------------------------------------------------- -/// @name Initialization -///----------------------------------------------------------------------------- - -/** - Returns a shared BITHockeyManager object - - @return A singleton BITHockeyManager instance ready use - */ -+ (BITHockeyManager *)sharedHockeyManager; - - -/** - Initializes the manager with a particular app identifier - - Initialize the manager with a HockeyApp app identifier. - - [[BITHockeyManager sharedHockeyManager] - configureWithIdentifier:@""]; - - @see configureWithIdentifier:delegate: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - @see startManager - @param appIdentifier The app identifier that should be used. - */ -- (void)configureWithIdentifier:(NSString *)appIdentifier; - - -/** - Initializes the manager with a particular app identifier and delegate - - Initialize the manager with a HockeyApp app identifier and assign the class that - implements the optional protocols `BITHockeyManagerDelegate`, `BITCrashManagerDelegate` or - `BITUpdateManagerDelegate`. - - [[BITHockeyManager sharedHockeyManager] - configureWithIdentifier:@"" - delegate:nil]; - - @see configureWithIdentifier: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - @see startManager - @see BITHockeyManagerDelegate - @see BITCrashManagerDelegate - @see BITUpdateManagerDelegate - @see BITFeedbackManagerDelegate - @param appIdentifier The app identifier that should be used. - @param delegate `nil` or the class implementing the option protocols - */ -- (void)configureWithIdentifier:(NSString *)appIdentifier delegate:(id)delegate; - - -/** - Initializes the manager with an app identifier for beta, one for live usage and delegate - - Initialize the manager with different HockeyApp app identifiers for beta and live usage. - All modules will automatically detect if the app is running in the App Store and use - the live app identifier for that. In all other cases it will use the beta app identifier. - And also assign the class that implements the optional protocols `BITHockeyManagerDelegate`, - `BITCrashManagerDelegate` or `BITUpdateManagerDelegate` - - [[BITHockeyManager sharedHockeyManager] - configureWithBetaIdentifier:@"" - liveIdentifier:@"" - delegate:nil]; - - We recommend using one app entry on HockeyApp for your beta versions and another one for - your live versions. The reason is that you will have way more beta versions than live - versions, but on the other side get way more crash reports on the live version. Separating - them into two different app entries makes it easier to work with the data. In addition - you will likely end up having the same version number for a beta and live version which - would mix different data into the same version. Also the live version does not require - you to upload any IPA files, uploading only the dSYM package for crash reporting is - just fine. - - @see configureWithIdentifier: - @see configureWithIdentifier:delegate: - @see startManager - @see BITHockeyManagerDelegate - @see BITCrashManagerDelegate - @see BITUpdateManagerDelegate - @see BITFeedbackManagerDelegate - @param betaIdentifier The app identifier for the _non_ app store (beta) configurations - @param liveIdentifier The app identifier for the app store configurations. - @param delegate `nil` or the class implementing the optional protocols - */ -- (void)configureWithBetaIdentifier:(NSString *)betaIdentifier liveIdentifier:(NSString *)liveIdentifier delegate:(id)delegate; - - -/** - Starts the manager and runs all modules - - Call this after configuring the manager and setting up all modules. - - @see configureWithIdentifier:delegate: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - */ -- (void)startManager; - - -#pragma mark - Public Properties - -///----------------------------------------------------------------------------- -/// @name Modules -///----------------------------------------------------------------------------- - - -/** - Set the delegate - - Defines the class that implements the optional protocol `BITHockeyManagerDelegate`. - - The delegate will automatically be propagated to all components. There is no need to set the delegate - for each component individually. - - @warning This property needs to be set before calling `startManager` - - @see BITHockeyManagerDelegate - @see BITCrashManagerDelegate - @see BITUpdateManagerDelegate - @see BITFeedbackManagerDelegate - */ -@property (nonatomic, weak) id delegate; - - -/** - Defines the server URL to send data to or request data from - - By default this is set to the HockeyApp servers and there rarely should be a - need to modify that. - - @warning This property needs to be set before calling `startManager` - */ -@property (nonatomic, strong) NSString *serverURL; - - -/** - Reference to the initialized BITCrashManager module - - Returns the BITCrashManager instance initialized by BITHockeyManager - - @see configureWithIdentifier:delegate: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - @see startManager - @see disableCrashManager - */ -@property (nonatomic, strong, readonly) BITCrashManager *crashManager; - - -/** - Flag the determines whether the Crash Manager should be disabled - - If this flag is enabled, then crash reporting is disabled and no crashes will - be send. - - Please note that the Crash Manager instance will be initialized anyway, but crash report - handling (signal and uncaught exception handlers) will **not** be registered. - - @warning This property needs to be set before calling `startManager` - - *Default*: _NO_ - @see crashManager - */ -@property (nonatomic, getter = isCrashManagerDisabled) BOOL disableCrashManager; - - -/** - Reference to the initialized BITUpdateManager module - - Returns the BITUpdateManager instance initialized by BITHockeyManager - - @see configureWithIdentifier:delegate: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - @see startManager - @see disableUpdateManager - */ -@property (nonatomic, strong, readonly) BITUpdateManager *updateManager; - - -/** - Flag the determines whether the Update Manager should be disabled - - If this flag is enabled, then checking for updates and submitting beta usage - analytics will be turned off! - - Please note that the Update Manager instance will be initialized anyway! - - @warning This property needs to be set before calling `startManager` - - *Default*: _NO_ - @see updateManager - */ -@property (nonatomic, getter = isUpdateManagerDisabled) BOOL disableUpdateManager; - - -/** - Reference to the initialized BITStoreUpdateManager module - - Returns the BITStoreUpdateManager instance initialized by BITHockeyManager - - @see configureWithIdentifier:delegate: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - @see startManager - @see enableStoreUpdateManager - */ -@property (nonatomic, strong, readonly) BITStoreUpdateManager *storeUpdateManager; - - -/** - Flag the determines whether the App Store Update Manager should be enabled - - If this flag is enabled, then checking for updates when the app runs from the - app store will be turned on! - - Please note that the Store Update Manager instance will be initialized anyway! - - @warning This property needs to be set before calling `startManager` - - *Default*: _NO_ - @see storeUpdateManager - */ -@property (nonatomic, getter = isStoreUpdateManagerEnabled) BOOL enableStoreUpdateManager; - -/** - Reference to the initialized BITFeedbackManager module - - Returns the BITFeedbackManager instance initialized by BITHockeyManager - - @see configureWithIdentifier:delegate: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - @see startManager - @see disableFeedbackManager - */ -@property (nonatomic, strong, readonly) BITFeedbackManager *feedbackManager; - - -/** - Flag the determines whether the Feedback Manager should be disabled - - If this flag is enabled, then letting the user give feedback and - get responses will be turned off! - - Please note that the Feedback Manager instance will be initialized anyway! - - @warning This property needs to be set before calling `startManager` - - *Default*: _NO_ - @see feedbackManager - */ -@property (nonatomic, getter = isFeedbackManagerDisabled) BOOL disableFeedbackManager; - -/** - Reference to the initialized BITAuthenticator module - - Returns the BITAuthenticator instance initialized by BITHockeyManager - - @see configureWithIdentifier:delegate: - @see configureWithBetaIdentifier:liveIdentifier:delegate: - @see startManager - */ -@property (nonatomic, strong, readonly) BITAuthenticator *authenticator; - - -///----------------------------------------------------------------------------- -/// @name Environment -///----------------------------------------------------------------------------- - -/** - Flag that determines whether the application is installed and running - from an App Store installation. - - Returns _YES_ if the app is installed and running from the App Store - Returns _NO_ if the app is installed via debug, ad-hoc or enterprise distribution - */ -@property (nonatomic, readonly, getter=isAppStoreEnvironment) BOOL appStoreEnvironment; - - -/** - Returns the app installation specific anonymous UUID - - The value returned by this method is unique and persisted per app installation - in the keychain. It is also being used in crash reports as `CrashReporter Key` - and internally when sending crash reports and feedback messages. - - This is not identical to the `[ASIdentifierManager advertisingIdentifier]` or - the `[UIDevice identifierForVendor]`! - */ -@property (nonatomic, readonly) NSString *installString; - - -///----------------------------------------------------------------------------- -/// @name Debug Logging -///----------------------------------------------------------------------------- - -/** - Flag that determines whether additional logging output should be generated - by the manager and all modules. - - This is ignored if the app is running in the App Store and reverts to the - default value in that case. - - @warning This property needs to be set before calling `startManager` - - *Default*: _NO_ - */ -@property (nonatomic, assign, getter=isDebugLogEnabled) BOOL debugLogEnabled; - - -///----------------------------------------------------------------------------- -/// @name Integration test -///----------------------------------------------------------------------------- - -/** - Pings the server with the HockeyApp app identifiers used for initialization - - Call this method once for debugging purposes to test if your SDK setup code - reaches the server successfully. - - Once invoked, check the apps page on HockeyApp for a verification. - - If you setup the SDK with a beta and live identifier, a call to both app IDs will be done. - - This call is ignored if the app is running in the App Store!. - */ -- (void)testIdentifier; - - -///----------------------------------------------------------------------------- -/// @name Additional meta data -///----------------------------------------------------------------------------- - -/** Set the userid that should used in the SDK components - - Right now this is used by the `BITCrashManager` to attach to a crash report. - `BITFeedbackManager` uses it too for assigning the user to a discussion thread. - - The value can be set at any time and will be stored in the keychain on the current - device only! To delete the value from the keychain set the value to `nil`. - - This property is optional and can be used as an alternative to the delegate. If you - want to define specific data for each component, use the delegate instead which does - overwrite the values set by this property. - - @warning When returning a non nil value, crash reports are not anonymous any more - and the crash alerts will not show the word "anonymous"! - - @warning This property needs to be set before calling `startManager` to be considered - for being added to crash reports as meta data. - - @see userName - @see userEmail - @see `[BITHockeyManagerDelegate userIDForHockeyManager:componentManager:]` - */ -@property (nonatomic, retain) NSString *userID; - - -/** Set the user name that should used in the SDK components - - Right now this is used by the `BITCrashManager` to attach to a crash report. - `BITFeedbackManager` uses it too for assigning the user to a discussion thread. - - The value can be set at any time and will be stored in the keychain on the current - device only! To delete the value from the keychain set the value to `nil`. - - This property is optional and can be used as an alternative to the delegate. If you - want to define specific data for each component, use the delegate instead which does - overwrite the values set by this property. - - @warning When returning a non nil value, crash reports are not anonymous any more - and the crash alerts will not show the word "anonymous"! - - @warning This property needs to be set before calling `startManager` to be considered - for being added to crash reports as meta data. - - @see userID - @see userEmail - @see `[BITHockeyManagerDelegate userNameForHockeyManager:componentManager:]` - */ -@property (nonatomic, retain) NSString *userName; - - -/** Set the users email address that should used in the SDK components - - Right now this is used by the `BITCrashManager` to attach to a crash report. - `BITFeedbackManager` uses it too for assigning the user to a discussion thread. - - The value can be set at any time and will be stored in the keychain on the current - device only! To delete the value from the keychain set the value to `nil`. - - This property is optional and can be used as an alternative to the delegate. If you - want to define specific data for each component, use the delegate instead which does - overwrite the values set by this property. - - @warning When returning a non nil value, crash reports are not anonymous any more - and the crash alerts will not show the word "anonymous"! - - @warning This property needs to be set before calling `startManager` to be considered - for being added to crash reports as meta data. - - @see userID - @see userName - @see `[BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:]` - */ -@property (nonatomic, retain) NSString *userEmail; - - -///----------------------------------------------------------------------------- -/// @name SDK meta data -///----------------------------------------------------------------------------- - -/** - Returns the SDK Version (CFBundleShortVersionString). - */ -- (NSString *)version; - -/** - Returns the SDK Build (CFBundleVersion) as a string. - */ -- (NSString *)build; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyManagerDelegate.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyManagerDelegate.h deleted file mode 100644 index c8eeaced57..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITHockeyManagerDelegate.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import -#import "HockeySDKFeatureConfig.h" - -#if HOCKEYSDK_FEATURE_CRASH_REPORTER -#import "BITCrashManagerDelegate.h" -#endif - -#if HOCKEYSDK_FEATURE_UPDATES -#import "BITUpdateManagerDelegate.h" -#endif - -#if HOCKEYSDK_FEATURE_FEEDBACK -#import "BITFeedbackManagerDelegate.h" -#endif - -#if HOCKEYSDK_FEATURE_AUTHENTICATOR -#import "BITAuthenticator.h" -#endif - -@class BITHockeyManager; -@class BITHockeyBaseManager; - -/** - The `BITHockeyManagerDelegate` formal protocol defines methods further configuring - the behaviour of `BITHockeyManager`, as well as the delegate of the modules it manages. - */ - -@protocol BITHockeyManagerDelegate - -@optional - - -///----------------------------------------------------------------------------- -/// @name App Identifier usage -///----------------------------------------------------------------------------- - -/** - Implement to force the usage of the live identifier - - This is useful if you are e.g. distributing an enterprise app inside your company - and want to use the `liveIdentifier` for that even though it is not running from - the App Store. - - Example: - - - (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager { - #ifdef (CONFIGURATION_AppStore) - return YES; - #endif - return NO; - } - - @param hockeyManager BITHockeyManager instance - */ -- (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager; - - -///----------------------------------------------------------------------------- -/// @name UI presentation -///----------------------------------------------------------------------------- - - -// optional parent view controller for the feedback screen when invoked via the alert view, default is the root UIWindow instance -/** - Return a custom parent view controller for presenting modal sheets - - By default the SDK is using the root UIWindow instance to present any required - view controllers. Overwrite this if this doesn't result in a satisfying - behavior or if you want to define any other parent view controller. - - @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate - @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` - */ -- (UIViewController *)viewControllerForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; - - -///----------------------------------------------------------------------------- -/// @name Additional meta data -///----------------------------------------------------------------------------- - - -/** Return the userid that should used in the SDK components - - Right now this is used by the `BITCrashManager` to attach to a crash report. - `BITFeedbackManager` uses it too for assigning the user to a discussion thread. - - In addition, if this returns not nil for `BITFeedbackManager` the user will - not be asked for any user details by the component, including useerName or userEmail. - - You can find out the component requesting the userID like this: - - - (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager { - if (componentManager == hockeyManager.feedbackManager) { - return UserIDForFeedback; - } else if (componentManager == hockeyManager.crashManager) { - return UserIDForCrashReports; - } else { - return nil; - } - } - - For crash reports, this delegate is invoked on the startup after the crash! - - Alternatively you can also use `[BITHockeyManager userID]` which will cache the value in the keychain. - - @warning When returning a non nil value for the `BITCrashManager` component, crash reports - are not anonymous any more and the crash alerts will not show the word "anonymous"! - - @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate - @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` - @see userNameForHockeyManager:componentManager: - @see userEmailForHockeyManager:componentManager: - @see [BITHockeyManager userID] - */ -- (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; - - -/** Return the user name that should used in the SDK components - - Right now this is used by the `BITCrashManager` to attach to a crash report. - `BITFeedbackManager` uses it too for assigning the user to a discussion thread. - - In addition, if this returns not nil for `BITFeedbackManager` the user will - not be asked for any user details by the component, including useerName or userEmail. - - You can find out the component requesting the user name like this: - - - (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager { - if (componentManager == hockeyManager.feedbackManager) { - return UserNameForFeedback; - } else if (componentManager == hockeyManager.crashManager) { - return UserNameForCrashReports; - } else { - return nil; - } - } - - For crash reports, this delegate is invoked on the startup after the crash! - - Alternatively you can also use `[BITHockeyManager userName]` which will cache the value in the keychain. - - @warning When returning a non nil value for the `BITCrashManager` component, crash reports - are not anonymous any more and the crash alerts will not show the word "anonymous"! - - @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate - @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` - @see userIDForHockeyManager:componentManager: - @see userEmailForHockeyManager:componentManager: - @see [BITHockeyManager userName] - */ -- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; - - -/** Return the users email address that should used in the SDK components - - Right now this is used by the `BITCrashManager` to attach to a crash report. - `BITFeedbackManager` uses it too for assigning the user to a discussion thread. - - In addition, if this returns not nil for `BITFeedbackManager` the user will - not be asked for any user details by the component, including useerName or userEmail. - - You can find out the component requesting the user email like this: - - - (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager { - if (componentManager == hockeyManager.feedbackManager) { - return UserEmailForFeedback; - } else if (componentManager == hockeyManager.crashManager) { - return UserEmailForCrashReports; - } else { - return nil; - } - } - - For crash reports, this delegate is invoked on the startup after the crash! - - Alternatively you can also use `[BITHockeyManager userEmail]` which will cache the value in the keychain. - - @warning When returning a non nil value for the `BITCrashManager` component, crash reports - are not anonymous any more and the crash alerts will not show the word "anonymous"! - - @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate - @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` - @see userIDForHockeyManager:componentManager: - @see userNameForHockeyManager:componentManager: - @see [BITHockeyManager userEmail] - */ -- (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITStoreUpdateManager.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITStoreUpdateManager.h deleted file mode 100644 index 1b081b719f..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITStoreUpdateManager.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import -#import "BITHockeyBaseManager.h" - - -/** - * Defines the update check intervals - */ -typedef NS_ENUM(NSInteger, BITStoreUpdateSetting) { - /** - * Check every day - */ - BITStoreUpdateCheckDaily = 0, - /** - * Check every week - */ - BITStoreUpdateCheckWeekly = 1, - /** - * Check manually - */ - BITStoreUpdateCheckManually = 2 -}; - -@protocol BITStoreUpdateManagerDelegate; - -/** - The store update manager module. - - This is the HockeySDK module for handling app updates when having your app released in the App Store. - By default the module uses the current users locale to define the app store to check for updates. You - can modify this using the `countryCode` property. See the property documentation for details on its usage. - - When an update is detected, this module will show an alert asking the user if he/she wants to update or - ignore this version. If update was chosen, it will open the apps page in the app store app. - - You need to enable this module using `[BITHockeyManager enableStoreUpdateManager]` if you want to use this - feature. By default this module is disabled! - - When this module is enabled and **NOT** running in an App Store build/environment, it won't do any checks! - - The `BITStoreUpdateManagerDelegate` protocol informs the app about new detected app versions. - - @warning This module can **NOT** check if the current device and OS version match the minimum requirements of - the new app version! - - */ - -@interface BITStoreUpdateManager : BITHockeyBaseManager - -///----------------------------------------------------------------------------- -/// @name Update Checking -///----------------------------------------------------------------------------- - -/** - When to check for new updates. - - Defines when a the SDK should check if there is a new update available on the - server. This must be assigned one of the following, see `BITStoreUpdateSetting`: - - - `BITStoreUpdateCheckDaily`: Once a day - - `BITStoreUpdateCheckWeekly`: Once a week - - `BITStoreUpdateCheckManually`: Manually - - **Default**: BITStoreUpdateCheckWeekly - - @warning When setting this to `BITStoreUpdateCheckManually` you need to either - invoke the update checking process yourself with `checkForUpdate` somehow, e.g. by - proving an update check button for the user or integrating the Update View into your - user interface. - @see BITStoreUpdateSetting - @see countryCode - @see checkForUpdateOnLaunch - @see checkForUpdate - */ -@property (nonatomic, assign) BITStoreUpdateSetting updateSetting; - - -/** - Defines the store country the app is always available in, otherwise uses the users locale - - If this value is not defined, then it uses the device country if the current locale. - - If you are pre-defining a country and are releasing a new version on a specific date, - it can happen that users get an alert but the update is not yet available in their country! - - But if a user downloaded the app from another appstore than the locale is set and the app is not - available in the locales app store, then the user will never receive an update notification! - - More information about possible country codes is available here: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 - - @see updateSetting - @see checkForUpdateOnLaunch - @see checkForUpdate - */ -@property (nonatomic, strong) NSString *countryCode; - - -/** - Flag that determines whether the automatic update checks should be done. - - If this is enabled the update checks will be performed automatically depending on the - `updateSetting` property. If this is disabled the `updateSetting` property will have - no effect, and checking for updates is totally up to be done by yourself. - - *Default*: _YES_ - - @warning When setting this to `NO` you need to invoke update checks yourself! - @see updateSetting - @see countryCode - @see checkForUpdate - */ -@property (nonatomic, assign, getter=isCheckingForUpdateOnLaunch) BOOL checkForUpdateOnLaunch; - - -///----------------------------------------------------------------------------- -/// @name User Interface -///----------------------------------------------------------------------------- - - -/** - Flag that determines if the integrated update alert should be used - - If enabled, the integrated UIAlert based update notification will be used to inform - the user about a new update being available in the App Store. - - If disabled, you need to implement the `BITStoreUpdateManagerDelegate` protocol with - the method `[BITStoreUpdateManagerDelegate detectedUpdateFromStoreUpdateManager:newVersion:storeURL:]` - to be notified about new version and proceed yourself. - The manager will consider this identical to an `Ignore` user action using the alert - and not inform about this particular version any more, unless the app is updated - and this very same version shows up at a later time again as a new version. - - *Default*: _YES_ - - @warning If the HockeySDKResources bundle is missing in the application package, then the internal - update alert is also disabled and be treated identical to manually disabling this - property. - @see updateSetting - */ -@property (nonatomic, assign, getter=isUpdateUIEnabled) BOOL updateUIEnabled; - -///----------------------------------------------------------------------------- -/// @name Manual update checking -///----------------------------------------------------------------------------- - -/** - Check for an update - - Call this to trigger a check if there is a new update available on the HockeyApp servers. - - @see updateSetting - @see countryCode - @see checkForUpdateOnLaunch - */ -- (void)checkForUpdate; - - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITStoreUpdateManagerDelegate.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITStoreUpdateManagerDelegate.h deleted file mode 100644 index 0d629dc0d5..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITStoreUpdateManagerDelegate.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@class BITStoreUpdateManager; - -/** - The `BITStoreUpdateManagerDelegate` formal protocol defines methods for - more interaction with `BITStoreUpdateManager`. - */ - -@protocol BITStoreUpdateManagerDelegate - -@optional - - -///----------------------------------------------------------------------------- -/// @name Update information -///----------------------------------------------------------------------------- - -/** Informs which new version has been reported to be available - - @warning If this is invoked with a simulated new version, the storeURL could be _NIL_ if the current builds - bundle identifier is different to the bundle identifier used in the app store build. - @param storeUpdateManager The `BITStoreUpdateManager` instance invoking this delegate - @param newVersion The new version string reported by the App Store - @param storeURL The App Store URL for this app that could be invoked to let them perform the update. - */ --(void)detectedUpdateFromStoreUpdateManager:(BITStoreUpdateManager *)storeUpdateManager newVersion:(NSString *)newVersion storeURL:(NSURL *)storeURL; - - - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateManager.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateManager.h deleted file mode 100644 index 9fdf93d925..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateManager.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Author: Andreas Linde - * Peter Steinberger - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * Copyright (c) 2011 Andreas Linde. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import "BITHockeyBaseManager.h" - - -/** - * Update check interval - */ -typedef NS_ENUM (NSUInteger, BITUpdateSetting) { - /** - * On every startup or or when the app comes to the foreground - */ - BITUpdateCheckStartup = 0, - /** - * Once a day - */ - BITUpdateCheckDaily = 1, - /** - * Manually - */ - BITUpdateCheckManually = 2 -}; - -@protocol BITUpdateManagerDelegate; - -@class BITAppVersionMetaInfo; -@class BITUpdateViewController; - -/** - The update manager module. - - This is the HockeySDK module for handling app updates when using Ad-Hoc or Enterprise provisioning profiles. - This modul handles version updates, presents update and version information in a App Store like user interface, - collects usage information and provides additional authorization options when using Ad-Hoc provisioning profiles. - - This module automatically disables itself when running in an App Store build by default! - - The protocol `BITUpdateManagerDelegate` provides delegates to inform about events and adjust a few behaviors. - - To use the server side restriction feature, to provide updates only to specific users, you need to setup the - `BITAuthenticator` class. This allows the update request to tell the server which user is using the app on the - current device and then let the server decide which updates the device may see. - - */ - -@interface BITUpdateManager : BITHockeyBaseManager - -///----------------------------------------------------------------------------- -/// @name Update Checking -///----------------------------------------------------------------------------- - -// see HockeyUpdateSetting-enum. Will be saved in user defaults. -// default value: HockeyUpdateCheckStartup -/** - When to check for new updates. - - Defines when a the SDK should check if there is a new update available on the - server. This must be assigned one of the following, see `BITUpdateSetting`: - - - `BITUpdateCheckStartup`: On every startup or or when the app comes to the foreground - - `BITUpdateCheckDaily`: Once a day - - `BITUpdateCheckManually`: Manually - - When running the app from the App Store, this setting is ignored. - - **Default**: BITUpdateCheckStartup - - @warning When setting this to `BITUpdateCheckManually` you need to either - invoke the update checking process yourself with `checkForUpdate` somehow, e.g. by - proving an update check button for the user or integrating the Update View into your - user interface. - @see BITUpdateSetting - @see checkForUpdateOnLaunch - @see checkForUpdate - */ -@property (nonatomic, assign) BITUpdateSetting updateSetting; - - -/** - Flag that determines whether the automatic update checks should be done. - - If this is enabled the update checks will be performed automatically depending on the - `updateSetting` property. If this is disabled the `updateSetting` property will have - no effect, and checking for updates is totally up to be done by yourself. - - When running the app from the App Store, this setting is ignored. - - *Default*: _YES_ - - @warning When setting this to `NO` you need to invoke update checks yourself! - @see updateSetting - @see checkForUpdate - */ -@property (nonatomic, assign, getter=isCheckForUpdateOnLaunch) BOOL checkForUpdateOnLaunch; - - -// manually start an update check -/** - Check for an update - - Call this to trigger a check if there is a new update available on the HockeyApp servers. - - When running the app from the App Store, this setting is ignored. - - @see updateSetting - @see checkForUpdateOnLaunch - */ -- (void)checkForUpdate; - - -///----------------------------------------------------------------------------- -/// @name Update Notification -///----------------------------------------------------------------------------- - -/** - Flag that determines if updates alert should be repeatedly shown - - If enabled the update alert shows on every startup and whenever the app becomes active, - until the update is installed. - If disabled the update alert is only shown once ever and it is up to you to provide an - alternate way for the user to navigate to the update UI or update in another way. - - When running the app from the App Store, this setting is ignored. - - *Default*: _YES_ - */ -@property (nonatomic, assign) BOOL alwaysShowUpdateReminder; - - -/** - Flag that determines if the update alert should show an direct install option - - If enabled the update alert shows an additional option which allows to invoke the update - installation process directly, instead of viewing the update UI first. - By default the alert only shows a `Show` and `Ignore` option. - - When running the app from the App Store, this setting is ignored. - - *Default*: _NO_ - */ -@property (nonatomic, assign, getter=isShowingDirectInstallOption) BOOL showDirectInstallOption; - - -///----------------------------------------------------------------------------- -/// @name Expiry -///----------------------------------------------------------------------------- - -/** - Expiry date of the current app version - - If set, the app will get unusable at the given date by presenting a blocking view on - top of the apps UI so that no interaction is possible. To present a custom you, check - the documentation of the - `[BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:]` delegate. - - Once the expiry date is reached, the app will no longer check for updates or - send any usage data to the server! - - When running the app from the App Store, this setting is ignored. - - *Default*: nil - @see disableUpdateCheckOptionWhenExpired - @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] - @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] - @warning This only works when using Ad-Hoc provisioning profiles! - */ -@property (nonatomic, strong) NSDate *expiryDate; - -/** - Disable the update check button from expiry screen or alerts - - If do not want your users to be able to check for updates once a version is expired, - then enable this property. - - If this is not enabled, the users will be able to check for updates and install them - if any is available for the current device. - - *Default*: NO - @see expiryDate - @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] - @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] - @warning This only works when using Ad-Hoc provisioning profiles! -*/ -@property (nonatomic) BOOL disableUpdateCheckOptionWhenExpired; - - -///----------------------------------------------------------------------------- -/// @name User Interface -///----------------------------------------------------------------------------- - - -/** - Present the modal update user interface. - */ -- (void)showUpdateView; - - -/** - Create an update view - - @param modal Return a view ready for modal presentation with integrated navigation bar - @return BITUpdateViewController The update user interface view controller, - e.g. to push it onto a navigation stack. - */ -- (BITUpdateViewController *)hockeyViewController:(BOOL)modal; - - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateManagerDelegate.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateManagerDelegate.h deleted file mode 100644 index 4a1ac9bf6b..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateManagerDelegate.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@class BITUpdateManager; - -/** - The `BITUpdateManagerDelegate` formal protocol defines methods further configuring - the behaviour of `BITUpdateManager`. - */ - -@protocol BITUpdateManagerDelegate - -@optional - - -///----------------------------------------------------------------------------- -/// @name Expiry -///----------------------------------------------------------------------------- - -/** - Return if expiry alert should be shown if date is reached - - If you want to display your own user interface when the expiry date is reached, - implement this method, present your user interface and return _NO_. In this case - it is your responsibility to make the app unusable! - - Note: This delegate will be invoked on startup and every time the app becomes - active again! - - When returning _YES_ the default blocking UI will be shown. - - When running the app from the App Store, this delegate is ignored. - - @param updateManager The `BITUpdateManager` instance invoking this delegate - @see [BITUpdateManager expiryDate] - @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] - */ -- (BOOL)shouldDisplayExpiryAlertForUpdateManager:(BITUpdateManager *)updateManager; - - -/** - Invoked once a default expiry alert is shown - - Once expiry date is reached and the default blocking UI is shown, - this delegate method is invoked to provide you the possibility to do any - desired additional processing. - - @param updateManager The `BITUpdateManager` instance invoking this delegate - @see [BITUpdateManager expiryDate] - @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] - */ -- (void)didDisplayExpiryAlertForUpdateManager:(BITUpdateManager *)updateManager; - - -///----------------------------------------------------------------------------- -/// @name Privacy -///----------------------------------------------------------------------------- - -/** Return NO if usage data should not be send - - The update module send usage data by default, if the application is _NOT_ - running in an App Store version. Implement this delegate and - return NO if you want to disable this. - - If you intend to implement a user setting to let them enable or disable - sending usage data, this delegate should be used to return that value. - - Usage data contains the following information: - - App Version - - iOS Version - - Device type - - Language - - Installation timestamp - - Usage time - - @param updateManager The `BITUpdateManager` instance invoking this delegate - @warning When setting this to `NO`, you will _NOT_ know if this user is actually testing! - */ -- (BOOL)updateManagerShouldSendUsageData:(BITUpdateManager *)updateManager; - - -///----------------------------------------------------------------------------- -/// @name Privacy -///----------------------------------------------------------------------------- - -/** - Invoked right before the app will exit to allow app update to start (>= iOS8 only) - - The iOS installation mechanism only starts if the app the should be updated is currently - not running. On all iOS versions up to iOS 7, the system did automatically exit the app - in these cases. Since iOS 8 this isn't done any longer. - - @param updateManager The `BITUpdateManager` instance invoking this delegate - */ -- (void)updateManagerWillExitApp:(BITUpdateManager *)updateManager; - - -#pragma mark - Deprecated - -///----------------------------------------------------------------------------- -/// @name Update View Presentation Helper -///----------------------------------------------------------------------------- - -/** - Provide a parent view controller for the update user interface - - If you don't have a `rootViewController` set on your `UIWindow` and the SDK cannot - automatically find the current top most `UIViewController`, you can provide the - `UIViewController` that should be used to present the update user interface modal. - - @param updateManager The `BITUpdateManager` instance invoking this delegate - - @deprecated Please use `BITHockeyManagerDelegate viewControllerForHockeyManager:componentManager:` instead - */ -- (UIViewController *)viewControllerForUpdateManager:(BITUpdateManager *)updateManager DEPRECATED_ATTRIBUTE; - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateViewController.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateViewController.h deleted file mode 100644 index e36f318270..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/BITUpdateViewController.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Author: Andreas Linde - * Peter Steinberger - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * Copyright (c) 2011 Andreas Linde, Peter Steinberger. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "BITHockeyBaseViewController.h" - - -@interface BITUpdateViewController : BITHockeyBaseViewController -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/HockeySDK.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/HockeySDK.h deleted file mode 100644 index 0d04c43832..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/HockeySDK.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - * Copyright (c) 2011 Andreas Linde. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef HockeySDK_h -#define HockeySDK_h - -#import "HockeySDKFeatureConfig.h" - -#import "BITHockeyManager.h" -#import "BITHockeyManagerDelegate.h" - -#if HOCKEYSDK_FEATURE_CRASH_REPORTER || HOCKEYSDK_FEATURE_FEEDBACK -#import "BITHockeyAttachment.h" -#endif - -#if HOCKEYSDK_FEATURE_CRASH_REPORTER -#import "BITCrashManager.h" -#import "BITCrashAttachment.h" -#import "BITCrashManagerDelegate.h" -#import "BITCrashDetails.h" -#import "BITCrashMetaData.h" -#endif /* HOCKEYSDK_FEATURE_CRASH_REPORTER */ - -#if HOCKEYSDK_FEATURE_UPDATES -#import "BITUpdateManager.h" -#import "BITUpdateManagerDelegate.h" -#import "BITUpdateViewController.h" -#endif /* HOCKEYSDK_FEATURE_UPDATES */ - -#if HOCKEYSDK_FEATURE_STORE_UPDATES -#import "BITStoreUpdateManager.h" -#import "BITStoreUpdateManagerDelegate.h" -#endif /* HOCKEYSDK_FEATURE_STORE_UPDATES */ - -#if HOCKEYSDK_FEATURE_FEEDBACK -#import "BITFeedbackManager.h" -#import "BITFeedbackManagerDelegate.h" -#import "BITFeedbackActivity.h" -#import "BITFeedbackComposeViewController.h" -#import "BITFeedbackComposeViewControllerDelegate.h" -#import "BITFeedbackListViewController.h" -#endif /* HOCKEYSDK_FEATURE_FEEDBACK */ - -#if HOCKEYSDK_FEATURE_AUTHENTICATOR -#import "BITAuthenticator.h" -#endif - -// Notification message which HockeyManager is listening to, to retry requesting updated from the server -#define BITHockeyNetworkDidBecomeReachableNotification @"BITHockeyNetworkDidBecomeReachable" - - -/** - * HockeySDK Crash Reporter error domain - */ -typedef NS_ENUM (NSInteger, BITCrashErrorReason) { - /** - * Unknown error - */ - BITCrashErrorUnknown, - /** - * API Server rejected app version - */ - BITCrashAPIAppVersionRejected, - /** - * API Server returned empty response - */ - BITCrashAPIReceivedEmptyResponse, - /** - * Connection error with status code - */ - BITCrashAPIErrorWithStatusCode -}; -extern NSString *const __attribute__((unused)) kBITCrashErrorDomain; - -/** - * HockeySDK Update error domain - */ -typedef NS_ENUM (NSInteger, BITUpdateErrorReason) { - /** - * Unknown error - */ - BITUpdateErrorUnknown, - /** - * API Server returned invalid status - */ - BITUpdateAPIServerReturnedInvalidStatus, - /** - * API Server returned invalid data - */ - BITUpdateAPIServerReturnedInvalidData, - /** - * API Server returned empty response - */ - BITUpdateAPIServerReturnedEmptyResponse, - /** - * Authorization secret missing - */ - BITUpdateAPIClientAuthorizationMissingSecret, - /** - * No internet connection - */ - BITUpdateAPIClientCannotCreateConnection -}; -extern NSString *const __attribute__((unused)) kBITUpdateErrorDomain; - - -/** - * HockeySDK Feedback error domain - */ -typedef NS_ENUM(NSInteger, BITFeedbackErrorReason) { - /** - * Unknown error - */ - BITFeedbackErrorUnknown, - /** - * API Server returned invalid status - */ - BITFeedbackAPIServerReturnedInvalidStatus, - /** - * API Server returned invalid data - */ - BITFeedbackAPIServerReturnedInvalidData, - /** - * API Server returned empty response - */ - BITFeedbackAPIServerReturnedEmptyResponse, - /** - * Authorization secret missing - */ - BITFeedbackAPIClientAuthorizationMissingSecret, - /** - * No internet connection - */ - BITFeedbackAPIClientCannotCreateConnection -}; -extern NSString *const __attribute__((unused)) kBITFeedbackErrorDomain; - -/** - * HockeySDK Authenticator error domain - */ -typedef NS_ENUM(NSInteger, BITAuthenticatorReason) { - /** - * Unknown error - */ - BITAuthenticatorErrorUnknown, - /** - * Network error - */ - BITAuthenticatorNetworkError, - - /** - * API Server returned invalid response - */ - BITAuthenticatorAPIServerReturnedInvalidResponse, - /** - * Not Authorized - */ - BITAuthenticatorNotAuthorized, - /** - * Unknown Application ID (configuration error) - */ - BITAuthenticatorUnknownApplicationID, - /** - * Authorization secret missing - */ - BITAuthenticatorAuthorizationSecretMissing, - /** - * Not yet identified - */ - BITAuthenticatorNotIdentified, -}; -extern NSString *const __attribute__((unused)) kBITAuthenticatorErrorDomain; - -/** - * HockeySDK global error domain - */ -typedef NS_ENUM(NSInteger, BITHockeyErrorReason) { - /** - * Unknown error - */ - BITHockeyErrorUnknown -}; -extern NSString *const __attribute__((unused)) kBITHockeyErrorDomain; - - -#endif diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/HockeySDKFeatureConfig.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/HockeySDKFeatureConfig.h deleted file mode 100644 index 1a8b387ebd..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Headers/HockeySDKFeatureConfig.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef HockeySDK_HockeySDKFeatureConfig_h -#define HockeySDK_HockeySDKFeatureConfig_h - - -/** - * If true, include support for handling crash reports - * - * _Default_: Enabled - */ -#ifndef HOCKEYSDK_FEATURE_CRASH_REPORTER -# define HOCKEYSDK_FEATURE_CRASH_REPORTER 1 -#endif /* HOCKEYSDK_FEATURE_CRASH_REPORTER */ - - -/** - * If true, include support for managing user feedback - * - * _Default_: Enabled - */ -#ifndef HOCKEYSDK_FEATURE_FEEDBACK -# define HOCKEYSDK_FEATURE_FEEDBACK 1 -#endif /* HOCKEYSDK_FEATURE_FEEDBACK */ - - -/** - * If true, include support for informing the user about new updates pending in the App Store - * - * _Default_: Enabled - */ -#ifndef HOCKEYSDK_FEATURE_STORE_UPDATES -# define HOCKEYSDK_FEATURE_STORE_UPDATES 1 -#endif /* HOCKEYSDK_FEATURE_STORE_UPDATES */ - - -/** - * If true, include support for authentication installations for Ad-Hoc and Enterprise builds - * - * _Default_: Enabled - */ -#ifndef HOCKEYSDK_FEATURE_AUTHENTICATOR -# define HOCKEYSDK_FEATURE_AUTHENTICATOR 1 -#endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ - - -/** - * If true, include support for handling in-app udpates for Ad-Hoc and Enterprise builds - * - * _Default_: Enabled - */ -#ifndef HOCKEYSDK_FEATURE_UPDATES -# define HOCKEYSDK_FEATURE_UPDATES 1 -#endif /* HOCKEYSDK_FEATURE_UPDATES */ - - -#endif /* HockeySDK_HockeySDKFeatureConfig_h */ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/HockeySDK b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/HockeySDK deleted file mode 100644 index 519d284c05..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/HockeySDK and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDK.xcconfig b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDK.xcconfig deleted file mode 100644 index 7f04f3fdd2..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDK.xcconfig +++ /dev/null @@ -1,3 +0,0 @@ -OTHER_LDFLAGS=$(inherited) -framework CoreText -framework CoreGraphics -framework Foundation -framework QuartzCore -framework SystemConfiguration -framework UIKit -framework Security -framework AssetsLibrary -framework MobileCoreServices -HOCKEYSDK_DOCSET_NAME=HockeySDK-iOS -GCC_PREPROCESSOR_DEFINITIONS=$(inherited) CONFIGURATION_$(CONFIGURATION) diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow.png deleted file mode 100644 index e0834c2b67..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow@2x.png deleted file mode 100644 index 943622c889..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow@3x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow@3x.png deleted file mode 100644 index 3aa46b08e9..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Arrow@3x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur.png deleted file mode 100644 index 907e9595f1..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur@2x.png deleted file mode 100644 index 55f5465410..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur@3x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur@3x.png deleted file mode 100644 index b4c8594cb0..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Blur@3x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel.png deleted file mode 100644 index 77fb4f0f04..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel@2x.png deleted file mode 100644 index a205001fe5..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel@3x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel@3x.png deleted file mode 100644 index 53e5db7aa3..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Cancel@3x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/IconGradient.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/IconGradient.png deleted file mode 100644 index d145d79e47..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/IconGradient.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/IconGradient@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/IconGradient@2x.png deleted file mode 100644 index d9076127d2..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/IconGradient@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Info.plist b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Info.plist deleted file mode 100644 index 6c07f94816..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Info.plist and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok.png deleted file mode 100644 index a3a872d25c..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok@2x.png deleted file mode 100644 index d3693d3e97..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok@3x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok@3x.png deleted file mode 100644 index 1b4664d414..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Ok@3x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle.png deleted file mode 100644 index 5b7ed3dd9a..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle@2x.png deleted file mode 100644 index 5531cd3933..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle@3x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle@3x.png deleted file mode 100644 index 0d21badc31..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/Rectangle@3x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied.png deleted file mode 100644 index 2ebaef0f63..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied@2x.png deleted file mode 100644 index c59864ba76..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied@3x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied@3x.png deleted file mode 100644 index e7f0878188..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/authorize_denied@3x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/bg.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/bg.png deleted file mode 100644 index 48024b3525..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/bg.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDelete.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDelete.png deleted file mode 100644 index ef386d9d31..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDelete.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDelete@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDelete@2x.png deleted file mode 100644 index 9669ae0a24..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDelete@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted.png deleted file mode 100644 index a4445ce9ea..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted@2x.png deleted file mode 100644 index 5172002c51..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegular.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegular.png deleted file mode 100644 index 8623931434..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegular.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegular@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegular@2x.png deleted file mode 100644 index 6eecd777c9..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegular@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegularHighlighted.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegularHighlighted.png deleted file mode 100644 index 061685ec4a..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegularHighlighted.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegularHighlighted@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegularHighlighted@2x.png deleted file mode 100644 index 6cb8e2fac0..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/buttonRoundedRegularHighlighted@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/de.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/de.lproj/HockeySDK.strings deleted file mode 100644 index b9dbd1eb0c..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/de.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/en.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/en.lproj/HockeySDK.strings deleted file mode 100644 index 6e23907350..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/en.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/es.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/es.lproj/HockeySDK.strings deleted file mode 100644 index 31dc7dcc27..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/es.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity.png deleted file mode 100644 index 5f5104d0dc..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@2x.png deleted file mode 100644 index 535ef28241..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@2x~ipad.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@2x~ipad.png deleted file mode 100644 index 632b1f7099..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@2x~ipad.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@3x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@3x.png deleted file mode 100644 index 8ebc49c552..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity@3x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity~ipad.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity~ipad.png deleted file mode 100644 index 654de35832..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/feedbackActivity~ipad.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/fr.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/fr.lproj/HockeySDK.strings deleted file mode 100644 index 3da03612dc..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/fr.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/hr.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/hr.lproj/HockeySDK.strings deleted file mode 100644 index 1e7a4f0b2e..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/hr.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/hu.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/hu.lproj/HockeySDK.strings deleted file mode 100644 index 7265fe8d08..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/hu.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/iconCamera.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/iconCamera.png deleted file mode 100644 index d429e3a926..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/iconCamera.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/iconCamera@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/iconCamera@2x.png deleted file mode 100644 index a1cf4bc568..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/iconCamera@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/it.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/it.lproj/HockeySDK.strings deleted file mode 100644 index df38103921..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/it.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/ja.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/ja.lproj/HockeySDK.strings deleted file mode 100644 index b23ac9336d..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/ja.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/nl.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/nl.lproj/HockeySDK.strings deleted file mode 100644 index 94b3b1ec36..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/nl.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/pt-PT.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/pt-PT.lproj/HockeySDK.strings deleted file mode 100644 index 4437285ed5..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/pt-PT.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/pt.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/pt.lproj/HockeySDK.strings deleted file mode 100644 index 706c719089..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/pt.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/ru.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/ru.lproj/HockeySDK.strings deleted file mode 100644 index 876384d01a..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/ru.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/zh-Hans.lproj/HockeySDK.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/zh-Hans.lproj/HockeySDK.strings deleted file mode 100644 index ba8ff7bf73..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/A/Resources/HockeySDKResources.bundle/zh-Hans.lproj/HockeySDK.strings and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/Current b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/Current deleted file mode 120000 index 8c7e5a667f..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/Resources/HockeySDK.xcconfig b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/Resources/HockeySDK.xcconfig deleted file mode 120000 index 8ae24201e3..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/Resources/HockeySDK.xcconfig +++ /dev/null @@ -1 +0,0 @@ -../HockeySDK.framework/Resources/HockeySDK.xcconfig \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/Resources/HockeySDKResources.bundle b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/Resources/HockeySDKResources.bundle deleted file mode 120000 index 4150e0a084..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/HockeySDK.embeddedframework/Resources/HockeySDKResources.bundle +++ /dev/null @@ -1 +0,0 @@ -../HockeySDK.framework/Resources/HockeySDKResources.bundle \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/LICENSE b/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/LICENSE deleted file mode 100644 index 4c97598d23..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/HockeySDK-iOS/LICENSE +++ /dev/null @@ -1,124 +0,0 @@ -## Licenses - -The Hockey SDK is provided under the following license: - - The MIT License - Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. - All rights reserved. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - -Except as noted below, PLCrashReporter -is provided under the following license: - - Copyright (c) 2008 - 2014 Plausible Labs Cooperative, Inc. - Copyright (c) 2012 - 2014 HockeyApp, Bit Stadium GmbH. - All rights reserved. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - -The protobuf-c library, as well as the PLCrashLogWriterEncoding.c -file are licensed as follows: - - Copyright 2008, Dave Benson. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with - the License. You may obtain a copy of the License - at http://www.apache.org/licenses/LICENSE-2.0 Unless - required by applicable law or agreed to in writing, - software distributed under the License is distributed on - an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -TTTAttributedLabel is licensed as follows: - - Copyright (c) 2011 Mattt Thompson (http://mattt.me/) - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - -SFHFKeychainUtils is licensed as follows: - - Created by Buzz Andersen on 10/20/08. - Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone. - Copyright 2008 Sci-Fi Hi-Fi. All rights reserved. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL-Info.plist b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL-Info.plist deleted file mode 100755 index 28fab22de3..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL-Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - com.ogl.IntroOpenGL2 - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - opengles-2 - - UIStatusBarHidden - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL-Prefix.pch b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL-Prefix.pch deleted file mode 100755 index 2d745122c3..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL-Prefix.pch +++ /dev/null @@ -1,28 +0,0 @@ -// -// Prefix header for all source files of the 'IntroOpenGL' target in the 'IntroOpenGL' project -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import - #import "RMGeometry.h" - -#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad - -#define dDeviceOrientation [[UIDevice currentDevice] orientation] -#define isPortrait UIDeviceOrientationIsPortrait(dDeviceOrientation) -#define isLandscape UIDeviceOrientationIsLandscape(dDeviceOrientation) - -//#define STATUS_HEIGHT [[UIDevice currentDevice] systemVersion]>=7 ? 0 : 10; - - #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] - - #define _(n) NSLocalizedString(n, nil) - -#endif diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL.xcodeproj/project.pbxproj b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL.xcodeproj/project.pbxproj deleted file mode 100755 index 0823cc19ae..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL.xcodeproj/project.pbxproj +++ /dev/null @@ -1,671 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 000E3CA7198693240074DF95 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 000E3CA6198693240074DF95 /* ImageIO.framework */; }; - 000E3CA9198693350074DF95 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 000E3CA8198693350074DF95 /* MobileCoreServices.framework */; }; - 003A78A8193E2B01007D28E0 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 003A78A7193E2B01007D28E0 /* GLKit.framework */; }; - 003A78AA193E2B07007D28E0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 003A78A9193E2B07007D28E0 /* OpenGLES.framework */; }; - 006C1FE518D35A9200F0C5F0 /* RMAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 006C1FDE18D35A9200F0C5F0 /* RMAppDelegate.m */; }; - 006C1FE718D35A9200F0C5F0 /* RMIntroPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 006C1FE218D35A9200F0C5F0 /* RMIntroPageView.m */; }; - 006C1FE818D35A9200F0C5F0 /* RMIntroViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 006C1FE418D35A9200F0C5F0 /* RMIntroViewController.m */; }; - 006C1FEB18D35BD100F0C5F0 /* RMGeometry.m in Sources */ = {isa = PBXBuildFile; fileRef = 006C1FEA18D35BD100F0C5F0 /* RMGeometry.m */; }; - 006C1FEE18D35C1400F0C5F0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 006C1FF018D35C1400F0C5F0 /* Localizable.strings */; }; - 006C206818D60E8600F0C5F0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 006C206718D60E8600F0C5F0 /* QuartzCore.framework */; }; - 007582B7191558D00016BCD1 /* timing.c in Sources */ = {isa = PBXBuildFile; fileRef = 007582B6191558D00016BCD1 /* timing.c */; }; - 0078937F18CE765200A15B38 /* texture_helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 0078937E18CE765200A15B38 /* texture_helper.m */; }; - 0099100F1ACBE95E0003A2ED /* fast_arrow_shadow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FF31ACBE95E0003A2ED /* fast_arrow_shadow@2x.png */; }; - 009910101ACBE95E0003A2ED /* fast_arrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FF41ACBE95E0003A2ED /* fast_arrow@2x.png */; }; - 009910111ACBE95E0003A2ED /* fast_body@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FF51ACBE95E0003A2ED /* fast_body@2x.png */; }; - 009910121ACBE95E0003A2ED /* fast_spiral@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FF61ACBE95E0003A2ED /* fast_spiral@2x.png */; }; - 009910131ACBE95E0003A2ED /* ic_bubble_dot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FF71ACBE95E0003A2ED /* ic_bubble_dot@2x.png */; }; - 009910141ACBE95E0003A2ED /* ic_bubble@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FF81ACBE95E0003A2ED /* ic_bubble@2x.png */; }; - 009910151ACBE95E0003A2ED /* ic_cam_lens@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FF91ACBE95E0003A2ED /* ic_cam_lens@2x.png */; }; - 009910161ACBE95E0003A2ED /* ic_cam@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FFA1ACBE95E0003A2ED /* ic_cam@2x.png */; }; - 009910171ACBE95E0003A2ED /* ic_pencil@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FFB1ACBE95E0003A2ED /* ic_pencil@2x.png */; }; - 009910181ACBE95E0003A2ED /* ic_pin@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FFC1ACBE95E0003A2ED /* ic_pin@2x.png */; }; - 009910191ACBE95E0003A2ED /* ic_smile_eye@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FFD1ACBE95E0003A2ED /* ic_smile_eye@2x.png */; }; - 0099101A1ACBE95E0003A2ED /* ic_smile@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FFE1ACBE95E0003A2ED /* ic_smile@2x.png */; }; - 0099101B1ACBE95E0003A2ED /* ic_videocam@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00990FFF1ACBE95E0003A2ED /* ic_videocam@2x.png */; }; - 0099101C1ACBE95E0003A2ED /* knot_down@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910001ACBE95E0003A2ED /* knot_down@2x.png */; }; - 0099101D1ACBE95E0003A2ED /* knot_up@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910011ACBE95E0003A2ED /* knot_up@2x.png */; }; - 0099101E1ACBE95E0003A2ED /* powerful_infinity_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910021ACBE95E0003A2ED /* powerful_infinity_white@2x.png */; }; - 0099101F1ACBE95E0003A2ED /* powerful_infinity@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910031ACBE95E0003A2ED /* powerful_infinity@2x.png */; }; - 009910201ACBE95E0003A2ED /* powerful_mask@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910041ACBE95E0003A2ED /* powerful_mask@2x.png */; }; - 009910211ACBE95E0003A2ED /* powerful_star@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910051ACBE95E0003A2ED /* powerful_star@2x.png */; }; - 009910221ACBE95E0003A2ED /* private_door@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910061ACBE95E0003A2ED /* private_door@2x.png */; }; - 009910231ACBE95E0003A2ED /* private_screw@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910071ACBE95E0003A2ED /* private_screw@2x.png */; }; - 009910241ACBE95E0003A2ED /* telegram_plane@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910081ACBE95E0003A2ED /* telegram_plane@2x.png */; }; - 009910251ACBE95E0003A2ED /* telegram_sphere@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 009910091ACBE95E0003A2ED /* telegram_sphere@2x.png */; }; - 009910261ACBE95E0003A2ED /* start_arrow_ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 0099100A1ACBE95E0003A2ED /* start_arrow_ipad.png */; }; - 009910271ACBE95E0003A2ED /* start_arrow_ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0099100B1ACBE95E0003A2ED /* start_arrow_ipad@2x.png */; }; - 009910281ACBE95E0003A2ED /* start_arrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0099100C1ACBE95E0003A2ED /* start_arrow@2x.png */; }; - 0099102D1ACBEB220003A2ED /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0099102B1ACBEB220003A2ED /* LaunchScreen.xib */; }; - 0099102F1ACBEB5B0003A2ED /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0099102E1ACBEB5B0003A2ED /* Images.xcassets */; }; - 00D761331948B1B100961E77 /* RMRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 00D761321948B1B100961E77 /* RMRootViewController.m */; }; - 00D761361948B28E00961E77 /* RMLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 00D761351948B28E00961E77 /* RMLoginViewController.m */; }; - 00EAE19518F83BBB00D0B495 /* rngs.c in Sources */ = {isa = PBXBuildFile; fileRef = 00EAE19318F83BBB00D0B495 /* rngs.c */; }; - 00F0BD1F1AD5359300204D81 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00F0BD1E1AD5359300204D81 /* AssetsLibrary.framework */; }; - 00F0BD211AD5359D00204D81 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00F0BD201AD5359D00204D81 /* CoreText.framework */; }; - 00F0BD231AD535A500204D81 /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00F0BD221AD535A500204D81 /* QuickLook.framework */; }; - 00F0BD251AD535AE00204D81 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00F0BD241AD535AE00204D81 /* Security.framework */; }; - 00F0BD271AD535BA00204D81 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00F0BD261AD535BA00204D81 /* SystemConfiguration.framework */; }; - 00F0BD2D1AD535F400204D81 /* HockeySDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00F0BD291AD535F400204D81 /* HockeySDK.framework */; }; - 00F0BD2E1AD535F400204D81 /* HockeySDK.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 00F0BD2B1AD535F400204D81 /* HockeySDK.xcconfig */; }; - 00F0BD2F1AD535F400204D81 /* HockeySDKResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 00F0BD2C1AD535F400204D81 /* HockeySDKResources.bundle */; }; - 0A8FBF8C179E073A0039BA29 /* platform_log.c in Sources */ = {isa = PBXBuildFile; fileRef = 0A8FBF71179DFAEE0039BA29 /* platform_log.c */; }; - 0A8FBF90179E07440039BA29 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0ADF1887178E2185005DA99E /* main.m */; }; - 0A8FBF91179E07600039BA29 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 0A8FBF04179DEF7B0039BA29 /* buffer.c */; }; - 0A8FBF92179E07600039BA29 /* animations.c in Sources */ = {isa = PBXBuildFile; fileRef = 0A8FBF07179DEF7B0039BA29 /* animations.c */; }; - 0A8FBF94179E07600039BA29 /* shader.c in Sources */ = {isa = PBXBuildFile; fileRef = 0A8FBF0B179DEF7B0039BA29 /* shader.c */; }; - 0ACEE2B417E78AF5009DFC95 /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = 0ACEE2B017E78AF5009DFC95 /* objects.c */; }; - 0ACEE2B517E78AF5009DFC95 /* program.c in Sources */ = {isa = PBXBuildFile; fileRef = 0ACEE2B217E78AF5009DFC95 /* program.c */; }; - 0ADF1878178E2185005DA99E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0ADF1877178E2185005DA99E /* UIKit.framework */; }; - 0ADF187A178E2185005DA99E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0ADF1879178E2185005DA99E /* Foundation.framework */; }; - 0ADF187C178E2185005DA99E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0ADF187B178E2185005DA99E /* CoreGraphics.framework */; }; - 0ADF1886178E2185005DA99E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0ADF1884178E2185005DA99E /* InfoPlist.strings */; }; - 0ADF188E178E2185005DA99E /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 0ADF188D178E2185005DA99E /* Default.png */; }; - 0ADF1890178E2185005DA99E /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0ADF188F178E2185005DA99E /* Default@2x.png */; }; - 0ADF1892178E2185005DA99E /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0ADF1891178E2185005DA99E /* Default-568h@2x.png */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 000E3CA6198693240074DF95 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; - 000E3CA8198693350074DF95 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 003A78A7193E2B01007D28E0 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; - 003A78A9193E2B07007D28E0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 006C1FDD18D35A9200F0C5F0 /* RMAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMAppDelegate.h; sourceTree = ""; }; - 006C1FDE18D35A9200F0C5F0 /* RMAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMAppDelegate.m; sourceTree = ""; }; - 006C1FE118D35A9200F0C5F0 /* RMIntroPageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMIntroPageView.h; sourceTree = ""; }; - 006C1FE218D35A9200F0C5F0 /* RMIntroPageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMIntroPageView.m; sourceTree = ""; }; - 006C1FE318D35A9200F0C5F0 /* RMIntroViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMIntroViewController.h; sourceTree = ""; }; - 006C1FE418D35A9200F0C5F0 /* RMIntroViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMIntroViewController.m; sourceTree = ""; }; - 006C1FE918D35BD100F0C5F0 /* RMGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMGeometry.h; sourceTree = ""; }; - 006C1FEA18D35BD100F0C5F0 /* RMGeometry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMGeometry.m; sourceTree = ""; }; - 006C1FEF18D35C1400F0C5F0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - 006C206718D60E8600F0C5F0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 007582B5191558C10016BCD1 /* timing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = timing.h; sourceTree = ""; }; - 007582B6191558D00016BCD1 /* timing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timing.c; sourceTree = ""; }; - 0078937D18CE765200A15B38 /* texture_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = texture_helper.h; sourceTree = SOURCE_ROOT; }; - 0078937E18CE765200A15B38 /* texture_helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = texture_helper.m; sourceTree = SOURCE_ROOT; }; - 00990FF31ACBE95E0003A2ED /* fast_arrow_shadow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_arrow_shadow@2x.png"; sourceTree = ""; }; - 00990FF41ACBE95E0003A2ED /* fast_arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_arrow@2x.png"; sourceTree = ""; }; - 00990FF51ACBE95E0003A2ED /* fast_body@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_body@2x.png"; sourceTree = ""; }; - 00990FF61ACBE95E0003A2ED /* fast_spiral@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fast_spiral@2x.png"; sourceTree = ""; }; - 00990FF71ACBE95E0003A2ED /* ic_bubble_dot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_bubble_dot@2x.png"; sourceTree = ""; }; - 00990FF81ACBE95E0003A2ED /* ic_bubble@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_bubble@2x.png"; sourceTree = ""; }; - 00990FF91ACBE95E0003A2ED /* ic_cam_lens@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_cam_lens@2x.png"; sourceTree = ""; }; - 00990FFA1ACBE95E0003A2ED /* ic_cam@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_cam@2x.png"; sourceTree = ""; }; - 00990FFB1ACBE95E0003A2ED /* ic_pencil@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pencil@2x.png"; sourceTree = ""; }; - 00990FFC1ACBE95E0003A2ED /* ic_pin@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pin@2x.png"; sourceTree = ""; }; - 00990FFD1ACBE95E0003A2ED /* ic_smile_eye@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_smile_eye@2x.png"; sourceTree = ""; }; - 00990FFE1ACBE95E0003A2ED /* ic_smile@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_smile@2x.png"; sourceTree = ""; }; - 00990FFF1ACBE95E0003A2ED /* ic_videocam@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_videocam@2x.png"; sourceTree = ""; }; - 009910001ACBE95E0003A2ED /* knot_down@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "knot_down@2x.png"; sourceTree = ""; }; - 009910011ACBE95E0003A2ED /* knot_up@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "knot_up@2x.png"; sourceTree = ""; }; - 009910021ACBE95E0003A2ED /* powerful_infinity_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_infinity_white@2x.png"; sourceTree = ""; }; - 009910031ACBE95E0003A2ED /* powerful_infinity@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_infinity@2x.png"; sourceTree = ""; }; - 009910041ACBE95E0003A2ED /* powerful_mask@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_mask@2x.png"; sourceTree = ""; }; - 009910051ACBE95E0003A2ED /* powerful_star@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "powerful_star@2x.png"; sourceTree = ""; }; - 009910061ACBE95E0003A2ED /* private_door@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "private_door@2x.png"; sourceTree = ""; }; - 009910071ACBE95E0003A2ED /* private_screw@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "private_screw@2x.png"; sourceTree = ""; }; - 009910081ACBE95E0003A2ED /* telegram_plane@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_plane@2x.png"; sourceTree = ""; }; - 009910091ACBE95E0003A2ED /* telegram_sphere@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "telegram_sphere@2x.png"; sourceTree = ""; }; - 0099100A1ACBE95E0003A2ED /* start_arrow_ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = start_arrow_ipad.png; sourceTree = ""; }; - 0099100B1ACBE95E0003A2ED /* start_arrow_ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start_arrow_ipad@2x.png"; sourceTree = ""; }; - 0099100C1ACBE95E0003A2ED /* start_arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start_arrow@2x.png"; sourceTree = ""; }; - 0099102C1ACBEB220003A2ED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 0099102E1ACBEB5B0003A2ED /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = IntroOpenGL/Images.xcassets; sourceTree = SOURCE_ROOT; }; - 00D761311948B1B100961E77 /* RMRootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMRootViewController.h; sourceTree = ""; }; - 00D761321948B1B100961E77 /* RMRootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMRootViewController.m; sourceTree = ""; }; - 00D761341948B28E00961E77 /* RMLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMLoginViewController.h; sourceTree = ""; }; - 00D761351948B28E00961E77 /* RMLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMLoginViewController.m; sourceTree = ""; }; - 00EAE19318F83BBB00D0B495 /* rngs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rngs.c; sourceTree = ""; }; - 00EAE19418F83BBB00D0B495 /* rngs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rngs.h; sourceTree = ""; }; - 00F0BD1E1AD5359300204D81 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; - 00F0BD201AD5359D00204D81 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - 00F0BD221AD535A500204D81 /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; }; - 00F0BD241AD535AE00204D81 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 00F0BD261AD535BA00204D81 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 00F0BD291AD535F400204D81 /* HockeySDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = HockeySDK.framework; sourceTree = ""; }; - 00F0BD2B1AD535F400204D81 /* HockeySDK.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = HockeySDK.xcconfig; sourceTree = ""; }; - 00F0BD2C1AD535F400204D81 /* HockeySDKResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = HockeySDKResources.bundle; sourceTree = ""; }; - 0A8FBF00179DEF700039BA29 /* platform_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_macros.h; sourceTree = ""; }; - 0A8FBF01179DEF700039BA29 /* platform_log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_log.h; sourceTree = ""; }; - 0A8FBF04179DEF7B0039BA29 /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = ""; }; - 0A8FBF05179DEF7B0039BA29 /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; - 0A8FBF06179DEF7B0039BA29 /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = ""; }; - 0A8FBF07179DEF7B0039BA29 /* animations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = animations.c; sourceTree = ""; }; - 0A8FBF08179DEF7B0039BA29 /* animations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = animations.h; sourceTree = ""; }; - 0A8FBF0B179DEF7B0039BA29 /* shader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = shader.c; sourceTree = ""; }; - 0A8FBF0C179DEF7B0039BA29 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; - 0A8FBF10179DEF7B0039BA29 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; - 0A8FBF71179DFAEE0039BA29 /* platform_log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = platform_log.c; sourceTree = ""; }; - 0ABADED6178E2E7800DED9FD /* platform_gl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = platform_gl.h; sourceTree = ""; }; - 0ACEE2B017E78AF5009DFC95 /* objects.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = objects.c; sourceTree = ""; }; - 0ACEE2B117E78AF5009DFC95 /* objects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = ""; }; - 0ACEE2B217E78AF5009DFC95 /* program.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = program.c; sourceTree = ""; }; - 0ACEE2B317E78AF5009DFC95 /* program.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = program.h; sourceTree = ""; }; - 0ACEE2B617E7A037009DFC95 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matrix.h; sourceTree = ""; }; - 0ACEE2BB17E7A065009DFC95 /* linmath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linmath.h; sourceTree = ""; }; - 0ADF1874178E2185005DA99E /* IntroOpenGL.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IntroOpenGL.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 0ADF1877178E2185005DA99E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 0ADF1879178E2185005DA99E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 0ADF187B178E2185005DA99E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 0ADF1883178E2185005DA99E /* IntroOpenGL-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "IntroOpenGL-Info.plist"; sourceTree = ""; }; - 0ADF1885178E2185005DA99E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 0ADF1887178E2185005DA99E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 0ADF1889178E2185005DA99E /* IntroOpenGL-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "IntroOpenGL-Prefix.pch"; sourceTree = ""; }; - 0ADF188D178E2185005DA99E /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 0ADF188F178E2185005DA99E /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; - 0ADF1891178E2185005DA99E /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 0ADF1871178E2185005DA99E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 00F0BD271AD535BA00204D81 /* SystemConfiguration.framework in Frameworks */, - 00F0BD251AD535AE00204D81 /* Security.framework in Frameworks */, - 00F0BD231AD535A500204D81 /* QuickLook.framework in Frameworks */, - 00F0BD211AD5359D00204D81 /* CoreText.framework in Frameworks */, - 00F0BD1F1AD5359300204D81 /* AssetsLibrary.framework in Frameworks */, - 000E3CA9198693350074DF95 /* MobileCoreServices.framework in Frameworks */, - 00F0BD2D1AD535F400204D81 /* HockeySDK.framework in Frameworks */, - 000E3CA7198693240074DF95 /* ImageIO.framework in Frameworks */, - 003A78AA193E2B07007D28E0 /* OpenGLES.framework in Frameworks */, - 003A78A8193E2B01007D28E0 /* GLKit.framework in Frameworks */, - 006C206818D60E8600F0C5F0 /* QuartzCore.framework in Frameworks */, - 0ADF1878178E2185005DA99E /* UIKit.framework in Frameworks */, - 0ADF187A178E2185005DA99E /* Foundation.framework in Frameworks */, - 0ADF187C178E2185005DA99E /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 006C1FF118D35C9800F0C5F0 /* Resources */ = { - isa = PBXGroup; - children = ( - 0099102E1ACBEB5B0003A2ED /* Images.xcassets */, - 00990FF31ACBE95E0003A2ED /* fast_arrow_shadow@2x.png */, - 00990FF41ACBE95E0003A2ED /* fast_arrow@2x.png */, - 00990FF51ACBE95E0003A2ED /* fast_body@2x.png */, - 00990FF61ACBE95E0003A2ED /* fast_spiral@2x.png */, - 00990FF71ACBE95E0003A2ED /* ic_bubble_dot@2x.png */, - 00990FF81ACBE95E0003A2ED /* ic_bubble@2x.png */, - 00990FF91ACBE95E0003A2ED /* ic_cam_lens@2x.png */, - 00990FFA1ACBE95E0003A2ED /* ic_cam@2x.png */, - 00990FFB1ACBE95E0003A2ED /* ic_pencil@2x.png */, - 00990FFC1ACBE95E0003A2ED /* ic_pin@2x.png */, - 00990FFD1ACBE95E0003A2ED /* ic_smile_eye@2x.png */, - 00990FFE1ACBE95E0003A2ED /* ic_smile@2x.png */, - 00990FFF1ACBE95E0003A2ED /* ic_videocam@2x.png */, - 009910001ACBE95E0003A2ED /* knot_down@2x.png */, - 009910011ACBE95E0003A2ED /* knot_up@2x.png */, - 009910021ACBE95E0003A2ED /* powerful_infinity_white@2x.png */, - 009910031ACBE95E0003A2ED /* powerful_infinity@2x.png */, - 009910041ACBE95E0003A2ED /* powerful_mask@2x.png */, - 009910051ACBE95E0003A2ED /* powerful_star@2x.png */, - 009910061ACBE95E0003A2ED /* private_door@2x.png */, - 009910071ACBE95E0003A2ED /* private_screw@2x.png */, - 009910081ACBE95E0003A2ED /* telegram_plane@2x.png */, - 009910091ACBE95E0003A2ED /* telegram_sphere@2x.png */, - 0099100A1ACBE95E0003A2ED /* start_arrow_ipad.png */, - 0099100B1ACBE95E0003A2ED /* start_arrow_ipad@2x.png */, - 0099100C1ACBE95E0003A2ED /* start_arrow@2x.png */, - ); - path = Resources; - sourceTree = ""; - }; - 00F0BD281AD535F400204D81 /* HockeySDK.embeddedframework */ = { - isa = PBXGroup; - children = ( - 00F0BD291AD535F400204D81 /* HockeySDK.framework */, - 00F0BD2A1AD535F400204D81 /* Resources */, - ); - name = HockeySDK.embeddedframework; - path = "HockeySDK-iOS/HockeySDK.embeddedframework"; - sourceTree = ""; - }; - 00F0BD2A1AD535F400204D81 /* Resources */ = { - isa = PBXGroup; - children = ( - 00F0BD2B1AD535F400204D81 /* HockeySDK.xcconfig */, - 00F0BD2C1AD535F400204D81 /* HockeySDKResources.bundle */, - ); - path = Resources; - sourceTree = ""; - }; - 0A8FBEFF179DEF700039BA29 /* common */ = { - isa = PBXGroup; - children = ( - 0A8FBF71179DFAEE0039BA29 /* platform_log.c */, - 0A8FBF00179DEF700039BA29 /* platform_macros.h */, - 0A8FBF01179DEF700039BA29 /* platform_log.h */, - 0078937D18CE765200A15B38 /* texture_helper.h */, - 0078937E18CE765200A15B38 /* texture_helper.m */, - ); - name = common; - path = ../common; - sourceTree = ""; - }; - 0A8FBF03179DEF7B0039BA29 /* core */ = { - isa = PBXGroup; - children = ( - 00EAE19318F83BBB00D0B495 /* rngs.c */, - 00EAE19418F83BBB00D0B495 /* rngs.h */, - 0A8FBF08179DEF7B0039BA29 /* animations.h */, - 0A8FBF07179DEF7B0039BA29 /* animations.c */, - 0ACEE2B117E78AF5009DFC95 /* objects.h */, - 0ACEE2B017E78AF5009DFC95 /* objects.c */, - 0ACEE2B317E78AF5009DFC95 /* program.h */, - 0ACEE2B217E78AF5009DFC95 /* program.c */, - 007582B5191558C10016BCD1 /* timing.h */, - 007582B6191558D00016BCD1 /* timing.c */, - 0A8FBF05179DEF7B0039BA29 /* buffer.h */, - 0A8FBF04179DEF7B0039BA29 /* buffer.c */, - 0A8FBF06179DEF7B0039BA29 /* shader.h */, - 0A8FBF0B179DEF7B0039BA29 /* shader.c */, - 0A8FBF0C179DEF7B0039BA29 /* config.h */, - 0ACEE2B617E7A037009DFC95 /* matrix.h */, - 0A8FBF10179DEF7B0039BA29 /* macros.h */, - ); - name = core; - path = ../../core; - sourceTree = ""; - }; - 0ACEE2B817E7A065009DFC95 /* linmath */ = { - isa = PBXGroup; - children = ( - 0ACEE2BB17E7A065009DFC95 /* linmath.h */, - ); - name = linmath; - path = ../../3rdparty/linmath; - sourceTree = ""; - }; - 0ADF186B178E2185005DA99E = { - isa = PBXGroup; - children = ( - 006C1FF118D35C9800F0C5F0 /* Resources */, - 0ACEE2B817E7A065009DFC95 /* linmath */, - 0A8FBF03179DEF7B0039BA29 /* core */, - 0A8FBEFF179DEF700039BA29 /* common */, - 0ADF1881178E2185005DA99E /* ios */, - 0ADF1876178E2185005DA99E /* Frameworks */, - 0ADF1875178E2185005DA99E /* Products */, - ); - sourceTree = ""; - }; - 0ADF1875178E2185005DA99E /* Products */ = { - isa = PBXGroup; - children = ( - 0ADF1874178E2185005DA99E /* IntroOpenGL.app */, - ); - name = Products; - sourceTree = ""; - }; - 0ADF1876178E2185005DA99E /* Frameworks */ = { - isa = PBXGroup; - children = ( - 00F0BD281AD535F400204D81 /* HockeySDK.embeddedframework */, - 00F0BD261AD535BA00204D81 /* SystemConfiguration.framework */, - 00F0BD241AD535AE00204D81 /* Security.framework */, - 00F0BD221AD535A500204D81 /* QuickLook.framework */, - 00F0BD201AD5359D00204D81 /* CoreText.framework */, - 00F0BD1E1AD5359300204D81 /* AssetsLibrary.framework */, - 000E3CA8198693350074DF95 /* MobileCoreServices.framework */, - 000E3CA6198693240074DF95 /* ImageIO.framework */, - 003A78A9193E2B07007D28E0 /* OpenGLES.framework */, - 003A78A7193E2B01007D28E0 /* GLKit.framework */, - 006C206718D60E8600F0C5F0 /* QuartzCore.framework */, - 0ADF1877178E2185005DA99E /* UIKit.framework */, - 0ADF1879178E2185005DA99E /* Foundation.framework */, - 0ADF187B178E2185005DA99E /* CoreGraphics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 0ADF1881178E2185005DA99E /* ios */ = { - isa = PBXGroup; - children = ( - 0099102B1ACBEB220003A2ED /* LaunchScreen.xib */, - 006C1FE118D35A9200F0C5F0 /* RMIntroPageView.h */, - 006C1FE218D35A9200F0C5F0 /* RMIntroPageView.m */, - 006C1FE318D35A9200F0C5F0 /* RMIntroViewController.h */, - 006C1FE418D35A9200F0C5F0 /* RMIntroViewController.m */, - 006C1FDD18D35A9200F0C5F0 /* RMAppDelegate.h */, - 006C1FDE18D35A9200F0C5F0 /* RMAppDelegate.m */, - 00D761311948B1B100961E77 /* RMRootViewController.h */, - 00D761321948B1B100961E77 /* RMRootViewController.m */, - 00D761341948B28E00961E77 /* RMLoginViewController.h */, - 00D761351948B28E00961E77 /* RMLoginViewController.m */, - 006C1FE918D35BD100F0C5F0 /* RMGeometry.h */, - 006C1FEA18D35BD100F0C5F0 /* RMGeometry.m */, - 0ADF1882178E2185005DA99E /* Supporting Files */, - 0ABADED6178E2E7800DED9FD /* platform_gl.h */, - ); - name = ios; - sourceTree = ""; - }; - 0ADF1882178E2185005DA99E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 006C1FF018D35C1400F0C5F0 /* Localizable.strings */, - 0ADF1883178E2185005DA99E /* IntroOpenGL-Info.plist */, - 0ADF1884178E2185005DA99E /* InfoPlist.strings */, - 0ADF1887178E2185005DA99E /* main.m */, - 0ADF1889178E2185005DA99E /* IntroOpenGL-Prefix.pch */, - 0ADF188D178E2185005DA99E /* Default.png */, - 0ADF188F178E2185005DA99E /* Default@2x.png */, - 0ADF1891178E2185005DA99E /* Default-568h@2x.png */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 0ADF1873178E2185005DA99E /* IntroOpenGL */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0ADF18A2178E2185005DA99E /* Build configuration list for PBXNativeTarget "IntroOpenGL" */; - buildPhases = ( - 0ADF1870178E2185005DA99E /* Sources */, - 0ADF1871178E2185005DA99E /* Frameworks */, - 0ADF1872178E2185005DA99E /* Resources */, - 00F0BD1D1AD5355600204D81 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = IntroOpenGL; - productName = airhockey; - productReference = 0ADF1874178E2185005DA99E /* IntroOpenGL.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0ADF186C178E2185005DA99E /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - ORGANIZATIONNAME = "Learn OpenGL ES"; - TargetAttributes = { - 0ADF1873178E2185005DA99E = { - DevelopmentTeam = SWJJKVDDR2; - }; - }; - }; - buildConfigurationList = 0ADF186F178E2185005DA99E /* Build configuration list for PBXProject "IntroOpenGL" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 0ADF186B178E2185005DA99E; - productRefGroup = 0ADF1875178E2185005DA99E /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 0ADF1873178E2185005DA99E /* IntroOpenGL */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 0ADF1872178E2185005DA99E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 009910241ACBE95E0003A2ED /* telegram_plane@2x.png in Resources */, - 009910151ACBE95E0003A2ED /* ic_cam_lens@2x.png in Resources */, - 00F0BD2F1AD535F400204D81 /* HockeySDKResources.bundle in Resources */, - 009910111ACBE95E0003A2ED /* fast_body@2x.png in Resources */, - 0099101F1ACBE95E0003A2ED /* powerful_infinity@2x.png in Resources */, - 0099101E1ACBE95E0003A2ED /* powerful_infinity_white@2x.png in Resources */, - 009910181ACBE95E0003A2ED /* ic_pin@2x.png in Resources */, - 009910251ACBE95E0003A2ED /* telegram_sphere@2x.png in Resources */, - 0ADF1886178E2185005DA99E /* InfoPlist.strings in Resources */, - 009910281ACBE95E0003A2ED /* start_arrow@2x.png in Resources */, - 0099101B1ACBE95E0003A2ED /* ic_videocam@2x.png in Resources */, - 006C1FEE18D35C1400F0C5F0 /* Localizable.strings in Resources */, - 009910261ACBE95E0003A2ED /* start_arrow_ipad.png in Resources */, - 009910101ACBE95E0003A2ED /* fast_arrow@2x.png in Resources */, - 0099101D1ACBE95E0003A2ED /* knot_up@2x.png in Resources */, - 00F0BD2E1AD535F400204D81 /* HockeySDK.xcconfig in Resources */, - 0099101C1ACBE95E0003A2ED /* knot_down@2x.png in Resources */, - 0099100F1ACBE95E0003A2ED /* fast_arrow_shadow@2x.png in Resources */, - 0099102F1ACBEB5B0003A2ED /* Images.xcassets in Resources */, - 009910191ACBE95E0003A2ED /* ic_smile_eye@2x.png in Resources */, - 009910231ACBE95E0003A2ED /* private_screw@2x.png in Resources */, - 0ADF188E178E2185005DA99E /* Default.png in Resources */, - 009910211ACBE95E0003A2ED /* powerful_star@2x.png in Resources */, - 0099102D1ACBEB220003A2ED /* LaunchScreen.xib in Resources */, - 009910201ACBE95E0003A2ED /* powerful_mask@2x.png in Resources */, - 009910141ACBE95E0003A2ED /* ic_bubble@2x.png in Resources */, - 009910161ACBE95E0003A2ED /* ic_cam@2x.png in Resources */, - 0099101A1ACBE95E0003A2ED /* ic_smile@2x.png in Resources */, - 009910171ACBE95E0003A2ED /* ic_pencil@2x.png in Resources */, - 009910131ACBE95E0003A2ED /* ic_bubble_dot@2x.png in Resources */, - 0ADF1890178E2185005DA99E /* Default@2x.png in Resources */, - 009910121ACBE95E0003A2ED /* fast_spiral@2x.png in Resources */, - 009910271ACBE95E0003A2ED /* start_arrow_ipad@2x.png in Resources */, - 009910221ACBE95E0003A2ED /* private_door@2x.png in Resources */, - 0ADF1892178E2185005DA99E /* Default-568h@2x.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00F0BD1D1AD5355600204D81 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "FILE=\"${SRCROOT}/HockeySDK-iOS/BuildAgent\"\nif [ -f \"$FILE\" ]; then\n\"$FILE\"\nfi"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 0ADF1870178E2185005DA99E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00EAE19518F83BBB00D0B495 /* rngs.c in Sources */, - 007582B7191558D00016BCD1 /* timing.c in Sources */, - 0A8FBF91179E07600039BA29 /* buffer.c in Sources */, - 00D761331948B1B100961E77 /* RMRootViewController.m in Sources */, - 0A8FBF92179E07600039BA29 /* animations.c in Sources */, - 006C1FE518D35A9200F0C5F0 /* RMAppDelegate.m in Sources */, - 0A8FBF94179E07600039BA29 /* shader.c in Sources */, - 0A8FBF90179E07440039BA29 /* main.m in Sources */, - 006C1FEB18D35BD100F0C5F0 /* RMGeometry.m in Sources */, - 006C1FE818D35A9200F0C5F0 /* RMIntroViewController.m in Sources */, - 00D761361948B28E00961E77 /* RMLoginViewController.m in Sources */, - 006C1FE718D35A9200F0C5F0 /* RMIntroPageView.m in Sources */, - 0A8FBF8C179E073A0039BA29 /* platform_log.c in Sources */, - 0078937F18CE765200A15B38 /* texture_helper.m in Sources */, - 0ACEE2B417E78AF5009DFC95 /* objects.c in Sources */, - 0ACEE2B517E78AF5009DFC95 /* program.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 006C1FF018D35C1400F0C5F0 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 006C1FEF18D35C1400F0C5F0 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 0099102B1ACBEB220003A2ED /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 0099102C1ACBEB220003A2ED /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; - 0ADF1884178E2185005DA99E /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 0ADF1885178E2185005DA99E /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 0ADF18A0178E2185005DA99E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Ilya Rimchikov (W66FJY7879)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Ilya Rimchikov (W66FJY7879)"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 0ADF18A1178E2185005DA99E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution: Ilya Rimchikov (SWJJKVDDR2)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Ilya Rimchikov (SWJJKVDDR2)"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 0ADF18A3178E2185005DA99E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/HockeySDK-iOS/HockeySDK.embeddedframework", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "IntroOpenGL-Prefix.pch"; - HEADER_SEARCH_PATHS = ../../3rdparty/libpng; - INFOPLIST_FILE = "IntroOpenGL-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 0ADF18A4178E2185005DA99E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/HockeySDK-iOS/HockeySDK.embeddedframework", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "IntroOpenGL-Prefix.pch"; - HEADER_SEARCH_PATHS = ../../3rdparty/libpng; - INFOPLIST_FILE = "IntroOpenGL-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 0ADF186F178E2185005DA99E /* Build configuration list for PBXProject "IntroOpenGL" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0ADF18A0178E2185005DA99E /* Debug */, - 0ADF18A1178E2185005DA99E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0ADF18A2178E2185005DA99E /* Build configuration list for PBXNativeTarget "IntroOpenGL" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0ADF18A3178E2185005DA99E /* Debug */, - 0ADF18A4178E2185005DA99E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0ADF186C178E2185005DA99E /* Project object */; -} diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 8d41d631fe..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/AppIcon.appiconset/Contents.json b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 1b96b3b213..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "57x57", - "scale" : "1x" - }, - { - "idiom" : "iphone", - "size" : "57x57", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "50x50", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "50x50", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "72x72", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "72x72", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Contents.json b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index a2a7d966d0..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default.png", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default@2x.png", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default-568h@2x.png", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default@2x.png", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default-568h@2x.png", - "minimum-system-version" : "7.0", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png deleted file mode 100755 index 0891b7aabf..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default.png deleted file mode 100755 index 4c8ca6f693..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default@2x.png b/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default@2x.png deleted file mode 100755 index 35b84cffeb..0000000000 Binary files a/submodules/TelegramUI/third-party/RMIntro/platform/ios/IntroOpenGL/Images.xcassets/LaunchImage.launchimage/Default@2x.png and /dev/null differ diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMAppDelegate.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMAppDelegate.h deleted file mode 100644 index 734acf855e..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMAppDelegate.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// RMAppDelegate.h -// IntroOpenGL -// -// Created by Ilya Rimchikov on 19/01/14. -// -// - -#import -#import "RMIntroViewController.h" -#import "RMRootViewController.h" - -@interface RMAppDelegate : UIResponder -{ - RMRootViewController *_rootVC; -} -@property (strong, nonatomic) UIWindow *window; -//@property (nonatomic) RMTestView *iconView; -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMAppDelegate.m b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMAppDelegate.m deleted file mode 100644 index da3fc21607..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMAppDelegate.m +++ /dev/null @@ -1,68 +0,0 @@ -// -// RMAppDelegate.m -// IntroOpenGL -// -// Created by Ilya Rimchikov on 19/01/14. -// -// - -#import "RMAppDelegate.h" -#import "RMIntroViewController.h" - -#import - - -@implementation RMAppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"55c68b3d58c8184bb3d5ee35715e79ee"]; - [[BITHockeyManager sharedHockeyManager] startManager]; - [[BITHockeyManager sharedHockeyManager].authenticator - authenticateInstallation]; - - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - - _rootVC = [[RMRootViewController alloc]init]; - _rootVC.view.backgroundColor = [UIColor greenColor]; - - self.window.rootViewController = _rootVC; - - [self.window makeKeyAndVisible]; - - return YES; -} - - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - - //_rootVC.draw_q=0; - //[_rootVC performSelector:@selector(startTimer) withObject:nil afterDelay:.1]; - //[_rootVC startTimer]; -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGLKViewController.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGLKViewController.h deleted file mode 100644 index 3920efeda4..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGLKViewController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// RMGLKViewController.h -// Intro -// -// Created by Ilya on 04/03/14. -// -// - -#import -#import - -@interface RMGLKViewController : GLKViewController - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGLKViewController.m b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGLKViewController.m deleted file mode 100644 index 78b47b7789..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMGLKViewController.m +++ /dev/null @@ -1,66 +0,0 @@ -// -// RMGLKViewController.m -// Intro -// -// Created by Ilya on 04/03/14. -// -// - -#import "RMGLKViewController.h" -#include "game.h" - -@interface RMGLKViewController () { -} - -@property (strong, nonatomic) EAGLContext *context; - -- (void)setupGL; - -@end - -@implementation RMGLKViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; - - if (!self.context) { - NSLog(@"Failed to create ES context"); - } - - GLKView *view = (GLKView *)self.view; - view.context = self.context; - //view.drawableDepthFormat = GLKViewDrawableDepthFormat24; - //view.drawableStencilFormat = GLKViewDrawableStencilFormat8; - //view.userInteractionEnabled = YES; - self.preferredFramesPerSecond = 60; - - [self setupGL]; -} - -- (void)dealloc -{ - if ([EAGLContext currentContext] == self.context) { - [EAGLContext setCurrentContext:nil]; - } -} - -- (void)setupGL -{ - [EAGLContext setCurrentContext:self.context]; - on_surface_created(); - - on_surface_changed(self.view.bounds.size.width, self.view.bounds.size.height); - //on_surface_changed(240*self.view.contentScaleFactor, 240*self.view.contentScaleFactor); -} - -#pragma mark - GLKView and GLKViewController delegate methods - -- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect -{ - on_draw_frame(); -} - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMLoginViewController.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMLoginViewController.h deleted file mode 100644 index 424aabc412..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMLoginViewController.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// RMLoginViewController.h -// IntroOpenGL -// -// Created by Ilya Rimchikov on 11/06/14. -// Copyright (c) 2014 Learn OpenGL ES. All rights reserved. -// - -#import - -@interface RMLoginViewController : UIViewController - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMLoginViewController.m b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMLoginViewController.m deleted file mode 100644 index e487604a41..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMLoginViewController.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// RMLoginViewController.m -// IntroOpenGL -// -// Created by Ilya Rimchikov on 11/06/14. -// Copyright (c) 2014 Learn OpenGL ES. All rights reserved. -// - -#import "RMLoginViewController.h" - -@interface RMLoginViewController () - -@end - -@implementation RMLoginViewController - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - self.view.backgroundColor = [UIColor colorWithWhite:.8 alpha:.8]; - // Custom initialization - } - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - // Do any additional setup after loading the view. -} - -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender -{ - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMRootViewController.h b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMRootViewController.h deleted file mode 100644 index 7284951314..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMRootViewController.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// RMRootViewController.h -// IntroOpenGL -// -// Created by Ilya Rimchikov on 11/06/14. -// Copyright (c) 2014 Learn OpenGL ES. All rights reserved. -// - -#import -#import "RMIntroViewController.h" -#import "RMLoginViewController.h" - -@interface RMRootViewController : UIViewController -{ - RMIntroViewController *_introVC; - RMLoginViewController *_loginVC; - -} - -- (void)startButtonPress; - - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMRootViewController.m b/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMRootViewController.m deleted file mode 100644 index 204ae8e536..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/RMRootViewController.m +++ /dev/null @@ -1,123 +0,0 @@ -// -// RMRootViewController.m -// IntroOpenGL -// -// Created by Ilya Rimchikov on 11/06/14. -// Copyright (c) 2014 Learn OpenGL ES. All rights reserved. -// - -#import "RMRootViewController.h" -#import "RMGeometry.h" - -@interface RMRootViewController () - -@end - -@implementation RMRootViewController - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - _introVC = [[RMIntroViewController alloc] init]; - _introVC.view.frame = CGRectChangedOriginY(self.view.frame, 0); - - _loginVC = [[RMLoginViewController alloc]init]; - _loginVC.view.frame = CGRectChangedOriginY(self.view.frame, 0); - - UIButton *back = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - [back setTitle:@"Back" forState:UIControlStateNormal]; - [back setFont:[UIFont systemFontOfSize:24.]]; - [_loginVC.view addSubview:back]; - back.frame= CGRectMake(0, 100, 320, 100); - [back addTarget:self action:@selector(backButtonPress) forControlEvents:UIControlEventTouchUpInside]; - - UIButton *reset = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - [reset setTitle:@"Free Intro Controller" forState:UIControlStateNormal]; - [reset setFont:[UIFont systemFontOfSize:24.]]; - [_loginVC.view addSubview:reset]; - reset.frame= CGRectMake(0, 200, 320, 100); - [reset addTarget:self action:@selector(resetButtonPress) forControlEvents:UIControlEventTouchUpInside]; - - } - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - [self.view addSubview:_introVC.view]; - - - // Do any additional setup after loading the view. -} - -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender -{ - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - - - -- (NSUInteger)supportedInterfaceOrientations -{ - //if (IPAD) { - return UIInterfaceOrientationMaskAll; - //} - //return UIInterfaceOrientationMaskPortrait; -} - - -- (void)startButtonPress -{ - NSLog(@"startButtonPress"); - - [self.view addSubview:_loginVC.view]; - _loginVC.view.frame = CGRectChangedOriginX(_loginVC.view.frame, self.view.frame.size.width); - - - [_introVC stopTimer]; - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:.3]; - _loginVC.view.frame = CGRectChangedOriginX(_loginVC.view.frame, 0); - [UIView commitAnimations]; - -} - - -- (void)backButtonPress -{ - NSLog(@"back"); - - [_introVC startTimer]; - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:.3]; - _loginVC.view.frame = CGRectChangedOriginX(_loginVC.view.frame, self.view.bounds.size.width); - [UIView commitAnimations]; - //[self popViewControllerAnimated:YES]; -} - -- (void)resetButtonPress -{ - NSLog(@"reset"); - [_introVC.view removeFromSuperview]; - _introVC = nil; - - //self.viewControllers = [NSArray arrayWithObject:[self.viewControllers objectAtIndex:1]]; - //[nav popViewControllerAnimated:YES]; -} - -@end diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/en.lproj/InfoPlist.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/en.lproj/InfoPlist.strings deleted file mode 100755 index 477b28ff8f..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/en.lproj/Localizable.strings b/submodules/TelegramUI/third-party/RMIntro/platform/ios/en.lproj/Localizable.strings deleted file mode 100644 index aa5a2f2203..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/en.lproj/Localizable.strings +++ /dev/null @@ -1,27 +0,0 @@ -/* - Localizable.strings - intro - - Created by Ilya Rimchikov on 17/01/14. - Copyright (c) 2014 Ilya Rimchikov. All rights reserved. -*/ - -"RMIntroHeadlineTelegram" = "Telegram"; -"RMIntroDescriptionTelegram" = "The world's **fastest** messaging app.\nIt is **free** and **secure**."; - -"RMIntroHeadlineFast" = "Fast"; -"RMIntroDescriptionFast" = "**Telegram** delivers messages faster\nthan any other application."; - -"RMIntroHeadlineFree" = "Free"; -"RMIntroDescriptionFree" = "**Telegram** is free forever. No ads.\nNo subscription fees."; - -"RMIntroHeadlinePowerful" = "Powerful"; -"RMIntroDescriptionPowerful" = "**Telegram** has no limits on\nthe size of your media and chats."; - -"RMIntroHeadlineSecure" = "Secure"; -"RMIntroDescriptionSecure" = "**Telegram** keeps your messages\nsafe from hacker attacks."; - -"RMIntroHeadlineCloud" = "Cloud-Based"; -"RMIntroDescriptionCloud" = "**Telegram** lets you access your\nmessages from multiple devices."; - -"RMIntroStartMessaging" = "Start Messaging"; \ No newline at end of file diff --git a/submodules/TelegramUI/third-party/RMIntro/platform/ios/main.m b/submodules/TelegramUI/third-party/RMIntro/platform/ios/main.m deleted file mode 100755 index 641e6983b3..0000000000 --- a/submodules/TelegramUI/third-party/RMIntro/platform/ios/main.m +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import "RMAppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([RMAppDelegate class])); - } -} diff --git a/submodules/TelegramUIPreferences/Info.plist b/submodules/TelegramUIPreferences/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramUIPreferences/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/TelegramUI/TelegramUI/CallListSettings.swift b/submodules/TelegramUIPreferences/Sources/CallListSettings.swift similarity index 83% rename from submodules/TelegramUI/TelegramUI/CallListSettings.swift rename to submodules/TelegramUIPreferences/Sources/CallListSettings.swift index d9168afe93..239f6a554c 100644 --- a/submodules/TelegramUI/TelegramUI/CallListSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/CallListSettings.swift @@ -6,7 +6,7 @@ public struct CallListSettings: PreferencesEntry, Equatable { public var showTab: Bool public static var defaultSettings: CallListSettings { - return CallListSettings(showTab: false) + return CallListSettings(showTab: true) } public init(showTab: Bool) { @@ -33,12 +33,12 @@ public struct CallListSettings: PreferencesEntry, Equatable { return lhs.showTab == rhs.showTab } - func withUpdatedShowTab(_ showTab: Bool) -> CallListSettings { + public func withUpdatedShowTab(_ showTab: Bool) -> CallListSettings { return CallListSettings(showTab: showTab) } } -func updateCallListSettingsInteractively(accountManager: AccountManager, _ f: @escaping (CallListSettings) -> CallListSettings) -> Signal { +public func updateCallListSettingsInteractively(accountManager: AccountManager, _ f: @escaping (CallListSettings) -> CallListSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.callListSettings, { entry in let currentSettings: CallListSettings diff --git a/submodules/TelegramUI/TelegramUI/ChatArchiveSettings.swift b/submodules/TelegramUIPreferences/Sources/ChatArchiveSettings.swift similarity index 65% rename from submodules/TelegramUI/TelegramUI/ChatArchiveSettings.swift rename to submodules/TelegramUIPreferences/Sources/ChatArchiveSettings.swift index d6efdcd97e..a91e0f0b3e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatArchiveSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ChatArchiveSettings.swift @@ -2,26 +2,26 @@ import Foundation import Postbox import SwiftSignalKit -struct ChatArchiveSettings: Equatable, PreferencesEntry { - var isHiddenByDefault: Bool +public struct ChatArchiveSettings: Equatable, PreferencesEntry { + public var isHiddenByDefault: Bool - static var `default`: ChatArchiveSettings { + public static var `default`: ChatArchiveSettings { return ChatArchiveSettings(isHiddenByDefault: false) } - init(isHiddenByDefault: Bool) { + public init(isHiddenByDefault: Bool) { self.isHiddenByDefault = isHiddenByDefault } - init(decoder: PostboxDecoder) { + public init(decoder: PostboxDecoder) { self.isHiddenByDefault = decoder.decodeInt32ForKey("isHiddenByDefault", orElse: 1) != 0 } - func encode(_ encoder: PostboxEncoder) { + public func encode(_ encoder: PostboxEncoder) { encoder.encodeInt32(self.isHiddenByDefault ? 1 : 0, forKey: "isHiddenByDefault") } - func isEqual(to: PreferencesEntry) -> Bool { + public func isEqual(to: PreferencesEntry) -> Bool { if let to = to as? ChatArchiveSettings { return self == to } else { @@ -30,7 +30,7 @@ struct ChatArchiveSettings: Equatable, PreferencesEntry { } } -func updateChatArchiveSettings(transaction: Transaction, _ f: @escaping (ChatArchiveSettings) -> ChatArchiveSettings) { +public func updateChatArchiveSettings(transaction: Transaction, _ f: @escaping (ChatArchiveSettings) -> ChatArchiveSettings) { transaction.updatePreferencesEntry(key: ApplicationSpecificPreferencesKeys.chatArchiveSettings, { entry in let currentSettings: ChatArchiveSettings if let entry = entry as? ChatArchiveSettings { diff --git a/submodules/TelegramUI/TelegramUI/ContactSynchronizationSettings.swift b/submodules/TelegramUIPreferences/Sources/ContactSynchronizationSettings.swift similarity index 89% rename from submodules/TelegramUI/TelegramUI/ContactSynchronizationSettings.swift rename to submodules/TelegramUIPreferences/Sources/ContactSynchronizationSettings.swift index 5b3df8ce67..98ae147d31 100644 --- a/submodules/TelegramUI/TelegramUI/ContactSynchronizationSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ContactSynchronizationSettings.swift @@ -7,6 +7,11 @@ public enum ContactsSortOrder: Int32 { case natural } +public enum PresentationPersonNameOrder: Int32 { + case firstLast = 0 + case lastFirst = 1 +} + public struct ContactSynchronizationSettings: Equatable, PreferencesEntry { public var _legacySynchronizeDeviceContacts: Bool public var nameDisplayOrder: PresentationPersonNameOrder @@ -43,7 +48,7 @@ public struct ContactSynchronizationSettings: Equatable, PreferencesEntry { } } -func updateContactSettingsInteractively(accountManager: AccountManager, _ f: @escaping (ContactSynchronizationSettings) -> ContactSynchronizationSettings) -> Signal { +public func updateContactSettingsInteractively(accountManager: AccountManager, _ f: @escaping (ContactSynchronizationSettings) -> ContactSynchronizationSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.contactSynchronizationSettings, { entry in let currentSettings: ContactSynchronizationSettings diff --git a/submodules/TelegramUI/TelegramUI/ExperimentalSettings.swift b/submodules/TelegramUIPreferences/Sources/ExperimentalSettings.swift similarity index 89% rename from submodules/TelegramUI/TelegramUI/ExperimentalSettings.swift rename to submodules/TelegramUIPreferences/Sources/ExperimentalSettings.swift index 8821fb1f99..53c722b3f2 100644 --- a/submodules/TelegramUI/TelegramUI/ExperimentalSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ExperimentalSettings.swift @@ -34,7 +34,7 @@ public struct ExperimentalSettings: PreferencesEntry, Equatable { } } -func updateExperimentalSettingsInteractively(accountManager: AccountManager, _ f: @escaping (ExperimentalSettings) -> ExperimentalSettings) -> Signal { +public func updateExperimentalSettingsInteractively(accountManager: AccountManager, _ f: @escaping (ExperimentalSettings) -> ExperimentalSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalSettings, { entry in let currentSettings: ExperimentalSettings diff --git a/submodules/TelegramUI/TelegramUI/ExperimentalUISettings.swift b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift similarity index 92% rename from submodules/TelegramUI/TelegramUI/ExperimentalUISettings.swift rename to submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift index 51b477d694..37d8e96724 100644 --- a/submodules/TelegramUI/TelegramUI/ExperimentalUISettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift @@ -42,7 +42,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { } } -func updateExperimentalUISettingsInteractively(accountManager: AccountManager, _ f: @escaping (ExperimentalUISettings) -> ExperimentalUISettings) -> Signal { +public func updateExperimentalUISettingsInteractively(accountManager: AccountManager, _ f: @escaping (ExperimentalUISettings) -> ExperimentalUISettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { entry in let currentSettings: ExperimentalUISettings diff --git a/submodules/TelegramUI/TelegramUI/GeneratedMediaStoreSettings.swift b/submodules/TelegramUIPreferences/Sources/GeneratedMediaStoreSettings.swift similarity index 84% rename from submodules/TelegramUI/TelegramUI/GeneratedMediaStoreSettings.swift rename to submodules/TelegramUIPreferences/Sources/GeneratedMediaStoreSettings.swift index 052e86d5ae..3b711ef296 100644 --- a/submodules/TelegramUI/TelegramUI/GeneratedMediaStoreSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/GeneratedMediaStoreSettings.swift @@ -10,7 +10,7 @@ public struct GeneratedMediaStoreSettings: PreferencesEntry, Equatable { return GeneratedMediaStoreSettings(storeEditedPhotos: true, storeCapturedMedia: true) } - init(storeEditedPhotos: Bool, storeCapturedMedia: Bool) { + public init(storeEditedPhotos: Bool, storeCapturedMedia: Bool) { self.storeEditedPhotos = storeEditedPhotos self.storeCapturedMedia = storeCapturedMedia } @@ -37,12 +37,12 @@ public struct GeneratedMediaStoreSettings: PreferencesEntry, Equatable { return lhs.storeEditedPhotos == rhs.storeEditedPhotos && lhs.storeCapturedMedia == rhs.storeCapturedMedia } - func withUpdatedStoreEditedPhotos(_ storeEditedPhotos: Bool) -> GeneratedMediaStoreSettings { + public func withUpdatedStoreEditedPhotos(_ storeEditedPhotos: Bool) -> GeneratedMediaStoreSettings { return GeneratedMediaStoreSettings(storeEditedPhotos: storeEditedPhotos, storeCapturedMedia: self.storeCapturedMedia) } } -func updateGeneratedMediaStoreSettingsInteractively(accountManager: AccountManager, _ f: @escaping (GeneratedMediaStoreSettings) -> GeneratedMediaStoreSettings) -> Signal { +public func updateGeneratedMediaStoreSettingsInteractively(accountManager: AccountManager, _ f: @escaping (GeneratedMediaStoreSettings) -> GeneratedMediaStoreSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.generatedMediaStoreSettings, { entry in let currentSettings: GeneratedMediaStoreSettings diff --git a/submodules/TelegramUI/TelegramUI/InAppNotificationSettings.swift b/submodules/TelegramUIPreferences/Sources/InAppNotificationSettings.swift similarity index 90% rename from submodules/TelegramUI/TelegramUI/InAppNotificationSettings.swift rename to submodules/TelegramUIPreferences/Sources/InAppNotificationSettings.swift index ac243b3caf..9f9335ca0b 100644 --- a/submodules/TelegramUI/TelegramUI/InAppNotificationSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/InAppNotificationSettings.swift @@ -44,7 +44,7 @@ public struct InAppNotificationSettings: PreferencesEntry, Equatable { return InAppNotificationSettings(playSounds: true, vibrate: false, displayPreviews: true, totalUnreadCountDisplayStyle: .raw, totalUnreadCountDisplayCategory: .messages, totalUnreadCountIncludeTags: [.regularChatsAndPrivateGroups], displayNameOnLockscreen: true, displayNotificationsFromAllAccounts: true) } - init(playSounds: Bool, vibrate: Bool, displayPreviews: Bool, totalUnreadCountDisplayStyle: TotalUnreadCountDisplayStyle, totalUnreadCountDisplayCategory: TotalUnreadCountDisplayCategory, totalUnreadCountIncludeTags: PeerSummaryCounterTags, displayNameOnLockscreen: Bool, displayNotificationsFromAllAccounts: Bool) { + public init(playSounds: Bool, vibrate: Bool, displayPreviews: Bool, totalUnreadCountDisplayStyle: TotalUnreadCountDisplayStyle, totalUnreadCountDisplayCategory: TotalUnreadCountDisplayCategory, totalUnreadCountIncludeTags: PeerSummaryCounterTags, displayNameOnLockscreen: Bool, displayNotificationsFromAllAccounts: Bool) { self.playSounds = playSounds self.vibrate = vibrate self.displayPreviews = displayPreviews @@ -90,7 +90,7 @@ public struct InAppNotificationSettings: PreferencesEntry, Equatable { } } -func updateInAppNotificationSettingsInteractively(accountManager: AccountManager, _ f: @escaping (InAppNotificationSettings) -> InAppNotificationSettings) -> Signal { +public func updateInAppNotificationSettingsInteractively(accountManager: AccountManager, _ f: @escaping (InAppNotificationSettings) -> InAppNotificationSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.inAppNotificationSettings, { entry in let currentSettings: InAppNotificationSettings diff --git a/submodules/TelegramUI/TelegramUI/InstantPagePresentationSettings.swift b/submodules/TelegramUIPreferences/Sources/InstantPagePresentationSettings.swift similarity index 86% rename from submodules/TelegramUI/TelegramUI/InstantPagePresentationSettings.swift rename to submodules/TelegramUIPreferences/Sources/InstantPagePresentationSettings.swift index 8ceed436e4..b2b696215a 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPagePresentationSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/InstantPagePresentationSettings.swift @@ -77,28 +77,28 @@ public final class InstantPagePresentationSettings: PreferencesEntry, Equatable return true } - func withUpdatedThemeType(_ themeType: InstantPageThemeType) -> InstantPagePresentationSettings { + public func withUpdatedThemeType(_ themeType: InstantPageThemeType) -> InstantPagePresentationSettings { return InstantPagePresentationSettings(themeType: themeType, fontSize: self.fontSize, forceSerif: self.forceSerif, autoNightMode: self.autoNightMode, ignoreAutoNightModeUntil: self.ignoreAutoNightModeUntil) } - func withUpdatedFontSize(_ fontSize: InstantPagePresentationFontSize) -> InstantPagePresentationSettings { + public func withUpdatedFontSize(_ fontSize: InstantPagePresentationFontSize) -> InstantPagePresentationSettings { return InstantPagePresentationSettings(themeType: self.themeType, fontSize: fontSize, forceSerif: self.forceSerif, autoNightMode: self.autoNightMode, ignoreAutoNightModeUntil: self.ignoreAutoNightModeUntil) } - func withUpdatedForceSerif(_ forceSerif: Bool) -> InstantPagePresentationSettings { + public func withUpdatedForceSerif(_ forceSerif: Bool) -> InstantPagePresentationSettings { return InstantPagePresentationSettings(themeType: self.themeType, fontSize: self.fontSize, forceSerif: forceSerif, autoNightMode: self.autoNightMode, ignoreAutoNightModeUntil: self.ignoreAutoNightModeUntil) } - func withUpdatedAutoNightMode(_ autoNightMode: Bool) -> InstantPagePresentationSettings { + public func withUpdatedAutoNightMode(_ autoNightMode: Bool) -> InstantPagePresentationSettings { return InstantPagePresentationSettings(themeType: self.themeType, fontSize: self.fontSize, forceSerif: self.forceSerif, autoNightMode: autoNightMode, ignoreAutoNightModeUntil: self.ignoreAutoNightModeUntil) } - func withUpdatedIgnoreAutoNightModeUntil(_ ignoreAutoNightModeUntil: Int32) -> InstantPagePresentationSettings { + public func withUpdatedIgnoreAutoNightModeUntil(_ ignoreAutoNightModeUntil: Int32) -> InstantPagePresentationSettings { return InstantPagePresentationSettings(themeType: self.themeType, fontSize: self.fontSize, forceSerif: self.forceSerif, autoNightMode: autoNightMode, ignoreAutoNightModeUntil: ignoreAutoNightModeUntil) } } -func updateInstantPagePresentationSettingsInteractively(accountManager: AccountManager, _ f: @escaping (InstantPagePresentationSettings) -> InstantPagePresentationSettings) -> Signal { +public func updateInstantPagePresentationSettingsInteractively(accountManager: AccountManager, _ f: @escaping (InstantPagePresentationSettings) -> InstantPagePresentationSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.instantPagePresentationSettings, { entry in let currentSettings: InstantPagePresentationSettings diff --git a/submodules/TelegramUI/TelegramUI/LegacyAutomaticMediaDownloadSettings.swift b/submodules/TelegramUIPreferences/Sources/LegacyAutomaticMediaDownloadSettings.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/LegacyAutomaticMediaDownloadSettings.swift rename to submodules/TelegramUIPreferences/Sources/LegacyAutomaticMediaDownloadSettings.swift diff --git a/submodules/TelegramUI/TelegramUI/MediaAutoDownloadSettings.swift b/submodules/TelegramUIPreferences/Sources/MediaAutoDownloadSettings.swift similarity index 96% rename from submodules/TelegramUI/TelegramUI/MediaAutoDownloadSettings.swift rename to submodules/TelegramUIPreferences/Sources/MediaAutoDownloadSettings.swift index 541cd06a11..dd1e6abf7a 100644 --- a/submodules/TelegramUI/TelegramUI/MediaAutoDownloadSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/MediaAutoDownloadSettings.swift @@ -217,7 +217,7 @@ public struct MediaAutoDownloadSettings: PreferencesEntry, Equatable { } } - func connectionSettings(for networkType: MediaAutoDownloadNetworkType) -> MediaAutoDownloadConnection { + public func connectionSettings(for networkType: MediaAutoDownloadNetworkType) -> MediaAutoDownloadConnection { switch networkType { case .cellular: return self.cellular @@ -226,7 +226,7 @@ public struct MediaAutoDownloadSettings: PreferencesEntry, Equatable { } } - func updatedWithAutodownloadSettings(_ autodownloadSettings: AutodownloadSettings) -> MediaAutoDownloadSettings { + public func updatedWithAutodownloadSettings(_ autodownloadSettings: AutodownloadSettings) -> MediaAutoDownloadSettings { var settings = self settings.presets = presetsWithAutodownloadSettings(autodownloadSettings) return settings @@ -246,7 +246,7 @@ private func presetsWithAutodownloadSettings(_ autodownloadSettings: Autodownloa return MediaAutoDownloadPresets(low: categoriesWithAutodownloadPreset(autodownloadSettings.lowPreset, preset: .low), medium: categoriesWithAutodownloadPreset(autodownloadSettings.mediumPreset, preset: .medium), high: categoriesWithAutodownloadPreset(autodownloadSettings.highPreset, preset: .high)) } -func updateMediaDownloadSettingsInteractively(accountManager: AccountManager, _ f: @escaping (MediaAutoDownloadSettings) -> MediaAutoDownloadSettings) -> Signal { +public func updateMediaDownloadSettingsInteractively(accountManager: AccountManager, _ f: @escaping (MediaAutoDownloadSettings) -> MediaAutoDownloadSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.automaticMediaDownloadSettings, { entry in let currentSettings: MediaAutoDownloadSettings @@ -306,7 +306,7 @@ private func categoryAndSizeForMedia(_ media: Media, categories: MediaAutoDownlo } } -func isAutodownloadEnabledForPeerType(_ peerType: MediaAutoDownloadPeerType, category: MediaAutoDownloadCategory) -> Bool { +public func isAutodownloadEnabledForPeerType(_ peerType: MediaAutoDownloadPeerType, category: MediaAutoDownloadCategory) -> Bool { switch peerType { case .contact: return category.contacts @@ -319,7 +319,7 @@ func isAutodownloadEnabledForPeerType(_ peerType: MediaAutoDownloadPeerType, cat } } -func isAutodownloadEnabledForAnyPeerType(category: MediaAutoDownloadCategory) -> Bool { +public func isAutodownloadEnabledForAnyPeerType(category: MediaAutoDownloadCategory) -> Bool { return category.contacts || category.otherPrivate || category.groups || category.channels } @@ -337,13 +337,12 @@ public func shouldDownloadMediaAutomatically(settings: MediaAutoDownloadSettings } if let (category, size) = categoryAndSizeForMedia(media, categories: effectiveAutodownloadCategories(settings: settings, networkType: networkType)) { - guard isAutodownloadEnabledForPeerType(peerType, category: category) else { - return false - } if let size = size { var sizeLimit = category.sizeLimit if let file = media as? TelegramMediaFile, file.isVoice { sizeLimit = max(2 * 1024 * 1024, sizeLimit) + } else if !isAutodownloadEnabledForPeerType(peerType, category: category) { + return false } return size <= sizeLimit } else if category.sizeLimit == Int32.max { diff --git a/submodules/TelegramUI/TelegramUI/MediaInputSettings.swift b/submodules/TelegramUIPreferences/Sources/MediaInputSettings.swift similarity index 85% rename from submodules/TelegramUI/TelegramUI/MediaInputSettings.swift rename to submodules/TelegramUIPreferences/Sources/MediaInputSettings.swift index e7064f67b3..db6fba2ae2 100644 --- a/submodules/TelegramUI/TelegramUI/MediaInputSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/MediaInputSettings.swift @@ -33,12 +33,12 @@ public struct MediaInputSettings: PreferencesEntry, Equatable { return lhs.enableRaiseToSpeak == rhs.enableRaiseToSpeak } - func withUpdatedEnableRaiseToSpeak(_ enableRaiseToSpeak: Bool) -> MediaInputSettings { + public func withUpdatedEnableRaiseToSpeak(_ enableRaiseToSpeak: Bool) -> MediaInputSettings { return MediaInputSettings(enableRaiseToSpeak: enableRaiseToSpeak) } } -func updateMediaInputSettingsInteractively(accountManager: AccountManager, _ f: @escaping (MediaInputSettings) -> MediaInputSettings) -> Signal { +public func updateMediaInputSettingsInteractively(accountManager: AccountManager, _ f: @escaping (MediaInputSettings) -> MediaInputSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.mediaInputSettings, { entry in let currentSettings: MediaInputSettings diff --git a/submodules/TelegramUI/TelegramUI/MusicPlaybackSettings.swift b/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift similarity index 86% rename from submodules/TelegramUI/TelegramUI/MusicPlaybackSettings.swift rename to submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift index 8528947332..8d6d48cd49 100644 --- a/submodules/TelegramUI/TelegramUI/MusicPlaybackSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift @@ -62,20 +62,20 @@ public struct MusicPlaybackSettings: PreferencesEntry, Equatable { return lhs.order == rhs.order && lhs.looping == rhs.looping && lhs.voicePlaybackRate == rhs.voicePlaybackRate } - func withUpdatedOrder(_ order: MusicPlaybackSettingsOrder) -> MusicPlaybackSettings { + public func withUpdatedOrder(_ order: MusicPlaybackSettingsOrder) -> MusicPlaybackSettings { return MusicPlaybackSettings(order: order, looping: self.looping, voicePlaybackRate: self.voicePlaybackRate) } - func withUpdatedLooping(_ looping: MusicPlaybackSettingsLooping) -> MusicPlaybackSettings { + public func withUpdatedLooping(_ looping: MusicPlaybackSettingsLooping) -> MusicPlaybackSettings { return MusicPlaybackSettings(order: self.order, looping: looping, voicePlaybackRate: self.voicePlaybackRate) } - func withUpdatedVoicePlaybackRate(_ voicePlaybackRate: AudioPlaybackRate) -> MusicPlaybackSettings { + public func withUpdatedVoicePlaybackRate(_ voicePlaybackRate: AudioPlaybackRate) -> MusicPlaybackSettings { return MusicPlaybackSettings(order: self.order, looping: self.looping, voicePlaybackRate: voicePlaybackRate) } } -func updateMusicPlaybackSettingsInteractively(accountManager: AccountManager, _ f: @escaping (MusicPlaybackSettings) -> MusicPlaybackSettings) -> Signal { +public func updateMusicPlaybackSettingsInteractively(accountManager: AccountManager, _ f: @escaping (MusicPlaybackSettings) -> MusicPlaybackSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.musicPlaybackSettings, { entry in let currentSettings: MusicPlaybackSettings diff --git a/submodules/TelegramUI/TelegramUI/PostboxKeys.swift b/submodules/TelegramUIPreferences/Sources/PostboxKeys.swift similarity index 100% rename from submodules/TelegramUI/TelegramUI/PostboxKeys.swift rename to submodules/TelegramUIPreferences/Sources/PostboxKeys.swift diff --git a/submodules/TelegramUI/TelegramUI/PresentationPasscodeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationPasscodeSettings.swift similarity index 80% rename from submodules/TelegramUI/TelegramUI/PresentationPasscodeSettings.swift rename to submodules/TelegramUIPreferences/Sources/PresentationPasscodeSettings.swift index 6ff8197f03..6d212f46a2 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationPasscodeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationPasscodeSettings.swift @@ -12,7 +12,7 @@ public struct PresentationPasscodeSettings: PreferencesEntry, Equatable { return PresentationPasscodeSettings(enableBiometrics: false, autolockTimeout: nil, biometricsDomainState: nil, shareBiometricsDomainState: nil) } - init(enableBiometrics: Bool, autolockTimeout: Int32?, biometricsDomainState: Data?, shareBiometricsDomainState: Data?) { + public init(enableBiometrics: Bool, autolockTimeout: Int32?, biometricsDomainState: Data?, shareBiometricsDomainState: Data?) { self.enableBiometrics = enableBiometrics self.autolockTimeout = autolockTimeout self.biometricsDomainState = biometricsDomainState @@ -57,30 +57,30 @@ public struct PresentationPasscodeSettings: PreferencesEntry, Equatable { return lhs.enableBiometrics == rhs.enableBiometrics && lhs.autolockTimeout == rhs.autolockTimeout && lhs.biometricsDomainState == rhs.biometricsDomainState && lhs.shareBiometricsDomainState == rhs.shareBiometricsDomainState } - func withUpdatedEnableBiometrics(_ enableBiometrics: Bool) -> PresentationPasscodeSettings { + public func withUpdatedEnableBiometrics(_ enableBiometrics: Bool) -> PresentationPasscodeSettings { return PresentationPasscodeSettings(enableBiometrics: enableBiometrics, autolockTimeout: self.autolockTimeout, biometricsDomainState: self.biometricsDomainState, shareBiometricsDomainState: self.shareBiometricsDomainState) } - func withUpdatedAutolockTimeout(_ autolockTimeout: Int32?) -> PresentationPasscodeSettings { + public func withUpdatedAutolockTimeout(_ autolockTimeout: Int32?) -> PresentationPasscodeSettings { return PresentationPasscodeSettings(enableBiometrics: self.enableBiometrics, autolockTimeout: autolockTimeout, biometricsDomainState: self.biometricsDomainState, shareBiometricsDomainState: self.shareBiometricsDomainState) } - func withUpdatedBiometricsDomainState(_ biometricsDomainState: Data?) -> PresentationPasscodeSettings { + public func withUpdatedBiometricsDomainState(_ biometricsDomainState: Data?) -> PresentationPasscodeSettings { return PresentationPasscodeSettings(enableBiometrics: self.enableBiometrics, autolockTimeout: autolockTimeout, biometricsDomainState: biometricsDomainState, shareBiometricsDomainState: self.shareBiometricsDomainState) } - func withUpdatedShareBiometricsDomainState(_ shareBiometricsDomainState: Data?) -> PresentationPasscodeSettings { + public func withUpdatedShareBiometricsDomainState(_ shareBiometricsDomainState: Data?) -> PresentationPasscodeSettings { return PresentationPasscodeSettings(enableBiometrics: self.enableBiometrics, autolockTimeout: autolockTimeout, biometricsDomainState: self.biometricsDomainState, shareBiometricsDomainState: shareBiometricsDomainState) } } -func updatePresentationPasscodeSettingsInteractively(accountManager: AccountManager, _ f: @escaping (PresentationPasscodeSettings) -> PresentationPasscodeSettings) -> Signal { +public func updatePresentationPasscodeSettingsInteractively(accountManager: AccountManager, _ f: @escaping (PresentationPasscodeSettings) -> PresentationPasscodeSettings) -> Signal { return accountManager.transaction { transaction -> Void in updatePresentationPasscodeSettingsInternal(transaction: transaction, f) } } -func updatePresentationPasscodeSettingsInternal(transaction: AccountManagerModifier, _ f: @escaping (PresentationPasscodeSettings) -> PresentationPasscodeSettings) { +public func updatePresentationPasscodeSettingsInternal(transaction: AccountManagerModifier, _ f: @escaping (PresentationPasscodeSettings) -> PresentationPasscodeSettings) { transaction.updateSharedData(ApplicationSpecificSharedDataKeys.presentationPasscodeSettings, { entry in let currentSettings: PresentationPasscodeSettings if let entry = entry as? PresentationPasscodeSettings { diff --git a/submodules/TelegramUI/TelegramUI/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift similarity index 99% rename from submodules/TelegramUI/TelegramUI/PresentationThemeSettings.swift rename to submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index bfb6d184d2..88cf1c3af1 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -57,7 +57,7 @@ public enum PresentationThemeReference: PostboxCoding, Equatable { } } - var index: Int64 { + public var index: Int64 { let namespace: Int32 let id: Int32 switch self { diff --git a/submodules/TelegramUI/TelegramUI/RenderedTotalUnreadCount.swift b/submodules/TelegramUIPreferences/Sources/RenderedTotalUnreadCount.swift similarity index 93% rename from submodules/TelegramUI/TelegramUI/RenderedTotalUnreadCount.swift rename to submodules/TelegramUIPreferences/Sources/RenderedTotalUnreadCount.swift index ee5a9782ff..c0c8767fbb 100644 --- a/submodules/TelegramUI/TelegramUI/RenderedTotalUnreadCount.swift +++ b/submodules/TelegramUIPreferences/Sources/RenderedTotalUnreadCount.swift @@ -12,7 +12,7 @@ public func renderedTotalUnreadCount(inAppNotificationSettings: InAppNotificatio return renderedTotalUnreadCount(inAppSettings: inAppNotificationSettings, totalUnreadState: totalUnreadState) } -func renderedTotalUnreadCount(inAppSettings: InAppNotificationSettings, totalUnreadState: ChatListTotalUnreadState) -> (Int32, RenderedTotalUnreadCountType) { +public func renderedTotalUnreadCount(inAppSettings: InAppNotificationSettings, totalUnreadState: ChatListTotalUnreadState) -> (Int32, RenderedTotalUnreadCountType) { let type: RenderedTotalUnreadCountType switch inAppSettings.totalUnreadCountDisplayStyle { case .raw: diff --git a/submodules/TelegramUI/TelegramUI/StickerSettings.swift b/submodules/TelegramUIPreferences/Sources/StickerSettings.swift similarity index 86% rename from submodules/TelegramUI/TelegramUI/StickerSettings.swift rename to submodules/TelegramUIPreferences/Sources/StickerSettings.swift index 77b5c2a830..79244f2e03 100644 --- a/submodules/TelegramUI/TelegramUI/StickerSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/StickerSettings.swift @@ -39,12 +39,12 @@ public struct StickerSettings: PreferencesEntry, Equatable { return lhs.emojiStickerSuggestionMode == rhs.emojiStickerSuggestionMode } - func withUpdatedEmojiStickerSuggestionMode(_ emojiStickerSuggestionMode: EmojiStickerSuggestionMode) -> StickerSettings { + public func withUpdatedEmojiStickerSuggestionMode(_ emojiStickerSuggestionMode: EmojiStickerSuggestionMode) -> StickerSettings { return StickerSettings(emojiStickerSuggestionMode: emojiStickerSuggestionMode) } } -func updateStickerSettingsInteractively(accountManager: AccountManager, _ f: @escaping (StickerSettings) -> StickerSettings) -> Signal { +public func updateStickerSettingsInteractively(accountManager: AccountManager, _ f: @escaping (StickerSettings) -> StickerSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.stickerSettings, { entry in let currentSettings: StickerSettings diff --git a/submodules/TelegramUIPreferences/Sources/TelegramUIPreferences.h b/submodules/TelegramUIPreferences/Sources/TelegramUIPreferences.h new file mode 100644 index 0000000000..72e77250e5 --- /dev/null +++ b/submodules/TelegramUIPreferences/Sources/TelegramUIPreferences.h @@ -0,0 +1,19 @@ +// +// TelegramUIPreferences.h +// TelegramUIPreferences +// +// Created by Peter on 6/13/19. +// Copyright © 2019 Telegram LLP. All rights reserved. +// + +#import + +//! Project version number for TelegramUIPreferences. +FOUNDATION_EXPORT double TelegramUIPreferencesVersionNumber; + +//! Project version string for TelegramUIPreferences. +FOUNDATION_EXPORT const unsigned char TelegramUIPreferencesVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/TelegramUI/TelegramUI/VoiceCallSettings.swift b/submodules/TelegramUIPreferences/Sources/VoiceCallSettings.swift similarity index 87% rename from submodules/TelegramUI/TelegramUI/VoiceCallSettings.swift rename to submodules/TelegramUIPreferences/Sources/VoiceCallSettings.swift index b2aabc038b..91f87db642 100644 --- a/submodules/TelegramUI/TelegramUI/VoiceCallSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/VoiceCallSettings.swift @@ -3,7 +3,7 @@ import Postbox import TelegramCore import SwiftSignalKit -func effectiveDataSaving(for settings: VoiceCallSettings?, autodownloadSettings: AutodownloadSettings) -> VoiceCallDataSaving { +public func effectiveDataSaving(for settings: VoiceCallSettings?, autodownloadSettings: AutodownloadSettings) -> VoiceCallDataSaving { if let settings = settings { if case .default = settings.dataSaving { switch (autodownloadSettings.mediumPreset.lessDataForPhoneCalls, autodownloadSettings.highPreset.lessDataForPhoneCalls) { @@ -37,7 +37,7 @@ public struct VoiceCallSettings: PreferencesEntry, Equatable { return VoiceCallSettings(dataSaving: .default, enableSystemIntegration: true) } - init(dataSaving: VoiceCallDataSaving, enableSystemIntegration: Bool) { + public init(dataSaving: VoiceCallDataSaving, enableSystemIntegration: Bool) { self.dataSaving = dataSaving self.enableSystemIntegration = enableSystemIntegration } @@ -71,7 +71,7 @@ public struct VoiceCallSettings: PreferencesEntry, Equatable { } } -func updateVoiceCallSettingsSettingsInteractively(accountManager: AccountManager, _ f: @escaping (VoiceCallSettings) -> VoiceCallSettings) -> Signal { +public func updateVoiceCallSettingsSettingsInteractively(accountManager: AccountManager, _ f: @escaping (VoiceCallSettings) -> VoiceCallSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.voiceCallSettings, { entry in let currentSettings: VoiceCallSettings diff --git a/submodules/TelegramUI/TelegramUI/VoipDerivedState.swift b/submodules/TelegramUIPreferences/Sources/VoipDerivedState.swift similarity index 65% rename from submodules/TelegramUI/TelegramUI/VoipDerivedState.swift rename to submodules/TelegramUIPreferences/Sources/VoipDerivedState.swift index 3e370e7905..eb11fd9455 100644 --- a/submodules/TelegramUI/TelegramUI/VoipDerivedState.swift +++ b/submodules/TelegramUIPreferences/Sources/VoipDerivedState.swift @@ -2,26 +2,26 @@ import Foundation import Postbox import SwiftSignalKit -struct VoipDerivedState: Equatable, PreferencesEntry { - var data: Data +public struct VoipDerivedState: Equatable, PreferencesEntry { + public var data: Data - static var `default`: VoipDerivedState { + public static var `default`: VoipDerivedState { return VoipDerivedState(data: Data()) } - init(data: Data) { + public init(data: Data) { self.data = data } - init(decoder: PostboxDecoder) { + public init(decoder: PostboxDecoder) { self.data = decoder.decodeDataForKey("data") ?? Data() } - func encode(_ encoder: PostboxEncoder) { + public func encode(_ encoder: PostboxEncoder) { encoder.encodeData(self.data, forKey: "data") } - func isEqual(to: PreferencesEntry) -> Bool { + public func isEqual(to: PreferencesEntry) -> Bool { if let to = to as? VoipDerivedState { return self == to } else { @@ -30,7 +30,7 @@ struct VoipDerivedState: Equatable, PreferencesEntry { } } -func updateVoipDerivedStateInteractively(postbox: Postbox, _ f: @escaping (VoipDerivedState) -> VoipDerivedState) -> Signal { +public func updateVoipDerivedStateInteractively(postbox: Postbox, _ f: @escaping (VoipDerivedState) -> VoipDerivedState) -> Signal { return postbox.transaction { transaction -> Void in transaction.updatePreferencesEntry(key: ApplicationSpecificPreferencesKeys.voipDerivedState, { entry in let currentSettings: VoipDerivedState diff --git a/submodules/TelegramUI/TelegramUI/WatchPresetSettings.swift b/submodules/TelegramUIPreferences/Sources/WatchPresetSettings.swift similarity index 92% rename from submodules/TelegramUI/TelegramUI/WatchPresetSettings.swift rename to submodules/TelegramUIPreferences/Sources/WatchPresetSettings.swift index 4f1551038b..a6d09d5bca 100644 --- a/submodules/TelegramUI/TelegramUI/WatchPresetSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/WatchPresetSettings.swift @@ -53,7 +53,7 @@ public struct WatchPresetSettings: PreferencesEntry, Equatable { } } -func updateWatchPresetSettingsInteractively(accountManager: AccountManager, _ f: @escaping (WatchPresetSettings) -> WatchPresetSettings) -> Signal { +public func updateWatchPresetSettingsInteractively(accountManager: AccountManager, _ f: @escaping (WatchPresetSettings) -> WatchPresetSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.watchPresetSettings, { entry in let currentSettings: WatchPresetSettings diff --git a/submodules/TelegramUI/TelegramUI/WebSearchSettings.swift b/submodules/TelegramUIPreferences/Sources/WebSearchSettings.swift similarity index 61% rename from submodules/TelegramUI/TelegramUI/WebSearchSettings.swift rename to submodules/TelegramUIPreferences/Sources/WebSearchSettings.swift index 2bd39e03ee..a21413a4d4 100644 --- a/submodules/TelegramUI/TelegramUI/WebSearchSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/WebSearchSettings.swift @@ -2,26 +2,31 @@ import Foundation import Postbox import SwiftSignalKit -struct WebSearchSettings: Equatable, PreferencesEntry { - var scope: WebSearchScope +public enum WebSearchScope: Int32 { + case images + case gifs +} + +public struct WebSearchSettings: Equatable, PreferencesEntry { + public var scope: WebSearchScope - static var defaultSettings: WebSearchSettings { + public static var defaultSettings: WebSearchSettings { return WebSearchSettings(scope: .images) } - init(scope: WebSearchScope) { + public init(scope: WebSearchScope) { self.scope = scope } - init(decoder: PostboxDecoder) { + public init(decoder: PostboxDecoder) { self.scope = WebSearchScope(rawValue: decoder.decodeInt32ForKey("scope", orElse: 0)) ?? .images } - func encode(_ encoder: PostboxEncoder) { + public func encode(_ encoder: PostboxEncoder) { encoder.encodeInt32(self.scope.rawValue, forKey: "scope") } - func isEqual(to: PreferencesEntry) -> Bool { + public func isEqual(to: PreferencesEntry) -> Bool { if let to = to as? WebSearchSettings { return self == to } else { @@ -30,7 +35,7 @@ struct WebSearchSettings: Equatable, PreferencesEntry { } } -func updateWebSearchSettingsInteractively(accountManager: AccountManager, _ f: @escaping (WebSearchSettings) -> WebSearchSettings) -> Signal { +public func updateWebSearchSettingsInteractively(accountManager: AccountManager, _ f: @escaping (WebSearchSettings) -> WebSearchSettings) -> Signal { return accountManager.transaction { transaction -> Void in transaction.updateSharedData(ApplicationSpecificSharedDataKeys.webSearchSettings, { entry in let currentSettings: WebSearchSettings diff --git a/submodules/TelegramUIPreferences/TelegramUIPreferences_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUIPreferences/TelegramUIPreferences_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..eb1d681de6 --- /dev/null +++ b/submodules/TelegramUIPreferences/TelegramUIPreferences_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,631 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D008185D22B58848008A895F /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008185C22B58848008A895F /* Postbox.framework */; }; + D008185F22B58850008A895F /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008185E22B58850008A895F /* TelegramCore.framework */; }; + D008186122B58853008A895F /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D008186022B58853008A895F /* SwiftSignalKit.framework */; }; + D0AE312522B1DE420058D3BC /* TelegramUIPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE312322B1DE420058D3BC /* TelegramUIPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE313F22B1DEAC0058D3BC /* WebSearchSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE312B22B1DEAA0058D3BC /* WebSearchSettings.swift */; }; + D0AE314022B1DEAC0058D3BC /* StickerSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE312C22B1DEAB0058D3BC /* StickerSettings.swift */; }; + D0AE314122B1DEAC0058D3BC /* PresentationPasscodeSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE312D22B1DEAB0058D3BC /* PresentationPasscodeSettings.swift */; }; + D0AE314222B1DEAC0058D3BC /* InstantPagePresentationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE312E22B1DEAB0058D3BC /* InstantPagePresentationSettings.swift */; }; + D0AE314322B1DEAC0058D3BC /* ExperimentalSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE312F22B1DEAB0058D3BC /* ExperimentalSettings.swift */; }; + D0AE314422B1DEAC0058D3BC /* WatchPresetSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313022B1DEAB0058D3BC /* WatchPresetSettings.swift */; }; + D0AE314522B1DEAC0058D3BC /* RenderedTotalUnreadCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313122B1DEAB0058D3BC /* RenderedTotalUnreadCount.swift */; }; + D0AE314622B1DEAC0058D3BC /* InAppNotificationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313222B1DEAB0058D3BC /* InAppNotificationSettings.swift */; }; + D0AE314722B1DEAC0058D3BC /* MediaAutoDownloadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313322B1DEAB0058D3BC /* MediaAutoDownloadSettings.swift */; }; + D0AE314822B1DEAC0058D3BC /* LegacyAutomaticMediaDownloadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313422B1DEAB0058D3BC /* LegacyAutomaticMediaDownloadSettings.swift */; }; + D0AE314922B1DEAC0058D3BC /* MediaInputSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313522B1DEAB0058D3BC /* MediaInputSettings.swift */; }; + D0AE314A22B1DEAC0058D3BC /* ExperimentalUISettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313622B1DEAB0058D3BC /* ExperimentalUISettings.swift */; }; + D0AE314B22B1DEAC0058D3BC /* ChatArchiveSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313722B1DEAB0058D3BC /* ChatArchiveSettings.swift */; }; + D0AE314C22B1DEAC0058D3BC /* GeneratedMediaStoreSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313822B1DEAB0058D3BC /* GeneratedMediaStoreSettings.swift */; }; + D0AE314D22B1DEAC0058D3BC /* VoiceCallSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313922B1DEAC0058D3BC /* VoiceCallSettings.swift */; }; + D0AE314E22B1DEAC0058D3BC /* MusicPlaybackSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313A22B1DEAC0058D3BC /* MusicPlaybackSettings.swift */; }; + D0AE314F22B1DEAC0058D3BC /* PresentationThemeSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313B22B1DEAC0058D3BC /* PresentationThemeSettings.swift */; }; + D0AE315022B1DEAC0058D3BC /* CallListSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313C22B1DEAC0058D3BC /* CallListSettings.swift */; }; + D0AE315122B1DEAC0058D3BC /* ContactSynchronizationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313D22B1DEAC0058D3BC /* ContactSynchronizationSettings.swift */; }; + D0AE315222B1DEAC0058D3BC /* VoipDerivedState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE313E22B1DEAC0058D3BC /* VoipDerivedState.swift */; }; + D0AE315922B1DF770058D3BC /* PostboxKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE315822B1DF770058D3BC /* PostboxKeys.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D008185C22B58848008A895F /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008185E22B58850008A895F /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008186022B58853008A895F /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE312022B1DE420058D3BC /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE312322B1DE420058D3BC /* TelegramUIPreferences.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramUIPreferences.h; sourceTree = ""; }; + D0AE312422B1DE420058D3BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE312B22B1DEAA0058D3BC /* WebSearchSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebSearchSettings.swift; sourceTree = ""; }; + D0AE312C22B1DEAB0058D3BC /* StickerSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerSettings.swift; sourceTree = ""; }; + D0AE312D22B1DEAB0058D3BC /* PresentationPasscodeSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationPasscodeSettings.swift; sourceTree = ""; }; + D0AE312E22B1DEAB0058D3BC /* InstantPagePresentationSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstantPagePresentationSettings.swift; sourceTree = ""; }; + D0AE312F22B1DEAB0058D3BC /* ExperimentalSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExperimentalSettings.swift; sourceTree = ""; }; + D0AE313022B1DEAB0058D3BC /* WatchPresetSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchPresetSettings.swift; sourceTree = ""; }; + D0AE313122B1DEAB0058D3BC /* RenderedTotalUnreadCount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RenderedTotalUnreadCount.swift; sourceTree = ""; }; + D0AE313222B1DEAB0058D3BC /* InAppNotificationSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InAppNotificationSettings.swift; sourceTree = ""; }; + D0AE313322B1DEAB0058D3BC /* MediaAutoDownloadSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaAutoDownloadSettings.swift; sourceTree = ""; }; + D0AE313422B1DEAB0058D3BC /* LegacyAutomaticMediaDownloadSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyAutomaticMediaDownloadSettings.swift; sourceTree = ""; }; + D0AE313522B1DEAB0058D3BC /* MediaInputSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaInputSettings.swift; sourceTree = ""; }; + D0AE313622B1DEAB0058D3BC /* ExperimentalUISettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExperimentalUISettings.swift; sourceTree = ""; }; + D0AE313722B1DEAB0058D3BC /* ChatArchiveSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatArchiveSettings.swift; sourceTree = ""; }; + D0AE313822B1DEAB0058D3BC /* GeneratedMediaStoreSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedMediaStoreSettings.swift; sourceTree = ""; }; + D0AE313922B1DEAC0058D3BC /* VoiceCallSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoiceCallSettings.swift; sourceTree = ""; }; + D0AE313A22B1DEAC0058D3BC /* MusicPlaybackSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MusicPlaybackSettings.swift; sourceTree = ""; }; + D0AE313B22B1DEAC0058D3BC /* PresentationThemeSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationThemeSettings.swift; sourceTree = ""; }; + D0AE313C22B1DEAC0058D3BC /* CallListSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallListSettings.swift; sourceTree = ""; }; + D0AE313D22B1DEAC0058D3BC /* ContactSynchronizationSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactSynchronizationSettings.swift; sourceTree = ""; }; + D0AE313E22B1DEAC0058D3BC /* VoipDerivedState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipDerivedState.swift; sourceTree = ""; }; + D0AE315822B1DF770058D3BC /* PostboxKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostboxKeys.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE311D22B1DE420058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D008186122B58853008A895F /* SwiftSignalKit.framework in Frameworks */, + D008185F22B58850008A895F /* TelegramCore.framework in Frameworks */, + D008185D22B58848008A895F /* Postbox.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D008185B22B58848008A895F /* Frameworks */ = { + isa = PBXGroup; + children = ( + D008186022B58853008A895F /* SwiftSignalKit.framework */, + D008185E22B58850008A895F /* TelegramCore.framework */, + D008185C22B58848008A895F /* Postbox.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + D0AE311622B1DE420058D3BC = { + isa = PBXGroup; + children = ( + D0AE312422B1DE420058D3BC /* Info.plist */, + D0AE312222B1DE420058D3BC /* Sources */, + D0AE312122B1DE420058D3BC /* Products */, + D008185B22B58848008A895F /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE312122B1DE420058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE312022B1DE420058D3BC /* TelegramUIPreferences.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE312222B1DE420058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE315822B1DF770058D3BC /* PostboxKeys.swift */, + D0AE313C22B1DEAC0058D3BC /* CallListSettings.swift */, + D0AE313722B1DEAB0058D3BC /* ChatArchiveSettings.swift */, + D0AE313D22B1DEAC0058D3BC /* ContactSynchronizationSettings.swift */, + D0AE312F22B1DEAB0058D3BC /* ExperimentalSettings.swift */, + D0AE313622B1DEAB0058D3BC /* ExperimentalUISettings.swift */, + D0AE313822B1DEAB0058D3BC /* GeneratedMediaStoreSettings.swift */, + D0AE313222B1DEAB0058D3BC /* InAppNotificationSettings.swift */, + D0AE312E22B1DEAB0058D3BC /* InstantPagePresentationSettings.swift */, + D0AE313422B1DEAB0058D3BC /* LegacyAutomaticMediaDownloadSettings.swift */, + D0AE313322B1DEAB0058D3BC /* MediaAutoDownloadSettings.swift */, + D0AE313522B1DEAB0058D3BC /* MediaInputSettings.swift */, + D0AE313A22B1DEAC0058D3BC /* MusicPlaybackSettings.swift */, + D0AE312D22B1DEAB0058D3BC /* PresentationPasscodeSettings.swift */, + D0AE313B22B1DEAC0058D3BC /* PresentationThemeSettings.swift */, + D0AE313122B1DEAB0058D3BC /* RenderedTotalUnreadCount.swift */, + D0AE312C22B1DEAB0058D3BC /* StickerSettings.swift */, + D0AE313922B1DEAC0058D3BC /* VoiceCallSettings.swift */, + D0AE313E22B1DEAC0058D3BC /* VoipDerivedState.swift */, + D0AE313022B1DEAB0058D3BC /* WatchPresetSettings.swift */, + D0AE312B22B1DEAA0058D3BC /* WebSearchSettings.swift */, + D0AE312322B1DE420058D3BC /* TelegramUIPreferences.h */, + ); + path = Sources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE311B22B1DE420058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE312522B1DE420058D3BC /* TelegramUIPreferences.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE311F22B1DE420058D3BC /* TelegramUIPreferences */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE312822B1DE420058D3BC /* Build configuration list for PBXNativeTarget "TelegramUIPreferences" */; + buildPhases = ( + D0AE311B22B1DE420058D3BC /* Headers */, + D0AE311C22B1DE420058D3BC /* Sources */, + D0AE311D22B1DE420058D3BC /* Frameworks */, + D0AE311E22B1DE420058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelegramUIPreferences; + productName = TelegramUIPreferences; + productReference = D0AE312022B1DE420058D3BC /* TelegramUIPreferences.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE311722B1DE420058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE311F22B1DE420058D3BC = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D0AE311A22B1DE420058D3BC /* Build configuration list for PBXProject "TelegramUIPreferences_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE311622B1DE420058D3BC; + productRefGroup = D0AE312122B1DE420058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE311F22B1DE420058D3BC /* TelegramUIPreferences */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE311E22B1DE420058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE311C22B1DE420058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE314822B1DEAC0058D3BC /* LegacyAutomaticMediaDownloadSettings.swift in Sources */, + D0AE314022B1DEAC0058D3BC /* StickerSettings.swift in Sources */, + D0AE314B22B1DEAC0058D3BC /* ChatArchiveSettings.swift in Sources */, + D0AE315222B1DEAC0058D3BC /* VoipDerivedState.swift in Sources */, + D0AE314422B1DEAC0058D3BC /* WatchPresetSettings.swift in Sources */, + D0AE314622B1DEAC0058D3BC /* InAppNotificationSettings.swift in Sources */, + D0AE315922B1DF770058D3BC /* PostboxKeys.swift in Sources */, + D0AE314122B1DEAC0058D3BC /* PresentationPasscodeSettings.swift in Sources */, + D0AE314322B1DEAC0058D3BC /* ExperimentalSettings.swift in Sources */, + D0AE315122B1DEAC0058D3BC /* ContactSynchronizationSettings.swift in Sources */, + D0AE314D22B1DEAC0058D3BC /* VoiceCallSettings.swift in Sources */, + D0AE314522B1DEAC0058D3BC /* RenderedTotalUnreadCount.swift in Sources */, + D0AE313F22B1DEAC0058D3BC /* WebSearchSettings.swift in Sources */, + D0AE314A22B1DEAC0058D3BC /* ExperimentalUISettings.swift in Sources */, + D0AE314922B1DEAC0058D3BC /* MediaInputSettings.swift in Sources */, + D0AE314722B1DEAC0058D3BC /* MediaAutoDownloadSettings.swift in Sources */, + D0AE314222B1DEAC0058D3BC /* InstantPagePresentationSettings.swift in Sources */, + D0AE314C22B1DEAC0058D3BC /* GeneratedMediaStoreSettings.swift in Sources */, + D0AE314E22B1DEAC0058D3BC /* MusicPlaybackSettings.swift in Sources */, + D0AE315022B1DEAC0058D3BC /* CallListSettings.swift in Sources */, + D0AE314F22B1DEAC0058D3BC /* PresentationThemeSettings.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B6622B5BF0500AD4DE8 /* 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; + }; + D0A25B6722B5BF0500AD4DE8 /* 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.TelegramUIPreferences; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B7F22B5BF4E00AD4DE8 /* 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; + }; + D0A25B8022B5BF4E00AD4DE8 /* 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.TelegramUIPreferences; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE312622B1DE420058D3BC /* 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; + }; + D0AE312722B1DE420058D3BC /* 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; + }; + D0AE312922B1DE420058D3BC /* 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.TelegramUIPreferences; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE312A22B1DE420058D3BC /* 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.TelegramUIPreferences; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE311A22B1DE420058D3BC /* Build configuration list for PBXProject "TelegramUIPreferences_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE312622B1DE420058D3BC /* DebugAppStoreLLC */, + D0A25B6622B5BF0500AD4DE8 /* DebugHockeyapp */, + D0AE312722B1DE420058D3BC /* ReleaseAppStoreLLC */, + D0A25B7F22B5BF4E00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE312822B1DE420058D3BC /* Build configuration list for PBXNativeTarget "TelegramUIPreferences" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE312922B1DE420058D3BC /* DebugAppStoreLLC */, + D0A25B6722B5BF0500AD4DE8 /* DebugHockeyapp */, + D0AE312A22B1DE420058D3BC /* ReleaseAppStoreLLC */, + D0A25B8022B5BF4E00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE311722B1DE420058D3BC /* Project object */; +} diff --git a/submodules/TelegramVoip/Info.plist b/submodules/TelegramVoip/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/TelegramVoip/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/TelegramUI/TelegramUI/OngoingCallContext.swift b/submodules/TelegramVoip/Sources/OngoingCallContext.swift similarity index 89% rename from submodules/TelegramUI/TelegramUI/OngoingCallContext.swift rename to submodules/TelegramVoip/Sources/OngoingCallContext.swift index b21b7ca625..ef378a70eb 100644 --- a/submodules/TelegramUI/TelegramUI/OngoingCallContext.swift +++ b/submodules/TelegramVoip/Sources/OngoingCallContext.swift @@ -2,8 +2,7 @@ import Foundation import SwiftSignalKit import TelegramCore import Postbox - -import TelegramUIPrivateModule +import TelegramUIPreferences private func callConnectionDescription(_ connection: CallSessionConnection) -> OngoingCallConnectionDescription { return OngoingCallConnectionDescription(connectionId: connection.id, ip: connection.ip, ipv6: connection.ipv6, port: connection.port, peerTag: connection.peerTag) @@ -11,7 +10,7 @@ private func callConnectionDescription(_ connection: CallSessionConnection) -> O private let callLogsLimit = 20 -func callLogNameForId(id: Int64, account: Account) -> String? { +public func callLogNameForId(id: Int64, account: Account) -> String? { let path = callLogsPath(account: account) let namePrefix = "\(id)_" @@ -27,7 +26,7 @@ func callLogNameForId(id: Int64, account: Account) -> String? { return nil } -func callLogsPath(account: Account) -> String { +public func callLogsPath(account: Account) -> String { return account.basePath + "/calls" } @@ -70,7 +69,7 @@ private let setupLogs: Bool = { return true }() -enum OngoingCallContextState { +public enum OngoingCallContextState { case initializing case connected case failed @@ -129,8 +128,8 @@ private func ongoingDataSavingForType(_ type: VoiceCallDataSaving) -> OngoingCal } } -final class OngoingCallContext { - let internalId: CallSessionInternalId +public final class OngoingCallContext { + public let internalId: CallSessionInternalId private let queue = Queue() private let account: Account @@ -139,7 +138,7 @@ final class OngoingCallContext { private var contextRef: Unmanaged? private let contextState = Promise(nil) - var state: Signal { + public var state: Signal { return self.contextState.get() |> map { $0.flatMap { @@ -156,18 +155,18 @@ final class OngoingCallContext { } private let receptionPromise = Promise(nil) - var reception: Signal { + public var reception: Signal { return self.receptionPromise.get() } private let audioSessionDisposable = MetaDisposable() private var networkTypeDisposable: Disposable? - static var maxLayer: Int32 { + public static var maxLayer: Int32 { return OngoingCallThreadLocalContext.maxLayer() } - init(account: Account, callSessionManager: CallSessionManager, internalId: CallSessionInternalId, proxyServer: ProxyServerSettings?, initialNetworkType: NetworkType, updatedNetworkType: Signal, serializedData: String?, dataSaving: VoiceCallDataSaving, derivedState: VoipDerivedState) { + public init(account: Account, callSessionManager: CallSessionManager, internalId: CallSessionInternalId, proxyServer: ProxyServerSettings?, initialNetworkType: NetworkType, updatedNetworkType: Signal, serializedData: String?, dataSaving: VoiceCallDataSaving, derivedState: VoipDerivedState) { let _ = setupLogs OngoingCallThreadLocalContext.applyServerConfig(serializedData) @@ -225,7 +224,7 @@ final class OngoingCallContext { } } - func start(key: Data, isOutgoing: Bool, connections: CallSessionConnectionSet, maxLayer: Int32, allowP2P: Bool, audioSessionActive: Signal, logName: String) { + public func start(key: Data, isOutgoing: Bool, connections: CallSessionConnectionSet, maxLayer: Int32, allowP2P: Bool, audioSessionActive: Signal, logName: String) { let logPath = logName.isEmpty ? "" : callLogsPath(account: self.account) + "/" + logName + ".log" self.audioSessionDisposable.set((audioSessionActive |> filter { $0 } @@ -238,7 +237,7 @@ final class OngoingCallContext { })) } - func stop(callId: CallId? = nil, sendDebugLogs: Bool = false) { + public func stop(callId: CallId? = nil, sendDebugLogs: Bool = false) { self.withContext { context in context.stop { debugLog, bytesSentWifi, bytesReceivedWifi, bytesSentMobile, bytesReceivedMobile in let delta = NetworkUsageStatsConnectionsEntry( @@ -261,13 +260,13 @@ final class OngoingCallContext { } } - func setIsMuted(_ value: Bool) { + public func setIsMuted(_ value: Bool) { self.withContext { context in context.setIsMuted(value) } } - func debugInfo() -> Signal<(String, String), NoError> { + public func debugInfo() -> Signal<(String, String), NoError> { let poll = Signal<(String, String), NoError> { subscriber in self.withContext { context in let version = context.version() @@ -283,7 +282,7 @@ final class OngoingCallContext { return (poll |> then(.complete() |> delay(0.5, queue: Queue.concurrentDefaultQueue()))) |> restart } - func needsRating(_ completion: @escaping (Bool) -> Void) { + public func needsRating(_ completion: @escaping (Bool) -> Void) { self.withContext { context in let needsRating = context.needRate() Queue.mainQueue().async { diff --git a/submodules/TelegramUI/TelegramUI/OngoingCallThreadLocalContext.h b/submodules/TelegramVoip/Sources/OngoingCallThreadLocalContext.h similarity index 100% rename from submodules/TelegramUI/TelegramUI/OngoingCallThreadLocalContext.h rename to submodules/TelegramVoip/Sources/OngoingCallThreadLocalContext.h diff --git a/submodules/TelegramUI/TelegramUI/OngoingCallThreadLocalContext.mm b/submodules/TelegramVoip/Sources/OngoingCallThreadLocalContext.mm similarity index 100% rename from submodules/TelegramUI/TelegramUI/OngoingCallThreadLocalContext.mm rename to submodules/TelegramVoip/Sources/OngoingCallThreadLocalContext.mm diff --git a/submodules/TelegramVoip/Sources/TelegramVoip.h b/submodules/TelegramVoip/Sources/TelegramVoip.h new file mode 100644 index 0000000000..2043b2c1d8 --- /dev/null +++ b/submodules/TelegramVoip/Sources/TelegramVoip.h @@ -0,0 +1,9 @@ +#import + +//! Project version number for TelegramVoip. +FOUNDATION_EXPORT double TelegramVoipVersionNumber; + +//! Project version string for TelegramVoip. +FOUNDATION_EXPORT const unsigned char TelegramVoipVersionString[]; + +#import diff --git a/submodules/TelegramVoip/TelegramVoip_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramVoip/TelegramVoip_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..ad6fa262f7 --- /dev/null +++ b/submodules/TelegramVoip/TelegramVoip_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,555 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D0AE316922B2694E0058D3BC /* TelegramVoip.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE316722B2694E0058D3BC /* TelegramVoip.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE317122B269E40058D3BC /* OngoingCallThreadLocalContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0AE316F22B269E30058D3BC /* OngoingCallThreadLocalContext.mm */; }; + D0AE317222B269E40058D3BC /* OngoingCallThreadLocalContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D0AE317022B269E40058D3BC /* OngoingCallThreadLocalContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0AE317622B26F020058D3BC /* OngoingCallContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE317522B26F010058D3BC /* OngoingCallContext.swift */; }; + D0AE317922B26F400058D3BC /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE317822B26F400058D3BC /* Postbox.framework */; }; + D0AE317B22B26F470058D3BC /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE317A22B26F470058D3BC /* TelegramCore.framework */; }; + D0AE317D22B26F4B0058D3BC /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE317C22B26F4B0058D3BC /* SwiftSignalKit.framework */; }; + D0AE317F22B26F6B0058D3BC /* TelegramUIPreferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE317E22B26F6B0058D3BC /* TelegramUIPreferences.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D0AE316422B2694E0058D3BC /* TelegramVoip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramVoip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE316722B2694E0058D3BC /* TelegramVoip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TelegramVoip.h; sourceTree = ""; }; + D0AE316822B2694E0058D3BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D0AE316F22B269E30058D3BC /* OngoingCallThreadLocalContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OngoingCallThreadLocalContext.mm; sourceTree = ""; }; + D0AE317022B269E40058D3BC /* OngoingCallThreadLocalContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OngoingCallThreadLocalContext.h; sourceTree = ""; }; + D0AE317522B26F010058D3BC /* OngoingCallContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OngoingCallContext.swift; sourceTree = ""; }; + D0AE317822B26F400058D3BC /* Postbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE317A22B26F470058D3BC /* TelegramCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE317C22B26F4B0058D3BC /* SwiftSignalKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0AE317E22B26F6B0058D3BC /* TelegramUIPreferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramUIPreferences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D0AE316122B2694E0058D3BC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE317F22B26F6B0058D3BC /* TelegramUIPreferences.framework in Frameworks */, + D0AE317D22B26F4B0058D3BC /* SwiftSignalKit.framework in Frameworks */, + D0AE317B22B26F470058D3BC /* TelegramCore.framework in Frameworks */, + D0AE317922B26F400058D3BC /* Postbox.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0AE315A22B2694E0058D3BC = { + isa = PBXGroup; + children = ( + D0AE316822B2694E0058D3BC /* Info.plist */, + D0AE316622B2694E0058D3BC /* Sources */, + D0AE316522B2694E0058D3BC /* Products */, + D0AE317722B26F400058D3BC /* Frameworks */, + ); + sourceTree = ""; + }; + D0AE316522B2694E0058D3BC /* Products */ = { + isa = PBXGroup; + children = ( + D0AE316422B2694E0058D3BC /* TelegramVoip.framework */, + ); + name = Products; + sourceTree = ""; + }; + D0AE316622B2694E0058D3BC /* Sources */ = { + isa = PBXGroup; + children = ( + D0AE317522B26F010058D3BC /* OngoingCallContext.swift */, + D0AE317022B269E40058D3BC /* OngoingCallThreadLocalContext.h */, + D0AE316F22B269E30058D3BC /* OngoingCallThreadLocalContext.mm */, + D0AE316722B2694E0058D3BC /* TelegramVoip.h */, + ); + path = Sources; + sourceTree = ""; + }; + D0AE317722B26F400058D3BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0AE317E22B26F6B0058D3BC /* TelegramUIPreferences.framework */, + D0AE317C22B26F4B0058D3BC /* SwiftSignalKit.framework */, + D0AE317A22B26F470058D3BC /* TelegramCore.framework */, + D0AE317822B26F400058D3BC /* Postbox.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0AE315F22B2694E0058D3BC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE317222B269E40058D3BC /* OngoingCallThreadLocalContext.h in Headers */, + D0AE316922B2694E0058D3BC /* TelegramVoip.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D0AE316322B2694E0058D3BC /* TelegramVoip */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0AE316C22B2694E0058D3BC /* Build configuration list for PBXNativeTarget "TelegramVoip" */; + buildPhases = ( + D0AE315F22B2694E0058D3BC /* Headers */, + D0AE316022B2694E0058D3BC /* Sources */, + D0AE316122B2694E0058D3BC /* Frameworks */, + D0AE316222B2694E0058D3BC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelegramVoip; + productName = TelegramVoip; + productReference = D0AE316422B2694E0058D3BC /* TelegramVoip.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0AE315B22B2694E0058D3BC /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D0AE316322B2694E0058D3BC = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + }; + }; + buildConfigurationList = D0AE315E22B2694E0058D3BC /* Build configuration list for PBXProject "TelegramVoip_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D0AE315A22B2694E0058D3BC; + productRefGroup = D0AE316522B2694E0058D3BC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0AE316322B2694E0058D3BC /* TelegramVoip */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0AE316222B2694E0058D3BC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0AE316022B2694E0058D3BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D0AE317122B269E40058D3BC /* OngoingCallThreadLocalContext.mm in Sources */, + D0AE317622B26F020058D3BC /* OngoingCallContext.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D0A25B6422B5BEFC00AD4DE8 /* 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; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugHockeyapp; + }; + D0A25B6522B5BEFC00AD4DE8 /* 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.TelegramVoip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B7D22B5BF4B00AD4DE8 /* 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; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyappInternal; + }; + D0A25B7E22B5BF4B00AD4DE8 /* 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.TelegramVoip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0AE316A22B2694E0058D3BC /* 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; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = DebugAppStoreLLC; + }; + D0AE316B22B2694E0058D3BC /* 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; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStoreLLC; + }; + D0AE316D22B2694E0058D3BC /* 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.TelegramVoip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D0AE316E22B2694E0058D3BC /* 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.TelegramVoip; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0AE315E22B2694E0058D3BC /* Build configuration list for PBXProject "TelegramVoip_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE316A22B2694E0058D3BC /* DebugAppStoreLLC */, + D0A25B6422B5BEFC00AD4DE8 /* DebugHockeyapp */, + D0AE316B22B2694E0058D3BC /* ReleaseAppStoreLLC */, + D0A25B7D22B5BF4B00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D0AE316C22B2694E0058D3BC /* Build configuration list for PBXNativeTarget "TelegramVoip" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0AE316D22B2694E0058D3BC /* DebugAppStoreLLC */, + D0A25B6522B5BEFC00AD4DE8 /* DebugHockeyapp */, + D0AE316E22B2694E0058D3BC /* ReleaseAppStoreLLC */, + D0A25B7E22B5BF4B00AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0AE315B22B2694E0058D3BC /* Project object */; +} diff --git a/submodules/WatchCommon/Info.plist b/submodules/WatchCommon/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/WatchCommon/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/Watch/Bridge/TGBridgeActionMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeActionMediaAttachment.h similarity index 91% rename from Watch/Bridge/TGBridgeActionMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeActionMediaAttachment.h index 2c1fb44db1..cc88fd83d9 100644 --- a/Watch/Bridge/TGBridgeActionMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeActionMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif typedef NS_ENUM(NSUInteger, TGBridgeMessageAction) { TGBridgeMessageActionNone = 0, diff --git a/Watch/Bridge/TGBridgeActionMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeActionMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeActionMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeActionMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeAudioMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeAudioMediaAttachment.h similarity index 74% rename from Watch/Bridge/TGBridgeAudioMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeAudioMediaAttachment.h index 01b70fe351..9a318ad24a 100644 --- a/Watch/Bridge/TGBridgeAudioMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeAudioMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @interface TGBridgeAudioMediaAttachment : TGBridgeMediaAttachment diff --git a/Watch/Bridge/TGBridgeAudioMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeAudioMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeAudioMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeAudioMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeBotCommandInfo.h b/submodules/WatchCommon/Sources/TGBridgeBotCommandInfo.h similarity index 100% rename from Watch/Bridge/TGBridgeBotCommandInfo.h rename to submodules/WatchCommon/Sources/TGBridgeBotCommandInfo.h diff --git a/Watch/Bridge/TGBridgeBotCommandInfo.m b/submodules/WatchCommon/Sources/TGBridgeBotCommandInfo.m similarity index 100% rename from Watch/Bridge/TGBridgeBotCommandInfo.m rename to submodules/WatchCommon/Sources/TGBridgeBotCommandInfo.m diff --git a/Watch/Bridge/TGBridgeBotInfo.h b/submodules/WatchCommon/Sources/TGBridgeBotInfo.h similarity index 100% rename from Watch/Bridge/TGBridgeBotInfo.h rename to submodules/WatchCommon/Sources/TGBridgeBotInfo.h diff --git a/Watch/Bridge/TGBridgeBotInfo.m b/submodules/WatchCommon/Sources/TGBridgeBotInfo.m similarity index 100% rename from Watch/Bridge/TGBridgeBotInfo.m rename to submodules/WatchCommon/Sources/TGBridgeBotInfo.m diff --git a/Watch/Bridge/TGBridgeChat.h b/submodules/WatchCommon/Sources/TGBridgeChat.h similarity index 86% rename from Watch/Bridge/TGBridgeChat.h rename to submodules/WatchCommon/Sources/TGBridgeChat.h index 6f94f3df87..4bcfb2a9df 100644 --- a/Watch/Bridge/TGBridgeChat.h +++ b/submodules/WatchCommon/Sources/TGBridgeChat.h @@ -1,5 +1,10 @@ -#import "TGBridgeCommon.h" -#import "TGBridgeMessage.h" +#if TARGET_OS_WATCH +#import +#import +#else +#import +#import +#endif @interface TGBridgeChat : NSObject diff --git a/Watch/Bridge/TGBridgeChat.m b/submodules/WatchCommon/Sources/TGBridgeChat.m similarity index 100% rename from Watch/Bridge/TGBridgeChat.m rename to submodules/WatchCommon/Sources/TGBridgeChat.m diff --git a/Watch/Bridge/TGBridgeChatMessages.h b/submodules/WatchCommon/Sources/TGBridgeChatMessages.h similarity index 64% rename from Watch/Bridge/TGBridgeChatMessages.h rename to submodules/WatchCommon/Sources/TGBridgeChatMessages.h index 04e7220be7..027884407d 100644 --- a/Watch/Bridge/TGBridgeChatMessages.h +++ b/submodules/WatchCommon/Sources/TGBridgeChatMessages.h @@ -1,4 +1,8 @@ -#import "TGBridgeCommon.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @class SSignal; diff --git a/Watch/Bridge/TGBridgeChatMessages.m b/submodules/WatchCommon/Sources/TGBridgeChatMessages.m similarity index 100% rename from Watch/Bridge/TGBridgeChatMessages.m rename to submodules/WatchCommon/Sources/TGBridgeChatMessages.m diff --git a/Watch/Bridge/TGBridgeCommon.h b/submodules/WatchCommon/Sources/TGBridgeCommon.h similarity index 100% rename from Watch/Bridge/TGBridgeCommon.h rename to submodules/WatchCommon/Sources/TGBridgeCommon.h diff --git a/Watch/Bridge/TGBridgeCommon.m b/submodules/WatchCommon/Sources/TGBridgeCommon.m similarity index 100% rename from Watch/Bridge/TGBridgeCommon.m rename to submodules/WatchCommon/Sources/TGBridgeCommon.m diff --git a/Watch/Bridge/TGBridgeContactMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeContactMediaAttachment.h similarity index 72% rename from Watch/Bridge/TGBridgeContactMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeContactMediaAttachment.h index 4d247e8d0f..5afec7815b 100644 --- a/Watch/Bridge/TGBridgeContactMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeContactMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @interface TGBridgeContactMediaAttachment : TGBridgeMediaAttachment diff --git a/Watch/Bridge/TGBridgeContactMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeContactMediaAttachment.m similarity index 89% rename from Watch/Bridge/TGBridgeContactMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeContactMediaAttachment.m index 50fb4aab15..4b2f482eaa 100644 --- a/Watch/Bridge/TGBridgeContactMediaAttachment.m +++ b/submodules/WatchCommon/Sources/TGBridgeContactMediaAttachment.m @@ -1,6 +1,6 @@ #import "TGBridgeContactMediaAttachment.h" -#import "../Extension/TGStringUtils.h" +//#import "../Extension/TGStringUtils.h" const NSInteger TGBridgeContactMediaAttachmentType = 0xB90A5663; @@ -42,10 +42,7 @@ NSString *const TGBridgeContactMediaPrettyPhoneNumberKey = @"prettyPhoneNumber"; if (firstName != nil && firstName.length != 0 && lastName != nil && lastName.length != 0) { - if (TGIsKorean()) - return [[NSString alloc] initWithFormat:@"%@ %@", lastName, firstName]; - else - return [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName]; + return [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName]; } else if (firstName != nil && firstName.length != 0) return firstName; diff --git a/Watch/Bridge/TGBridgeContext.h b/submodules/WatchCommon/Sources/TGBridgeContext.h similarity index 100% rename from Watch/Bridge/TGBridgeContext.h rename to submodules/WatchCommon/Sources/TGBridgeContext.h diff --git a/Watch/Bridge/TGBridgeContext.m b/submodules/WatchCommon/Sources/TGBridgeContext.m similarity index 97% rename from Watch/Bridge/TGBridgeContext.m rename to submodules/WatchCommon/Sources/TGBridgeContext.m index 4ae8cde2ff..4b0600e2fc 100644 --- a/Watch/Bridge/TGBridgeContext.m +++ b/submodules/WatchCommon/Sources/TGBridgeContext.m @@ -1,6 +1,6 @@ #import "TGBridgeContext.h" #import "TGBridgeCommon.h" -#import "TGWatchCommon.h" +//#import "TGWatchCommon.h" NSString *const TGBridgeContextAuthorized = @"authorized"; NSString *const TGBridgeContextUserId = @"userId"; @@ -16,7 +16,7 @@ NSString *const TGBridgeContextStartupDataVersion = @"version"; if (self != nil) { _authorized = [dictionary[TGBridgeContextAuthorized] boolValue]; - _userId = [dictionary[TGBridgeContextUserId] int32Value]; + _userId = (int32_t)[dictionary[TGBridgeContextUserId] intValue]; _micAccessAllowed = [dictionary[TGBridgeContextMicAccessAllowed] boolValue]; if (dictionary[TGBridgeContextStartupData] != nil) { diff --git a/Watch/Bridge/TGBridgeDocumentMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeDocumentMediaAttachment.h similarity index 86% rename from Watch/Bridge/TGBridgeDocumentMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeDocumentMediaAttachment.h index 328483412a..05a6992d7c 100644 --- a/Watch/Bridge/TGBridgeDocumentMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeDocumentMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @interface TGBridgeDocumentMediaAttachment : TGBridgeMediaAttachment diff --git a/Watch/Bridge/TGBridgeDocumentMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeDocumentMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeDocumentMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeDocumentMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeForwardedMessageMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeForwardedMessageMediaAttachment.h similarity index 61% rename from Watch/Bridge/TGBridgeForwardedMessageMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeForwardedMessageMediaAttachment.h index 16e1b648ca..79db88519e 100644 --- a/Watch/Bridge/TGBridgeForwardedMessageMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeForwardedMessageMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @interface TGBridgeForwardedMessageMediaAttachment : TGBridgeMediaAttachment diff --git a/Watch/Bridge/TGBridgeForwardedMessageMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeForwardedMessageMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeForwardedMessageMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeForwardedMessageMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeImageMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeImageMediaAttachment.h similarity index 60% rename from Watch/Bridge/TGBridgeImageMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeImageMediaAttachment.h index aff935c69f..bfa9d13089 100644 --- a/Watch/Bridge/TGBridgeImageMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeImageMediaAttachment.h @@ -1,6 +1,11 @@ -#import "TGBridgeMediaAttachment.h" #import +#if TARGET_OS_WATCH +#import +#else +#import +#endif + @interface TGBridgeImageMediaAttachment : TGBridgeMediaAttachment @property (nonatomic, assign) int64_t imageId; diff --git a/Watch/Bridge/TGBridgeImageMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeImageMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeImageMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeImageMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeLocationMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeLocationMediaAttachment.h similarity index 78% rename from Watch/Bridge/TGBridgeLocationMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeLocationMediaAttachment.h index c1a7bf54eb..42efbc4d35 100644 --- a/Watch/Bridge/TGBridgeLocationMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeLocationMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @interface TGBridgeVenueAttachment : NSObject diff --git a/Watch/Bridge/TGBridgeLocationMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeLocationMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeLocationMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeLocationMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeLocationVenue.h b/submodules/WatchCommon/Sources/TGBridgeLocationVenue.h similarity index 100% rename from Watch/Bridge/TGBridgeLocationVenue.h rename to submodules/WatchCommon/Sources/TGBridgeLocationVenue.h diff --git a/Watch/Bridge/TGBridgeLocationVenue.m b/submodules/WatchCommon/Sources/TGBridgeLocationVenue.m similarity index 100% rename from Watch/Bridge/TGBridgeLocationVenue.m rename to submodules/WatchCommon/Sources/TGBridgeLocationVenue.m diff --git a/Watch/Bridge/TGBridgeMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeMediaAttachment.h similarity index 63% rename from Watch/Bridge/TGBridgeMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeMediaAttachment.h index 4833e13b91..451d9562bc 100644 --- a/Watch/Bridge/TGBridgeMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeCommon.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @interface TGBridgeMediaAttachment : NSObject diff --git a/Watch/Bridge/TGBridgeMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeMessage.h b/submodules/WatchCommon/Sources/TGBridgeMessage.h similarity index 56% rename from Watch/Bridge/TGBridgeMessage.h rename to submodules/WatchCommon/Sources/TGBridgeMessage.h index 46d46a00b8..c88cb5cf34 100644 --- a/Watch/Bridge/TGBridgeMessage.h +++ b/submodules/WatchCommon/Sources/TGBridgeMessage.h @@ -1,16 +1,32 @@ -#import "TGBridgeCommon.h" -#import "TGBridgeImageMediaAttachment.h" -#import "TGBridgeVideoMediaAttachment.h" -#import "TGBridgeAudioMediaAttachment.h" -#import "TGBridgeDocumentMediaAttachment.h" -#import "TGBridgeLocationMediaAttachment.h" -#import "TGBridgeContactMediaAttachment.h" -#import "TGBridgeActionMediaAttachment.h" -#import "TGBridgeReplyMessageMediaAttachment.h" -#import "TGBridgeForwardedMessageMediaAttachment.h" -#import "TGBridgeWebPageMediaAttachment.h" -#import "TGBridgeMessageEntitiesAttachment.h" -#import "TGBridgeUnsupportedMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#else +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#endif typedef enum { TGBridgeTextCheckingResultTypeUndefined, diff --git a/Watch/Bridge/TGBridgeMessage.m b/submodules/WatchCommon/Sources/TGBridgeMessage.m similarity index 98% rename from Watch/Bridge/TGBridgeMessage.m rename to submodules/WatchCommon/Sources/TGBridgeMessage.m index 1793d98851..4f5e5bb6e7 100644 --- a/Watch/Bridge/TGBridgeMessage.m +++ b/submodules/WatchCommon/Sources/TGBridgeMessage.m @@ -1,5 +1,5 @@ #import "TGBridgeMessage.h" -#import "TGWatchCommon.h" +//#import "TGWatchCommon.h" #import "TGBridgePeerIdAdapter.h" NSString *const TGBridgeMessageIdentifierKey = @"identifier"; @@ -90,7 +90,7 @@ NSString *const TGBridgeMessagesArrayKey = @"messages"; { TGBridgeActionMediaAttachment *actionAttachment = (TGBridgeActionMediaAttachment *)attachment; if (actionAttachment.actionData[@"uid"] != nil) - [userIds addIndex:[actionAttachment.actionData[@"uid"] int32Value]]; + [userIds addIndex:(int32_t)[actionAttachment.actionData[@"uid"] intValue]]; } } diff --git a/Watch/Bridge/TGBridgeMessageEntities.h b/submodules/WatchCommon/Sources/TGBridgeMessageEntities.h similarity index 100% rename from Watch/Bridge/TGBridgeMessageEntities.h rename to submodules/WatchCommon/Sources/TGBridgeMessageEntities.h diff --git a/Watch/Bridge/TGBridgeMessageEntities.m b/submodules/WatchCommon/Sources/TGBridgeMessageEntities.m similarity index 100% rename from Watch/Bridge/TGBridgeMessageEntities.m rename to submodules/WatchCommon/Sources/TGBridgeMessageEntities.m diff --git a/submodules/WatchCommon/Sources/TGBridgeMessageEntitiesAttachment.h b/submodules/WatchCommon/Sources/TGBridgeMessageEntitiesAttachment.h new file mode 100644 index 0000000000..08b44e1900 --- /dev/null +++ b/submodules/WatchCommon/Sources/TGBridgeMessageEntitiesAttachment.h @@ -0,0 +1,13 @@ +#if TARGET_OS_WATCH +#import +#import +#else +#import +#import +#endif + +@interface TGBridgeMessageEntitiesAttachment : TGBridgeMediaAttachment + +@property (nonatomic, strong) NSArray *entities; + +@end diff --git a/Watch/Bridge/TGBridgeMessageEntitiesAttachment.m b/submodules/WatchCommon/Sources/TGBridgeMessageEntitiesAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeMessageEntitiesAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeMessageEntitiesAttachment.m diff --git a/Watch/Bridge/TGBridgePeerIdAdapter.h b/submodules/WatchCommon/Sources/TGBridgePeerIdAdapter.h similarity index 100% rename from Watch/Bridge/TGBridgePeerIdAdapter.h rename to submodules/WatchCommon/Sources/TGBridgePeerIdAdapter.h diff --git a/Watch/Bridge/TGBridgePeerNotificationSettings.h b/submodules/WatchCommon/Sources/TGBridgePeerNotificationSettings.h similarity index 78% rename from Watch/Bridge/TGBridgePeerNotificationSettings.h rename to submodules/WatchCommon/Sources/TGBridgePeerNotificationSettings.h index 262908e368..fce723cecb 100644 --- a/Watch/Bridge/TGBridgePeerNotificationSettings.h +++ b/submodules/WatchCommon/Sources/TGBridgePeerNotificationSettings.h @@ -1,4 +1,4 @@ -#import "TGBridgeCommon.h" +#import @interface TGBridgePeerNotificationSettings : NSObject diff --git a/Watch/Bridge/TGBridgePeerNotificationSettings.m b/submodules/WatchCommon/Sources/TGBridgePeerNotificationSettings.m similarity index 100% rename from Watch/Bridge/TGBridgePeerNotificationSettings.m rename to submodules/WatchCommon/Sources/TGBridgePeerNotificationSettings.m diff --git a/Watch/Bridge/TGBridgeReplyMarkupMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeReplyMarkupMediaAttachment.h similarity index 57% rename from Watch/Bridge/TGBridgeReplyMarkupMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeReplyMarkupMediaAttachment.h index c0114eb3fa..261137605c 100644 --- a/Watch/Bridge/TGBridgeReplyMarkupMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeReplyMarkupMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @class TGBridgeBotReplyMarkup; diff --git a/Watch/Bridge/TGBridgeReplyMarkupMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeReplyMarkupMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeReplyMarkupMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeReplyMarkupMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeReplyMessageMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeReplyMessageMediaAttachment.h similarity index 60% rename from Watch/Bridge/TGBridgeReplyMessageMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeReplyMessageMediaAttachment.h index 5c2cd80f08..d5b6aebf06 100644 --- a/Watch/Bridge/TGBridgeReplyMessageMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeReplyMessageMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @class TGBridgeMessage; diff --git a/Watch/Bridge/TGBridgeReplyMessageMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeReplyMessageMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeReplyMessageMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeReplyMessageMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeSubscriptions.h b/submodules/WatchCommon/Sources/TGBridgeSubscriptions.h similarity index 98% rename from Watch/Bridge/TGBridgeSubscriptions.h rename to submodules/WatchCommon/Sources/TGBridgeSubscriptions.h index 82f179715b..c0f2fa29e0 100644 --- a/Watch/Bridge/TGBridgeSubscriptions.h +++ b/submodules/WatchCommon/Sources/TGBridgeSubscriptions.h @@ -1,4 +1,8 @@ -#import "TGBridgeCommon.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif #import #import diff --git a/Watch/Bridge/TGBridgeSubscriptions.m b/submodules/WatchCommon/Sources/TGBridgeSubscriptions.m similarity index 100% rename from Watch/Bridge/TGBridgeSubscriptions.m rename to submodules/WatchCommon/Sources/TGBridgeSubscriptions.m diff --git a/Watch/Bridge/TGBridgeUnsupportedMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeUnsupportedMediaAttachment.h similarity index 63% rename from Watch/Bridge/TGBridgeUnsupportedMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeUnsupportedMediaAttachment.h index 8803a6a8f4..03145c0db4 100644 --- a/Watch/Bridge/TGBridgeUnsupportedMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeUnsupportedMediaAttachment.h @@ -1,4 +1,8 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @interface TGBridgeUnsupportedMediaAttachment : TGBridgeMediaAttachment diff --git a/Watch/Bridge/TGBridgeUnsupportedMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeUnsupportedMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeUnsupportedMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeUnsupportedMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeUser.h b/submodules/WatchCommon/Sources/TGBridgeUser.h similarity index 93% rename from Watch/Bridge/TGBridgeUser.h rename to submodules/WatchCommon/Sources/TGBridgeUser.h index f1ecadd951..fe4c16a51b 100644 --- a/Watch/Bridge/TGBridgeUser.h +++ b/submodules/WatchCommon/Sources/TGBridgeUser.h @@ -1,4 +1,8 @@ -#import "TGBridgeCommon.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif @class TGBridgeBotInfo; @class TGBridgeUserChange; diff --git a/Watch/Bridge/TGBridgeUser.m b/submodules/WatchCommon/Sources/TGBridgeUser.m similarity index 96% rename from Watch/Bridge/TGBridgeUser.m rename to submodules/WatchCommon/Sources/TGBridgeUser.m index 615e6a34a1..4c0fed8d97 100644 --- a/Watch/Bridge/TGBridgeUser.m +++ b/submodules/WatchCommon/Sources/TGBridgeUser.m @@ -1,8 +1,8 @@ #import "TGBridgeUser.h" -#import "TGWatchCommon.h" +//#import "TGWatchCommon.h" #import "TGBridgeBotInfo.h" -#import "../Extension/TGStringUtils.h" +//#import "../Extension/TGStringUtils.h" NSString *const TGBridgeUserIdentifierKey = @"identifier"; NSString *const TGBridgeUserFirstNameKey = @"firstName"; @@ -100,10 +100,7 @@ NSString *const TGBridgeUsersDictionaryKey = @"users"; if (firstName != nil && firstName.length != 0 && lastName != nil && lastName.length != 0) { - if (TGIsKorean()) - return [[NSString alloc] initWithFormat:@"%@ %@", lastName, firstName]; - else - return [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName]; + return [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName]; } else if (firstName != nil && firstName.length != 0) return firstName; @@ -214,15 +211,15 @@ NSString *const TGBridgeUsersDictionaryKey = @"users"; NSNumber *kindChange = change.fields[TGBridgeUserKindKey]; if (kindChange != nil) - user->_kind = [kindChange int32Value]; + user->_kind = (int32_t)[kindChange intValue]; NSNumber *botKindChange = change.fields[TGBridgeUserBotKindKey]; if (botKindChange != nil) - user->_botKind = [botKindChange int32Value]; + user->_botKind = (int32_t)[botKindChange intValue]; NSNumber *botVersionChange = change.fields[TGBridgeUserBotVersionKey]; if (botVersionChange != nil) - user->_botVersion = [botVersionChange int32Value]; + user->_botVersion = (int32_t)[botVersionChange intValue]; NSNumber *verifiedChange = change.fields[TGBridgeUserVerifiedKey]; if (verifiedChange != nil) diff --git a/Watch/Bridge/TGBridgeVideoMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeVideoMediaAttachment.h similarity index 68% rename from Watch/Bridge/TGBridgeVideoMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeVideoMediaAttachment.h index fca37e940f..b5e02dcf6d 100644 --- a/Watch/Bridge/TGBridgeVideoMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeVideoMediaAttachment.h @@ -1,4 +1,9 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif + #import @interface TGBridgeVideoMediaAttachment : TGBridgeMediaAttachment diff --git a/Watch/Bridge/TGBridgeVideoMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeVideoMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeVideoMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeVideoMediaAttachment.m diff --git a/Watch/Bridge/TGBridgeWebPageMediaAttachment.h b/submodules/WatchCommon/Sources/TGBridgeWebPageMediaAttachment.h similarity index 85% rename from Watch/Bridge/TGBridgeWebPageMediaAttachment.h rename to submodules/WatchCommon/Sources/TGBridgeWebPageMediaAttachment.h index c5e81d329a..dd87e33132 100644 --- a/Watch/Bridge/TGBridgeWebPageMediaAttachment.h +++ b/submodules/WatchCommon/Sources/TGBridgeWebPageMediaAttachment.h @@ -1,4 +1,9 @@ -#import "TGBridgeMediaAttachment.h" +#if TARGET_OS_WATCH +#import +#else +#import +#endif + #import @class TGBridgeImageMediaAttachment; diff --git a/Watch/Bridge/TGBridgeWebPageMediaAttachment.m b/submodules/WatchCommon/Sources/TGBridgeWebPageMediaAttachment.m similarity index 100% rename from Watch/Bridge/TGBridgeWebPageMediaAttachment.m rename to submodules/WatchCommon/Sources/TGBridgeWebPageMediaAttachment.m diff --git a/submodules/WatchCommon/Sources/WatchCommon.h b/submodules/WatchCommon/Sources/WatchCommon.h new file mode 100644 index 0000000000..740b833b89 --- /dev/null +++ b/submodules/WatchCommon/Sources/WatchCommon.h @@ -0,0 +1,35 @@ +#import + +//! Project version number for WatchCommon. +FOUNDATION_EXPORT double WatchCommonVersionNumber; + +//! Project version string for WatchCommon. +FOUNDATION_EXPORT const unsigned char WatchCommonVersionString[]; + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/submodules/WatchCommon/Sources/WatchCommonWatch.h b/submodules/WatchCommon/Sources/WatchCommonWatch.h new file mode 100644 index 0000000000..38e8745e0f --- /dev/null +++ b/submodules/WatchCommon/Sources/WatchCommonWatch.h @@ -0,0 +1,36 @@ +#import + +//! Project version number for WatchCommon. +FOUNDATION_EXPORT double WatchCommonVersionNumber; + +//! Project version string for WatchCommon. +FOUNDATION_EXPORT const unsigned char WatchCommonVersionString[]; + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + diff --git a/submodules/WatchCommon/WatchCommonWatch/Info.plist b/submodules/WatchCommon/WatchCommonWatch/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/WatchCommon/WatchCommonWatch/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/WatchCommon/WatchCommonWatch/WatchCommonWatch.h b/submodules/WatchCommon/WatchCommonWatch/WatchCommonWatch.h new file mode 100644 index 0000000000..2aa9040e2b --- /dev/null +++ b/submodules/WatchCommon/WatchCommonWatch/WatchCommonWatch.h @@ -0,0 +1,19 @@ +// +// WatchCommonWatch.h +// WatchCommonWatch +// +// Created by Peter on 6/15/19. +// Copyright © 2019 Telegram LLP. All rights reserved. +// + +#import + +//! Project version number for WatchCommonWatch. +FOUNDATION_EXPORT double WatchCommonWatchVersionNumber; + +//! Project version string for WatchCommonWatch. +FOUNDATION_EXPORT const unsigned char WatchCommonWatchVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/WatchCommon/WatchCommon_Xcode.xcodeproj/project.pbxproj b/submodules/WatchCommon/WatchCommon_Xcode.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..c7c4c86d9f --- /dev/null +++ b/submodules/WatchCommon/WatchCommon_Xcode.xcodeproj/project.pbxproj @@ -0,0 +1,1249 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D00817AA22B4798B008A895F /* WatchCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817A822B4798B008A895F /* WatchCommon.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008181722B5710B008A895F /* TGBridgeUnsupportedMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E522B57104008A895F /* TGBridgeUnsupportedMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008181822B5710B008A895F /* TGBridgeContactMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817E622B57105008A895F /* TGBridgeContactMediaAttachment.m */; }; + D008181922B5710B008A895F /* TGBridgeAudioMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E722B57105008A895F /* TGBridgeAudioMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008181A22B5710B008A895F /* TGBridgeActionMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E822B57105008A895F /* TGBridgeActionMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008181B22B5710B008A895F /* TGBridgeMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E922B57105008A895F /* TGBridgeMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008181C22B5710B008A895F /* TGBridgeReplyMarkupMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817EA22B57105008A895F /* TGBridgeReplyMarkupMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008181D22B5710B008A895F /* TGBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817EB22B57105008A895F /* TGBridgeContext.m */; }; + D008181E22B5710B008A895F /* TGBridgeChat.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817EC22B57105008A895F /* TGBridgeChat.m */; }; + D008181F22B5710B008A895F /* TGBridgeImageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817ED22B57105008A895F /* TGBridgeImageMediaAttachment.m */; }; + D008182022B5710B008A895F /* TGBridgeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817EE22B57105008A895F /* TGBridgeContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008182122B5710B008A895F /* TGBridgeLocationVenue.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817EF22B57105008A895F /* TGBridgeLocationVenue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008182222B5710B008A895F /* TGBridgeChatMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F022B57105008A895F /* TGBridgeChatMessages.m */; }; + D008182322B5710B008A895F /* TGBridgeVideoMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817F122B57105008A895F /* TGBridgeVideoMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008182422B5710B008A895F /* TGBridgeAudioMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F222B57106008A895F /* TGBridgeAudioMediaAttachment.m */; }; + D008182522B5710B008A895F /* TGBridgeWebPageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817F322B57106008A895F /* TGBridgeWebPageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008182622B5710B008A895F /* TGBridgeReplyMarkupMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F422B57106008A895F /* TGBridgeReplyMarkupMediaAttachment.m */; }; + D008182722B5710B008A895F /* TGBridgeCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F522B57106008A895F /* TGBridgeCommon.m */; }; + D008182822B5710B008A895F /* TGBridgeMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F622B57106008A895F /* TGBridgeMessage.m */; }; + D008182922B5710B008A895F /* TGBridgeLocationVenue.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F722B57106008A895F /* TGBridgeLocationVenue.m */; }; + D008182A22B5710B008A895F /* TGBridgeMessageEntities.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817F822B57106008A895F /* TGBridgeMessageEntities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008182B22B5710B008A895F /* TGBridgeSubscriptions.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F922B57106008A895F /* TGBridgeSubscriptions.m */; }; + D008182C22B5710B008A895F /* TGBridgeForwardedMessageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FA22B57106008A895F /* TGBridgeForwardedMessageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008182D22B5710B008A895F /* TGBridgeForwardedMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817FB22B57107008A895F /* TGBridgeForwardedMessageMediaAttachment.m */; }; + D008182E22B5710B008A895F /* TGBridgeBotInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FC22B57107008A895F /* TGBridgeBotInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008182F22B5710B008A895F /* TGBridgeBotCommandInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817FD22B57107008A895F /* TGBridgeBotCommandInfo.m */; }; + D008183022B5710B008A895F /* TGBridgeContactMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FE22B57107008A895F /* TGBridgeContactMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183122B5710B008A895F /* TGBridgeImageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FF22B57107008A895F /* TGBridgeImageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183222B5710B008A895F /* TGBridgeChat.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180022B57107008A895F /* TGBridgeChat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183322B5710B008A895F /* TGBridgeUnsupportedMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180122B57107008A895F /* TGBridgeUnsupportedMediaAttachment.m */; }; + D008183422B5710B008A895F /* TGBridgeCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180222B57107008A895F /* TGBridgeCommon.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183522B5710B008A895F /* TGBridgeUser.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180322B57108008A895F /* TGBridgeUser.m */; }; + D008183622B5710B008A895F /* TGBridgeBotInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180422B57108008A895F /* TGBridgeBotInfo.m */; }; + D008183722B5710B008A895F /* TGBridgeActionMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180522B57108008A895F /* TGBridgeActionMediaAttachment.m */; }; + D008183822B5710B008A895F /* TGBridgeWebPageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180622B57108008A895F /* TGBridgeWebPageMediaAttachment.m */; }; + D008183922B5710B008A895F /* TGBridgeReplyMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180722B57108008A895F /* TGBridgeReplyMessageMediaAttachment.m */; }; + D008183A22B5710B008A895F /* TGBridgeReplyMessageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180822B57108008A895F /* TGBridgeReplyMessageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183B22B5710B008A895F /* TGBridgeDocumentMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180922B57108008A895F /* TGBridgeDocumentMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183C22B5710B008A895F /* TGBridgeSubscriptions.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180A22B57109008A895F /* TGBridgeSubscriptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183D22B5710B008A895F /* TGBridgeMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180B22B57109008A895F /* TGBridgeMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008183E22B5710B008A895F /* TGBridgeMessageEntitiesAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180C22B57109008A895F /* TGBridgeMessageEntitiesAttachment.m */; }; + D008183F22B5710B008A895F /* TGBridgeMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180D22B57109008A895F /* TGBridgeMediaAttachment.m */; }; + D008184022B5710B008A895F /* TGBridgeMessageEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180E22B57109008A895F /* TGBridgeMessageEntities.m */; }; + D008184122B5710B008A895F /* TGBridgeLocationMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180F22B57109008A895F /* TGBridgeLocationMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008184222B5710B008A895F /* TGBridgeBotCommandInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181022B5710A008A895F /* TGBridgeBotCommandInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008184322B5710B008A895F /* TGBridgeChatMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181122B5710A008A895F /* TGBridgeChatMessages.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008184422B5710B008A895F /* TGBridgeMessageEntitiesAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181222B5710A008A895F /* TGBridgeMessageEntitiesAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008184522B5710B008A895F /* TGBridgeVideoMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008181322B5710A008A895F /* TGBridgeVideoMediaAttachment.m */; }; + D008184622B5710B008A895F /* TGBridgeDocumentMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008181422B5710A008A895F /* TGBridgeDocumentMediaAttachment.m */; }; + D008184722B5710B008A895F /* TGBridgeLocationMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008181522B5710A008A895F /* TGBridgeLocationMediaAttachment.m */; }; + D008184822B5710B008A895F /* TGBridgeUser.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181622B5710A008A895F /* TGBridgeUser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008186F22B58B45008A895F /* TGBridgeActionMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180522B57108008A895F /* TGBridgeActionMediaAttachment.m */; }; + D008187022B58B45008A895F /* TGBridgeAudioMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F222B57106008A895F /* TGBridgeAudioMediaAttachment.m */; }; + D008187122B58B45008A895F /* TGBridgeBotCommandInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817FD22B57107008A895F /* TGBridgeBotCommandInfo.m */; }; + D008187222B58B45008A895F /* TGBridgeBotInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180422B57108008A895F /* TGBridgeBotInfo.m */; }; + D008187322B58B45008A895F /* TGBridgeChat.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817EC22B57105008A895F /* TGBridgeChat.m */; }; + D008187422B58B45008A895F /* TGBridgeChatMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F022B57105008A895F /* TGBridgeChatMessages.m */; }; + D008187522B58B45008A895F /* TGBridgeCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F522B57106008A895F /* TGBridgeCommon.m */; }; + D008187622B58B45008A895F /* TGBridgeContactMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817E622B57105008A895F /* TGBridgeContactMediaAttachment.m */; }; + D008187722B58B45008A895F /* TGBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817EB22B57105008A895F /* TGBridgeContext.m */; }; + D008187822B58B45008A895F /* TGBridgeDocumentMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008181422B5710A008A895F /* TGBridgeDocumentMediaAttachment.m */; }; + D008187922B58B45008A895F /* TGBridgeForwardedMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817FB22B57107008A895F /* TGBridgeForwardedMessageMediaAttachment.m */; }; + D008187A22B58B45008A895F /* TGBridgeImageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817ED22B57105008A895F /* TGBridgeImageMediaAttachment.m */; }; + D008187B22B58B45008A895F /* TGBridgeLocationMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008181522B5710A008A895F /* TGBridgeLocationMediaAttachment.m */; }; + D008187C22B58B45008A895F /* TGBridgeLocationVenue.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F722B57106008A895F /* TGBridgeLocationVenue.m */; }; + D008187D22B58B45008A895F /* TGBridgeMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180D22B57109008A895F /* TGBridgeMediaAttachment.m */; }; + D008187E22B58B45008A895F /* TGBridgeMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F622B57106008A895F /* TGBridgeMessage.m */; }; + D008187F22B58B45008A895F /* TGBridgeMessageEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180E22B57109008A895F /* TGBridgeMessageEntities.m */; }; + D008188022B58B45008A895F /* TGBridgeMessageEntitiesAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180C22B57109008A895F /* TGBridgeMessageEntitiesAttachment.m */; }; + D008188122B58B45008A895F /* TGBridgeReplyMarkupMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F422B57106008A895F /* TGBridgeReplyMarkupMediaAttachment.m */; }; + D008188222B58B45008A895F /* TGBridgeReplyMessageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180722B57108008A895F /* TGBridgeReplyMessageMediaAttachment.m */; }; + D008188322B58B45008A895F /* TGBridgeSubscriptions.m in Sources */ = {isa = PBXBuildFile; fileRef = D00817F922B57106008A895F /* TGBridgeSubscriptions.m */; }; + D008188422B58B45008A895F /* TGBridgeUnsupportedMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180122B57107008A895F /* TGBridgeUnsupportedMediaAttachment.m */; }; + D008188522B58B45008A895F /* TGBridgeUser.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180322B57108008A895F /* TGBridgeUser.m */; }; + D008188622B58B45008A895F /* TGBridgeVideoMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008181322B5710A008A895F /* TGBridgeVideoMediaAttachment.m */; }; + D008188722B58B45008A895F /* TGBridgeWebPageMediaAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = D008180622B57108008A895F /* TGBridgeWebPageMediaAttachment.m */; }; + D008188822B58B61008A895F /* TGBridgeActionMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E822B57105008A895F /* TGBridgeActionMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008188922B58B61008A895F /* TGBridgeAudioMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E722B57105008A895F /* TGBridgeAudioMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008188A22B58B61008A895F /* TGBridgeBotCommandInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181022B5710A008A895F /* TGBridgeBotCommandInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008188B22B58B61008A895F /* TGBridgeBotInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FC22B57107008A895F /* TGBridgeBotInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008188C22B58B61008A895F /* TGBridgeChat.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180022B57107008A895F /* TGBridgeChat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008188D22B58B61008A895F /* TGBridgeChatMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181122B5710A008A895F /* TGBridgeChatMessages.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008188E22B58B61008A895F /* TGBridgeCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180222B57107008A895F /* TGBridgeCommon.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008188F22B58B61008A895F /* TGBridgeContactMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FE22B57107008A895F /* TGBridgeContactMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189022B58B61008A895F /* TGBridgeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817EE22B57105008A895F /* TGBridgeContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189122B58B61008A895F /* TGBridgeDocumentMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180922B57108008A895F /* TGBridgeDocumentMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189222B58B61008A895F /* TGBridgeForwardedMessageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FA22B57106008A895F /* TGBridgeForwardedMessageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189322B58B61008A895F /* TGBridgeImageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817FF22B57107008A895F /* TGBridgeImageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189422B58B61008A895F /* TGBridgeLocationMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180F22B57109008A895F /* TGBridgeLocationMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189522B58B61008A895F /* TGBridgeLocationVenue.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817EF22B57105008A895F /* TGBridgeLocationVenue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189622B58B61008A895F /* TGBridgeMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E922B57105008A895F /* TGBridgeMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189722B58B61008A895F /* TGBridgeMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180B22B57109008A895F /* TGBridgeMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189822B58B61008A895F /* TGBridgeMessageEntities.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817F822B57106008A895F /* TGBridgeMessageEntities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189922B58B61008A895F /* TGBridgeMessageEntitiesAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181222B5710A008A895F /* TGBridgeMessageEntitiesAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189A22B58B61008A895F /* TGBridgeReplyMarkupMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817EA22B57105008A895F /* TGBridgeReplyMarkupMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189B22B58B61008A895F /* TGBridgeReplyMessageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180822B57108008A895F /* TGBridgeReplyMessageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189C22B58B61008A895F /* TGBridgeSubscriptions.h in Headers */ = {isa = PBXBuildFile; fileRef = D008180A22B57109008A895F /* TGBridgeSubscriptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189D22B58B61008A895F /* TGBridgeUnsupportedMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817E522B57104008A895F /* TGBridgeUnsupportedMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189E22B58B61008A895F /* TGBridgeUser.h in Headers */ = {isa = PBXBuildFile; fileRef = D008181622B5710A008A895F /* TGBridgeUser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D008189F22B58B61008A895F /* TGBridgeVideoMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817F122B57105008A895F /* TGBridgeVideoMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818A022B58B61008A895F /* TGBridgeWebPageMediaAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D00817F322B57106008A895F /* TGBridgeWebPageMediaAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818A322B58C90008A895F /* WatchCommonWatch.h in Headers */ = {isa = PBXBuildFile; fileRef = D00818A222B58C90008A895F /* WatchCommonWatch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818A722B58EA9008A895F /* TGBridgePeerIdAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = D00818A622B58EA9008A895F /* TGBridgePeerIdAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818A822B58EAC008A895F /* TGBridgePeerIdAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = D00818A622B58EA9008A895F /* TGBridgePeerIdAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818AB22B58F76008A895F /* TGBridgePeerNotificationSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = D00818A922B58F76008A895F /* TGBridgePeerNotificationSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818AC22B58F76008A895F /* TGBridgePeerNotificationSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = D00818A922B58F76008A895F /* TGBridgePeerNotificationSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D00818AD22B58F76008A895F /* TGBridgePeerNotificationSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = D00818AA22B58F76008A895F /* TGBridgePeerNotificationSettings.m */; }; + D00818AE22B58F76008A895F /* TGBridgePeerNotificationSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = D00818AA22B58F76008A895F /* TGBridgePeerNotificationSettings.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D00817A522B4798B008A895F /* WatchCommon.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WatchCommon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D00817A822B4798B008A895F /* WatchCommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WatchCommon.h; sourceTree = ""; }; + D00817A922B4798B008A895F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D00817E522B57104008A895F /* TGBridgeUnsupportedMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeUnsupportedMediaAttachment.h; sourceTree = ""; }; + D00817E622B57105008A895F /* TGBridgeContactMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeContactMediaAttachment.m; sourceTree = ""; }; + D00817E722B57105008A895F /* TGBridgeAudioMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeAudioMediaAttachment.h; sourceTree = ""; }; + D00817E822B57105008A895F /* TGBridgeActionMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeActionMediaAttachment.h; sourceTree = ""; }; + D00817E922B57105008A895F /* TGBridgeMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeMediaAttachment.h; sourceTree = ""; }; + D00817EA22B57105008A895F /* TGBridgeReplyMarkupMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeReplyMarkupMediaAttachment.h; sourceTree = ""; }; + D00817EB22B57105008A895F /* TGBridgeContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeContext.m; sourceTree = ""; }; + D00817EC22B57105008A895F /* TGBridgeChat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeChat.m; sourceTree = ""; }; + D00817ED22B57105008A895F /* TGBridgeImageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeImageMediaAttachment.m; sourceTree = ""; }; + D00817EE22B57105008A895F /* TGBridgeContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeContext.h; sourceTree = ""; }; + D00817EF22B57105008A895F /* TGBridgeLocationVenue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeLocationVenue.h; sourceTree = ""; }; + D00817F022B57105008A895F /* TGBridgeChatMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeChatMessages.m; sourceTree = ""; }; + D00817F122B57105008A895F /* TGBridgeVideoMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeVideoMediaAttachment.h; sourceTree = ""; }; + D00817F222B57106008A895F /* TGBridgeAudioMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeAudioMediaAttachment.m; sourceTree = ""; }; + D00817F322B57106008A895F /* TGBridgeWebPageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeWebPageMediaAttachment.h; sourceTree = ""; }; + D00817F422B57106008A895F /* TGBridgeReplyMarkupMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeReplyMarkupMediaAttachment.m; sourceTree = ""; }; + D00817F522B57106008A895F /* TGBridgeCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeCommon.m; sourceTree = ""; }; + D00817F622B57106008A895F /* TGBridgeMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeMessage.m; sourceTree = ""; }; + D00817F722B57106008A895F /* TGBridgeLocationVenue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeLocationVenue.m; sourceTree = ""; }; + D00817F822B57106008A895F /* TGBridgeMessageEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeMessageEntities.h; sourceTree = ""; }; + D00817F922B57106008A895F /* TGBridgeSubscriptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeSubscriptions.m; sourceTree = ""; }; + D00817FA22B57106008A895F /* TGBridgeForwardedMessageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeForwardedMessageMediaAttachment.h; sourceTree = ""; }; + D00817FB22B57107008A895F /* TGBridgeForwardedMessageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeForwardedMessageMediaAttachment.m; sourceTree = ""; }; + D00817FC22B57107008A895F /* TGBridgeBotInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeBotInfo.h; sourceTree = ""; }; + D00817FD22B57107008A895F /* TGBridgeBotCommandInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeBotCommandInfo.m; sourceTree = ""; }; + D00817FE22B57107008A895F /* TGBridgeContactMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeContactMediaAttachment.h; sourceTree = ""; }; + D00817FF22B57107008A895F /* TGBridgeImageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeImageMediaAttachment.h; sourceTree = ""; }; + D008180022B57107008A895F /* TGBridgeChat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeChat.h; sourceTree = ""; }; + D008180122B57107008A895F /* TGBridgeUnsupportedMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeUnsupportedMediaAttachment.m; sourceTree = ""; }; + D008180222B57107008A895F /* TGBridgeCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeCommon.h; sourceTree = ""; }; + D008180322B57108008A895F /* TGBridgeUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeUser.m; sourceTree = ""; }; + D008180422B57108008A895F /* TGBridgeBotInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeBotInfo.m; sourceTree = ""; }; + D008180522B57108008A895F /* TGBridgeActionMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeActionMediaAttachment.m; sourceTree = ""; }; + D008180622B57108008A895F /* TGBridgeWebPageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeWebPageMediaAttachment.m; sourceTree = ""; }; + D008180722B57108008A895F /* TGBridgeReplyMessageMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeReplyMessageMediaAttachment.m; sourceTree = ""; }; + D008180822B57108008A895F /* TGBridgeReplyMessageMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeReplyMessageMediaAttachment.h; sourceTree = ""; }; + D008180922B57108008A895F /* TGBridgeDocumentMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeDocumentMediaAttachment.h; sourceTree = ""; }; + D008180A22B57109008A895F /* TGBridgeSubscriptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeSubscriptions.h; sourceTree = ""; }; + D008180B22B57109008A895F /* TGBridgeMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeMessage.h; sourceTree = ""; }; + D008180C22B57109008A895F /* TGBridgeMessageEntitiesAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeMessageEntitiesAttachment.m; sourceTree = ""; }; + D008180D22B57109008A895F /* TGBridgeMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeMediaAttachment.m; sourceTree = ""; }; + D008180E22B57109008A895F /* TGBridgeMessageEntities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeMessageEntities.m; sourceTree = ""; }; + D008180F22B57109008A895F /* TGBridgeLocationMediaAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeLocationMediaAttachment.h; sourceTree = ""; }; + D008181022B5710A008A895F /* TGBridgeBotCommandInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeBotCommandInfo.h; sourceTree = ""; }; + D008181122B5710A008A895F /* TGBridgeChatMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeChatMessages.h; sourceTree = ""; }; + D008181222B5710A008A895F /* TGBridgeMessageEntitiesAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeMessageEntitiesAttachment.h; sourceTree = ""; }; + D008181322B5710A008A895F /* TGBridgeVideoMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeVideoMediaAttachment.m; sourceTree = ""; }; + D008181422B5710A008A895F /* TGBridgeDocumentMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeDocumentMediaAttachment.m; sourceTree = ""; }; + D008181522B5710A008A895F /* TGBridgeLocationMediaAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgeLocationMediaAttachment.m; sourceTree = ""; }; + D008181622B5710A008A895F /* TGBridgeUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgeUser.h; sourceTree = ""; }; + D008186722B58A73008A895F /* WatchCommonWatch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WatchCommonWatch.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D008186922B58A73008A895F /* WatchCommonWatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WatchCommonWatch.h; sourceTree = ""; }; + D008186A22B58A73008A895F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D00818A222B58C90008A895F /* WatchCommonWatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WatchCommonWatch.h; sourceTree = ""; }; + D00818A622B58EA9008A895F /* TGBridgePeerIdAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgePeerIdAdapter.h; sourceTree = ""; }; + D00818A922B58F76008A895F /* TGBridgePeerNotificationSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBridgePeerNotificationSettings.h; sourceTree = ""; }; + D00818AA22B58F76008A895F /* TGBridgePeerNotificationSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGBridgePeerNotificationSettings.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D00817A222B4798B008A895F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D008186422B58A73008A895F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D008179B22B4798B008A895F = { + isa = PBXGroup; + children = ( + D00817A922B4798B008A895F /* Info.plist */, + D00817A722B4798B008A895F /* Sources */, + D008186822B58A73008A895F /* WatchCommonWatch */, + D00817A622B4798B008A895F /* Products */, + ); + sourceTree = ""; + }; + D00817A622B4798B008A895F /* Products */ = { + isa = PBXGroup; + children = ( + D00817A522B4798B008A895F /* WatchCommon.framework */, + D008186722B58A73008A895F /* WatchCommonWatch.framework */, + ); + name = Products; + sourceTree = ""; + }; + D00817A722B4798B008A895F /* Sources */ = { + isa = PBXGroup; + children = ( + D00818A922B58F76008A895F /* TGBridgePeerNotificationSettings.h */, + D00818AA22B58F76008A895F /* TGBridgePeerNotificationSettings.m */, + D00818A622B58EA9008A895F /* TGBridgePeerIdAdapter.h */, + D00817E822B57105008A895F /* TGBridgeActionMediaAttachment.h */, + D008180522B57108008A895F /* TGBridgeActionMediaAttachment.m */, + D00817E722B57105008A895F /* TGBridgeAudioMediaAttachment.h */, + D00817F222B57106008A895F /* TGBridgeAudioMediaAttachment.m */, + D008181022B5710A008A895F /* TGBridgeBotCommandInfo.h */, + D00817FD22B57107008A895F /* TGBridgeBotCommandInfo.m */, + D00817FC22B57107008A895F /* TGBridgeBotInfo.h */, + D008180422B57108008A895F /* TGBridgeBotInfo.m */, + D008180022B57107008A895F /* TGBridgeChat.h */, + D00817EC22B57105008A895F /* TGBridgeChat.m */, + D008181122B5710A008A895F /* TGBridgeChatMessages.h */, + D00817F022B57105008A895F /* TGBridgeChatMessages.m */, + D008180222B57107008A895F /* TGBridgeCommon.h */, + D00817F522B57106008A895F /* TGBridgeCommon.m */, + D00817FE22B57107008A895F /* TGBridgeContactMediaAttachment.h */, + D00817E622B57105008A895F /* TGBridgeContactMediaAttachment.m */, + D00817EE22B57105008A895F /* TGBridgeContext.h */, + D00817EB22B57105008A895F /* TGBridgeContext.m */, + D008180922B57108008A895F /* TGBridgeDocumentMediaAttachment.h */, + D008181422B5710A008A895F /* TGBridgeDocumentMediaAttachment.m */, + D00817FA22B57106008A895F /* TGBridgeForwardedMessageMediaAttachment.h */, + D00817FB22B57107008A895F /* TGBridgeForwardedMessageMediaAttachment.m */, + D00817FF22B57107008A895F /* TGBridgeImageMediaAttachment.h */, + D00817ED22B57105008A895F /* TGBridgeImageMediaAttachment.m */, + D008180F22B57109008A895F /* TGBridgeLocationMediaAttachment.h */, + D008181522B5710A008A895F /* TGBridgeLocationMediaAttachment.m */, + D00817EF22B57105008A895F /* TGBridgeLocationVenue.h */, + D00817F722B57106008A895F /* TGBridgeLocationVenue.m */, + D00817E922B57105008A895F /* TGBridgeMediaAttachment.h */, + D008180D22B57109008A895F /* TGBridgeMediaAttachment.m */, + D008180B22B57109008A895F /* TGBridgeMessage.h */, + D00817F622B57106008A895F /* TGBridgeMessage.m */, + D00817F822B57106008A895F /* TGBridgeMessageEntities.h */, + D008180E22B57109008A895F /* TGBridgeMessageEntities.m */, + D008181222B5710A008A895F /* TGBridgeMessageEntitiesAttachment.h */, + D008180C22B57109008A895F /* TGBridgeMessageEntitiesAttachment.m */, + D00817EA22B57105008A895F /* TGBridgeReplyMarkupMediaAttachment.h */, + D00817F422B57106008A895F /* TGBridgeReplyMarkupMediaAttachment.m */, + D008180822B57108008A895F /* TGBridgeReplyMessageMediaAttachment.h */, + D008180722B57108008A895F /* TGBridgeReplyMessageMediaAttachment.m */, + D008180A22B57109008A895F /* TGBridgeSubscriptions.h */, + D00817F922B57106008A895F /* TGBridgeSubscriptions.m */, + D00817E522B57104008A895F /* TGBridgeUnsupportedMediaAttachment.h */, + D008180122B57107008A895F /* TGBridgeUnsupportedMediaAttachment.m */, + D008181622B5710A008A895F /* TGBridgeUser.h */, + D008180322B57108008A895F /* TGBridgeUser.m */, + D00817F122B57105008A895F /* TGBridgeVideoMediaAttachment.h */, + D008181322B5710A008A895F /* TGBridgeVideoMediaAttachment.m */, + D00817F322B57106008A895F /* TGBridgeWebPageMediaAttachment.h */, + D008180622B57108008A895F /* TGBridgeWebPageMediaAttachment.m */, + D00818A222B58C90008A895F /* WatchCommonWatch.h */, + D00817A822B4798B008A895F /* WatchCommon.h */, + ); + path = Sources; + sourceTree = ""; + }; + D008186822B58A73008A895F /* WatchCommonWatch */ = { + isa = PBXGroup; + children = ( + D008186922B58A73008A895F /* WatchCommonWatch.h */, + D008186A22B58A73008A895F /* Info.plist */, + ); + path = WatchCommonWatch; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D00817A022B4798B008A895F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D00818AB22B58F76008A895F /* TGBridgePeerNotificationSettings.h in Headers */, + D008183D22B5710B008A895F /* TGBridgeMessage.h in Headers */, + D008181A22B5710B008A895F /* TGBridgeActionMediaAttachment.h in Headers */, + D008182122B5710B008A895F /* TGBridgeLocationVenue.h in Headers */, + D00818A822B58EAC008A895F /* TGBridgePeerIdAdapter.h in Headers */, + D008184122B5710B008A895F /* TGBridgeLocationMediaAttachment.h in Headers */, + D008182522B5710B008A895F /* TGBridgeWebPageMediaAttachment.h in Headers */, + D008183B22B5710B008A895F /* TGBridgeDocumentMediaAttachment.h in Headers */, + D008181722B5710B008A895F /* TGBridgeUnsupportedMediaAttachment.h in Headers */, + D008183422B5710B008A895F /* TGBridgeCommon.h in Headers */, + D008181B22B5710B008A895F /* TGBridgeMediaAttachment.h in Headers */, + D008184822B5710B008A895F /* TGBridgeUser.h in Headers */, + D008182E22B5710B008A895F /* TGBridgeBotInfo.h in Headers */, + D008182A22B5710B008A895F /* TGBridgeMessageEntities.h in Headers */, + D008184222B5710B008A895F /* TGBridgeBotCommandInfo.h in Headers */, + D008184322B5710B008A895F /* TGBridgeChatMessages.h in Headers */, + D008181C22B5710B008A895F /* TGBridgeReplyMarkupMediaAttachment.h in Headers */, + D008181922B5710B008A895F /* TGBridgeAudioMediaAttachment.h in Headers */, + D008182322B5710B008A895F /* TGBridgeVideoMediaAttachment.h in Headers */, + D008183022B5710B008A895F /* TGBridgeContactMediaAttachment.h in Headers */, + D008183C22B5710B008A895F /* TGBridgeSubscriptions.h in Headers */, + D008183122B5710B008A895F /* TGBridgeImageMediaAttachment.h in Headers */, + D008183A22B5710B008A895F /* TGBridgeReplyMessageMediaAttachment.h in Headers */, + D008183222B5710B008A895F /* TGBridgeChat.h in Headers */, + D00817AA22B4798B008A895F /* WatchCommon.h in Headers */, + D008184422B5710B008A895F /* TGBridgeMessageEntitiesAttachment.h in Headers */, + D008182022B5710B008A895F /* TGBridgeContext.h in Headers */, + D008182C22B5710B008A895F /* TGBridgeForwardedMessageMediaAttachment.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D008186222B58A73008A895F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D00818AC22B58F76008A895F /* TGBridgePeerNotificationSettings.h in Headers */, + D008189622B58B61008A895F /* TGBridgeMediaAttachment.h in Headers */, + D008189C22B58B61008A895F /* TGBridgeSubscriptions.h in Headers */, + D008188C22B58B61008A895F /* TGBridgeChat.h in Headers */, + D00818A722B58EA9008A895F /* TGBridgePeerIdAdapter.h in Headers */, + D008188F22B58B61008A895F /* TGBridgeContactMediaAttachment.h in Headers */, + D00818A022B58B61008A895F /* TGBridgeWebPageMediaAttachment.h in Headers */, + D008189A22B58B61008A895F /* TGBridgeReplyMarkupMediaAttachment.h in Headers */, + D00818A322B58C90008A895F /* WatchCommonWatch.h in Headers */, + D008189D22B58B61008A895F /* TGBridgeUnsupportedMediaAttachment.h in Headers */, + D008189122B58B61008A895F /* TGBridgeDocumentMediaAttachment.h in Headers */, + D008188822B58B61008A895F /* TGBridgeActionMediaAttachment.h in Headers */, + D008188B22B58B61008A895F /* TGBridgeBotInfo.h in Headers */, + D008189722B58B61008A895F /* TGBridgeMessage.h in Headers */, + D008189422B58B61008A895F /* TGBridgeLocationMediaAttachment.h in Headers */, + D008189922B58B61008A895F /* TGBridgeMessageEntitiesAttachment.h in Headers */, + D008189022B58B61008A895F /* TGBridgeContext.h in Headers */, + D008189522B58B61008A895F /* TGBridgeLocationVenue.h in Headers */, + D008188922B58B61008A895F /* TGBridgeAudioMediaAttachment.h in Headers */, + D008189B22B58B61008A895F /* TGBridgeReplyMessageMediaAttachment.h in Headers */, + D008189822B58B61008A895F /* TGBridgeMessageEntities.h in Headers */, + D008189322B58B61008A895F /* TGBridgeImageMediaAttachment.h in Headers */, + D008188A22B58B61008A895F /* TGBridgeBotCommandInfo.h in Headers */, + D008189E22B58B61008A895F /* TGBridgeUser.h in Headers */, + D008188D22B58B61008A895F /* TGBridgeChatMessages.h in Headers */, + D008189F22B58B61008A895F /* TGBridgeVideoMediaAttachment.h in Headers */, + D008188E22B58B61008A895F /* TGBridgeCommon.h in Headers */, + D008189222B58B61008A895F /* TGBridgeForwardedMessageMediaAttachment.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D00817A422B4798B008A895F /* WatchCommon */ = { + isa = PBXNativeTarget; + buildConfigurationList = D00817AD22B4798B008A895F /* Build configuration list for PBXNativeTarget "WatchCommon" */; + buildPhases = ( + D00817A022B4798B008A895F /* Headers */, + D00817A122B4798B008A895F /* Sources */, + D00817A222B4798B008A895F /* Frameworks */, + D00817A322B4798B008A895F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WatchCommon; + productName = WatchCommon; + productReference = D00817A522B4798B008A895F /* WatchCommon.framework */; + productType = "com.apple.product-type.framework"; + }; + D008186622B58A73008A895F /* WatchCommonWatch */ = { + isa = PBXNativeTarget; + buildConfigurationList = D008186C22B58A73008A895F /* Build configuration list for PBXNativeTarget "WatchCommonWatch" */; + buildPhases = ( + D008186222B58A73008A895F /* Headers */, + D008186322B58A73008A895F /* Sources */, + D008186422B58A73008A895F /* Frameworks */, + D008186522B58A73008A895F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WatchCommonWatch; + productName = WatchCommonWatch; + productReference = D008186722B58A73008A895F /* WatchCommonWatch.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D008179C22B4798B008A895F /* Project object */ = { + isa = PBXProject; + attributes = { + DefaultBuildSystemTypeForWorkspace = Latest; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Telegram LLP"; + TargetAttributes = { + D00817A422B4798B008A895F = { + CreatedOnToolsVersion = 10.1; + }; + D008186622B58A73008A895F = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = D008179F22B4798B008A895F /* Build configuration list for PBXProject "WatchCommon_Xcode" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D008179B22B4798B008A895F; + productRefGroup = D00817A622B4798B008A895F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D00817A422B4798B008A895F /* WatchCommon */, + D008186622B58A73008A895F /* WatchCommonWatch */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D00817A322B4798B008A895F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D008186522B58A73008A895F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D00817A122B4798B008A895F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D008182F22B5710B008A895F /* TGBridgeBotCommandInfo.m in Sources */, + D008182822B5710B008A895F /* TGBridgeMessage.m in Sources */, + D008183822B5710B008A895F /* TGBridgeWebPageMediaAttachment.m in Sources */, + D008181822B5710B008A895F /* TGBridgeContactMediaAttachment.m in Sources */, + D008182B22B5710B008A895F /* TGBridgeSubscriptions.m in Sources */, + D008182922B5710B008A895F /* TGBridgeLocationVenue.m in Sources */, + D008183F22B5710B008A895F /* TGBridgeMediaAttachment.m in Sources */, + D008183622B5710B008A895F /* TGBridgeBotInfo.m in Sources */, + D008181F22B5710B008A895F /* TGBridgeImageMediaAttachment.m in Sources */, + D008182422B5710B008A895F /* TGBridgeAudioMediaAttachment.m in Sources */, + D008181E22B5710B008A895F /* TGBridgeChat.m in Sources */, + D008182722B5710B008A895F /* TGBridgeCommon.m in Sources */, + D008184622B5710B008A895F /* TGBridgeDocumentMediaAttachment.m in Sources */, + D008183722B5710B008A895F /* TGBridgeActionMediaAttachment.m in Sources */, + D008182D22B5710B008A895F /* TGBridgeForwardedMessageMediaAttachment.m in Sources */, + D008181D22B5710B008A895F /* TGBridgeContext.m in Sources */, + D008183522B5710B008A895F /* TGBridgeUser.m in Sources */, + D008184522B5710B008A895F /* TGBridgeVideoMediaAttachment.m in Sources */, + D008184022B5710B008A895F /* TGBridgeMessageEntities.m in Sources */, + D00818AD22B58F76008A895F /* TGBridgePeerNotificationSettings.m in Sources */, + D008184722B5710B008A895F /* TGBridgeLocationMediaAttachment.m in Sources */, + D008183322B5710B008A895F /* TGBridgeUnsupportedMediaAttachment.m in Sources */, + D008183922B5710B008A895F /* TGBridgeReplyMessageMediaAttachment.m in Sources */, + D008183E22B5710B008A895F /* TGBridgeMessageEntitiesAttachment.m in Sources */, + D008182622B5710B008A895F /* TGBridgeReplyMarkupMediaAttachment.m in Sources */, + D008182222B5710B008A895F /* TGBridgeChatMessages.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D008186322B58A73008A895F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D008187622B58B45008A895F /* TGBridgeContactMediaAttachment.m in Sources */, + D008188622B58B45008A895F /* TGBridgeVideoMediaAttachment.m in Sources */, + D008187022B58B45008A895F /* TGBridgeAudioMediaAttachment.m in Sources */, + D008188222B58B45008A895F /* TGBridgeReplyMessageMediaAttachment.m in Sources */, + D008188122B58B45008A895F /* TGBridgeReplyMarkupMediaAttachment.m in Sources */, + D008187422B58B45008A895F /* TGBridgeChatMessages.m in Sources */, + D008187F22B58B45008A895F /* TGBridgeMessageEntities.m in Sources */, + D008187322B58B45008A895F /* TGBridgeChat.m in Sources */, + D008187822B58B45008A895F /* TGBridgeDocumentMediaAttachment.m in Sources */, + D008187922B58B45008A895F /* TGBridgeForwardedMessageMediaAttachment.m in Sources */, + D008188422B58B45008A895F /* TGBridgeUnsupportedMediaAttachment.m in Sources */, + D008187C22B58B45008A895F /* TGBridgeLocationVenue.m in Sources */, + D008187B22B58B45008A895F /* TGBridgeLocationMediaAttachment.m in Sources */, + D008187222B58B45008A895F /* TGBridgeBotInfo.m in Sources */, + D008187E22B58B45008A895F /* TGBridgeMessage.m in Sources */, + D008188022B58B45008A895F /* TGBridgeMessageEntitiesAttachment.m in Sources */, + D008187722B58B45008A895F /* TGBridgeContext.m in Sources */, + D008188522B58B45008A895F /* TGBridgeUser.m in Sources */, + D008186F22B58B45008A895F /* TGBridgeActionMediaAttachment.m in Sources */, + D00818AE22B58F76008A895F /* TGBridgePeerNotificationSettings.m in Sources */, + D008187A22B58B45008A895F /* TGBridgeImageMediaAttachment.m in Sources */, + D008187D22B58B45008A895F /* TGBridgeMediaAttachment.m in Sources */, + D008188322B58B45008A895F /* TGBridgeSubscriptions.m in Sources */, + D008188722B58B45008A895F /* TGBridgeWebPageMediaAttachment.m in Sources */, + D008187122B58B45008A895F /* TGBridgeBotCommandInfo.m in Sources */, + D008187522B58B45008A895F /* TGBridgeCommon.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D00817AB22B4798B008A895F /* 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; + }; + D00817AC22B4798B008A895F /* 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; + }; + D00817AE22B4798B008A895F /* DebugAppStoreLLC */ = { + 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.WatchCommon; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAppStoreLLC; + }; + D00817AF22B4798B008A895F /* ReleaseAppStoreLLC */ = { + 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.WatchCommon; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStoreLLC; + }; + D008186D22B58A73008A895F /* DebugAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + 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 = ""; + CODE_SIGN_STYLE = Manual; + 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; + 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 = WatchCommonWatch/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-DTARGET_OS_WATCH=1"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.WatchCommonWatch; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = DebugAppStoreLLC; + }; + D008186E22B58A73008A895F /* ReleaseAppStoreLLC */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + 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 = ""; + CODE_SIGN_STYLE = Manual; + 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; + 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 = WatchCommonWatch/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = "-DTARGET_OS_WATCH=1"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.WatchCommonWatch; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 4; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = ReleaseAppStoreLLC; + }; + D0A25B5722B5BEE200AD4DE8 /* 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; + }; + D0A25B5822B5BEE200AD4DE8 /* DebugHockeyapp */ = { + 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.WatchCommon; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugHockeyapp; + }; + D0A25B5922B5BEE200AD4DE8 /* DebugHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + 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 = ""; + CODE_SIGN_STYLE = Manual; + 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; + 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 = WatchCommonWatch/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-DTARGET_OS_WATCH=1"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.WatchCommonWatch; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = DebugHockeyapp; + }; + D0A25B7022B5BF3600AD4DE8 /* 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; + }; + D0A25B7122B5BF3600AD4DE8 /* ReleaseHockeyappInternal */ = { + 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.WatchCommon; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyappInternal; + }; + D0A25B7222B5BF3600AD4DE8 /* ReleaseHockeyappInternal */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + 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 = ""; + CODE_SIGN_STYLE = Manual; + 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; + 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 = WatchCommonWatch/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = "-DTARGET_OS_WATCH=1"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.WatchCommonWatch; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 4; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = ReleaseHockeyappInternal; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D008179F22B4798B008A895F /* Build configuration list for PBXProject "WatchCommon_Xcode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D00817AB22B4798B008A895F /* DebugAppStoreLLC */, + D0A25B5722B5BEE200AD4DE8 /* DebugHockeyapp */, + D00817AC22B4798B008A895F /* ReleaseAppStoreLLC */, + D0A25B7022B5BF3600AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D00817AD22B4798B008A895F /* Build configuration list for PBXNativeTarget "WatchCommon" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D00817AE22B4798B008A895F /* DebugAppStoreLLC */, + D0A25B5822B5BEE200AD4DE8 /* DebugHockeyapp */, + D00817AF22B4798B008A895F /* ReleaseAppStoreLLC */, + D0A25B7122B5BF3600AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; + D008186C22B58A73008A895F /* Build configuration list for PBXNativeTarget "WatchCommonWatch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D008186D22B58A73008A895F /* DebugAppStoreLLC */, + D0A25B5922B5BEE200AD4DE8 /* DebugHockeyapp */, + D008186E22B58A73008A895F /* ReleaseAppStoreLLC */, + D0A25B7222B5BF3600AD4DE8 /* ReleaseHockeyappInternal */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ReleaseAppStoreLLC; + }; +/* End XCConfigurationList section */ + }; + rootObject = D008179C22B4798B008A895F /* Project object */; +} diff --git a/submodules/lottie-ios/.gitignore b/submodules/lottie-ios/.gitignore index 3894abf5df..6b550366e5 100644 --- a/submodules/lottie-ios/.gitignore +++ b/submodules/lottie-ios/.gitignore @@ -5,8 +5,8 @@ LottieExamples/LottieExamples.xcodeproj/xcuserdata/ LottieExamples.xcworkspace/xcuserdata/ Lottie/Lottie.xcodeproj/xcuserdata/ UserInterfaceState.xcuserstate -xample/lottie-ios.xcodeproj/xcuserdata -Lottie.xcodeproj/xcuserdata/ +Example/lottie-ios.xcodeproj/xcuserdata +*/xcuserdata/* Example/lottie-ios.xcworkspace/xcuserdata/ Example/lottie-ios.xcodeproj/xcuserdata/ .idea/ diff --git a/submodules/lottie-ios/Lottie_Xcode.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist b/submodules/lottie-ios/Lottie_Xcode.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 7e54bbfd84..0000000000 --- a/submodules/lottie-ios/Lottie_Xcode.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - SchemeUserState - - Lottie.xcscheme_^#shared#^_ - - orderHint - 3 - - Lottie_iOS.xcscheme_^#shared#^_ - - orderHint - 32 - - - - diff --git a/tools/GenerateLocalization.sh b/tools/GenerateLocalization.sh index aec80ef109..3516dea959 100644 --- a/tools/GenerateLocalization.sh +++ b/tools/GenerateLocalization.sh @@ -1,3 +1,3 @@ #!/bin/sh -swift tools/GenerateLocalization.swift Telegram-iOS/en.lproj/Localizable.strings submodules/TelegramUI/TelegramUI/PresentationStrings.swift submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping +swift tools/GenerateLocalization.swift Telegram-iOS/en.lproj/Localizable.strings submodules/TelegramPresentationData/Sources/PresentationStrings.swift submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping diff --git a/tools/GenerateLocalization.swift b/tools/GenerateLocalization.swift index 97ce585064..489484976a 100644 --- a/tools/GenerateLocalization.swift +++ b/tools/GenerateLocalization.swift @@ -297,7 +297,7 @@ private func extractArgumentRanges(_ value: String) -> [(Int, NSRange)] { return result } -func formatWithArgumentRanges(_ value: String, _ ranges: [(Int, NSRange)], _ arguments: [String]) -> (String, [(Int, NSRange)]) { +public func formatWithArgumentRanges(_ value: String, _ ranges: [(Int, NSRange)], _ arguments: [String]) -> (String, [(Int, NSRange)]) { let string = value as NSString var resultingRanges: [(Int, NSRange)] = [] @@ -348,7 +348,7 @@ private final class DataReader { } private func loadMapping() -> ([Int], [String], [Int], [Int], [String]) { - guard let filePath = frameworkBundle.path(forResource: "PresentationStrings", ofType: "mapping") else { + guard let filePath = Bundle(for: PresentationStrings.self).path(forResource: "PresentationStrings", ofType: "mapping") else { fatalError() } guard let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) else { @@ -505,7 +505,7 @@ public final class PresentationStrings { result += """ - init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { + public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { self.primaryComponent = primaryComponent self.secondaryComponent = secondaryComponent self.groupingSeparator = groupingSeparator