From 58fba306e01918d4da923f6f5de4c8f09c91a8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Ramos?= Date: Thu, 6 Jan 2022 16:18:00 +0000 Subject: [PATCH 1/2] Externalize creation of Chat collection view layout models --- Chatto/Chatto.xcodeproj/project.pbxproj | 8 ++ .../ChatCollectionItemsDiffer.swift | 88 ++++++++++++ ...ChatCollectionViewLayoutModelFactory.swift | 57 ++++++++ .../ChatMessageCollectionAdapter.swift | 131 ++++-------------- 4 files changed, 177 insertions(+), 107 deletions(-) create mode 100644 Chatto/sources/ChatController/ChatMessages/ChatCollectionItemsDiffer.swift create mode 100644 Chatto/sources/ChatController/ChatMessages/ChatCollectionViewLayoutModelFactory.swift diff --git a/Chatto/Chatto.xcodeproj/project.pbxproj b/Chatto/Chatto.xcodeproj/project.pbxproj index d086e466..135746b0 100644 --- a/Chatto/Chatto.xcodeproj/project.pbxproj +++ b/Chatto/Chatto.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ A410D4BD26C570B100A48342 /* ChatMessagesViewControllerHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A410D4BC26C570B100A48342 /* ChatMessagesViewControllerHelpers.swift */; }; A42C66DE273BC387006B032A /* TimingChatInputBarAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A42C66DD273BC387006B032A /* TimingChatInputBarAnimation.swift */; }; A42C66E0273BC3B1006B032A /* SpringChatInputBarAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A42C66DF273BC3B1006B032A /* SpringChatInputBarAnimation.swift */; }; + A441C27C2787442C00988636 /* ChatCollectionViewLayoutModelFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = A441C27B2787442C00988636 /* ChatCollectionViewLayoutModelFactory.swift */; }; + A441C27E2787446C00988636 /* ChatCollectionItemsDiffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A441C27D2787446C00988636 /* ChatCollectionItemsDiffer.swift */; }; A452A8C12705DAED00DCC8D5 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A452A8BF2705DAED00DCC8D5 /* Observable.swift */; }; A4724CDB27355829006B9562 /* ChatPanGestureRecogniserHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4724CDA27355829006B9562 /* ChatPanGestureRecogniserHandler.swift */; }; A4C03CFE26CE431D00360526 /* ChatInputBarPresenterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4C03CFD26CE431D00360526 /* ChatInputBarPresenterProtocol.swift */; }; @@ -69,6 +71,8 @@ A410D4BC26C570B100A48342 /* ChatMessagesViewControllerHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessagesViewControllerHelpers.swift; sourceTree = ""; }; A42C66DD273BC387006B032A /* TimingChatInputBarAnimation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimingChatInputBarAnimation.swift; sourceTree = ""; }; A42C66DF273BC3B1006B032A /* SpringChatInputBarAnimation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpringChatInputBarAnimation.swift; sourceTree = ""; }; + A441C27B2787442C00988636 /* ChatCollectionViewLayoutModelFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayoutModelFactory.swift; sourceTree = ""; }; + A441C27D2787446C00988636 /* ChatCollectionItemsDiffer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatCollectionItemsDiffer.swift; sourceTree = ""; }; A452A8BF2705DAED00DCC8D5 /* Observable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; A4724CDA27355829006B9562 /* ChatPanGestureRecogniserHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatPanGestureRecogniserHandler.swift; sourceTree = ""; }; A4C03CFD26CE431D00360526 /* ChatInputBarPresenterProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresenterProtocol.swift; sourceTree = ""; }; @@ -224,6 +228,8 @@ A4F7666226BD417600008F24 /* ChatMessagesViewController.swift */, A4F7666526BD4FA400008F24 /* ChatMessageCollectionAdapter.swift */, A4F7666726BD59EF00008F24 /* ChatMessagesViewModel.swift */, + A441C27B2787442C00988636 /* ChatCollectionViewLayoutModelFactory.swift */, + A441C27D2787446C00988636 /* ChatCollectionItemsDiffer.swift */, ); path = ChatMessages; sourceTree = ""; @@ -440,6 +446,8 @@ A42C66DE273BC387006B032A /* TimingChatInputBarAnimation.swift in Sources */, C36281E71BF0F196004D6BCE /* UICollectionView+Scrolling.swift in Sources */, 26D653F2251043BD007BC13C /* ReplyFeedbackGenerator.swift in Sources */, + A441C27E2787446C00988636 /* ChatCollectionItemsDiffer.swift in Sources */, + A441C27C2787442C00988636 /* ChatCollectionViewLayoutModelFactory.swift in Sources */, 3565429D203DB99300B29DA1 /* ChatLayoutConfiguration.swift in Sources */, C36281EB1BF0F62F004D6BCE /* DummyChatItemPresenter.swift in Sources */, C3C7C3981CAC4BAC00A49929 /* ChatCollectionViewLayout.swift in Sources */, diff --git a/Chatto/sources/ChatController/ChatMessages/ChatCollectionItemsDiffer.swift b/Chatto/sources/ChatController/ChatMessages/ChatCollectionItemsDiffer.swift new file mode 100644 index 00000000..3c01b1d5 --- /dev/null +++ b/Chatto/sources/ChatController/ChatMessages/ChatCollectionItemsDiffer.swift @@ -0,0 +1,88 @@ +// +// Copyright (c) Bumble, 2021-present. All rights reserved. +// + +import CoreGraphics + +final class ChatCollectionItemsDiffer { + + struct Diff { + let changes: CollectionChanges + let itemCompanionCollection: ChatItemCompanionCollection + let layoutModel: ChatCollectionViewLayoutModel + } + + private let chatItemsDecorator: ChatItemsDecoratorProtocol + private let chatItemPresenterFactory: ChatItemPresenterFactoryProtocol + private let chatCollectionViewLayoutModelFactory: ChatCollectionViewLayoutModelFactoryProtocol + + init( + chatItemsDecorator: ChatItemsDecoratorProtocol, + chatItemPresenterFactory: ChatItemPresenterFactoryProtocol, + chatCollectionViewLayoutModelFactory: ChatCollectionViewLayoutModelFactoryProtocol + ) { + self.chatItemsDecorator = chatItemsDecorator + self.chatItemPresenterFactory = chatItemPresenterFactory + self.chatCollectionViewLayoutModelFactory = chatCollectionViewLayoutModelFactory + } + + func calculateChanges( + newItems: [ChatItemProtocol], + oldItems: ChatItemCompanionCollection, + collectionViewWidth: CGFloat + ) -> Diff { + + let newDecoratedItems = self.chatItemsDecorator.decorateItems(newItems) + let changes = generateChanges( + oldCollection: oldItems.map(HashableItem.init), + newCollection: newDecoratedItems.map(HashableItem.init) + ) + let itemCompanionCollection = self.createCompanionCollection(fromChatItems: newDecoratedItems, previousCompanionCollection: oldItems) + let layoutModel = self.chatCollectionViewLayoutModelFactory.createLayoutModel(itemCompanionCollection, collectionViewWidth: collectionViewWidth) + + return Diff( + changes: changes, + itemCompanionCollection: itemCompanionCollection, + layoutModel: layoutModel + ) + } + + private func createCompanionCollection(fromChatItems newItems: [DecoratedChatItem], previousCompanionCollection oldItems: ChatItemCompanionCollection) -> ChatItemCompanionCollection { + return ChatItemCompanionCollection(items: newItems.map { (decoratedChatItem) -> ChatItemCompanion in + + /* + We use an assumption, that message having a specific messageId never changes its type. + If such changes has to be supported, then generation of changes has to suppport reloading items. + Otherwise, updateVisibleCells may try to update the existing cells with new presenters which aren't able to work with another types. + */ + + let presenter: ChatItemPresenterProtocol = { + guard let oldChatItemCompanion = oldItems[decoratedChatItem.uid] ?? oldItems[decoratedChatItem.chatItem.uid], + oldChatItemCompanion.chatItem.type == decoratedChatItem.chatItem.type, + oldChatItemCompanion.presenter.isItemUpdateSupported else { + return self.chatItemPresenterFactory.createChatItemPresenter(decoratedChatItem.chatItem) + } + + oldChatItemCompanion.presenter.update(with: decoratedChatItem.chatItem) + return oldChatItemCompanion.presenter + }() + + return ChatItemCompanion(uid: decoratedChatItem.uid, chatItem: decoratedChatItem.chatItem, presenter: presenter, decorationAttributes: decoratedChatItem.decorationAttributes) + }) + } +} + +private struct HashableItem: Hashable { + private let uid: String + private let type: String + + init(_ decoratedChatItem: DecoratedChatItem) { + self.uid = decoratedChatItem.uid + self.type = decoratedChatItem.chatItem.type + } + + init(_ chatItemCompanion: ChatItemCompanion) { + self.uid = chatItemCompanion.uid + self.type = chatItemCompanion.chatItem.type + } +} diff --git a/Chatto/sources/ChatController/ChatMessages/ChatCollectionViewLayoutModelFactory.swift b/Chatto/sources/ChatController/ChatMessages/ChatCollectionViewLayoutModelFactory.swift new file mode 100644 index 00000000..b3ad9d9f --- /dev/null +++ b/Chatto/sources/ChatController/ChatMessages/ChatCollectionViewLayoutModelFactory.swift @@ -0,0 +1,57 @@ +// +// Copyright (c) Bumble, 2021-present. All rights reserved. +// + +import CoreGraphics +import Foundation + +public protocol ChatCollectionViewLayoutModelFactoryProtocol { + func createLayoutModel(_ items: ChatItemCompanionCollection, collectionViewWidth: CGFloat) -> ChatCollectionViewLayoutModel +} + +public final class ChatCollectionViewLayoutModelFactory: ChatCollectionViewLayoutModelFactoryProtocol { + + public init() { } + + public func createLayoutModel(_ items: ChatItemCompanionCollection, collectionViewWidth: CGFloat) -> ChatCollectionViewLayoutModel { + // swiftlint:disable:next nesting + typealias IntermediateItemLayoutData = (height: CGFloat?, bottomMargin: CGFloat) + typealias ItemLayoutData = (height: CGFloat, bottomMargin: CGFloat) + // swiftlint:disable:previous nesting + + func createLayoutModel(intermediateLayoutData: [IntermediateItemLayoutData]) -> ChatCollectionViewLayoutModel { + let layoutData = intermediateLayoutData.map { (intermediateLayoutData: IntermediateItemLayoutData) -> ItemLayoutData in + return (height: intermediateLayoutData.height!, bottomMargin: intermediateLayoutData.bottomMargin) + } + return ChatCollectionViewLayoutModel.createModel(collectionViewWidth, itemsLayoutData: layoutData) + } + + let isInBackground = !Thread.isMainThread + var intermediateLayoutData = [IntermediateItemLayoutData]() + var itemsForMainThread = [(index: Int, itemCompanion: ChatItemCompanion)]() + + for (index, itemCompanion) in items.enumerated() { + var height: CGFloat? + let bottomMargin: CGFloat = itemCompanion.decorationAttributes?.bottomMargin ?? 0 + if !isInBackground || itemCompanion.presenter.canCalculateHeightInBackground { + height = itemCompanion.presenter.heightForCell(maximumWidth: collectionViewWidth, decorationAttributes: itemCompanion.decorationAttributes) + } else { + itemsForMainThread.append((index: index, itemCompanion: itemCompanion)) + } + intermediateLayoutData.append((height: height, bottomMargin: bottomMargin)) + } + + if itemsForMainThread.count > 0 { + DispatchQueue.main.sync { + for (index, itemCompanion) in itemsForMainThread { + let height = itemCompanion.presenter.heightForCell( + maximumWidth: collectionViewWidth, + decorationAttributes: itemCompanion.decorationAttributes + ) + intermediateLayoutData[index].height = height + } + } + } + return createLayoutModel(intermediateLayoutData: intermediateLayoutData) + } +} diff --git a/Chatto/sources/ChatController/ChatMessages/ChatMessageCollectionAdapter.swift b/Chatto/sources/ChatController/ChatMessages/ChatMessageCollectionAdapter.swift index 22a913b6..7bf35fe9 100644 --- a/Chatto/sources/ChatController/ChatMessages/ChatMessageCollectionAdapter.swift +++ b/Chatto/sources/ChatController/ChatMessages/ChatMessageCollectionAdapter.swift @@ -40,6 +40,7 @@ public final class ChatMessageCollectionAdapter: NSObject, ChatMessageCollection private let chatItemsDecorator: ChatItemsDecoratorProtocol private let chatItemPresenterFactory: ChatItemPresenterFactoryProtocol private let chatMessagesViewModel: ChatMessagesViewModelProtocol + private let collectionViewLayoutModelFactory: ChatCollectionViewLayoutModelFactoryProtocol private let configuration: Configuration private let referenceIndexPathRestoreProvider: ReferenceIndexPathRestoreProvider private let collectionUpdatesQueue: SerialTaskQueueProtocol @@ -65,10 +66,12 @@ public final class ChatMessageCollectionAdapter: NSObject, ChatMessageCollection chatMessagesViewModel: ChatMessagesViewModelProtocol, configuration: Configuration, referenceIndexPathRestoreProvider: @escaping ReferenceIndexPathRestoreProvider, - updateQueue: SerialTaskQueueProtocol) { + updateQueue: SerialTaskQueueProtocol, + collectionViewLayoutModelFactory: ChatCollectionViewLayoutModelFactoryProtocol = ChatCollectionViewLayoutModelFactory()) { self.chatItemsDecorator = chatItemsDecorator self.chatItemPresenterFactory = chatItemPresenterFactory self.chatMessagesViewModel = chatMessagesViewModel + self.collectionViewLayoutModelFactory = collectionViewLayoutModelFactory self.configuration = configuration self.referenceIndexPathRestoreProvider = referenceIndexPathRestoreProvider self.collectionUpdatesQueue = updateQueue @@ -197,10 +200,13 @@ extension ChatMessageCollectionAdapter: ChatDataSourceDelegateProtocol { let performInBackground = updateType != .firstLoad self.isLoadingContents = true - let performBatchUpdates: (CollectionChanges, @escaping () -> Void) -> Void = { [weak self] changes, updateModelClosure in + let performBatchUpdates: (ChatCollectionItemsDiffer.Diff) -> Void = { [weak self] diff in self?.performBatchUpdates( - updateModelClosure: updateModelClosure, - changes: changes, + updateModelClosure: { [weak self] in + self?.layoutModel = diff.layoutModel + self?.chatItemCompanionCollection = diff.itemCompanionCollection + }, + changes: diff.changes, updateType: updateType ) { self?.isLoadingContents = false @@ -208,8 +214,15 @@ extension ChatMessageCollectionAdapter: ChatDataSourceDelegateProtocol { } } - let createModelUpdate = { [weak self] in - return self?.createModelUpdates( + + let layoutModelsProcessor = ChatCollectionItemsDiffer( + chatItemsDecorator: self.chatItemsDecorator, + chatItemPresenterFactory: self.chatItemPresenterFactory, + chatCollectionViewLayoutModelFactory: self.collectionViewLayoutModelFactory + ) + + let createCollectionItemsDiffBlock: () -> ChatCollectionItemsDiffer.Diff? = { + return layoutModelsProcessor.calculateChanges( newItems: newItems, oldItems: oldItems, collectionViewWidth: collectionViewWidth @@ -218,16 +231,16 @@ extension ChatMessageCollectionAdapter: ChatDataSourceDelegateProtocol { if performInBackground { DispatchQueue.global(qos: .userInitiated).async { - guard let modelUpdate = createModelUpdate() else { return } + guard let collectionItemsDiff = createCollectionItemsDiffBlock() else { return } DispatchQueue.main.async { - performBatchUpdates(modelUpdate.changes, modelUpdate.updateModelClosure) + performBatchUpdates(collectionItemsDiff) } } } else { - guard let modelUpdate = createModelUpdate() else { return } + guard let collectionItemsDiff = createCollectionItemsDiffBlock() else { return } - performBatchUpdates(modelUpdate.changes, modelUpdate.updateModelClosure) + performBatchUpdates(collectionItemsDiff) } } @@ -260,21 +273,6 @@ extension ChatMessageCollectionAdapter: ChatDataSourceDelegateProtocol { } } - private func createModelUpdates(newItems: [ChatItemProtocol], oldItems: ChatItemCompanionCollection, collectionViewWidth: CGFloat) -> (changes: CollectionChanges, updateModelClosure: () -> Void) { - let newDecoratedItems = self.chatItemsDecorator.decorateItems(newItems) - let changes = generateChanges( - oldCollection: oldItems.map(HashableItem.init), - newCollection: newDecoratedItems.map(HashableItem.init) - ) - let itemCompanionCollection = self.createCompanionCollection(fromChatItems: newDecoratedItems, previousCompanionCollection: oldItems) - let layoutModel = self.createLayoutModel(itemCompanionCollection, collectionViewWidth: collectionViewWidth) - let updateModelClosure : () -> Void = { [weak self] in - self?.layoutModel = layoutModel - self?.chatItemCompanionCollection = itemCompanionCollection - } - return (changes, updateModelClosure) - } - // Returns scrolling position in interval [0, 1], 0 top, 1 bottom public var focusPosition: Double { guard let collectionView = self.collectionView else { return 0 } @@ -298,72 +296,6 @@ extension ChatMessageCollectionAdapter: ChatDataSourceDelegateProtocol { return min(max(0, Double(midContentOffset / contentHeight)), 1.0) } - private func createCompanionCollection(fromChatItems newItems: [DecoratedChatItem], previousCompanionCollection oldItems: ChatItemCompanionCollection) -> ChatItemCompanionCollection { - return ChatItemCompanionCollection(items: newItems.map { (decoratedChatItem) -> ChatItemCompanion in - - /* - We use an assumption, that message having a specific messageId never changes its type. - If such changes has to be supported, then generation of changes has to suppport reloading items. - Otherwise, updateVisibleCells may try to update the existing cells with new presenters which aren't able to work with another types. - */ - - let presenter: ChatItemPresenterProtocol = { - guard let oldChatItemCompanion = oldItems[decoratedChatItem.uid] ?? oldItems[decoratedChatItem.chatItem.uid], - oldChatItemCompanion.chatItem.type == decoratedChatItem.chatItem.type, - oldChatItemCompanion.presenter.isItemUpdateSupported else { - return self.chatItemPresenterFactory.createChatItemPresenter(decoratedChatItem.chatItem) - } - - oldChatItemCompanion.presenter.update(with: decoratedChatItem.chatItem) - return oldChatItemCompanion.presenter - }() - - return ChatItemCompanion(uid: decoratedChatItem.uid, chatItem: decoratedChatItem.chatItem, presenter: presenter, decorationAttributes: decoratedChatItem.decorationAttributes) - }) - } - - private func createLayoutModel(_ items: ChatItemCompanionCollection, collectionViewWidth: CGFloat) -> ChatCollectionViewLayoutModel { - // swiftlint:disable:next nesting - typealias IntermediateItemLayoutData = (height: CGFloat?, bottomMargin: CGFloat) - typealias ItemLayoutData = (height: CGFloat, bottomMargin: CGFloat) - // swiftlint:disable:previous nesting - - func createLayoutModel(intermediateLayoutData: [IntermediateItemLayoutData]) -> ChatCollectionViewLayoutModel { - let layoutData = intermediateLayoutData.map { (intermediateLayoutData: IntermediateItemLayoutData) -> ItemLayoutData in - return (height: intermediateLayoutData.height!, bottomMargin: intermediateLayoutData.bottomMargin) - } - return ChatCollectionViewLayoutModel.createModel(collectionViewWidth, itemsLayoutData: layoutData) - } - - let isInBackground = !Thread.isMainThread - var intermediateLayoutData = [IntermediateItemLayoutData]() - var itemsForMainThread = [(index: Int, itemCompanion: ChatItemCompanion)]() - - for (index, itemCompanion) in items.enumerated() { - var height: CGFloat? - let bottomMargin: CGFloat = itemCompanion.decorationAttributes?.bottomMargin ?? 0 - if !isInBackground || itemCompanion.presenter.canCalculateHeightInBackground { - height = itemCompanion.presenter.heightForCell(maximumWidth: collectionViewWidth, decorationAttributes: itemCompanion.decorationAttributes) - } else { - itemsForMainThread.append((index: index, itemCompanion: itemCompanion)) - } - intermediateLayoutData.append((height: height, bottomMargin: bottomMargin)) - } - - if itemsForMainThread.count > 0 { - DispatchQueue.main.sync { - for (index, itemCompanion) in itemsForMainThread { - let height = itemCompanion.presenter.heightForCell( - maximumWidth: collectionViewWidth, - decorationAttributes: itemCompanion.decorationAttributes - ) - intermediateLayoutData[index].height = height - } - } - } - return createLayoutModel(intermediateLayoutData: intermediateLayoutData) - } - private func performBatchUpdates(updateModelClosure: @escaping () -> Void, // swiftlint:disable:this cyclomatic_complexity changes: CollectionChanges, updateType: UpdateType, @@ -560,7 +492,7 @@ extension ChatMessageCollectionAdapter: ChatCollectionViewLayoutModelProviderPro guard let collectionView = self.collectionView else { return self.layoutModel } if self.layoutModel.calculatedForWidth != collectionView.bounds.width { - self.layoutModel = self.createLayoutModel( + self.layoutModel = self.collectionViewLayoutModelFactory.createLayoutModel( self.chatItemCompanionCollection, collectionViewWidth: collectionView.bounds.width ) @@ -703,21 +635,6 @@ public extension ChatMessageCollectionAdapter.Configuration { } } -private struct HashableItem: Hashable { - private let uid: String - private let type: String - - init(_ decoratedChatItem: DecoratedChatItem) { - self.uid = decoratedChatItem.uid - self.type = decoratedChatItem.chatItem.type - } - - init(_ chatItemCompanion: ChatItemCompanion) { - self.uid = chatItemCompanion.uid - self.type = chatItemCompanion.chatItem.type - } -} - private enum ScrollAction { case scrollToBottom case preservePosition(rectForReferenceIndexPathBeforeUpdate: CGRect?, referenceIndexPathAfterUpdate: IndexPath?) From 70cb421da2af00ad51ec647bb54cd287a1329c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Ramos?= Date: Thu, 6 Jan 2022 17:32:57 +0000 Subject: [PATCH 2/2] Update Chat App --- ChattoApp/Pods/Pods.xcodeproj/project.pbxproj | 556 +++++++++--------- 1 file changed, 282 insertions(+), 274 deletions(-) diff --git a/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj b/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj index 8a29346a..f4354311 100644 --- a/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj +++ b/ChattoApp/Pods/Pods.xcodeproj/project.pbxproj @@ -7,60 +7,64 @@ objects = { /* Begin PBXBuildFile section */ + 003F2ECAE07C5743D32F5501F6B784AA /* SpringChatInputBarAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDCE2C239C3934471A34EB8BB04F21AD /* SpringChatInputBarAnimation.swift */; }; 00EB2E6BC141E84F132B4D088910B7B0 /* CGPoint+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACF649A7B1FA5DEF288A1FD7147FBE3A /* CGPoint+Additions.swift */; }; - 02E0E86DDD25DB2467CFDF386FAEAF98 /* ChatInputBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 87B7593F9ACE6D0F89BCE312169EC579 /* ChatInputBar.xib */; }; + 0125D23FAF85A9F3634D170F8B8E8DB5 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EBF19624B1D9CADD4D2B7DA35A3DA083 /* Text.xcassets */; }; 07CC00A4C827F65D1861E8DF749A708C /* DeviceImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661700D3A85B45B3D5683B77D6C00FC5 /* DeviceImagePicker.swift */; }; - 0EB1146B2D578A1B4D8723594F785DC2 /* ChatInputBarPresenterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC09DE4DEC2A5F03A62FFE7AE28DFCB1 /* ChatInputBarPresenterProtocol.swift */; }; - 13637A707AD89CA6F0A58951D2A56195 /* ChatLayoutConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D979E155CD6CC2D73B4C0BC8C91A2D29 /* ChatLayoutConfiguration.swift */; }; + 0985D13F549F74E62A8BFF60B72F32AF /* CellPanGestureHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D48B0D061A05AB312BA7773FC98C98C0 /* CellPanGestureHandler.swift */; }; + 10E4579A4B73C2FBEAAD9B7F4B77F9C6 /* Photos.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52A7245D99547533B4A7001E133B3C64 /* Photos.xcassets */; }; + 138884405664B1A215F756703802E99F /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF1A85F3E2104EC2D54276D495D0415 /* Utils.swift */; }; 154CF72B88B890557846D47FE00479D6 /* PhotosInputCameraPickerFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = EADF0E28FF1964D1424BA20722EDC327 /* PhotosInputCameraPickerFactory.swift */; }; 16E922ACA282B2DCAF5DA57A68215EC1 /* LiveCameraCellPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B9EFAA192D05BEECBD25E428510D3B /* LiveCameraCellPresenter.swift */; }; 1780A07826157489183EB1E8233E34E1 /* UIEdgeInsets+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1B41D41D2370BC3F3ED01F33EF9012 /* UIEdgeInsets+Additions.swift */; }; 17C3514B4782EA46A1C591A181E54381 /* ExpandableChatInputBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D43BA1BF90EAFEF71DC1A17C96381D5 /* ExpandableChatInputBarPresenter.swift */; }; 1A732A0BB697BC877CAF74FCB4B7B047 /* UIImage+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6379F7A04029BEFC6BE54840D9343D8 /* UIImage+Additions.swift */; }; + 1B0C2634BC49FE297AFE1D92CB232420 /* CollectionChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2668A3D3780839295A8570A4859E7CF1 /* CollectionChanges.swift */; }; + 1B0D411A94A48FAAC5D35DCE2E4AD792 /* BaseMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9E41BCDF63D778520436C3062CD198C5 /* BaseMessageAssets.xcassets */; }; + 1B539EC34805B13B392556BF8C0FECDB /* SerialTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C63D8B2734E0D40343E34F22867211 /* SerialTaskQueue.swift */; }; 1BE952CA2546077CAFC0EF07154B6D9E /* ChatInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C7AE12BDA8AD163A62E447D0FAA8591 /* ChatInputBar.swift */; }; - 1E6E562A6BDD65F4937BBD13345596A7 /* UICollectionView+Scrolling.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEA43424C19C862124F27C3F1D73E270 /* UICollectionView+Scrolling.swift */; }; - 1EED7336C691A7481346A1E6D4E3C61D /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D35C8AD37BF6FA97373E73A41E192735 /* Observable.swift */; }; - 20D66140FD48456B4160A7CE1E2437F8 /* Chatto-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1185D1A9587737C9A2D5D1118C224624 /* Chatto-dummy.m */; }; + 1C82FE13FAD506658E0D4073A598A752 /* ChatCollectionViewLayoutModelFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA011027BB75080B61DDFF1C683FCE9C /* ChatCollectionViewLayoutModelFactory.swift */; }; + 1D86CF3962CF47E19D5E104C0DBDE016 /* ChatInputBarPresenterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 143D512C194D5F08CC08B2AD230DD76B /* ChatInputBarPresenterProtocol.swift */; }; 2253E0FF9E1C2043AAD1EA10B3F17073 /* Pods-ChattoApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D8F53B3D35A3001CB4D8DF8DEE7781 /* Pods-ChattoApp-dummy.m */; }; 23B2068915D4FD024A4DC2A86122F51D /* ExpandableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56E03DCB0F8049A3D612E93AF886F0F /* ExpandableTextView.swift */; }; 23B5C5061389186AFB6B263D0A31F4D1 /* UIColor+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACB2A7E690D64B9C8CB515E5DA0F6826 /* UIColor+Additions.swift */; }; + 24C937E895962EC907615B3F9B3C1117 /* DummyChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078D55B67676BA58253816178939C796 /* DummyChatItemPresenter.swift */; }; 2B434F5CC3C519929AEAB4A6208F5267 /* Comparable+Clamp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038475DFC67DAF6790F9251D71436C20 /* Comparable+Clamp.swift */; }; 2CEEBB59299443CE93920AA3D055C170 /* PhotosInputWithPlaceholdersDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B0D0C7C95B62FD18DC5493BBB3DF740 /* PhotosInputWithPlaceholdersDataProvider.swift */; }; - 2EA7F87DF1063B2ADA281701D153F437 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF1A85F3E2104EC2D54276D495D0415 /* Utils.swift */; }; 2ED92B5A86446980F53DB8EDFFC17398 /* PhotosInputDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D59AEFD3EC0C51AF97125A179003CE2 /* PhotosInputDataProvider.swift */; }; 2F86EE6E41066BF26E1D7F30804A0C86 /* PhotoMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D17CF1E42B722D8D3E12C2D3F4A9ACB /* PhotoMessageViewModel.swift */; }; 339D71EC31AC1BF18B9B614D0D5CA3B3 /* PhotosInputCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8723EBB8B61794C634D2F6346DDC292B /* PhotosInputCellProvider.swift */; }; - 35F4AF53A7F62027CED279E93ED4D609 /* ChatItemPresenterFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7027C3EE1502E19009ABCA8A7694A52 /* ChatItemPresenterFactory.swift */; }; 37932F22893AA65579DD58E1CEE6FB88 /* PhotosInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7134068F85C7A97E897C74C9A660EC66 /* PhotosInputView.swift */; }; - 3BB1E8AB74047E93C78C14325B36E6CC /* BaseChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584B694D43227E15C7913F9BD6FF49EB /* BaseChatViewController.swift */; }; - 3BEEF2CD836466CFEE16F62EECD1D5CF /* ChatPanGestureRecogniserHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C25B9CCA3A20D37EE56BE7D5966662 /* ChatPanGestureRecogniserHandler.swift */; }; - 3C4A6A6BF4ABF9875CD05C887CA58AB2 /* PhotoMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0185AD1836B9B8763657BAC030D91473 /* PhotoMessageAssets.xcassets */; }; - 3CD0ABED334777FEB5F32AFA2574D0D7 /* ChatItemCompanionCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB170A541BEFBC5F51BBD9E4A5164785 /* ChatItemCompanionCollection.swift */; }; + 39F96A17E81F55DA6E73B523748A5159 /* ChatDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E173FBBAB820131F08E77B8B8109A /* ChatDataSourceProtocol.swift */; }; 3D053B3EF6B2A92E39A00DF23E5E4B90 /* PhotosInputPlaceholderCellProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530BA25D3FF43217DFF1D958AA222062 /* PhotosInputPlaceholderCellProvider.swift */; }; 3D668DAB86C941BB767741057D3FDAA9 /* CGRect+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3812BB5710112A2E9D173AB4A99682ED /* CGRect+Additions.swift */; }; + 3E250A858EC64129E8A0F8A2A17520E5 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D35C8AD37BF6FA97373E73A41E192735 /* Observable.swift */; }; + 3F26414090107486FA0E69286B4C5201 /* CircleProgressIndicator.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FCE3A4E2E905614489D899CF3DA5ECF1 /* CircleProgressIndicator.xcassets */; }; 3F3C38B891197D58D094BB1E63D6DD53 /* PhotoMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4E1AA9EAAB00639E329B1CC622D4C6 /* PhotoMessageCollectionViewCell.swift */; }; - 405EA46E87BC3BB9823B2F53428630A3 /* SerialTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C63D8B2734E0D40343E34F22867211 /* SerialTaskQueue.swift */; }; + 3FE4E9B311C71CF6067D686C7527A103 /* KeyboardTrackingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F71AE145ADAC65F9B346761F610F725 /* KeyboardTrackingView.swift */; }; 4091E6388613F779520A7AB0C844EEA3 /* AnimationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009DAEEF69090C4D6A7DC1CBBCEF6F1E /* AnimationUtils.swift */; }; 4212AD2DFAC3801600330A58EF12F17A /* TabInputButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F9E66831B38308CDF41E0B77603ED4 /* TabInputButton.swift */; }; 42348A6991029456AABE9B919497CD34 /* TextMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35D14E9CE87F00AF37FA075D473A65D2 /* TextMessageCollectionViewCell.swift */; }; + 42C1CE80A21C143EBC68223104805768 /* ChatItemProtocolDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5C6D879A052F44B466FF9784312A49A /* ChatItemProtocolDefinitions.swift */; }; 42FBBB3259F624354B774DA6529411F5 /* ChattoAdditionsResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B69CE53DFDF835669B41DFD94AB864CB /* ChattoAdditionsResources.bundle */; }; 46F5E24943EC79F0AC856D3D754D456F /* MessageManualLayoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD4EC59767080080BBED92A523164C9 /* MessageManualLayoutProvider.swift */; }; 4704DD1F6633B9D778E3EECA6C9ADFAB /* ChatItemDecorationAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F087AE157F5AC06AA804FC46A77B71B /* ChatItemDecorationAttributes.swift */; }; - 48C0CAF993C8249BB2E819963F5177F3 /* ChatCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9F2D986A2BE442DCFA4953440C2FFA7 /* ChatCollectionViewLayout.swift */; }; 494FF16A6872EF0C69DF82FE80AF4FEB /* PhotosInputPlaceholderDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6BCB209CE65FDABAEF0553C64505E1C /* PhotosInputPlaceholderDataProvider.swift */; }; 4997434FEFDEF314942F598E40C3F928 /* PhotosInputViewItemSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F08FD20C263EE93DEC3540049AB8176 /* PhotosInputViewItemSizeCalculator.swift */; }; 4B97DB46A9C83062343A0C6541DE8DF5 /* InterfaceOrientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C5B3CAFB19724AC824BB4825A56FA1 /* InterfaceOrientation.swift */; }; - 4C306216BCA3D540C5A9BE1B3CEF3195 /* Photos.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52A7245D99547533B4A7001E133B3C64 /* Photos.xcassets */; }; - 4D897F33E421DDFDE061E617D5FAF6F9 /* BaseChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EE78EC2711AC0E7B2D4080C06890653 /* BaseChatItemPresenter.swift */; }; + 4BDB4B80DDBF307D41BF24368A9DCFED /* KeyboardUpdatesHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42354B463B5D5894771D179FBB67B0AE /* KeyboardUpdatesHandler.swift */; }; + 4F0B8E47888FE2672671ECCF5EE72D88 /* ChatCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6290972FD401F2AD5C3F5D95D861D0CE /* ChatCollectionViewLayout.swift */; }; + 52FF6230422035E4E2E6A86C0E85603F /* TimingChatInputBarAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C734FC70108E74B4F9918630B682D /* TimingChatInputBarAnimation.swift */; }; 5527B075E88EECD91617F9728090A8B8 /* ScreenMetric.swift in Sources */ = {isa = PBXBuildFile; fileRef = 938AAA3CC84615DF6D2CFF4F8DF20636 /* ScreenMetric.swift */; }; + 572A921E57471AEEDD3252F8D8589BA2 /* PhotoMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0185AD1836B9B8763657BAC030D91473 /* PhotoMessageAssets.xcassets */; }; 579304C64F4EFB67D959B0F2FD112C5B /* PhotosInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E72BE9AEE3E4F54CDFE9FAE59166363E /* PhotosInputCell.swift */; }; 58BDE705E7301231450994BE0E19B35C /* MessageContentFactoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F6B8F8D95E01A6902FCD41D5AC28A1 /* MessageContentFactoryProtocol.swift */; }; + 592563EB268C19DAF968A057CFDDCF84 /* ChatMessageCollectionAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5012EE2172CC9592FCF2F0476C98366F /* ChatMessageCollectionAdapter.swift */; }; 5F906505E6AE53EEDB5ACFF2C7371801 /* CGSize+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA72CB94919BC071C4DBC5BE2E72F38 /* CGSize+Additions.swift */; }; 620AB510F834DE47D098E97F336415EF /* LiveCameraCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64656EC1E32EEC6BE89FC78428808E7C /* LiveCameraCell.swift */; }; 622F2EAFCB860EAD9D7AC9D58694F38E /* HashableRepresentible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4345021DC4C6037AB46F80906E6F8EB7 /* HashableRepresentible.swift */; }; 6419A5FD33AC9E0F1124C774F58A411C /* TextMessageMenuItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4E34B23EA1A4774877199279DC9571 /* TextMessageMenuItemPresenter.swift */; }; 652333315E93BB92D3B35625D10A4AA4 /* MessageDecorationViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A26AFFAD042EDA8AC0F9A712B8FBFB1 /* MessageDecorationViewLayout.swift */; }; - 65A804D2D9E40A830F08150B3CBCC470 /* TimingChatInputBarAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2341E42690D9B7EE81E1AB8063EB38 /* TimingChatInputBarAnimation.swift */; }; 65CC5C996B64F811F524311108AD8B31 /* BaseMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1A0F1E99B5713EE367393A2EE8A42B /* BaseMessageModel.swift */; }; 6891E06B17FF02AA54BF27FF123EB342 /* DefaultMessageContentPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F08F229260BF51B6425DFA0CC81B91F /* DefaultMessageContentPresenter.swift */; }; 6F09FC0A3802E1AF124D2EE151E21D45 /* PhotoBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD94BDC3622753A4E273A85D3420DEA /* PhotoBubbleView.swift */; }; @@ -71,121 +75,123 @@ 777B7EACC081A34BDE07ACEA4D818391 /* MessageContentPresenterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F33FD6C3CBE26D8086267D1D7A74D28 /* MessageContentPresenterProtocol.swift */; }; 787D7273C49901F2DB2D53857C0D362B /* ChatInputBarAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = D530671835A46A969EB8302BC5C8FD38 /* ChatInputBarAppearance.swift */; }; 78F4EF1F6AC0B9E09C1C1599EBEAFBFD /* CompoundBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28B4E861520526CF6E83C41850B41977 /* CompoundBubbleView.swift */; }; - 7916906EFADE057BE49B5EB7625FF7CE /* CellPanGestureHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B05D463E398889578B5C2A9DAD235A6A /* CellPanGestureHandler.swift */; }; 7B198CB86EA6EB5AC307578498921433 /* TextMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6D1A3B3FEE005219931F07BC5DA2713 /* TextMessagePresenter.swift */; }; - 7C4F381F2D7BC23E0EA0E51985D3830B /* BaseChatViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E3C2006EEC25948D4BF30DAE7C73EB /* BaseChatViewControllerView.swift */; }; 7C97C0EC86CD2AF1F2EDB0FB09C8EBBA /* CircleIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC345418E6E94716CFC6CCDF18950CEB /* CircleIconView.swift */; }; - 81DC567C0001EA3735798919B495644F /* ChatMessagesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A60EA44E4C23A4228C485E6F3D006101 /* ChatMessagesViewModel.swift */; }; + 82922282764102B1B6D00FAC46AFE34C /* ChatPanGestureRecogniserHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4F00D3C855A8951FD25A5817A4FFEC7 /* ChatPanGestureRecogniserHandler.swift */; }; 83D013DBC8BAA35F7294F5C9F146D3E0 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDB68F8A5A3C37EE338167096C856BF /* ImagePicker.swift */; }; 877586932993ADA221E223333EC8C291 /* PhotosInputPermissionsRequester.swift in Sources */ = {isa = PBXBuildFile; fileRef = F57A98FA29BCD97E024C761CDEB6E841 /* PhotosInputPermissionsRequester.swift */; }; + 893D3ADDFB5F5A1564F7570ECDC6F012 /* BaseChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EE78EC2711AC0E7B2D4080C06890653 /* BaseChatItemPresenter.swift */; }; + 89CCB22B3C1D293148125864A7007700 /* ChatMessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3C2CA50DEC4C1AD4D43AA5CD10C6312 /* ChatMessagesViewController.swift */; }; 89FCF4849FB53DD7AFB1AE08E4F4FB58 /* CompoundMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A11CD0D12D2AE9E0629223F15214F35 /* CompoundMessagePresenter.swift */; }; 8C1FF2BDBA658D6F75A3D44D0BAF2AAE /* CompoundMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E68C5F978F31C0D13FFCA6709039F55 /* CompoundMessageCollectionViewCell.swift */; }; 8E1C210603012EF495DA0A8AEDD5667F /* ChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98BF0CF2593641882594726E8D415BAA /* ChatInputItem.swift */; }; - 8E95EDF32D9658D2FA18F9FA9B926636 /* Chatto-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 66B97D1300DA73954DACA42B5005767D /* Chatto-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F8AE08207329B91C189FE7DE55FB86F /* PhotoMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA6E3740071EF2CE69466E68842241E0 /* PhotoMessageCollectionViewCellDefaultStyle.swift */; }; + 903FB0735034A1CB519B9CFA69E0C092 /* ChatLayoutConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 442F94661D5AC1DF7C8C8BE07A8E99B7 /* ChatLayoutConfiguration.swift */; }; 9246993D9B6894BC5DCD40D888241B5B /* TextChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27FD1E5F80CE44EE71AFE5FF0E1C0D98 /* TextChatInputItem.swift */; }; - 92849FA477AC502986BDA8D0B52014A7 /* KeyboardTrackingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F71AE145ADAC65F9B346761F610F725 /* KeyboardTrackingView.swift */; }; 988ACEE510B7E633549500CEE327C610 /* PasteActionInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A16C75D8526B19AC7A81186F1273E776 /* PasteActionInterceptor.swift */; }; 999DF579C57B35E1403191ADCA6823CA /* ChatInputBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E53BA465DD67F06192ACB75D2569516 /* ChatInputBarPresenter.swift */; }; + 9AEA59A15EA05C11AB16E100C92EC104 /* ChatCollectionItemsDiffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07B68335FA1D8D310730094C6C5D4D6F /* ChatCollectionItemsDiffer.swift */; }; 9CD06168393D27A744B9073C92E022FF /* PhotoMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56A24D4015BB6DFEAEF646E445474E66 /* PhotoMessagePresenterBuilder.swift */; }; - A1E4FD347578B0863AAFACA99E734A6D /* ChatDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE52590F8E9909C7136C08B440CAD99F /* ChatDataSourceProtocol.swift */; }; A2F81EB7841764814A015B05D3E67170 /* LiveCameraCaptureSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581029AF3E905E3A06C6EA0D88744C02 /* LiveCameraCaptureSession.swift */; }; A33ADC9BE31AB6501145FAC28881A3B2 /* ChatInputItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262132B0D1FC8558486851D3C2869E5D /* ChatInputItemView.swift */; }; - A4B59A1A87A6BFD55D407E5368A1323A /* CircleProgressIndicator.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FCE3A4E2E905614489D899CF3DA5ECF1 /* CircleProgressIndicator.xcassets */; }; + A3B8C25D1F9EB5A90CF0F8722C0BB790 /* BaseChatViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54A1063085E82FF6415E1D92DA08E4EA /* BaseChatViewControllerView.swift */; }; + A508CFA7FCD317A850C84C1C7C70B0EF /* Chatto-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1185D1A9587737C9A2D5D1118C224624 /* Chatto-dummy.m */; }; + A55B73036E085F6CF603BEDB900B0600 /* KeyboardTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 119670577840787E0F6E6AC655280124 /* KeyboardTracker.swift */; }; A58F8D4106B4A64DD08AC3E19CD89E0C /* PhotoMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3345AB3E1F5288239FFC002EFA054A4 /* PhotoMessageModel.swift */; }; + A71CE3CF11AEB23921951CF3396C7117 /* ChatItemCompanionCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB170A541BEFBC5F51BBD9E4A5164785 /* ChatItemCompanionCollection.swift */; }; A75E131345AF0A47C651D5D6A7D1B368 /* PhotosChatInputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E8F6A159C729440C457DBEAFD433BE9 /* PhotosChatInputItem.swift */; }; - A7F961BF5F3C7DDEFF5B249803DC2869 /* ChatMessageCollectionAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7532D03706FF61CFB9620732053730C /* ChatMessageCollectionAdapter.swift */; }; A99F2EDA18601640924DE0CE5932F01D /* PhotosInputPlaceholderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B1BEB0F26F8126B178097CC6D49671D /* PhotosInputPlaceholderCell.swift */; }; + AD1F4A438C5BBD5EDF7FC7B331AEF6F1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A174E57201961225505A5D48D72BCCE /* Foundation.framework */; }; AE0BFC4FBAC0C0891F41134AB89A2D04 /* LiveCameraCellPresenterFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7F71861005280E74B6B2EF09AAEBEE5 /* LiveCameraCellPresenterFactory.swift */; }; + B128937C10F96D5E259DA2C345537808 /* ChatInputBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 87B7593F9ACE6D0F89BCE312169EC579 /* ChatInputBar.xib */; }; BB5081AF0B5861381E1B1E175E0D8F9D /* Bundle+ChattoAdditionsResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8729C262A28E3C8F1FB05A52F8927722 /* Bundle+ChattoAdditionsResources.swift */; }; BB9D40CE200443AF72A5AEC9CEF0D631 /* CompoundBubbleLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40FA029FA472120383F421594BD26B33 /* CompoundBubbleLayout.swift */; }; BC02F2B3F53174F76445A8FC4BF765BA /* CGFloat+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83C1ABB7087E5B99746DCCEFC47100B8 /* CGFloat+Additions.swift */; }; - BD866EBC57473D2BAF81A4707FC79A43 /* ChatItemProtocolDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5C6D879A052F44B466FF9784312A49A /* ChatItemProtocolDefinitions.swift */; }; - BEE033B76D6699A8DE3C386957D2476E /* BaseMessageAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9E41BCDF63D778520436C3062CD198C5 /* BaseMessageAssets.xcassets */; }; C0AD63BF84C962D58A84C67426D62F7D /* ReusableXibView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 069DCCA2F9496A96BAB87A09525F5E3F /* ReusableXibView.swift */; }; C2E6B8DEC9B61A3D5CF99B186C6ACDCD /* TextMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214986D45BEFA3EB404C1E1D99E9EA6E /* TextMessagePresenterBuilder.swift */; }; - C8003652912969F689939AC8B41E4B3E /* ChatInputBarPresentingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74ACF02E2C13B1287A42BC6EB26ED06E /* ChatInputBarPresentingController.swift */; }; C8B3EA93E54E4297E111C1110CDD98FE /* BaseMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145470743D9D98A8B9C5CF149CD85495 /* BaseMessageCollectionViewCellDefaultStyle.swift */; }; CA472B48A6B2F5A5CD5BA49C8B850D13 /* CALayer+ImageMask.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3AD8DB03094B64985503C351FF7B98C /* CALayer+ImageMask.swift */; }; - CA532FCE954848752903D56687B3AEDE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A174E57201961225505A5D48D72BCCE /* Foundation.framework */; }; CBF9DEA4BA7DCDA0AD204CB43F8CD66A /* CircleProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5027D7F175A68A9868CE09E38068400 /* CircleProgressView.swift */; }; - CCCD743F7FB7353E3F48C6EAA2C562E4 /* SpringChatInputBarAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26AF77D5CE7FD21510F05E496707F576 /* SpringChatInputBarAnimation.swift */; }; - CDD31BF26225145340B4ABFCFA055E08 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EBF19624B1D9CADD4D2B7DA35A3DA083 /* Text.xcassets */; }; CF94CA2C83F69DA21F7505C89FF4BFB0 /* PhotoMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBEFFDA36D3CDD63AB9C3EDA098C92B8 /* PhotoMessagePresenter.swift */; }; - D2AC3E9F2EB40E853D883EBA8497D6D3 /* CollectionChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7E8E20AAFB5DD41BBC4E4291AA8AE0 /* CollectionChanges.swift */; }; - D37276F6F6C27336EB0B5D60A35A6F8D /* ReplyFeedbackGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46B74B27F715EF926E2BC3C8DB98757A /* ReplyFeedbackGenerator.swift */; }; + D2AF5E676EF6FE3AC4635885C9F8AF51 /* ChatItemPresenterFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0455D3183EBACE5BBBD2024148B99B0 /* ChatItemPresenterFactory.swift */; }; + D74377A4A0DD2569F9BC67D6EC82E65C /* ReplyFeedbackGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 409845FFF4C927886ED9A7A8623F5C03 /* ReplyFeedbackGenerator.swift */; }; D851A603E6A43DCE04C6A24739A0636B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A174E57201961225505A5D48D72BCCE /* Foundation.framework */; }; D9DA0FF8CC18CB432904AEB131DBF746 /* UIView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35672C0736CD9F555351A756B7FAE1B3 /* UIView+Additions.swift */; }; DA9FE06E8DDD57FE19A78A26ACD73D1D /* TextMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079C35789EED1140E7FFF154BAB4B648 /* TextMessageViewModel.swift */; }; + DB3F104338C001F0A5F54EA943320DAE /* UICollectionView+Scrolling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11E8626289F5676FA64783637EC4C4D1 /* UICollectionView+Scrolling.swift */; }; + DC07E45242DD94EFC8F7D67AC3205B76 /* ChatInputBarPresentingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E953FE1E792158393BA777203BA82390 /* ChatInputBarPresentingController.swift */; }; DCBC7D07930EF9DD3260194325E03327 /* Pods-ChattoApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F284074807EBD02656E1B9678B3FA42 /* Pods-ChattoApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE18B334044C255AD0126A4F9F40AFFF /* InputContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33EF577CE23ED9D7DF1E1634682D2668 /* InputContainerView.swift */; }; + DF27667B6EB93BE585985A422424FF95 /* Chatto-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 66B97D1300DA73954DACA42B5005767D /* Chatto-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF4A1DD9E780626072E1DAF86441AD9E /* BaseMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBA8A9FEE5B0B8863937B800C414E133 /* BaseMessageCollectionViewCell.swift */; }; - E41584F8F6A6F2E6F9647B661C0256F0 /* ChatItemCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF2F30B2D5FF09A8980C69E68FA9742 /* ChatItemCompanion.swift */; }; E49DE963481A5D89282719E7D0265316 /* UIScreen+Scale.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC48EF67D428D2B332007607077E7E5C /* UIScreen+Scale.swift */; }; E51B64ACFF28A1BC3E1EFA576857F966 /* ChattoAdditions-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5536EF55D73789751617E5BA048FB5 /* ChattoAdditions-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; E635A12FEED08A757219C3A87D5B5442 /* TextBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC4C1EFCE9EB2F4848FB9958A158C03E /* TextBubbleView.swift */; }; E67AF62F1239F32452260050F06076BF /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7504C8D2D9A349AC4A1ADDBAD9921F /* Alignment.swift */; }; + E8BC1D6045E1C6ACCC2B5C270E664D1D /* ChatMessagesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1BCB700DD5BF5618C102B7F7A4A2677 /* ChatMessagesViewModel.swift */; }; E8F0B135CFB3707D86CFA91376C6DB14 /* Chatto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCCE6A8E9F86772CD3FC9DDFC357633B /* Chatto.framework */; }; EAFECEC4C211A06F020DE2463EEFF78F /* PhotosInputCameraPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43364DB51BDA445069CD636E45E38EC1 /* PhotosInputCameraPicker.swift */; }; EB16A01C4A3F811D7C8BE7E000F171A8 /* MessageDecorationViewFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FA0FFE3039D0EA03342BE35A329089F /* MessageDecorationViewFactory.swift */; }; EB6132855178068B6CE39B3645DB977B /* CompoundBubbleViewStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8FEE54CE1FD0D4EEC5C364BCD9E0334 /* CompoundBubbleViewStyle.swift */; }; EF35DEE6C1BB0C1E7C1D16EA55C4F489 /* BaseMessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB084BA94AAD34EC8E0BFDF58C5CD36F /* BaseMessageViewModel.swift */; }; - EF952EF4A62AEC3E2B2332947339FD10 /* KeyboardUpdatesHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42354B463B5D5894771D179FBB67B0AE /* KeyboardUpdatesHandler.swift */; }; EFD704838767B1580DA407E00E85274A /* ViewDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E33E6AE1854A15B028E7AB2FDB4E7DC3 /* ViewDefinitions.swift */; }; + EFF44242521E77BEAE5A38003F96AE81 /* ChatItemCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF2F30B2D5FF09A8980C69E68FA9742 /* ChatItemCompanion.swift */; }; EFFE7A4E0D4ECAAD4F03B07674DA9C93 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A174E57201961225505A5D48D72BCCE /* Foundation.framework */; }; F0E3C85A149C20BC1B8D73518CB5CD76 /* BaseMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEDA0921EB2441A5A2EDAAC58BF977F /* BaseMessagePresenter.swift */; }; - F5C876D7767B050DD81473753273E28D /* ChatMessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE4A549C9FA905538F6E514A56BC5D9 /* ChatMessagesViewController.swift */; }; F5D44AE8A94BCC3A1D7122877B21737B /* CompoundMessagePresenterBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35ED7D8355F239A9A959FB70A4B526C5 /* CompoundMessagePresenterBuilder.swift */; }; - F86759BE6870C99C809CC5AA64871000 /* KeyboardTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 119670577840787E0F6E6AC655280124 /* KeyboardTracker.swift */; }; F87DAB0F24EAABB87BAD9112C085F2EB /* TextMessageCollectionViewCellDefaultStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D308A24D5378069C6F64B782BDBFC5 /* TextMessageCollectionViewCellDefaultStyle.swift */; }; - F95C8C2877F053B0D1A7E1F6ACAA48C6 /* DummyChatItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078D55B67676BA58253816178939C796 /* DummyChatItemPresenter.swift */; }; + FC189062F25305EE32486CD4DF27911B /* BaseChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1234E52190DA6CAE6304891425712B /* BaseChatViewController.swift */; }; FED3D8260F5BB583756E3501D55BA64F /* HorizontalStackScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADCA9C47DDB844C92F6D512640684AA /* HorizontalStackScrollView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 39315306270EB9F2A0601ACAC1F95078 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 2508BC3B908322C9E85E61AE743C9842; - remoteInfo = Chatto; - }; - 994104EA7729CB64C942076C53F97CDF /* PBXContainerItemProxy */ = { + 41DFE8A22ED40EA1B55EFE53CD84D4EA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9A88D54DB316ADF1E80363324718D63E; remoteInfo = ChattoAdditions; }; - A18109297E4D5FFB8CAC1CCC6DCDE332 /* PBXContainerItemProxy */ = { + C15B181B61236BF881F252706F28C8BD /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 6F936489F9DED646FF7F46860CC24EDB; - remoteInfo = "ChattoAdditions-ChattoAdditionsResources"; + remoteGlobalIDString = 2508BC3B908322C9E85E61AE743C9842; + remoteInfo = Chatto; }; - A839D986B4F4A35765E559B1F3F83F59 /* PBXContainerItemProxy */ = { + D7EF4CD3230EE8601D53160AC1DA1F6A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 2508BC3B908322C9E85E61AE743C9842; remoteInfo = Chatto; }; + F19526F8EDCBC8EE8EB0C27F105FC254 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6F936489F9DED646FF7F46860CC24EDB; + remoteInfo = "ChattoAdditions-ChattoAdditionsResources"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 009DAEEF69090C4D6A7DC1CBBCEF6F1E /* AnimationUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AnimationUtils.swift; sourceTree = ""; }; 0185AD1836B9B8763657BAC030D91473 /* PhotoMessageAssets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = PhotoMessageAssets.xcassets; sourceTree = ""; }; 038475DFC67DAF6790F9251D71436C20 /* Comparable+Clamp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Comparable+Clamp.swift"; sourceTree = ""; }; + 039C734FC70108E74B4F9918630B682D /* TimingChatInputBarAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TimingChatInputBarAnimation.swift; sourceTree = ""; }; 069DCCA2F9496A96BAB87A09525F5E3F /* ReusableXibView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReusableXibView.swift; sourceTree = ""; }; 06E4110FB72B044C77A054F2EBEAF854 /* Chatto.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Chatto.modulemap; sourceTree = ""; }; 078D55B67676BA58253816178939C796 /* DummyChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DummyChatItemPresenter.swift; sourceTree = ""; }; 079C35789EED1140E7FFF154BAB4B648 /* TextMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageViewModel.swift; sourceTree = ""; }; + 07B68335FA1D8D310730094C6C5D4D6F /* ChatCollectionItemsDiffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionItemsDiffer.swift; sourceTree = ""; }; 08F6B8F8D95E01A6902FCD41D5AC28A1 /* MessageContentFactoryProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MessageContentFactoryProtocol.swift; sourceTree = ""; }; 0F08FD20C263EE93DEC3540049AB8176 /* PhotosInputViewItemSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputViewItemSizeCalculator.swift; sourceTree = ""; }; 0FA0FFE3039D0EA03342BE35A329089F /* MessageDecorationViewFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MessageDecorationViewFactory.swift; sourceTree = ""; }; 1185D1A9587737C9A2D5D1118C224624 /* Chatto-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Chatto-dummy.m"; sourceTree = ""; }; 119670577840787E0F6E6AC655280124 /* KeyboardTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardTracker.swift; sourceTree = ""; }; + 11E8626289F5676FA64783637EC4C4D1 /* UICollectionView+Scrolling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Scrolling.swift"; sourceTree = ""; }; + 143D512C194D5F08CC08B2AD230DD76B /* ChatInputBarPresenterProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresenterProtocol.swift; sourceTree = ""; }; 145470743D9D98A8B9C5CF149CD85495 /* BaseMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; 17DABB4FAF93F3412343EA3829D21C6E /* Pods-ChattoApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ChattoApp-acknowledgements.plist"; sourceTree = ""; }; 1ADCA9C47DDB844C92F6D512640684AA /* HorizontalStackScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HorizontalStackScrollView.swift; sourceTree = ""; }; @@ -194,7 +200,7 @@ 1F08F229260BF51B6425DFA0CC81B91F /* DefaultMessageContentPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DefaultMessageContentPresenter.swift; sourceTree = ""; }; 214986D45BEFA3EB404C1E1D99E9EA6E /* TextMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenterBuilder.swift; sourceTree = ""; }; 262132B0D1FC8558486851D3C2869E5D /* ChatInputItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputItemView.swift; sourceTree = ""; }; - 26AF77D5CE7FD21510F05E496707F576 /* SpringChatInputBarAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SpringChatInputBarAnimation.swift; sourceTree = ""; }; + 2668A3D3780839295A8570A4859E7CF1 /* CollectionChanges.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionChanges.swift; sourceTree = ""; }; 27FD1E5F80CE44EE71AFE5FF0E1C0D98 /* TextChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextChatInputItem.swift; sourceTree = ""; }; 2856E1C4EC38BDEEAB7DD2C3A2F4D019 /* ChattoAdditions-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-prefix.pch"; sourceTree = ""; }; 28B4E861520526CF6E83C41850B41977 /* CompoundBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CompoundBubbleView.swift; sourceTree = ""; }; @@ -207,43 +213,44 @@ 35D14E9CE87F00AF37FA075D473A65D2 /* TextMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCell.swift; sourceTree = ""; }; 35ED7D8355F239A9A959FB70A4B526C5 /* CompoundMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CompoundMessagePresenterBuilder.swift; sourceTree = ""; }; 3812BB5710112A2E9D173AB4A99682ED /* CGRect+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGRect+Additions.swift"; sourceTree = ""; }; + 3A1234E52190DA6CAE6304891425712B /* BaseChatViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewController.swift; sourceTree = ""; }; 3C4011DB2C80F78B8321E9E704E40DD2 /* Pods-ChattoApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.release.xcconfig"; sourceTree = ""; }; 3EE78EC2711AC0E7B2D4080C06890653 /* BaseChatItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatItemPresenter.swift; sourceTree = ""; }; 3F581CC39018D3E156CAF8B4DB915918 /* Cache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cache.swift; sourceTree = ""; }; 4011915830EDD4A30327F2EF4695E72F /* ChattoAdditions-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ChattoAdditions-Info.plist"; sourceTree = ""; }; + 409845FFF4C927886ED9A7A8623F5C03 /* ReplyFeedbackGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReplyFeedbackGenerator.swift; sourceTree = ""; }; 40FA029FA472120383F421594BD26B33 /* CompoundBubbleLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CompoundBubbleLayout.swift; sourceTree = ""; }; 42354B463B5D5894771D179FBB67B0AE /* KeyboardUpdatesHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardUpdatesHandler.swift; sourceTree = ""; }; 43364DB51BDA445069CD636E45E38EC1 /* PhotosInputCameraPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCameraPicker.swift; sourceTree = ""; }; 4345021DC4C6037AB46F80906E6F8EB7 /* HashableRepresentible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HashableRepresentible.swift; sourceTree = ""; }; - 46B74B27F715EF926E2BC3C8DB98757A /* ReplyFeedbackGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReplyFeedbackGenerator.swift; sourceTree = ""; }; + 442F94661D5AC1DF7C8C8BE07A8E99B7 /* ChatLayoutConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatLayoutConfiguration.swift; sourceTree = ""; }; 4A233A5750C0221AD81EF29DB0CEA636 /* Chatto-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-prefix.pch"; sourceTree = ""; }; 4B5536EF55D73789751617E5BA048FB5 /* ChattoAdditions-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChattoAdditions-umbrella.h"; sourceTree = ""; }; 4D43BA1BF90EAFEF71DC1A17C96381D5 /* ExpandableChatInputBarPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ExpandableChatInputBarPresenter.swift; sourceTree = ""; }; 4F087AE157F5AC06AA804FC46A77B71B /* ChatItemDecorationAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemDecorationAttributes.swift; sourceTree = ""; }; + 5012EE2172CC9592FCF2F0476C98366F /* ChatMessageCollectionAdapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatMessageCollectionAdapter.swift; sourceTree = ""; }; 50C77FEBEB19D818C26806FF54F89504 /* Pods-ChattoApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ChattoApp-acknowledgements.markdown"; sourceTree = ""; }; 52A7245D99547533B4A7001E133B3C64 /* Photos.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Photos.xcassets; sourceTree = ""; }; 530BA25D3FF43217DFF1D958AA222062 /* PhotosInputPlaceholderCellProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderCellProvider.swift; sourceTree = ""; }; 53C5B3CAFB19724AC824BB4825A56FA1 /* InterfaceOrientation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InterfaceOrientation.swift; sourceTree = ""; }; + 54A1063085E82FF6415E1D92DA08E4EA /* BaseChatViewControllerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewControllerView.swift; sourceTree = ""; }; 56A24D4015BB6DFEAEF646E445474E66 /* PhotoMessagePresenterBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenterBuilder.swift; sourceTree = ""; }; 581029AF3E905E3A06C6EA0D88744C02 /* LiveCameraCaptureSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCaptureSession.swift; sourceTree = ""; }; - 584B694D43227E15C7913F9BD6FF49EB /* BaseChatViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewController.swift; sourceTree = ""; }; 5A11CD0D12D2AE9E0629223F15214F35 /* CompoundMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CompoundMessagePresenter.swift; sourceTree = ""; }; 5A174E57201961225505A5D48D72BCCE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 5D1B41D41D2370BC3F3ED01F33EF9012 /* UIEdgeInsets+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Additions.swift"; sourceTree = ""; }; + 6290972FD401F2AD5C3F5D95D861D0CE /* ChatCollectionViewLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayout.swift; sourceTree = ""; }; 64656EC1E32EEC6BE89FC78428808E7C /* LiveCameraCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCell.swift; sourceTree = ""; }; 661700D3A85B45B3D5683B77D6C00FC5 /* DeviceImagePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DeviceImagePicker.swift; sourceTree = ""; }; 66B97D1300DA73954DACA42B5005767D /* Chatto-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Chatto-umbrella.h"; sourceTree = ""; }; 66F9E66831B38308CDF41E0B77603ED4 /* TabInputButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabInputButton.swift; sourceTree = ""; }; - 67E3C2006EEC25948D4BF30DAE7C73EB /* BaseChatViewControllerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseChatViewControllerView.swift; sourceTree = ""; }; 6D17CF1E42B722D8D3E12C2D3F4A9ACB /* PhotoMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageViewModel.swift; sourceTree = ""; }; 6E53BA465DD67F06192ACB75D2569516 /* ChatInputBarPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresenter.swift; sourceTree = ""; }; 6F284074807EBD02656E1B9678B3FA42 /* Pods-ChattoApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ChattoApp-umbrella.h"; sourceTree = ""; }; 7134068F85C7A97E897C74C9A660EC66 /* PhotosInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputView.swift; sourceTree = ""; }; 71759FDAE31A0166F8FC944B8E0062B9 /* Chatto-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Chatto-Info.plist"; sourceTree = ""; }; - 74ACF02E2C13B1287A42BC6EB26ED06E /* ChatInputBarPresentingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresentingController.swift; sourceTree = ""; }; 74D308A24D5378069C6F64B782BDBFC5 /* TextMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; 76B9EFAA192D05BEECBD25E428510D3B /* LiveCameraCellPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCellPresenter.swift; sourceTree = ""; }; - 7C7E8E20AAFB5DD41BBC4E4291AA8AE0 /* CollectionChanges.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionChanges.swift; sourceTree = ""; }; 7E21CDEFA0FB7006255429A8A4C5FF46 /* CircleProgressIndicatorView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CircleProgressIndicatorView.swift; sourceTree = ""; }; 7E8F6A159C729440C457DBEAFD433BE9 /* PhotosChatInputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosChatInputItem.swift; sourceTree = ""; }; 817FA56CC5EEB942D149D73B6F08DBA5 /* ChattoAdditions.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChattoAdditions.release.xcconfig; sourceTree = ""; }; @@ -270,24 +277,21 @@ A3268B957AD18F7B3950012DFE6FFC88 /* Pods_ChattoApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ChattoApp.framework; path = "Pods-ChattoApp.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; A3345AB3E1F5288239FFC002EFA054A4 /* PhotoMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageModel.swift; sourceTree = ""; }; A3AD8DB03094B64985503C351FF7B98C /* CALayer+ImageMask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CALayer+ImageMask.swift"; sourceTree = ""; }; + A3C2CA50DEC4C1AD4D43AA5CD10C6312 /* ChatMessagesViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatMessagesViewController.swift; sourceTree = ""; }; A5C6D879A052F44B466FF9784312A49A /* ChatItemProtocolDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemProtocolDefinitions.swift; sourceTree = ""; }; - A60EA44E4C23A4228C485E6F3D006101 /* ChatMessagesViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatMessagesViewModel.swift; sourceTree = ""; }; A68A31D657786B55E78E464C81B7FD0F /* ResourceBundle-ChattoAdditionsResources-ChattoAdditions-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-ChattoAdditionsResources-ChattoAdditions-Info.plist"; sourceTree = ""; }; AA6E3740071EF2CE69466E68842241E0 /* PhotoMessageCollectionViewCellDefaultStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCellDefaultStyle.swift; sourceTree = ""; }; AB084BA94AAD34EC8E0BFDF58C5CD36F /* BaseMessageViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageViewModel.swift; sourceTree = ""; }; AB1A0F1E99B5713EE367393A2EE8A42B /* BaseMessageModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageModel.swift; sourceTree = ""; }; - ABE4A549C9FA905538F6E514A56BC5D9 /* ChatMessagesViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatMessagesViewController.swift; sourceTree = ""; }; AC4C1EFCE9EB2F4848FB9958A158C03E /* TextBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextBubbleView.swift; sourceTree = ""; }; ACB2A7E690D64B9C8CB515E5DA0F6826 /* UIColor+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+Additions.swift"; sourceTree = ""; }; ACF649A7B1FA5DEF288A1FD7147FBE3A /* CGPoint+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGPoint+Additions.swift"; sourceTree = ""; }; - B05D463E398889578B5C2A9DAD235A6A /* CellPanGestureHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellPanGestureHandler.swift; sourceTree = ""; }; + B16E173FBBAB820131F08E77B8B8109A /* ChatDataSourceProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatDataSourceProtocol.swift; sourceTree = ""; }; B24B9472C67862C09B6F86427666B494 /* Pods-ChattoApp-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ChattoApp-frameworks.sh"; sourceTree = ""; }; B6379F7A04029BEFC6BE54840D9343D8 /* UIImage+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIImage+Additions.swift"; sourceTree = ""; }; B69CE53DFDF835669B41DFD94AB864CB /* ChattoAdditionsResources.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = ChattoAdditionsResources.bundle; path = "ChattoAdditions-ChattoAdditionsResources.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; B6D1A3B3FEE005219931F07BC5DA2713 /* TextMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessagePresenter.swift; sourceTree = ""; }; - B7532D03706FF61CFB9620732053730C /* ChatMessageCollectionAdapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatMessageCollectionAdapter.swift; sourceTree = ""; }; B9C63D8B2734E0D40343E34F22867211 /* SerialTaskQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialTaskQueue.swift; path = Chatto/sources/SerialTaskQueue.swift; sourceTree = ""; }; - B9F2D986A2BE442DCFA4953440C2FFA7 /* ChatCollectionViewLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayout.swift; sourceTree = ""; }; BB170A541BEFBC5F51BBD9E4A5164785 /* ChatItemCompanionCollection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChatItemCompanionCollection.swift; path = Chatto/sources/ChatItemCompanionCollection.swift; sourceTree = ""; }; BBA72CB94919BC071C4DBC5BE2E72F38 /* CGSize+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGSize+Additions.swift"; sourceTree = ""; }; BDF2F30B2D5FF09A8980C69E68FA9742 /* ChatItemCompanion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemCompanion.swift; sourceTree = ""; }; @@ -298,45 +302,45 @@ C56E03DCB0F8049A3D612E93AF886F0F /* ExpandableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ExpandableTextView.swift; sourceTree = ""; }; C6BCB209CE65FDABAEF0553C64505E1C /* PhotosInputPlaceholderDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPlaceholderDataProvider.swift; sourceTree = ""; }; C9D8F53B3D35A3001CB4D8DF8DEE7781 /* Pods-ChattoApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ChattoApp-dummy.m"; sourceTree = ""; }; - CA2341E42690D9B7EE81E1AB8063EB38 /* TimingChatInputBarAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TimingChatInputBarAnimation.swift; sourceTree = ""; }; CBA8A9FEE5B0B8863937B800C414E133 /* BaseMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseMessageCollectionViewCell.swift; sourceTree = ""; }; CCCE6A8E9F86772CD3FC9DDFC357633B /* Chatto.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Chatto.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CD4E1AA9EAAB00639E329B1CC622D4C6 /* PhotoMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessageCollectionViewCell.swift; sourceTree = ""; }; + D1BCB700DD5BF5618C102B7F7A4A2677 /* ChatMessagesViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatMessagesViewModel.swift; sourceTree = ""; }; D35C8AD37BF6FA97373E73A41E192735 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; + D48B0D061A05AB312BA7773FC98C98C0 /* CellPanGestureHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellPanGestureHandler.swift; sourceTree = ""; }; + D4F00D3C855A8951FD25A5817A4FFEC7 /* ChatPanGestureRecogniserHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatPanGestureRecogniserHandler.swift; sourceTree = ""; }; D530671835A46A969EB8302BC5C8FD38 /* ChatInputBarAppearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarAppearance.swift; sourceTree = ""; }; - D7027C3EE1502E19009ABCA8A7694A52 /* ChatItemPresenterFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemPresenterFactory.swift; sourceTree = ""; }; D7F71861005280E74B6B2EF09AAEBEE5 /* LiveCameraCellPresenterFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveCameraCellPresenterFactory.swift; sourceTree = ""; }; - D979E155CD6CC2D73B4C0BC8C91A2D29 /* ChatLayoutConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatLayoutConfiguration.swift; sourceTree = ""; }; + DA011027BB75080B61DDFF1C683FCE9C /* ChatCollectionViewLayoutModelFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewLayoutModelFactory.swift; sourceTree = ""; }; DBEFFDA36D3CDD63AB9C3EDA098C92B8 /* PhotoMessagePresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoMessagePresenter.swift; sourceTree = ""; }; DDD94BDC3622753A4E273A85D3420DEA /* PhotoBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotoBubbleView.swift; sourceTree = ""; }; + E0455D3183EBACE5BBBD2024148B99B0 /* ChatItemPresenterFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatItemPresenterFactory.swift; sourceTree = ""; }; E231744704984B2CE53B4D6B20451D07 /* Pods-ChattoApp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ChattoApp-Info.plist"; sourceTree = ""; }; E33E6AE1854A15B028E7AB2FDB4E7DC3 /* ViewDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ViewDefinitions.swift; sourceTree = ""; }; E5027D7F175A68A9868CE09E38068400 /* CircleProgressView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CircleProgressView.swift; sourceTree = ""; }; E72BE9AEE3E4F54CDFE9FAE59166363E /* PhotosInputCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCell.swift; sourceTree = ""; }; E8A8DD01C4E36C434B8607EB0E4BDFA1 /* ChattoAdditions-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ChattoAdditions-dummy.m"; sourceTree = ""; }; E8FEE54CE1FD0D4EEC5C364BCD9E0334 /* CompoundBubbleViewStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CompoundBubbleViewStyle.swift; sourceTree = ""; }; + E953FE1E792158393BA777203BA82390 /* ChatInputBarPresentingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresentingController.swift; sourceTree = ""; }; EADF0E28FF1964D1424BA20722EDC327 /* PhotosInputCameraPickerFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputCameraPickerFactory.swift; sourceTree = ""; }; EBF19624B1D9CADD4D2B7DA35A3DA083 /* Text.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = Text.xcassets; sourceTree = ""; }; EC345418E6E94716CFC6CCDF18950CEB /* CircleIconView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CircleIconView.swift; sourceTree = ""; }; EC48EF67D428D2B332007607077E7E5C /* UIScreen+Scale.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIScreen+Scale.swift"; sourceTree = ""; }; ECF1A85F3E2104EC2D54276D495D0415 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; - EEA43424C19C862124F27C3F1D73E270 /* UICollectionView+Scrolling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Scrolling.swift"; sourceTree = ""; }; - F0C25B9CCA3A20D37EE56BE7D5966662 /* ChatPanGestureRecogniserHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatPanGestureRecogniserHandler.swift; sourceTree = ""; }; + EDCE2C239C3934471A34EB8BB04F21AD /* SpringChatInputBarAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SpringChatInputBarAnimation.swift; sourceTree = ""; }; F26241E90E38090426B8539A653278AC /* Pods-ChattoApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ChattoApp.debug.xcconfig"; sourceTree = ""; }; F57A98FA29BCD97E024C761CDEB6E841 /* PhotosInputPermissionsRequester.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PhotosInputPermissionsRequester.swift; sourceTree = ""; }; FB57D1BE393FAE04F3BAADEF3518EB17 /* Chatto.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = Chatto.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - FC09DE4DEC2A5F03A62FFE7AE28DFCB1 /* ChatInputBarPresenterProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatInputBarPresenterProtocol.swift; sourceTree = ""; }; FC4E34B23EA1A4774877199279DC9571 /* TextMessageMenuItemPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextMessageMenuItemPresenter.swift; sourceTree = ""; }; FCE3A4E2E905614489D899CF3DA5ECF1 /* CircleProgressIndicator.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; path = CircleProgressIndicator.xcassets; sourceTree = ""; }; - FE52590F8E9909C7136C08B440CAD99F /* ChatDataSourceProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ChatDataSourceProtocol.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 1CECCCCD7529DBE9404DA42201675AAA /* Frameworks */ = { + 2B99385E6320A6D020EE37284FA79472 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CA532FCE954848752903D56687B3AEDE /* Foundation.framework in Frameworks */, + AD1F4A438C5BBD5EDF7FC7B331AEF6F1 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -357,7 +361,7 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E6F67275DABE5AEACB7B9E66C56E4A1A /* Frameworks */ = { + F30DAF992B6EF7D57DA51414AC2176E1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -450,6 +454,16 @@ path = BaseMessage; sourceTree = ""; }; + 13C546D150500F1BF2BC42E83A720102 /* Animations */ = { + isa = PBXGroup; + children = ( + EDCE2C239C3934471A34EB8BB04F21AD /* SpringChatInputBarAnimation.swift */, + 039C734FC70108E74B4F9918630B682D /* TimingChatInputBarAnimation.swift */, + ); + name = Animations; + path = Animations; + sourceTree = ""; + }; 17A1F08B468C4695EA7AF5FD269C316F /* CircleProgressIndicatorView */ = { isa = PBXGroup; children = ( @@ -539,17 +553,6 @@ path = Camera; sourceTree = ""; }; - 2FBFE6777DDD39F808E1AC454132ACC7 /* InputBar */ = { - isa = PBXGroup; - children = ( - FC09DE4DEC2A5F03A62FFE7AE28DFCB1 /* ChatInputBarPresenterProtocol.swift */, - 74ACF02E2C13B1287A42BC6EB26ED06E /* ChatInputBarPresentingController.swift */, - 51DD7553E9FFB3DA782ADD1AE95D5FE2 /* Animations */, - ); - name = InputBar; - path = InputBar; - sourceTree = ""; - }; 324A18EC96A7DE2E9551A7F80FF70BBE /* Support Files */ = { isa = PBXGroup; children = ( @@ -596,22 +599,6 @@ path = Photo; sourceTree = ""; }; - 43A5B0523D6CA3AC5FF1FD93EE8498ED /* Collaborators */ = { - isa = PBXGroup; - children = ( - 67E3C2006EEC25948D4BF30DAE7C73EB /* BaseChatViewControllerView.swift */, - B05D463E398889578B5C2A9DAD235A6A /* CellPanGestureHandler.swift */, - B9F2D986A2BE442DCFA4953440C2FFA7 /* ChatCollectionViewLayout.swift */, - FE52590F8E9909C7136C08B440CAD99F /* ChatDataSourceProtocol.swift */, - D7027C3EE1502E19009ABCA8A7694A52 /* ChatItemPresenterFactory.swift */, - F0C25B9CCA3A20D37EE56BE7D5966662 /* ChatPanGestureRecogniserHandler.swift */, - 7C7E8E20AAFB5DD41BBC4E4291AA8AE0 /* CollectionChanges.swift */, - 46B74B27F715EF926E2BC3C8DB98757A /* ReplyFeedbackGenerator.swift */, - ); - name = Collaborators; - path = Collaborators; - sourceTree = ""; - }; 45DC6E7E812AC969C9BE9C5F57D090F2 /* Pods-ChattoApp */ = { isa = PBXGroup; children = ( @@ -638,16 +625,6 @@ path = PhotoMessages; sourceTree = ""; }; - 51DD7553E9FFB3DA782ADD1AE95D5FE2 /* Animations */ = { - isa = PBXGroup; - children = ( - 26AF77D5CE7FD21510F05E496707F576 /* SpringChatInputBarAnimation.swift */, - CA2341E42690D9B7EE81E1AB8063EB38 /* TimingChatInputBarAnimation.swift */, - ); - name = Animations; - path = Animations; - sourceTree = ""; - }; 5274B394D0FDEA0206353318CEBB92AF /* Views */ = { isa = PBXGroup; children = ( @@ -659,20 +636,6 @@ path = Views; sourceTree = ""; }; - 563233D870EA9981A3568A5E4E4D7C32 /* ChatController */ = { - isa = PBXGroup; - children = ( - 584B694D43227E15C7913F9BD6FF49EB /* BaseChatViewController.swift */, - D979E155CD6CC2D73B4C0BC8C91A2D29 /* ChatLayoutConfiguration.swift */, - EEA43424C19C862124F27C3F1D73E270 /* UICollectionView+Scrolling.swift */, - 7774F68FF2A5666FEDAD213010E94A9A /* ChatMessages */, - 43A5B0523D6CA3AC5FF1FD93EE8498ED /* Collaborators */, - 2FBFE6777DDD39F808E1AC454132ACC7 /* InputBar */, - ); - name = ChatController; - path = Chatto/sources/ChatController; - sourceTree = ""; - }; 5864AE3733D168CF733F5B28D3AB2218 /* Pod */ = { isa = PBXGroup; children = ( @@ -689,6 +652,19 @@ name = Pod; sourceTree = ""; }; + 5E13833B11EBEE9228D9D545ACDD7B14 /* ChatMessages */ = { + isa = PBXGroup; + children = ( + 07B68335FA1D8D310730094C6C5D4D6F /* ChatCollectionItemsDiffer.swift */, + DA011027BB75080B61DDFF1C683FCE9C /* ChatCollectionViewLayoutModelFactory.swift */, + 5012EE2172CC9592FCF2F0476C98366F /* ChatMessageCollectionAdapter.swift */, + A3C2CA50DEC4C1AD4D43AA5CD10C6312 /* ChatMessagesViewController.swift */, + D1BCB700DD5BF5618C102B7F7A4A2677 /* ChatMessagesViewModel.swift */, + ); + name = ChatMessages; + path = ChatMessages; + sourceTree = ""; + }; 647135350B5D6BF0156CB7D258E91F72 /* Resources */ = { isa = PBXGroup; children = ( @@ -724,17 +700,6 @@ path = Placeholder; sourceTree = ""; }; - 7774F68FF2A5666FEDAD213010E94A9A /* ChatMessages */ = { - isa = PBXGroup; - children = ( - B7532D03706FF61CFB9620732053730C /* ChatMessageCollectionAdapter.swift */, - ABE4A549C9FA905538F6E514A56BC5D9 /* ChatMessagesViewController.swift */, - A60EA44E4C23A4228C485E6F3D006101 /* ChatMessagesViewModel.swift */, - ); - name = ChatMessages; - path = ChatMessages; - sourceTree = ""; - }; 81B18A16F6E988B895CAD8648F996EDA /* ChattoAdditions */ = { isa = PBXGroup; children = ( @@ -787,7 +752,7 @@ BB170A541BEFBC5F51BBD9E4A5164785 /* ChatItemCompanionCollection.swift */, B9C63D8B2734E0D40343E34F22867211 /* SerialTaskQueue.swift */, 83CD4D77CA231B54CD2E2F7F391C17A9 /* Chat Items */, - 563233D870EA9981A3568A5E4E4D7C32 /* ChatController */, + 9852DCD0C9A7BCF3C1F3514E0638B93B /* ChatController */, 3B62B64DDEF4D8AA5B98418BDB134214 /* Keyboard */, 5864AE3733D168CF733F5B28D3AB2218 /* Pod */, 324A18EC96A7DE2E9551A7F80FF70BBE /* Support Files */, @@ -830,6 +795,20 @@ path = "UI Components"; sourceTree = ""; }; + 9852DCD0C9A7BCF3C1F3514E0638B93B /* ChatController */ = { + isa = PBXGroup; + children = ( + 3A1234E52190DA6CAE6304891425712B /* BaseChatViewController.swift */, + 442F94661D5AC1DF7C8C8BE07A8E99B7 /* ChatLayoutConfiguration.swift */, + 11E8626289F5676FA64783637EC4C4D1 /* UICollectionView+Scrolling.swift */, + 5E13833B11EBEE9228D9D545ACDD7B14 /* ChatMessages */, + AB34D8CD2F4C4543C1A9652B4C84AB8F /* Collaborators */, + E81EF74B6DF8D5ABC1BD93C48D1A177A /* InputBar */, + ); + name = ChatController; + path = Chatto/sources/ChatController; + sourceTree = ""; + }; A71CC19E15C744BF8D1B2410B8580930 /* TextMessages */ = { isa = PBXGroup; children = ( @@ -853,6 +832,22 @@ name = "Development Pods"; sourceTree = ""; }; + AB34D8CD2F4C4543C1A9652B4C84AB8F /* Collaborators */ = { + isa = PBXGroup; + children = ( + 54A1063085E82FF6415E1D92DA08E4EA /* BaseChatViewControllerView.swift */, + D48B0D061A05AB312BA7773FC98C98C0 /* CellPanGestureHandler.swift */, + 6290972FD401F2AD5C3F5D95D861D0CE /* ChatCollectionViewLayout.swift */, + B16E173FBBAB820131F08E77B8B8109A /* ChatDataSourceProtocol.swift */, + E0455D3183EBACE5BBBD2024148B99B0 /* ChatItemPresenterFactory.swift */, + D4F00D3C855A8951FD25A5817A4FFEC7 /* ChatPanGestureRecogniserHandler.swift */, + 2668A3D3780839295A8570A4859E7CF1 /* CollectionChanges.swift */, + 409845FFF4C927886ED9A7A8623F5C03 /* ReplyFeedbackGenerator.swift */, + ); + name = Collaborators; + path = Collaborators; + sourceTree = ""; + }; B2A52E99B497B6647DF98E54338208CF /* Input */ = { isa = PBXGroup; children = ( @@ -946,6 +941,17 @@ path = Text; sourceTree = ""; }; + E81EF74B6DF8D5ABC1BD93C48D1A177A /* InputBar */ = { + isa = PBXGroup; + children = ( + 143D512C194D5F08CC08B2AD230DD76B /* ChatInputBarPresenterProtocol.swift */, + E953FE1E792158393BA777203BA82390 /* ChatInputBarPresentingController.swift */, + 13C546D150500F1BF2BC42E83A720102 /* Animations */, + ); + name = InputBar; + path = InputBar; + sourceTree = ""; + }; EC3F1B3595B3D3F7F4DF8F2D0504A3C7 /* Text */ = { isa = PBXGroup; children = ( @@ -974,27 +980,27 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 04180BF90C34E265BA540810641A2F13 /* Headers */ = { + 1FF5EDC7C17B82B87203F1BB34EA5430 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 8E95EDF32D9658D2FA18F9FA9B926636 /* Chatto-umbrella.h in Headers */, + E51B64ACFF28A1BC3E1EFA576857F966 /* ChattoAdditions-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1FF5EDC7C17B82B87203F1BB34EA5430 /* Headers */ = { + 93AB6D17C44F34DBD73BBEE25FEB56B0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E51B64ACFF28A1BC3E1EFA576857F966 /* ChattoAdditions-umbrella.h in Headers */, + DCBC7D07930EF9DD3260194325E03327 /* Pods-ChattoApp-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 93AB6D17C44F34DBD73BBEE25FEB56B0 /* Headers */ = { + A9F6996B49A1BF5C03DECB062F3987C4 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - DCBC7D07930EF9DD3260194325E03327 /* Pods-ChattoApp-umbrella.h in Headers */, + DF27667B6EB93BE585985A422424FF95 /* Chatto-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1003,12 +1009,12 @@ /* Begin PBXNativeTarget section */ 2508BC3B908322C9E85E61AE743C9842 /* Chatto */ = { isa = PBXNativeTarget; - buildConfigurationList = 18CA1C9AC46AFEEF8B2BD1C51CE8D703 /* Build configuration list for PBXNativeTarget "Chatto" */; + buildConfigurationList = 6041F6FD72ED977E55DD637035BFED2D /* Build configuration list for PBXNativeTarget "Chatto" */; buildPhases = ( - 04180BF90C34E265BA540810641A2F13 /* Headers */, - C10E5838263BA1251D7A59B0FFAD6D25 /* Sources */, - 1CECCCCD7529DBE9404DA42201675AAA /* Frameworks */, - A9A6075DB12A5E176B1A8F4D8D597EA6 /* Resources */, + A9F6996B49A1BF5C03DECB062F3987C4 /* Headers */, + 63A97B24C5D3E09740EABDB31068BA58 /* Sources */, + 2B99385E6320A6D020EE37284FA79472 /* Frameworks */, + 1B387F48D7AD1D60F844EE02C8CB69CD /* Resources */, ); buildRules = ( ); @@ -1021,11 +1027,11 @@ }; 6F936489F9DED646FF7F46860CC24EDB /* ChattoAdditions-ChattoAdditionsResources */ = { isa = PBXNativeTarget; - buildConfigurationList = C8063F3EAF921301B3E18DAC84F6E041 /* Build configuration list for PBXNativeTarget "ChattoAdditions-ChattoAdditionsResources" */; + buildConfigurationList = D89FB2C9EE978A9E759D0BA212E25B3D /* Build configuration list for PBXNativeTarget "ChattoAdditions-ChattoAdditionsResources" */; buildPhases = ( - C4B0A4A4A95A3119BC0B899DF36C2EA1 /* Sources */, - E6F67275DABE5AEACB7B9E66C56E4A1A /* Frameworks */, - FF8DC6BC9BE82A7EA70206845988C7C8 /* Resources */, + 1D9D7DE08D7E852D0B43532B7D8E4E27 /* Sources */, + F30DAF992B6EF7D57DA51414AC2176E1 /* Frameworks */, + 801CB703DE0269EFF89383269B405858 /* Resources */, ); buildRules = ( ); @@ -1048,8 +1054,8 @@ buildRules = ( ); dependencies = ( - 351758C9FEC28FB150CF1C695BDCB478 /* PBXTargetDependency */, - DE28BE4C7D8AB8D7EE9FFE794BB89B3B /* PBXTargetDependency */, + 4BFB297C248CB69A5FCA1955A682DD7B /* PBXTargetDependency */, + 74523779E2FE3D7BDAB6856EA4B5892B /* PBXTargetDependency */, ); name = ChattoAdditions; productName = ChattoAdditions; @@ -1068,8 +1074,8 @@ buildRules = ( ); dependencies = ( - 7022A1B34D9F80A61BB46F8BF2D31200 /* PBXTargetDependency */, - 29589A874140080CAD28E68A9BF2F2F4 /* PBXTargetDependency */, + 724C516215E6F875E729349EB92AE0DC /* PBXTargetDependency */, + 7A04868A5DAAD195358694E000109100 /* PBXTargetDependency */, ); name = "Pods-ChattoApp"; productName = "Pods-ChattoApp"; @@ -1107,38 +1113,38 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 2CE00EA0040CCD44280CE7A910888A6F /* Resources */ = { + 1B387F48D7AD1D60F844EE02C8CB69CD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 42FBBB3259F624354B774DA6529411F5 /* ChattoAdditionsResources.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A9A6075DB12A5E176B1A8F4D8D597EA6 /* Resources */ = { + 2CE00EA0040CCD44280CE7A910888A6F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 42FBBB3259F624354B774DA6529411F5 /* ChattoAdditionsResources.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C5AB56C2CFE9B303C97A13DCDAA5E670 /* Resources */ = { + 801CB703DE0269EFF89383269B405858 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1B0D411A94A48FAAC5D35DCE2E4AD792 /* BaseMessageAssets.xcassets in Resources */, + B128937C10F96D5E259DA2C345537808 /* ChatInputBar.xib in Resources */, + 3F26414090107486FA0E69286B4C5201 /* CircleProgressIndicator.xcassets in Resources */, + 572A921E57471AEEDD3252F8D8589BA2 /* PhotoMessageAssets.xcassets in Resources */, + 10E4579A4B73C2FBEAAD9B7F4B77F9C6 /* Photos.xcassets in Resources */, + 0125D23FAF85A9F3634D170F8B8E8DB5 /* Text.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - FF8DC6BC9BE82A7EA70206845988C7C8 /* Resources */ = { + C5AB56C2CFE9B303C97A13DCDAA5E670 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BEE033B76D6699A8DE3C386957D2476E /* BaseMessageAssets.xcassets in Resources */, - 02E0E86DDD25DB2467CFDF386FAEAF98 /* ChatInputBar.xib in Resources */, - A4B59A1A87A6BFD55D407E5368A1323A /* CircleProgressIndicator.xcassets in Resources */, - 3C4A6A6BF4ABF9875CD05C887CA58AB2 /* PhotoMessageAssets.xcassets in Resources */, - 4C306216BCA3D540C5A9BE1B3CEF3195 /* Photos.xcassets in Resources */, - CDD31BF26225145340B4ABFCFA055E08 /* Text.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1153,47 +1159,49 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C10E5838263BA1251D7A59B0FFAD6D25 /* Sources */ = { + 1D9D7DE08D7E852D0B43532B7D8E4E27 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4D897F33E421DDFDE061E617D5FAF6F9 /* BaseChatItemPresenter.swift in Sources */, - 3BB1E8AB74047E93C78C14325B36E6CC /* BaseChatViewController.swift in Sources */, - 7C4F381F2D7BC23E0EA0E51985D3830B /* BaseChatViewControllerView.swift in Sources */, - 7916906EFADE057BE49B5EB7625FF7CE /* CellPanGestureHandler.swift in Sources */, - 48C0CAF993C8249BB2E819963F5177F3 /* ChatCollectionViewLayout.swift in Sources */, - A1E4FD347578B0863AAFACA99E734A6D /* ChatDataSourceProtocol.swift in Sources */, - 0EB1146B2D578A1B4D8723594F785DC2 /* ChatInputBarPresenterProtocol.swift in Sources */, - C8003652912969F689939AC8B41E4B3E /* ChatInputBarPresentingController.swift in Sources */, - E41584F8F6A6F2E6F9647B661C0256F0 /* ChatItemCompanion.swift in Sources */, - 3CD0ABED334777FEB5F32AFA2574D0D7 /* ChatItemCompanionCollection.swift in Sources */, - 35F4AF53A7F62027CED279E93ED4D609 /* ChatItemPresenterFactory.swift in Sources */, - BD866EBC57473D2BAF81A4707FC79A43 /* ChatItemProtocolDefinitions.swift in Sources */, - 13637A707AD89CA6F0A58951D2A56195 /* ChatLayoutConfiguration.swift in Sources */, - A7F961BF5F3C7DDEFF5B249803DC2869 /* ChatMessageCollectionAdapter.swift in Sources */, - F5C876D7767B050DD81473753273E28D /* ChatMessagesViewController.swift in Sources */, - 81DC567C0001EA3735798919B495644F /* ChatMessagesViewModel.swift in Sources */, - 3BEEF2CD836466CFEE16F62EECD1D5CF /* ChatPanGestureRecogniserHandler.swift in Sources */, - 20D66140FD48456B4160A7CE1E2437F8 /* Chatto-dummy.m in Sources */, - D2AC3E9F2EB40E853D883EBA8497D6D3 /* CollectionChanges.swift in Sources */, - F95C8C2877F053B0D1A7E1F6ACAA48C6 /* DummyChatItemPresenter.swift in Sources */, - F86759BE6870C99C809CC5AA64871000 /* KeyboardTracker.swift in Sources */, - 92849FA477AC502986BDA8D0B52014A7 /* KeyboardTrackingView.swift in Sources */, - EF952EF4A62AEC3E2B2332947339FD10 /* KeyboardUpdatesHandler.swift in Sources */, - 1EED7336C691A7481346A1E6D4E3C61D /* Observable.swift in Sources */, - D37276F6F6C27336EB0B5D60A35A6F8D /* ReplyFeedbackGenerator.swift in Sources */, - 405EA46E87BC3BB9823B2F53428630A3 /* SerialTaskQueue.swift in Sources */, - CCCD743F7FB7353E3F48C6EAA2C562E4 /* SpringChatInputBarAnimation.swift in Sources */, - 65A804D2D9E40A830F08150B3CBCC470 /* TimingChatInputBarAnimation.swift in Sources */, - 1E6E562A6BDD65F4937BBD13345596A7 /* UICollectionView+Scrolling.swift in Sources */, - 2EA7F87DF1063B2ADA281701D153F437 /* Utils.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C4B0A4A4A95A3119BC0B899DF36C2EA1 /* Sources */ = { + 63A97B24C5D3E09740EABDB31068BA58 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 893D3ADDFB5F5A1564F7570ECDC6F012 /* BaseChatItemPresenter.swift in Sources */, + FC189062F25305EE32486CD4DF27911B /* BaseChatViewController.swift in Sources */, + A3B8C25D1F9EB5A90CF0F8722C0BB790 /* BaseChatViewControllerView.swift in Sources */, + 0985D13F549F74E62A8BFF60B72F32AF /* CellPanGestureHandler.swift in Sources */, + 9AEA59A15EA05C11AB16E100C92EC104 /* ChatCollectionItemsDiffer.swift in Sources */, + 4F0B8E47888FE2672671ECCF5EE72D88 /* ChatCollectionViewLayout.swift in Sources */, + 1C82FE13FAD506658E0D4073A598A752 /* ChatCollectionViewLayoutModelFactory.swift in Sources */, + 39F96A17E81F55DA6E73B523748A5159 /* ChatDataSourceProtocol.swift in Sources */, + 1D86CF3962CF47E19D5E104C0DBDE016 /* ChatInputBarPresenterProtocol.swift in Sources */, + DC07E45242DD94EFC8F7D67AC3205B76 /* ChatInputBarPresentingController.swift in Sources */, + EFF44242521E77BEAE5A38003F96AE81 /* ChatItemCompanion.swift in Sources */, + A71CE3CF11AEB23921951CF3396C7117 /* ChatItemCompanionCollection.swift in Sources */, + D2AF5E676EF6FE3AC4635885C9F8AF51 /* ChatItemPresenterFactory.swift in Sources */, + 42C1CE80A21C143EBC68223104805768 /* ChatItemProtocolDefinitions.swift in Sources */, + 903FB0735034A1CB519B9CFA69E0C092 /* ChatLayoutConfiguration.swift in Sources */, + 592563EB268C19DAF968A057CFDDCF84 /* ChatMessageCollectionAdapter.swift in Sources */, + 89CCB22B3C1D293148125864A7007700 /* ChatMessagesViewController.swift in Sources */, + E8BC1D6045E1C6ACCC2B5C270E664D1D /* ChatMessagesViewModel.swift in Sources */, + 82922282764102B1B6D00FAC46AFE34C /* ChatPanGestureRecogniserHandler.swift in Sources */, + A508CFA7FCD317A850C84C1C7C70B0EF /* Chatto-dummy.m in Sources */, + 1B0C2634BC49FE297AFE1D92CB232420 /* CollectionChanges.swift in Sources */, + 24C937E895962EC907615B3F9B3C1117 /* DummyChatItemPresenter.swift in Sources */, + A55B73036E085F6CF603BEDB900B0600 /* KeyboardTracker.swift in Sources */, + 3FE4E9B311C71CF6067D686C7527A103 /* KeyboardTrackingView.swift in Sources */, + 4BDB4B80DDBF307D41BF24368A9DCFED /* KeyboardUpdatesHandler.swift in Sources */, + 3E250A858EC64129E8A0F8A2A17520E5 /* Observable.swift in Sources */, + D74377A4A0DD2569F9BC67D6EC82E65C /* ReplyFeedbackGenerator.swift in Sources */, + 1B539EC34805B13B392556BF8C0FECDB /* SerialTaskQueue.swift in Sources */, + 003F2ECAE07C5743D32F5501F6B784AA /* SpringChatInputBarAnimation.swift in Sources */, + 52FF6230422035E4E2E6A86C0E85603F /* TimingChatInputBarAnimation.swift in Sources */, + DB3F104338C001F0A5F54EA943320DAE /* UICollectionView+Scrolling.swift in Sources */, + 138884405664B1A215F756703802E99F /* Utils.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1295,29 +1303,29 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 29589A874140080CAD28E68A9BF2F2F4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ChattoAdditions; - target = 9A88D54DB316ADF1E80363324718D63E /* ChattoAdditions */; - targetProxy = 994104EA7729CB64C942076C53F97CDF /* PBXContainerItemProxy */; - }; - 351758C9FEC28FB150CF1C695BDCB478 /* PBXTargetDependency */ = { + 4BFB297C248CB69A5FCA1955A682DD7B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Chatto; target = 2508BC3B908322C9E85E61AE743C9842 /* Chatto */; - targetProxy = A839D986B4F4A35765E559B1F3F83F59 /* PBXContainerItemProxy */; + targetProxy = D7EF4CD3230EE8601D53160AC1DA1F6A /* PBXContainerItemProxy */; }; - 7022A1B34D9F80A61BB46F8BF2D31200 /* PBXTargetDependency */ = { + 724C516215E6F875E729349EB92AE0DC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Chatto; target = 2508BC3B908322C9E85E61AE743C9842 /* Chatto */; - targetProxy = 39315306270EB9F2A0601ACAC1F95078 /* PBXContainerItemProxy */; + targetProxy = C15B181B61236BF881F252706F28C8BD /* PBXContainerItemProxy */; }; - DE28BE4C7D8AB8D7EE9FFE794BB89B3B /* PBXTargetDependency */ = { + 74523779E2FE3D7BDAB6856EA4B5892B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "ChattoAdditions-ChattoAdditionsResources"; target = 6F936489F9DED646FF7F46860CC24EDB /* ChattoAdditions-ChattoAdditionsResources */; - targetProxy = A18109297E4D5FFB8CAC1CCC6DCDE332 /* PBXContainerItemProxy */; + targetProxy = F19526F8EDCBC8EE8EB0C27F105FC254 /* PBXContainerItemProxy */; + }; + 7A04868A5DAAD195358694E000109100 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ChattoAdditions; + target = 9A88D54DB316ADF1E80363324718D63E /* ChattoAdditions */; + targetProxy = 41DFE8A22ED40EA1B55EFE53CD84D4EA /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1384,10 +1392,11 @@ }; name = Release; }; - 2634720013C86D20511BEF4C3C18E6EE /* Release */ = { + 26CFDDEEE7C2E601D1508DC7BD6F5B97 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2CC33BD7DFA7CB9E5CF2077A47C41AE0 /* Chatto.release.xcconfig */; + baseConfigurationReference = 3C4011DB2C80F78B8321E9E704E40DD2 /* Pods-ChattoApp.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1398,18 +1407,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Chatto/Chatto-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ChattoApp/Pods-ChattoApp-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 11.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; - PRODUCT_MODULE_NAME = Chatto; - PRODUCT_NAME = Chatto; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ChattoApp/Pods-ChattoApp.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.3; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1417,11 +1427,10 @@ }; name = Release; }; - 26CFDDEEE7C2E601D1508DC7BD6F5B97 /* Release */ = { + 2987312763667411C0CC35BEAACCE4EE /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3C4011DB2C80F78B8321E9E704E40DD2 /* Pods-ChattoApp.release.xcconfig */; + baseConfigurationReference = 2CC33BD7DFA7CB9E5CF2077A47C41AE0 /* Chatto.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1432,19 +1441,18 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-ChattoApp/Pods-ChattoApp-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Chatto/Chatto-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 11.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ChattoApp/Pods-ChattoApp.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; + PRODUCT_MODULE_NAME = Chatto; + PRODUCT_NAME = Chatto; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.3; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1518,7 +1526,7 @@ }; name = Debug; }; - 4E52803A60B448EF9EB5A3EB644AFB58 /* Debug */ = { + 4A281E708F259E2CC82C959EF73A13EC /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 9AE9C25819DF1FC7C32AAC6F45D1FEA1 /* ChattoAdditions.debug.xcconfig */; buildSettings = { @@ -1534,6 +1542,38 @@ }; name = Debug; }; + 7720F59E2C299516D389CB7FB1680891 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 87133150D78D56C66DFCBEC322C36D66 /* Chatto.debug.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Chatto/Chatto-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; + PRODUCT_MODULE_NAME = Chatto; + PRODUCT_NAME = Chatto; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.3; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 987BB2B88CCBB36AFB812AE2C727FDAB /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 9AE9C25819DF1FC7C32AAC6F45D1FEA1 /* ChattoAdditions.debug.xcconfig */; @@ -1633,39 +1673,7 @@ }; name = Release; }; - B0B977C700F0B2C629EE87CCD4D37269 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 87133150D78D56C66DFCBEC322C36D66 /* Chatto.debug.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Chatto/Chatto-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Chatto/Chatto-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 11.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Chatto/Chatto.modulemap"; - PRODUCT_MODULE_NAME = Chatto; - PRODUCT_NAME = Chatto; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.3; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - E72C70354346A96BFA91AD32274C5215 /* Release */ = { + FEDB1838F4063646200C2D6AED31AAAA /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 817FA56CC5EEB942D149D73B6F08DBA5 /* ChattoAdditions.release.xcconfig */; buildSettings = { @@ -1684,15 +1692,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 18CA1C9AC46AFEEF8B2BD1C51CE8D703 /* Build configuration list for PBXNativeTarget "Chatto" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B0B977C700F0B2C629EE87CCD4D37269 /* Debug */, - 2634720013C86D20511BEF4C3C18E6EE /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 3DD15C259BD47801E93B91EC63A468CD /* Build configuration list for PBXNativeTarget "Pods-ChattoApp" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1711,11 +1710,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C8063F3EAF921301B3E18DAC84F6E041 /* Build configuration list for PBXNativeTarget "ChattoAdditions-ChattoAdditionsResources" */ = { + 6041F6FD72ED977E55DD637035BFED2D /* Build configuration list for PBXNativeTarget "Chatto" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7720F59E2C299516D389CB7FB1680891 /* Debug */, + 2987312763667411C0CC35BEAACCE4EE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D89FB2C9EE978A9E759D0BA212E25B3D /* Build configuration list for PBXNativeTarget "ChattoAdditions-ChattoAdditionsResources" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4E52803A60B448EF9EB5A3EB644AFB58 /* Debug */, - E72C70354346A96BFA91AD32274C5215 /* Release */, + 4A281E708F259E2CC82C959EF73A13EC /* Debug */, + FEDB1838F4063646200C2D6AED31AAAA /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release;