diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index afd6fdff9..2376e9e3f 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -3022,11 +3022,11 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6XVY5G3U44; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -3040,6 +3040,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltStoreCore; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -3056,10 +3058,10 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6XVY5G3U44; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -3073,6 +3075,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltStoreCore; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/AltStore.xcworkspace/contents.xcworkspacedata b/AltStore.xcworkspace/contents.xcworkspacedata index a28c1b3b8..b37ed6325 100644 --- a/AltStore.xcworkspace/contents.xcworkspacedata +++ b/AltStore.xcworkspace/contents.xcworkspacedata @@ -13,4 +13,7 @@ + + diff --git a/AltStoreCore/Model/StoreApp.swift b/AltStoreCore/Model/StoreApp.swift index b57975213..89ff64d28 100644 --- a/AltStoreCore/Model/StoreApp.swift +++ b/AltStoreCore/Model/StoreApp.swift @@ -25,6 +25,74 @@ public extension StoreApp static let dolphinAppID = "me.oatmealdome.dolphinios-njb" } +@objc +public enum Platform: UInt { + case ios + case tvos + case macos +} + +extension Platform: Decodable {} + +@objc +public final class PlatformURL: NSManagedObject, Decodable { + /* Properties */ + @NSManaged public private(set) var platform: Platform + @NSManaged public private(set) var downloadURL: URL + + + private enum CodingKeys: String, CodingKey + { + case platform + case downloadURL + } + + + public init(from decoder: Decoder) throws + { + guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") } + + // Must initialize with context in order for child context saves to work correctly. + super.init(entity: PlatformURL.entity(), insertInto: context) + + do + { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.platform = try container.decode(Platform.self, forKey: .platform) + self.downloadURL = try container.decode(URL.self, forKey: .downloadURL) + } + catch + { + if let context = self.managedObjectContext + { + context.delete(self) + } + + throw error + } + } +} + +extension PlatformURL: Comparable { + public static func < (lhs: PlatformURL, rhs: PlatformURL) -> Bool { + return lhs.platform.rawValue < rhs.platform.rawValue + } + + public static func > (lhs: PlatformURL, rhs: PlatformURL) -> Bool { + return lhs.platform.rawValue > rhs.platform.rawValue + } + + public static func <= (lhs: PlatformURL, rhs: PlatformURL) -> Bool { + return lhs.platform.rawValue <= rhs.platform.rawValue + } + + public static func >= (lhs: PlatformURL, rhs: PlatformURL) -> Bool { + return lhs.platform.rawValue >= rhs.platform.rawValue + } +} + +public typealias PlatformURLs = [PlatformURL] + @objc(StoreApp) public class StoreApp: NSManagedObject, Decodable, Fetchable { @@ -45,6 +113,8 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable @NSManaged public private(set) var versionDescription: String? @NSManaged public private(set) var downloadURL: URL + @NSManaged public private(set) var platformURLs: PlatformURLs? + @NSManaged public private(set) var tintColor: UIColor? @NSManaged public private(set) var isBeta: Bool @@ -90,6 +160,7 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable case iconURL case screenshotURLs case downloadURL + case platformURLs case tintColor case subtitle case permissions @@ -121,7 +192,23 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable self.iconURL = try container.decode(URL.self, forKey: .iconURL) self.screenshotURLs = try container.decodeIfPresent([URL].self, forKey: .screenshotURLs) ?? [] - self.downloadURL = try container.decode(URL.self, forKey: .downloadURL) + let downloadURL = try container.decodeIfPresent(URL.self, forKey: .downloadURL) + let platformURLs = try container.decodeIfPresent(PlatformURLs.self.self, forKey: .platformURLs) + if let platformURLs = platformURLs { + self.platformURLs = platformURLs + // Backwards compatibility, use the fiirst (iOS will be first since sorted that way) + if let first = platformURLs.sorted().first { + self.downloadURL = first.downloadURL + } else { + throw DecodingError.dataCorruptedError(forKey: .platformURLs, in: container, debugDescription: "platformURLs has no entries") + + } + + } else if let downloadURL = downloadURL { + self.downloadURL = downloadURL + } else { + throw DecodingError.dataCorruptedError(forKey: .downloadURL, in: container, debugDescription: "E downloadURL:String or downloadURLs:[[Platform:URL]] key required.") + } if let tintColorHex = try container.decodeIfPresent(String.self, forKey: .tintColor) { diff --git a/Podfile b/Podfile index 5f5f4683d..a629e8203 100644 --- a/Podfile +++ b/Podfile @@ -1,10 +1,16 @@ inhibit_all_warnings! +def common_pods + pod 'Roxas', :git => 'https://github.com/rileytestut/Roxas.git' +end + target 'AltStore' do platform :ios, '12.0' use_frameworks! + common_pods + # Pods for AltStore pod 'Nuke', '~> 7.0' pod 'AppCenter', '~> 4.2.0' @@ -26,7 +32,8 @@ target 'AltStoreCore' do platform :ios, '12.0' use_frameworks! - + common_pods + # Pods for AltServer pod 'KeychainAccess', '~> 4.2.0' diff --git a/Podfile.lock b/Podfile.lock index 0caa3d4c7..1f9fb9c21 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -9,6 +9,7 @@ PODS: - AppCenter/Core - KeychainAccess (4.2.1) - Nuke (7.6.3) + - Roxas (0.1) - Sparkle (1.24.0) - STPrivilegedTask (1.0.7) @@ -16,6 +17,7 @@ DEPENDENCIES: - AppCenter (~> 4.2.0) - KeychainAccess (~> 4.2.0) - Nuke (~> 7.0) + - Roxas (from `https://github.com/rileytestut/Roxas.git`) - Sparkle - STPrivilegedTask (from `https://github.com/rileytestut/STPrivilegedTask.git`) @@ -27,10 +29,15 @@ SPEC REPOS: - Sparkle EXTERNAL SOURCES: + Roxas: + :git: https://github.com/rileytestut/Roxas.git STPrivilegedTask: :git: https://github.com/rileytestut/STPrivilegedTask.git CHECKOUT OPTIONS: + Roxas: + :commit: 2bb3182495f680ce60da8e72c3d84a7d4451ef75 + :git: https://github.com/rileytestut/Roxas.git STPrivilegedTask: :commit: 6ca513d0dcb2aefb0e5a95915b77bbbbd8a6d942 :git: https://github.com/rileytestut/STPrivilegedTask.git @@ -39,9 +46,10 @@ SPEC CHECKSUMS: AppCenter: 87ef6eefd8ade4df59e88951288587429f3dd2a5 KeychainAccess: 9b07f665298d13c3a85881bd3171f6f49b8151c1 Nuke: 44130e95e09463f8773ae4b96b90de1eba6b3350 + Roxas: 1990039f843f5dc284918dc82375feb80020ef62 Sparkle: 270cd27377bf04e9c128af06e3a22d0f572d6ee3 STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68 -PODFILE CHECKSUM: ab4f64a189ce4136fef92ee4057edd44e3266b69 +PODFILE CHECKSUM: 1ddfe1781438ac09f5d1efb2a16833512faab687 -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 0caa3d4c7..1f9fb9c21 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -9,6 +9,7 @@ PODS: - AppCenter/Core - KeychainAccess (4.2.1) - Nuke (7.6.3) + - Roxas (0.1) - Sparkle (1.24.0) - STPrivilegedTask (1.0.7) @@ -16,6 +17,7 @@ DEPENDENCIES: - AppCenter (~> 4.2.0) - KeychainAccess (~> 4.2.0) - Nuke (~> 7.0) + - Roxas (from `https://github.com/rileytestut/Roxas.git`) - Sparkle - STPrivilegedTask (from `https://github.com/rileytestut/STPrivilegedTask.git`) @@ -27,10 +29,15 @@ SPEC REPOS: - Sparkle EXTERNAL SOURCES: + Roxas: + :git: https://github.com/rileytestut/Roxas.git STPrivilegedTask: :git: https://github.com/rileytestut/STPrivilegedTask.git CHECKOUT OPTIONS: + Roxas: + :commit: 2bb3182495f680ce60da8e72c3d84a7d4451ef75 + :git: https://github.com/rileytestut/Roxas.git STPrivilegedTask: :commit: 6ca513d0dcb2aefb0e5a95915b77bbbbd8a6d942 :git: https://github.com/rileytestut/STPrivilegedTask.git @@ -39,9 +46,10 @@ SPEC CHECKSUMS: AppCenter: 87ef6eefd8ade4df59e88951288587429f3dd2a5 KeychainAccess: 9b07f665298d13c3a85881bd3171f6f49b8151c1 Nuke: 44130e95e09463f8773ae4b96b90de1eba6b3350 + Roxas: 1990039f843f5dc284918dc82375feb80020ef62 Sparkle: 270cd27377bf04e9c128af06e3a22d0f572d6ee3 STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68 -PODFILE CHECKSUM: ab4f64a189ce4136fef92ee4057edd44e3266b69 +PODFILE CHECKSUM: 1ddfe1781438ac09f5d1efb2a16833512faab687 -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 09f9709b3..8dba0e533 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -30,270 +30,521 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0441B3E976E5F55E22731AECFF0DBA88 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4DC852E46ECF185858E535CA3D5AB6 /* Keychain.swift */; }; - 1298CF38DF60AC4A56A7FD2CBA026972 /* Nuke-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CC20798924CD1044DBBAA606FD644B6F /* Nuke-dummy.m */; }; - 1E7F998AB1D5D0E4330B09809539FD46 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 631BB8B063DD79EAF45CC22DBDA0C329 /* Security.framework */; }; - 24BAC5D9B402DA5717134F154C052B15 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA4A5DDA885076CF053E3B9E6843228A /* Cocoa.framework */; }; - 28F30B593B87BBEFA3E693BE2A11174E /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49CC7623E693F5C7F50DEF8134CE6BAC /* DataLoader.swift */; }; - 2C063B3BEF3C581E33B9B66C7C4D803B /* ImageProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = E21E032064AC86B919F264C91C264649 /* ImageProcessing.swift */; }; - 3141D17F016A1C7B1B33DAA9D4CE07FC /* ImageTaskMetrics.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D252FB70C45B71C2F10A56DE6A941D /* ImageTaskMetrics.swift */; }; - 4AEB48FE18565A59266480250E7C3FEA /* KeychainAccess-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C416643DFAD0FBE3052377FB5DD4A1A /* KeychainAccess-dummy.m */; }; - 4FA06B7BA0049C7097AFCE013DD8E4FF /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA4A5DDA885076CF053E3B9E6843228A /* Cocoa.framework */; }; - 642FC67C045E71923C63F4C7DF552543 /* STPrivilegedTask.m in Sources */ = {isa = PBXBuildFile; fileRef = A1CFC228917998470347609C970E2250 /* STPrivilegedTask.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7119ECC671B5D507C856BCFDE65A611D /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B667B4D06855E6E379D5CCFDA63534B /* ImageCache.swift */; }; - 75B4A7A6112970E8F5CFD2364703B060 /* Pods-AltServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A05A6067150CD1AC941487A81E57B327 /* Pods-AltServer-dummy.m */; }; - 769D8B0C5A187741B64AD32B0C73E1D4 /* Pods-AltServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 47FD0729E1AE07F5807D70E4ABEA48F0 /* Pods-AltServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8C84999B38A1A4FC9172A12F6A3D1C69 /* STPrivilegedTask-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F5EAE6C63FB3CBB2AD003D19B0F0F7A8 /* STPrivilegedTask-dummy.m */; }; - 93F219AC97237A7AC1DF77381CD77D9E /* Pods-AltStoreCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF2C09C7EAB8B5361EC909896A58A1A /* Pods-AltStoreCore-dummy.m */; }; - 9C1A5CD26B70F65FD16ADDFAD3A74C05 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; - 9D0E99B326D76B98393DF8B1B3EB5AD5 /* STPrivilegedTask.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D137C60036874A0557CCEE73BBCB2C /* STPrivilegedTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B170EA97951E165F51FA8F7686669271 /* ImagePipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60016998149B9BA38069733A808141B4 /* ImagePipeline.swift */; }; - B4FCE86BA184325487EE0465261CA111 /* DataCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0EDA861355A15CEE856BBBC62986E0A /* DataCache.swift */; }; - C106C9DB0B20B01498730530DC0C18CF /* ImagePreheater.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2EC05A19268D1FA57BEAC595A83FD4F /* ImagePreheater.swift */; }; - C47A1C638C0E97C4ECCBD18FD494BB34 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; - C4898169FC59160DE4C08711226774E0 /* Pods-AltStore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C153AAA772361221DBAAFFF077D00F3F /* Pods-AltStore-dummy.m */; }; - C847535FFFA08E19CFEFD1E181C09C7C /* ImageDecoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 274574E44800D14033BF5E84D9A0DCEC /* ImageDecoding.swift */; }; - CED73A304A066E228931B0FF819800E5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; - CF22B95F4979B5384D3FF75A8637128F /* Nuke-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3708F938147E2EA0A2E0C4B41AC7FAFB /* Nuke-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D26C339E4215DFB7CF7AB6AD30BAEABC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; - D775C176C73D3FCBE660D3642F0ECC4C /* Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3287DAF99F2D87FAF6C63B0E3271BBA /* Internal.swift */; }; - D8BF963F7EA268998C24355CB9CB7336 /* Pods-AltStore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F5287A98793EB9C5CEC3668161876AF /* Pods-AltStore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA1CB5949B054973CAE7C668F3506B1D /* STPrivilegedTask-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F316BE11AE0CDBB8BA9184213EB15FAB /* STPrivilegedTask-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A713AE0E7CB18DFA8960F125DB73D /* Pods-AltStoreCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C2C64D53D7A5548EE3E98E3805E46156 /* Pods-AltStoreCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E20BCE120A0B306A42F6F017203E0C66 /* ImageRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D23734EBAFBCF54FB7BF0708BF213B9 /* ImageRequest.swift */; }; - EEADFC5C1C5EC6E3E20506B8E069931D /* KeychainAccess-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 57E1673ED561752C44095839002D6186 /* KeychainAccess-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F84AC07D59C30C6F85EF8AF51206BB1A /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 289DA2913B70BAC4123A36BE7B5DB854 /* ImageView.swift */; }; + 03862A0004397D15BFBE813F11AFA836 /* Pods-AltStoreCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C2C64D53D7A5548EE3E98E3805E46156 /* Pods-AltStoreCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0613CE8304A0277F087EC82E13BE3A5A /* RSTCellContentChange.h in Headers */ = {isa = PBXBuildFile; fileRef = E8A2AD505940EBB9CB4196F14CA3CC34 /* RSTCellContentChange.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A7815D9BC3B8F5F53FE00D2D6A4B4D8 /* UITableView+CellContent.m in Sources */ = {isa = PBXBuildFile; fileRef = D1BB3AFFB49668D7EB6302C2B56318D6 /* UITableView+CellContent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0ECE641479E31CB2088B89C77653B76B /* UISpringTimingParameters+Conveniences.m in Sources */ = {isa = PBXBuildFile; fileRef = A51FDB1AECA5927A89FC7B7444A782D4 /* UISpringTimingParameters+Conveniences.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 116348E683238B29CAA0A81CB5AD2517 /* RSTPersistentContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2024D3AD1FCEE2FDB79AE6BC8D74F177 /* RSTPersistentContainer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 13A8490FBB232054B6DA7FBBBDAA1E80 /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BE4656B2B3F4C0954A905EB340064B /* ImageView.swift */; }; + 13B9FC95038E2226EBCB2F16D9F15344 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA4A5DDA885076CF053E3B9E6843228A /* Cocoa.framework */; }; + 13D643DD57F7B4D3420E0FA3ED171954 /* RSTOperationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 6271230E5F68DF0335AF0A3985BA53F3 /* RSTOperationQueue.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1A173DDC45B8AE5597E27E294AE7770F /* RSTPlaceholderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 70BEA18D738E32E76A8C8FE62C59BB25 /* RSTPlaceholderView.xib */; }; + 1AAC83FB605F1D1D1E030FA0BAEF2DCB /* RSTCellContentPrefetchingDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 000D19C82B3171923E6C2C0823C4E093 /* RSTCellContentPrefetchingDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1BF697A8040A30EFCE68604CC0852E0D /* STPrivilegedTask-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 73F0FA626B0FECFBD8F1ADD9BB9C9FEE /* STPrivilegedTask-dummy.m */; }; + 1CC663C5D323D3B27B12FFE703AB3240 /* RSTNibView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E660B3FFA68CDA39A6926B349B07A2F /* RSTNibView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21A2C00BF1A798A4801CC1943AAA0518 /* NSString+Localization.h in Headers */ = {isa = PBXBuildFile; fileRef = B72AD19D325CBF1919BC66B95A52B207 /* NSString+Localization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 22E07EC63D0629BA661B44FD591B0113 /* RSTPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 901AD8E7CBC8AF5535A123C22D245A62 /* RSTPlaceholderView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 23E7EDEE05EB271B63C0C03B36AAC4ED /* RSTPlaceholderView.h in Headers */ = {isa = PBXBuildFile; fileRef = FB9247F1D65CCABD4D73022CB9AE8BA4 /* RSTPlaceholderView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 28BBB015A40C2ACAF8136D7D7EC1A27C /* RSTCellContentChangeOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BF14078A67C9C90190CE4FC612CE5FA /* RSTCellContentChangeOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2C000B46826CDCB452C5FE09A02E5850 /* RSTBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B938E7EDD038CDE6806C5A327BA5BA93 /* RSTBlockOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2C9022F02292EA5FB21AB5FFC27D05F8 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72FD4BF17583598D5706E1CB8B479D30 /* Keychain.swift */; }; + 2DDEB2192477E63CC8BAADACDD0B28F4 /* Pods-AltServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 47FD0729E1AE07F5807D70E4ABEA48F0 /* Pods-AltServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3154FB9B22FA969AA6D8FA05AA8172C8 /* UIKit+ActivityIndicating.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E0F534230B5A292BDE6948842FC447B /* UIKit+ActivityIndicating.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 31CB9CFE7F71217168BEEAAC6E24E104 /* NSBundle+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 05539BC315302080021A21DC52AE7695 /* NSBundle+Extensions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 32E4AC774A99B4B555259E401533764C /* RSTCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E19DBD13983B8819CFF59D971E9F0428 /* RSTCollectionViewCell.xib */; }; + 3826A30459DE5A0E96693170CED95052 /* STPrivilegedTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 2681701BFBBA179650CD1270C82C8305 /* STPrivilegedTask.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3AFB8AEF3E34B7A6FC44A63AC068D5CA /* RSTFetchedResultsDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = DD0FCE812AD2B62D4D4A27874DF04BDF /* RSTFetchedResultsDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3B3800A1919F27B9496F011849EE4CE3 /* Roxas-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DB422AB9A436A02608C3FEA5E9C67B9 /* Roxas-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3CDA53D407452C07754BC64EFD02512B /* RSTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 82411FA06A338D0969EC7E6B4E29733F /* RSTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D10A92DA0557CD4F5FE9C4E38DA0DB8 /* RSTCompositeDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = B6AAADED8E6D42CDB0E10C81294315AF /* RSTCompositeDataSource.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3DBD498C0CB8EE3EDFD64B780D639088 /* RSTRelationshipPreservingMergePolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = A2902617976A3F2AE91FE3F7A6AB6DB3 /* RSTRelationshipPreservingMergePolicy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3EB58B07E02E22708AC25F6398E41EEE /* RSTHasher.m in Sources */ = {isa = PBXBuildFile; fileRef = A0B38C2A2E3092705AC243CB3C0A6357 /* RSTHasher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 403D1F6BD05A3671FB09C9BE8E185777 /* RSTNibView.m in Sources */ = {isa = PBXBuildFile; fileRef = 78689809D5F2F0A07985384D3D9EE52F /* RSTNibView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 411693EAF7513CB78749E8391272761A /* RSTToastView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6158699BCE6A6719A22C4096F9129197 /* RSTToastView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 41AC04EF8F0F903C57EF019E65DB9303 /* RSTDynamicDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 44C0AD6C5A773DE6555B31E3947F1FBB /* RSTDynamicDataSource.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4243BABC6A0E2E74318CDD303C29085D /* RSTOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 31DAAD8C241938CA0F25B272CE2A5105 /* RSTOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 444A18B009C8651A9F155B85AC7A1FF4 /* UITableViewCell+CellContent.m in Sources */ = {isa = PBXBuildFile; fileRef = B3402CA95D16B5F61CED4DE024C420AF /* UITableViewCell+CellContent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 46858D6B5BF7128F7E713CFEAF6B3058 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D6D9FF1108395B5C60753D06CA25496 /* ImageCache.swift */; }; + 48E6FECE016205D2AC8ACDA7B942173E /* UIAlertAction+Actions.m in Sources */ = {isa = PBXBuildFile; fileRef = ED7901EBD09B6990F7DDC1A40A6F2904 /* UIAlertAction+Actions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4AC4801E048A40929BC2FB30127E9ACF /* NSUserDefaults+DynamicProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B467FCC755F466193881232B4400CF4 /* NSUserDefaults+DynamicProperties.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4FE950E6C1C7C5995CC64B59A2DDE36F /* RSTDynamicDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 28FF6298DF1DDD1BAE8C363FFB0950DC /* RSTDynamicDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 504DCA4F68EED7A1A033E0A7CB559B91 /* RSTHasher.h in Headers */ = {isa = PBXBuildFile; fileRef = 0598C5BC5B0CFDE8E4CBB51F548F67AB /* RSTHasher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52484B0223124B4E17BB6132B75D3442 /* RSTOperationQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE455F30597C3E68B65915C7E87EEF3 /* RSTOperationQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52CF75B65F1465E136E6D7FC5FC9A4E1 /* ImageProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55DD58CB791224B1D2C1B5BD990919BB /* ImageProcessing.swift */; }; + 553D202EAD0E64F7AA3640EE159CC4FD /* UICollectionView+CellContent.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF6A5E0D8A63E7DA71C9D407D31FFDC /* UICollectionView+CellContent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 55F0366B3AA8B9A43F32DA3F5530D487 /* RSTOperation_Subclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 5441A4582AC3C39D8383319AF616CE88 /* RSTOperation_Subclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5744AA27C2E6EE1AC05EB2AA7F3E6070 /* RSTSeparatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = B306DAE41B3D2D572DBE1527F5A8EA43 /* RSTSeparatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 581C76CCC867C284BA38EF4ADA4054B5 /* Pods-AltStore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F5287A98793EB9C5CEC3668161876AF /* Pods-AltStore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58350126CC5DEA3C5831781CE9071224 /* UIKit+ActivityIndicating.m in Sources */ = {isa = PBXBuildFile; fileRef = CFD9A1DF01A5DA1FB9D610809705D845 /* UIKit+ActivityIndicating.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5AACC2F9F4CECD5341A252A7B12BD559 /* Pods-AltStore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C153AAA772361221DBAAFFF077D00F3F /* Pods-AltStore-dummy.m */; }; + 5BEA1009E4391A8C93EC699D9EB2631F /* RSTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 184C8F93B79916804B69FDD3EA135131 /* RSTConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 60FD17DB796856E35A1D7C3CA9951AC9 /* RSTSearchController.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BC26A428551B042F67BCD22457F504F /* RSTSearchController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61D95410429A89A605C67F8C0242BF63 /* RSTNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = FBF2A8A8D11E7DFE95FB6FA1615F90A2 /* RSTNavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6234DDD702595CA1FC5B4A93FF3042F5 /* UICollectionView+CellContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 79AC0AF30D97003ECBD93274AD72C525 /* UICollectionView+CellContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6781BFCDCC02B7F5EF9A979655A2BB2A /* RSTActivityIndicating.h in Headers */ = {isa = PBXBuildFile; fileRef = 00FDCE4C2ADECCEC9E6BE40108579188 /* RSTActivityIndicating.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6AAB89CD5368A51A3DE1095474D3F649 /* RSTTintedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = E897BC7E1C7670AD9ED8F4F9097297B3 /* RSTTintedImageView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6AECD5FFBED294A030312066C6458FBA /* STPrivilegedTask-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FB2F8E3D003AB295EDDD18C6352771C /* STPrivilegedTask-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E49BABA5629759CAF577C6555D41A83 /* NSUserDefaults+DynamicProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 7971F6FE5B14977FF0269B56A59B8064 /* NSUserDefaults+DynamicProperties.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E5E15546CDAB98ADAA048CFACBD78B3 /* ImagePreheater.swift in Sources */ = {isa = PBXBuildFile; fileRef = A94F76764A01E59F17E8B266B438F732 /* ImagePreheater.swift */; }; + 6EE881CD2532EB6A5A63AB426CAE02F6 /* RSTCellContentDataSource_Subclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A7D311B825C5F60E4DD9965713AA31D /* RSTCellContentDataSource_Subclasses.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 7051AAA2691A0B8715271A5B1B9CD686 /* NSLayoutConstraint+Edges.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2402416AF3FFF1EF9AEDF5065AB7C6 /* NSLayoutConstraint+Edges.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7209B9265151465C3F60C63FDF4D79FD /* RSTFetchedResultsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C6581F0D17D32C22D6C22A1C56925190 /* RSTFetchedResultsDataSource.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7D409E80972B8AEB97B48D8B18A22A6A /* RSTRelationshipPreservingMergePolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = D885DAC483B938A3480724C55DAD45EF /* RSTRelationshipPreservingMergePolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E80A62AE53F95DD8AC072EF87623717 /* RSTCollectionViewGridLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = B885138E3974C04183ECB19225C13F6F /* RSTCollectionViewGridLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8324B7758B4BB4987CE16942F0248C0A /* RSTLoadOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 29FE92ADAEB930DE5E5C9334C20BB7BB /* RSTLoadOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 837007986460E8E522E9B67904FAF738 /* RSTError.m in Sources */ = {isa = PBXBuildFile; fileRef = A0ADA62CDC2BB7350DB8E862AE9A6FC9 /* RSTError.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 84988A9AA75618FD101E1612309FE670 /* RSTLaunchViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F977C59946BA3F6F12EEF1B3E9CA0E75 /* RSTLaunchViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 849BB0B93593B6AE5F1E88B8754FCDDF /* RSTCellContentDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2F67BBB8A861FD1730930F512323A2 /* RSTCellContentDataSource.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8915AB3DEC6378EA8931FCDA637AAD30 /* NSBundle+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C54676785BABD9C4D102A5F7FA78647 /* NSBundle+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8ABEF6DD6164653480C20BF8DE5FE804 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; + 8B76E1BD8239C7A0AC9D794F883C59F4 /* ImageDecoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B3424B2AED353DAA453E497C5B5176 /* ImageDecoding.swift */; }; + 8BAD77D8C45F5DF5D7EF1EE7C0D243A2 /* RSTSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = 06C761F945C2A54FD9EF242395C294A0 /* RSTSearchController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8D250860E7CCA9820CA22D9CC988BF5D /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D68D7487B0045B3CA2DF2EE9041AC3 /* DataLoader.swift */; }; + 8EACC8D80F13140D9EE8A64D490DDF8A /* UICollectionViewCell+CellContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 99854153B2530CDCF1A901DE740A0BB7 /* UICollectionViewCell+CellContent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8F671ED07A9164D370378777456F629B /* NSString+Localization.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B05D721CDB02148D7E51457F344363 /* NSString+Localization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8F6F2C97DDBA42B8B26C04CBDF817B08 /* UIView+AnimatedHide.m in Sources */ = {isa = PBXBuildFile; fileRef = BFE97B6E513C1F41F628104FAEA6FDB4 /* UIView+AnimatedHide.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 90C121B0B1699DBD4BB271FDDC8EAE6D /* RSTCellContentChange.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E7DF90AFB81E34831EC61A835AC30C /* RSTCellContentChange.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 91CD8E15991EAB3F71623683E851B7B3 /* UICollectionViewCell+Nibs.m in Sources */ = {isa = PBXBuildFile; fileRef = 2250FBA16C2F495D635889180FA9A05B /* UICollectionViewCell+Nibs.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 92100BACCE616FB6CAE71B6F52D7CF3C /* RSTCellContentCell.h in Headers */ = {isa = PBXBuildFile; fileRef = A9CD32DAA97ACF0A8C4FCEC5E6309D65 /* RSTCellContentCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9267C6528CF936A8897868D502343D02 /* RSTArrayDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A3883B4539B6F99E7D404CFB3080D1C2 /* RSTArrayDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93EED161964228EB07C03C35A6FE071C /* RSTLoadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7C632192C9984033D154DA29DBF0F /* RSTLoadOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 980120349877F09287F791C5E21D4A69 /* UIImage+Manipulation.m in Sources */ = {isa = PBXBuildFile; fileRef = 134ECBBEA382123A4E1F7B6C0337164B /* UIImage+Manipulation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 981127D06C5B3621E0BE1EC7941C3423 /* ImageTaskMetrics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B08BE47A11F28EEA0821E63CBD694F5 /* ImageTaskMetrics.swift */; }; + 98A44336A6E361382C06259BE492EEF2 /* UIAlertAction+Actions.h in Headers */ = {isa = PBXBuildFile; fileRef = A09C1D844A5134FBB37F0C74D0FC2A42 /* UIAlertAction+Actions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9FD66D2FE52225EDABC11CD1CB9862FA /* UIViewController+TransitionState.m in Sources */ = {isa = PBXBuildFile; fileRef = 3685B0203BCA40D6359C18FF9D7CCF12 /* UIViewController+TransitionState.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9FE26C0C44CEA56FAEAC60A57D2CF11A /* STPrivilegedTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A877417BF240B8C5A90981AC6D106CA /* STPrivilegedTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A22DED79F1EF75562FE86DFD7C8DB51A /* RSTSeparatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 638CA2DA48C316E97D6C8C8B548B1FAD /* RSTSeparatorView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A28E1C0FB50D8CF2B860C6444BAEC741 /* Roxas-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0582AE952AD1E7FB50E2A01A5D248D87 /* Roxas-dummy.m */; }; + A38B0265BC301B8DE0384086AA0B1B5B /* NSPredicate+Search.m in Sources */ = {isa = PBXBuildFile; fileRef = 62283A07B00B6466072D6D606FEAEA94 /* NSPredicate+Search.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A50B038D09E1961A85C42AFD6BF1A346 /* NSFileManager+URLs.h in Headers */ = {isa = PBXBuildFile; fileRef = BA04BF5574C6D6BBF14B3B2A8BB173D0 /* NSFileManager+URLs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A511A66CE762DB3AC0A86217890BD2DB /* RSTArrayDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = FF93520BBC24F13DD9336F194F4A7401 /* RSTArrayDataSource.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A64A992AA7EFEDF63EA52FA8FA4DFCAD /* NSPredicate+Search.h in Headers */ = {isa = PBXBuildFile; fileRef = B729CE7EF76E97C8F5ED04FDC0375C88 /* NSPredicate+Search.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A7B5E6CB83FF33FB86813B789FF6F862 /* RSTNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CD75081E6364656A58D9985497AE32 /* RSTNavigationController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A7CD4B7656B444B91FC210C874109754 /* UICollectionViewCell+Nibs.h in Headers */ = {isa = PBXBuildFile; fileRef = E7003D80DFC75D02036F586B9A09C53B /* UICollectionViewCell+Nibs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ABACFC5E3F5F7EFE422E08A7B3B8F521 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; + AC74F6DF3173D5E8BC4133542536D964 /* RSTPersistentContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D0B2786BAEBD26ADEA97EFA0CDCEC9 /* RSTPersistentContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AE13D3FA75FDFB448DD60361E8EDD711 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; + B677862BD2C18CD450FE05D9785A101F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA4A5DDA885076CF053E3B9E6843228A /* Cocoa.framework */; }; + B986F3FA08612EE9146384B4540ECF5B /* ImagePipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B11E804355254B1DBD00C3A4251AC19 /* ImagePipeline.swift */; }; + BCEBE0663DEF68CCC3726A00CA03B890 /* UIView+AnimatedHide.h in Headers */ = {isa = PBXBuildFile; fileRef = FBB4DB919497378BECB198339FEB69A8 /* UIView+AnimatedHide.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF90BFF34BBAD8B2C7A6CE9641145561 /* KeychainAccess-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7519F1C62C67B302B027FE101E12AE94 /* KeychainAccess-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C168E8B39B5779EFAFB01875389A544D /* RSTHelperFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 136B30081E5CF1676172761D9A6B8F73 /* RSTHelperFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1773258FBCBFD3A13133C4068EA1A3D /* Pods-AltStoreCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF2C09C7EAB8B5361EC909896A58A1A /* Pods-AltStoreCore-dummy.m */; }; + C20639D9861176103B97DCC5D1052E13 /* RSTCellContentDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = CD859130F5EA8CD673F351DB802A5A93 /* RSTCellContentDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3E58E541F28459FA1CCB145A1A8DCC4 /* NSConstraintConflict+Conveniences.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EE5C6E86B982C8F4757006446F46C39 /* NSConstraintConflict+Conveniences.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C4242EDFB749F2C7C4ED1DA7A5C80316 /* UISpringTimingParameters+Conveniences.h in Headers */ = {isa = PBXBuildFile; fileRef = 01E581B09957A5D1B521FB357D0E154A /* UISpringTimingParameters+Conveniences.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C5381F52F6765D3C9DF1FF5DE903C3D9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; + C551BAB6CA0F8299344693075C7FDC97 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 631BB8B063DD79EAF45CC22DBDA0C329 /* Security.framework */; }; + C7AF883ABE83270B267EDF52E56BFEDF /* RSTBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC98B1BDDA357D581A5280ABCAF8752 /* RSTBlockOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C82D9BB29314F21FF2F2037894691C3F /* UIImage+Manipulation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2298822B64BC7858C2207F5F44A8FBCD /* UIImage+Manipulation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C8310ED9905E053FA35E150B865413B4 /* Nuke-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 74C3D3A652516D5EC76560DD60A3DB11 /* Nuke-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C8C64FF2779A1A751946D1E9C837841C /* NSConstraintConflict+Conveniences.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CDA5986FD8D6B2D023233F629C57E83 /* NSConstraintConflict+Conveniences.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CC551CB63C84AB8B26741A3806529219 /* RSTCollectionViewGridLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 22250A22949B8C9281E83B53A687EF5A /* RSTCollectionViewGridLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CFA3674E413D9F218A59D057B6603019 /* RSTCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = FCC9568E2015D97C38C350F6CA6568BB /* RSTCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CFABD048F9FCCA96F0C597B7DA9593AA /* UITableView+CellContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 46FC523634A6D40610DCFB4E602C2A3D /* UITableView+CellContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D17D07F6EAC0F743BC455C83CDEBADEF /* Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354377715DD9118C2821F0B86ED113F6 /* Internal.swift */; }; + D3861C37DCA5E40335419D6B7CED74E4 /* RSTCompositeDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DC172C2032DD52C3C218A690797648A /* RSTCompositeDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D5D4BB33BB18C4F7F8697B4A8C0A2291 /* ImageRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222047D98566C4B1954F4CAD13372B0 /* ImageRequest.swift */; }; + D617B7A93E7B6E63261966D27C68177D /* DataCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D670F08DE3226B1F323D67FCB183CAD5 /* DataCache.swift */; }; + D7E5A152352878BCB4D16DFAF5E86009 /* RSTDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 982612F2D6A959E05FF90BBD069CF7C1 /* RSTDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D878F44D1B200700A490ACB68F00F440 /* UITableViewCell+CellContent.h in Headers */ = {isa = PBXBuildFile; fileRef = C968207E2FD3F8782AE58D72DE6E3FA7 /* UITableViewCell+CellContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D9AEBF2769844613DDAF8FDC51EDFCA5 /* RSTTintedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = F952D2D7B6FFCB382D4A7F6C86D8B7B3 /* RSTTintedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DB0267A9CFE7B5700FAEF29B43876864 /* NSFileManager+URLs.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C4679224B773F1C60D3624295693103 /* NSFileManager+URLs.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DB79BCBB450D5207B6E088BFBD0A6161 /* RSTCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DD9B2B97B3F0B1561628DCBB07A8312 /* RSTCollectionViewCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DED7EFF94FA761E2E396C77411B4F7BB /* RSTOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = D5D006C94B879BB4105846A9FFE256A5 /* RSTOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2D33133B88E4875795B7B77202CB024 /* RSTToastView.h in Headers */ = {isa = PBXBuildFile; fileRef = 629A8524B052802080B35312C8811886 /* RSTToastView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E3B62887F28704DB6705478491CF60DF /* Roxas.h in Headers */ = {isa = PBXBuildFile; fileRef = 855D496D4E72460CA46C6AAB4BE9095C /* Roxas.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E56B9EA2F656433C7AE32C049022508A /* UIViewController+TransitionState.h in Headers */ = {isa = PBXBuildFile; fileRef = 55DE68EA396C56C3E22B38FCE3822000 /* UIViewController+TransitionState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E86B4C3125B99E4E66C6D05198D46935 /* RSTHelperFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E690185E212FD343956BAF3A478E3E1 /* RSTHelperFile.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E9894EBDF31A8E10E48C640BECADC1A8 /* NSLayoutConstraint+Edges.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E2D4EC2A849D37FD9D97A34A1B45893 /* NSLayoutConstraint+Edges.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E9D6E9A2D05C8B175ACD9F31E4E89572 /* RSTCellContentChangeOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E4EC14C42A28EE6A1F479FF1DD802AA2 /* RSTCellContentChangeOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + EB53E838F345C08123E84D79B8F311B8 /* UICollectionViewCell+CellContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 0ED11C9FB35153A785C51C7FE97BBAE5 /* UICollectionViewCell+CellContent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC7F48F27325892B2B267FEC2DD6EA61 /* Pods-AltServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A05A6067150CD1AC941487A81E57B327 /* Pods-AltServer-dummy.m */; }; + EEA3892D8746DA47A2889A0717514533 /* KeychainAccess-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B02113D5FF98151C1A9EC82B06A1283F /* KeychainAccess-dummy.m */; }; + EF5A7CDE9B2DE0433E5BBA49B45ADCBB /* Nuke-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = ED836BCF177DDF01D739F65ED5A0310E /* Nuke-dummy.m */; }; + F50496746B25522BE0C0166F7C2B8991 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9549A2323CDDA0B3FFED8BAD991538 /* Foundation.framework */; }; + FD4865931FC924F79CE8764F002D6B6C /* RSTLaunchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 493F618D583BA4BDCB71229DEFC35E4C /* RSTLaunchViewController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FF74081E618C329D80297C9674B76B81 /* RSTCellContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = 391057E3175199846C1B199BA3102E30 /* RSTCellContentView.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 3567E4665F97E6889AF0EB5590AB2976 /* PBXContainerItemProxy */ = { + 16CD2B0D13842734CF9D63E7E266EB8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 05327B1DB6967DBAA19D1ED734FDBD96; - remoteInfo = STPrivilegedTask; + remoteGlobalIDString = B5D1BA64AC676FF46408FCDE19A05767; + remoteInfo = Roxas; + }; + 486D70FB2D36ED4F4080698C9A0FE16A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B5D1BA64AC676FF46408FCDE19A05767; + remoteInfo = Roxas; + }; + 4D47F5080C8593C4CA5D621BCEFEA24C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 615C831BCE925ED486B225B87E44926D; + remoteInfo = KeychainAccess; }; - 64D630002D0AAEE7CC4BA807A38271F9 /* PBXContainerItemProxy */ = { + 693795A02CA7CCAE8E95687301865A75 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = ED77B4B88587C894E85C361023D67C53; remoteInfo = Sparkle; }; - 7AC4C92BEAB80F767E1D3BD2A6549F48 /* PBXContainerItemProxy */ = { + 723DC6DF3F91F46A46235D09E6C543C1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = A3282A5B2437E609EEB85861D7ECE717; remoteInfo = AppCenter; }; - 9171572156107EE505BA2730D1360B4E /* PBXContainerItemProxy */ = { + 74C9737A6CD62AC5E5216A991D7B14A8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 062A64896E847A6749F58B6BA9A931B1; - remoteInfo = Nuke; + remoteGlobalIDString = 05327B1DB6967DBAA19D1ED734FDBD96; + remoteInfo = STPrivilegedTask; }; - A603DD85ADDA29C5C939837DEF071D77 /* PBXContainerItemProxy */ = { + 965C37A011BBB6B4B657FFB0CBBFA471 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 615C831BCE925ED486B225B87E44926D; remoteInfo = KeychainAccess; }; - E3407AC00A49F98BFB508824A46399C3 /* PBXContainerItemProxy */ = { + A71CEA2294616C51899FB3EFBAE33F50 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 615C831BCE925ED486B225B87E44926D; - remoteInfo = KeychainAccess; + remoteGlobalIDString = 062A64896E847A6749F58B6BA9A931B1; + remoteInfo = Nuke; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 013E8EEE8514DE883489B953F797AD37 /* SPUDownloaderDeprecated.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderDeprecated.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderDeprecated.h; sourceTree = ""; }; + 000D19C82B3171923E6C2C0823C4E093 /* RSTCellContentPrefetchingDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentPrefetchingDataSource.h; path = Roxas/RSTCellContentPrefetchingDataSource.h; sourceTree = ""; }; + 00FDCE4C2ADECCEC9E6BE40108579188 /* RSTActivityIndicating.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTActivityIndicating.h; path = Roxas/RSTActivityIndicating.h; sourceTree = ""; }; + 01E581B09957A5D1B521FB357D0E154A /* UISpringTimingParameters+Conveniences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISpringTimingParameters+Conveniences.h"; path = "Roxas/UISpringTimingParameters+Conveniences.h"; sourceTree = ""; }; 0261936130906CCEF8BDAF9F153DB740 /* Pods-AltStoreCore-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltStoreCore-acknowledgements.markdown"; sourceTree = ""; }; - 0382F0C2A6CFC9B6577C7E07FE90F84F /* Nuke-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Nuke-Info.plist"; sourceTree = ""; }; + 0372D5630449EC4331836FEDDABE5BC6 /* SPUURLRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUURLRequest.h; path = Sparkle.framework/Versions/A/Headers/SPUURLRequest.h; sourceTree = ""; }; + 04DDB67A6D6A466ADE3497E5E5334BD9 /* Roxas-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Roxas-prefix.pch"; sourceTree = ""; }; + 05539BC315302080021A21DC52AE7695 /* NSBundle+Extensions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+Extensions.m"; path = "Roxas/NSBundle+Extensions.m"; sourceTree = ""; }; + 0582AE952AD1E7FB50E2A01A5D248D87 /* Roxas-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Roxas-dummy.m"; sourceTree = ""; }; + 0598C5BC5B0CFDE8E4CBB51F548F67AB /* RSTHasher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTHasher.h; path = Roxas/RSTHasher.h; sourceTree = ""; }; + 06C761F945C2A54FD9EF242395C294A0 /* RSTSearchController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTSearchController.m; path = Roxas/RSTSearchController.m; sourceTree = ""; }; 09C0C7EFF829464EB0F7FD63C7428ED9 /* Pods-AltStoreCore-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStoreCore-acknowledgements.plist"; sourceTree = ""; }; + 0BC26A428551B042F67BCD22457F504F /* RSTSearchController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTSearchController.h; path = Roxas/RSTSearchController.h; sourceTree = ""; }; + 0C07EBA0C41CD6E57D19EF5FB6F419C1 /* STPrivilegedTask-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "STPrivilegedTask-Info.plist"; sourceTree = ""; }; + 0DB422AB9A436A02608C3FEA5E9C67B9 /* Roxas-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Roxas-umbrella.h"; sourceTree = ""; }; 0DF2C09C7EAB8B5361EC909896A58A1A /* Pods-AltStoreCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltStoreCore-dummy.m"; sourceTree = ""; }; + 0ED11C9FB35153A785C51C7FE97BBAE5 /* UICollectionViewCell+CellContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewCell+CellContent.h"; path = "Roxas/UICollectionViewCell+CellContent.h"; sourceTree = ""; }; 0F1659C6FF3A41109719A998D70462DB /* Pods-AltServer-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltServer-frameworks.sh"; sourceTree = ""; }; - 0FCE2684F80D0006CD8ED57D1127B7D6 /* SUAppcastItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcastItem.h; path = Sparkle.framework/Versions/A/Headers/SUAppcastItem.h; sourceTree = ""; }; - 1039F21D1F7B28216C110D5F6B8EEED3 /* STPrivilegedTask-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "STPrivilegedTask-Info.plist"; sourceTree = ""; }; + 0FCBF23E5EBFD42D6DBE79AA5B00D31F /* SUUpdaterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUUpdaterDelegate.h; path = Sparkle.framework/Versions/A/Headers/SUUpdaterDelegate.h; sourceTree = ""; }; + 0FF18D35398602C0A9A9DC990E5E641D /* SPUDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloader.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloader.h; sourceTree = ""; }; 10A8A2A86D7ECFF30E4C2CA28AFEA050 /* Pods-AltStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltStore.modulemap"; sourceTree = ""; }; + 134ECBBEA382123A4E1F7B6C0337164B /* UIImage+Manipulation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Manipulation.m"; path = "Roxas/UIImage+Manipulation.m"; sourceTree = ""; }; + 136B30081E5CF1676172761D9A6B8F73 /* RSTHelperFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTHelperFile.h; path = Roxas/RSTHelperFile.h; sourceTree = ""; }; + 14D68D7487B0045B3CA2DF2EE9041AC3 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataLoader.swift; path = Sources/DataLoader.swift; sourceTree = ""; }; + 17D82A179695F84FD926BF2A30DA5B53 /* KeychainAccess-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "KeychainAccess-Info.plist"; sourceTree = ""; }; + 184C8F93B79916804B69FDD3EA135131 /* RSTConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTConstants.h; path = Roxas/RSTConstants.h; sourceTree = ""; }; 1AC9B7CBF52BC819D06B71C0A2B8A367 /* Pods-AltStoreCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltStoreCore.modulemap"; sourceTree = ""; }; - 1B667B4D06855E6E379D5CCFDA63534B /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = ""; }; + 1BC741FD87BC3E922F8259C8BF927335 /* STPrivilegedTask-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-prefix.pch"; sourceTree = ""; }; + 1C4679224B773F1C60D3624295693103 /* NSFileManager+URLs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileManager+URLs.m"; path = "Roxas/NSFileManager+URLs.m"; sourceTree = ""; }; + 1CDA5986FD8D6B2D023233F629C57E83 /* NSConstraintConflict+Conveniences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSConstraintConflict+Conveniences.m"; path = "Roxas/NSConstraintConflict+Conveniences.m"; sourceTree = ""; }; + 1E690185E212FD343956BAF3A478E3E1 /* RSTHelperFile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTHelperFile.m; path = Roxas/RSTHelperFile.m; sourceTree = ""; }; 1F5287A98793EB9C5CEC3668161876AF /* Pods-AltStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltStore-umbrella.h"; sourceTree = ""; }; - 274574E44800D14033BF5E84D9A0DCEC /* ImageDecoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDecoding.swift; path = Sources/ImageDecoding.swift; sourceTree = ""; }; - 289DA2913B70BAC4123A36BE7B5DB854 /* ImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageView.swift; path = Sources/ImageView.swift; sourceTree = ""; }; - 2DAD7D76FC007F48AE48F2FD15BF01BB /* Nuke.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nuke.framework; path = Nuke.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 316A35BB104F5F22465DA1FDA196B618 /* Sparkle-copy-dsyms.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Sparkle-copy-dsyms.sh"; sourceTree = ""; }; - 36139C28A280E919519D04785B845AB8 /* SPUDownloaderProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderProtocol.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderProtocol.h; sourceTree = ""; }; + 2024D3AD1FCEE2FDB79AE6BC8D74F177 /* RSTPersistentContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTPersistentContainer.m; path = Roxas/RSTPersistentContainer.m; sourceTree = ""; }; + 202A90AD326A6C4CFB8C03C4DE1146BC /* Sparkle.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Sparkle.debug.xcconfig; sourceTree = ""; }; + 221135939AA1D93F367C6347FA99855B /* STPrivilegedTask.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = STPrivilegedTask.debug.xcconfig; sourceTree = ""; }; + 22250A22949B8C9281E83B53A687EF5A /* RSTCollectionViewGridLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCollectionViewGridLayout.m; path = Roxas/RSTCollectionViewGridLayout.m; sourceTree = ""; }; + 2250FBA16C2F495D635889180FA9A05B /* UICollectionViewCell+Nibs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewCell+Nibs.m"; path = "Roxas/UICollectionViewCell+Nibs.m"; sourceTree = ""; }; + 2298822B64BC7858C2207F5F44A8FBCD /* UIImage+Manipulation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Manipulation.h"; path = "Roxas/UIImage+Manipulation.h"; sourceTree = ""; }; + 2681701BFBBA179650CD1270C82C8305 /* STPrivilegedTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = STPrivilegedTask.m; sourceTree = ""; }; + 28FF6298DF1DDD1BAE8C363FFB0950DC /* RSTDynamicDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTDynamicDataSource.h; path = Roxas/RSTDynamicDataSource.h; sourceTree = ""; }; + 29FE92ADAEB930DE5E5C9334C20BB7BB /* RSTLoadOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTLoadOperation.h; path = Roxas/RSTLoadOperation.h; sourceTree = ""; }; + 2A877417BF240B8C5A90981AC6D106CA /* STPrivilegedTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = STPrivilegedTask.h; sourceTree = ""; }; + 2AC98B1BDDA357D581A5280ABCAF8752 /* RSTBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTBlockOperation.m; path = Roxas/RSTBlockOperation.m; sourceTree = ""; }; + 2B11E804355254B1DBD00C3A4251AC19 /* ImagePipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePipeline.swift; path = Sources/ImagePipeline.swift; sourceTree = ""; }; + 2BACB1073EB7C7FCD5CD35B5D3AEFF9C /* Roxas-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Roxas-Info.plist"; sourceTree = ""; }; + 2DAD7D76FC007F48AE48F2FD15BF01BB /* Nuke */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nuke; path = Nuke.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 31DAAD8C241938CA0F25B272CE2A5105 /* RSTOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTOperation.m; path = Roxas/RSTOperation.m; sourceTree = ""; }; + 32D0B2786BAEBD26ADEA97EFA0CDCEC9 /* RSTPersistentContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTPersistentContainer.h; path = Roxas/RSTPersistentContainer.h; sourceTree = ""; }; + 34BE4656B2B3F4C0954A905EB340064B /* ImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageView.swift; path = Sources/ImageView.swift; sourceTree = ""; }; + 354377715DD9118C2821F0B86ED113F6 /* Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Internal.swift; path = Sources/Internal.swift; sourceTree = ""; }; 36537BA382462F4C2545E754B945A424 /* Pods-AltStore-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-acknowledgements.plist"; sourceTree = ""; }; - 3708F938147E2EA0A2E0C4B41AC7FAFB /* Nuke-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nuke-umbrella.h"; sourceTree = ""; }; + 3685B0203BCA40D6359C18FF9D7CCF12 /* UIViewController+TransitionState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+TransitionState.m"; path = "Roxas/UIViewController+TransitionState.m"; sourceTree = ""; }; + 391057E3175199846C1B199BA3102E30 /* RSTCellContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentView.h; path = Roxas/RSTCellContentView.h; sourceTree = ""; }; + 3A7D311B825C5F60E4DD9965713AA31D /* RSTCellContentDataSource_Subclasses.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentDataSource_Subclasses.h; path = Roxas/RSTCellContentDataSource_Subclasses.h; sourceTree = ""; }; 3B0CB9417531308D22740344089FEEFD /* Pods-AltServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.release.xcconfig"; sourceTree = ""; }; - 3DED1633B61DDB88FFF2EF9160AE78B4 /* SPUDownloaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderDelegate.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderDelegate.h; sourceTree = ""; }; - 3E76193172022F9DA3BC2236D39255F4 /* AppCenterAnalytics.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = AppCenterAnalytics.xcframework; path = "AppCenter-SDK-Apple/AppCenterAnalytics.xcframework"; sourceTree = ""; }; - 3EC264C0322EA7D294325E719E778C0D /* AppCenter.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppCenter.debug.xcconfig; sourceTree = ""; }; - 403E5DC2A495655EAFFCE6EFF9F1D835 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; + 3B467FCC755F466193881232B4400CF4 /* NSUserDefaults+DynamicProperties.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSUserDefaults+DynamicProperties.m"; path = "Roxas/NSUserDefaults+DynamicProperties.m"; sourceTree = ""; }; + 3C54676785BABD9C4D102A5F7FA78647 /* NSBundle+Extensions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+Extensions.h"; path = "Roxas/NSBundle+Extensions.h"; sourceTree = ""; }; + 3DD9B2B97B3F0B1561628DCBB07A8312 /* RSTCollectionViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCollectionViewCell.m; path = Roxas/RSTCollectionViewCell.m; sourceTree = ""; }; + 3E0BCF517BC2F75162C56CACCD3D6EA1 /* SPUDownloaderDeprecated.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderDeprecated.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderDeprecated.h; sourceTree = ""; }; + 3E0F534230B5A292BDE6948842FC447B /* UIKit+ActivityIndicating.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+ActivityIndicating.h"; path = "Roxas/UIKit+ActivityIndicating.h"; sourceTree = ""; }; + 3EE5C6E86B982C8F4757006446F46C39 /* NSConstraintConflict+Conveniences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSConstraintConflict+Conveniences.h"; path = "Roxas/NSConstraintConflict+Conveniences.h"; sourceTree = ""; }; + 3F033D3AEE2F95A91947F1F99139E676 /* SPUDownloaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderDelegate.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderDelegate.h; sourceTree = ""; }; + 3FB2F8E3D003AB295EDDD18C6352771C /* STPrivilegedTask-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-umbrella.h"; sourceTree = ""; }; + 4405793D5AF1EFD9D2BDA30AA0D2E514 /* Roxas */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Roxas; path = Roxas.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 44C0AD6C5A773DE6555B31E3947F1FBB /* RSTDynamicDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTDynamicDataSource.m; path = Roxas/RSTDynamicDataSource.m; sourceTree = ""; }; + 45E1DD5CF10E3947B58AC976F70BDBA6 /* Nuke-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nuke-prefix.pch"; sourceTree = ""; }; + 46FC523634A6D40610DCFB4E602C2A3D /* UITableView+CellContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+CellContent.h"; path = "Roxas/UITableView+CellContent.h"; sourceTree = ""; }; 477A6EFDF98B00046B4A53F8C12DE940 /* Pods-AltServer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-Info.plist"; sourceTree = ""; }; 47FD0729E1AE07F5807D70E4ABEA48F0 /* Pods-AltServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltServer-umbrella.h"; sourceTree = ""; }; - 49CC7623E693F5C7F50DEF8134CE6BAC /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataLoader.swift; path = Sources/DataLoader.swift; sourceTree = ""; }; - 49D21985E7FF5D855DBC3005BC15FEA8 /* SUCodeSigningVerifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUCodeSigningVerifier.h; path = Sparkle.framework/Versions/A/Headers/SUCodeSigningVerifier.h; sourceTree = ""; }; - 4C416643DFAD0FBE3052377FB5DD4A1A /* KeychainAccess-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KeychainAccess-dummy.m"; sourceTree = ""; }; + 493F618D583BA4BDCB71229DEFC35E4C /* RSTLaunchViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTLaunchViewController.m; path = Roxas/RSTLaunchViewController.m; sourceTree = ""; }; + 4BE455F30597C3E68B65915C7E87EEF3 /* RSTOperationQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTOperationQueue.h; path = Roxas/RSTOperationQueue.h; sourceTree = ""; }; + 4C5A0226224800FC8E0702FCDF036AE6 /* Roxas.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Roxas.modulemap; sourceTree = ""; }; + 4CD7C632192C9984033D154DA29DBF0F /* RSTLoadOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTLoadOperation.m; path = Roxas/RSTLoadOperation.m; sourceTree = ""; }; + 4E660B3FFA68CDA39A6926B349B07A2F /* RSTNibView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTNibView.h; path = Roxas/RSTNibView.h; sourceTree = ""; }; + 4EA899DD342B0F16248F91CC648655DC /* SUVersionDisplayProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionDisplayProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h; sourceTree = ""; }; + 5222047D98566C4B1954F4CAD13372B0 /* ImageRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageRequest.swift; path = Sources/ImageRequest.swift; sourceTree = ""; }; + 543FD9853B8DB0B6685C508777C25C7B /* AppCenterAnalytics.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = AppCenterAnalytics.xcframework; path = "AppCenter-SDK-Apple/AppCenterAnalytics.xcframework"; sourceTree = ""; }; + 5441A4582AC3C39D8383319AF616CE88 /* RSTOperation_Subclasses.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTOperation_Subclasses.h; path = Roxas/RSTOperation_Subclasses.h; sourceTree = ""; }; + 55DD58CB791224B1D2C1B5BD990919BB /* ImageProcessing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProcessing.swift; path = Sources/ImageProcessing.swift; sourceTree = ""; }; + 55DE68EA396C56C3E22B38FCE3822000 /* UIViewController+TransitionState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIViewController+TransitionState.h"; path = "Roxas/UIViewController+TransitionState.h"; sourceTree = ""; }; 56BA836111597464288E72A129A40A4D /* Pods-AltServer-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-acknowledgements.plist"; sourceTree = ""; }; - 57E1673ED561752C44095839002D6186 /* KeychainAccess-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-umbrella.h"; sourceTree = ""; }; - 5D23734EBAFBCF54FB7BF0708BF213B9 /* ImageRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageRequest.swift; path = Sources/ImageRequest.swift; sourceTree = ""; }; - 5E4DC852E46ECF185858E535CA3D5AB6 /* Keychain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Keychain.swift; path = Lib/KeychainAccess/Keychain.swift; sourceTree = ""; }; - 60016998149B9BA38069733A808141B4 /* ImagePipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePipeline.swift; path = Sources/ImagePipeline.swift; sourceTree = ""; }; + 5802ED484D1D61B1CF81E4FF3FA2B803 /* SUExport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUExport.h; path = Sparkle.framework/Versions/A/Headers/SUExport.h; sourceTree = ""; }; + 5A5E7BD1B5572E67B4B00A9CD9568CEC /* AppCenter-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "AppCenter-xcframeworks.sh"; sourceTree = ""; }; + 5BC893B0CFD82C226515798DD53D16C4 /* AppCenter.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = AppCenter.xcframework; path = "AppCenter-SDK-Apple/AppCenter.xcframework"; sourceTree = ""; }; + 6158699BCE6A6719A22C4096F9129197 /* RSTToastView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTToastView.m; path = Roxas/RSTToastView.m; sourceTree = ""; }; + 62283A07B00B6466072D6D606FEAEA94 /* NSPredicate+Search.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSPredicate+Search.m"; path = "Roxas/NSPredicate+Search.m"; sourceTree = ""; }; + 6271230E5F68DF0335AF0A3985BA53F3 /* RSTOperationQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTOperationQueue.m; path = Roxas/RSTOperationQueue.m; sourceTree = ""; }; + 629A8524B052802080B35312C8811886 /* RSTToastView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTToastView.h; path = Roxas/RSTToastView.h; sourceTree = ""; }; 631BB8B063DD79EAF45CC22DBDA0C329 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; - 64BA64A78FD1D70EC4284D19CC0F6877 /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUStandardVersionComparator.h; path = Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h; sourceTree = ""; }; - 676644EB1805E96CE47F7882733262B3 /* Pods_AltStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AltStore.framework; path = "Pods-AltStore.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 638CA2DA48C316E97D6C8C8B548B1FAD /* RSTSeparatorView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTSeparatorView.m; path = Roxas/RSTSeparatorView.m; sourceTree = ""; }; + 64FA03DB2C62A6BB4CEFAFFA46E86B7B /* SUAppcast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcast.h; path = Sparkle.framework/Versions/A/Headers/SUAppcast.h; sourceTree = ""; }; + 676644EB1805E96CE47F7882733262B3 /* Pods-AltStore */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-AltStore"; path = Pods_AltStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 69E5907F89168B3114EBDAFF7E6C140A /* Pods-AltServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.debug.xcconfig"; sourceTree = ""; }; - 6C792150C408736085A739A6D6D0F7A2 /* SPUDownloadData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloadData.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloadData.h; sourceTree = ""; }; + 69FCF3438994E0791403C7BC03D2E3AD /* KeychainAccess.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KeychainAccess.modulemap; sourceTree = ""; }; + 6BF14078A67C9C90190CE4FC612CE5FA /* RSTCellContentChangeOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentChangeOperation.h; path = Roxas/RSTCellContentChangeOperation.h; sourceTree = ""; }; + 6D6DE4B8CF4C0665DE049927333479D3 /* SUAppcastItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcastItem.h; path = Sparkle.framework/Versions/A/Headers/SUAppcastItem.h; sourceTree = ""; }; + 6DC172C2032DD52C3C218A690797648A /* RSTCompositeDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCompositeDataSource.h; path = Roxas/RSTCompositeDataSource.h; sourceTree = ""; }; + 6E2D4EC2A849D37FD9D97A34A1B45893 /* NSLayoutConstraint+Edges.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+Edges.h"; path = "Roxas/NSLayoutConstraint+Edges.h"; sourceTree = ""; }; + 70BEA18D738E32E76A8C8FE62C59BB25 /* RSTPlaceholderView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RSTPlaceholderView.xib; path = Roxas/RSTPlaceholderView.xib; sourceTree = ""; }; 70F125BA30C81B0E1ED1F99CEA3389BA /* Pods-AltServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltServer.modulemap"; sourceTree = ""; }; - 71E0327FEA5BFACFD142FB37BC1FD0C6 /* SUErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUErrors.h; path = Sparkle.framework/Versions/A/Headers/SUErrors.h; sourceTree = ""; }; - 726288F5802DA2301E5D48A0D14E84B2 /* SUUpdaterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUUpdaterDelegate.h; path = Sparkle.framework/Versions/A/Headers/SUUpdaterDelegate.h; sourceTree = ""; }; - 7327F856DC1511F7F2FC7D48F0D527ED /* AppCenter.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = AppCenter.xcframework; path = "AppCenter-SDK-Apple/AppCenter.xcframework"; sourceTree = ""; }; - 7540408582AD7792C66E59D59C1CE8E6 /* Sparkle.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Sparkle.release.xcconfig; sourceTree = ""; }; - 75EF7160B8581CFF81149378273DD6A0 /* KeychainAccess-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "KeychainAccess-Info.plist"; sourceTree = ""; }; - 76A8F2F82B71022E55FDEF484B6CE216 /* AppCenter.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppCenter.release.xcconfig; sourceTree = ""; }; - 7AC06D8ACD831E3BB90FB9DDABA13EAE /* STPrivilegedTask.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = STPrivilegedTask.release.xcconfig; sourceTree = ""; }; + 72FD4BF17583598D5706E1CB8B479D30 /* Keychain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Keychain.swift; path = Lib/KeychainAccess/Keychain.swift; sourceTree = ""; }; + 734065B89C7DB79B860A94E34A17FB78 /* AppCenterCrashes.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = AppCenterCrashes.xcframework; path = "AppCenter-SDK-Apple/AppCenterCrashes.xcframework"; sourceTree = ""; }; + 73F0FA626B0FECFBD8F1ADD9BB9C9FEE /* STPrivilegedTask-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "STPrivilegedTask-dummy.m"; sourceTree = ""; }; + 74C3D3A652516D5EC76560DD60A3DB11 /* Nuke-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nuke-umbrella.h"; sourceTree = ""; }; + 7519F1C62C67B302B027FE101E12AE94 /* KeychainAccess-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-umbrella.h"; sourceTree = ""; }; + 7578D05FD324913490C146F67BE61CB1 /* Nuke-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Nuke-Info.plist"; sourceTree = ""; }; + 78689809D5F2F0A07985384D3D9EE52F /* RSTNibView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTNibView.m; path = Roxas/RSTNibView.m; sourceTree = ""; }; + 7971F6FE5B14977FF0269B56A59B8064 /* NSUserDefaults+DynamicProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSUserDefaults+DynamicProperties.h"; path = "Roxas/NSUserDefaults+DynamicProperties.h"; sourceTree = ""; }; + 79AC0AF30D97003ECBD93274AD72C525 /* UICollectionView+CellContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionView+CellContent.h"; path = "Roxas/UICollectionView+CellContent.h"; sourceTree = ""; }; + 7BC92B848F28D58BD3FE1D3945929E81 /* SPUDownloaderProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderProtocol.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderProtocol.h; sourceTree = ""; }; + 7C2A1391A7949FA60B67301106708FBC /* AppCenter.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppCenter.release.xcconfig; sourceTree = ""; }; 7C824C7E55E5668EF6188F8482C5E2B1 /* Pods-AltStore-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltStore-acknowledgements.markdown"; sourceTree = ""; }; + 7D6D9FF1108395B5C60753D06CA25496 /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = ""; }; + 7DAE89A2CB0DA519569D6ADBABBEDDAF /* SUCodeSigningVerifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUCodeSigningVerifier.h; path = Sparkle.framework/Versions/A/Headers/SUCodeSigningVerifier.h; sourceTree = ""; }; + 7FB301535CE7A8491DDB1E4DA23A7D95 /* KeychainAccess.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.debug.xcconfig; sourceTree = ""; }; + 82411FA06A338D0969EC7E6B4E29733F /* RSTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTError.h; path = Roxas/RSTError.h; sourceTree = ""; }; 8347BD1B854FED4B2362CE4152512B4E /* Pods-AltStore-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltStore-frameworks.sh"; sourceTree = ""; }; - 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods_AltServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AltServer.framework; path = "Pods-AltServer.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 855D496D4E72460CA46C6AAB4BE9095C /* Roxas.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Roxas.h; path = Roxas/Roxas.h; sourceTree = ""; }; + 8867DC6130EBDE8AD3FDA0E2BFCC2E57 /* Sparkle.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Sparkle.release.xcconfig; sourceTree = ""; }; + 8BEA796A0759EC432CAC1FB1E8224AF2 /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUStandardVersionComparator.h; path = Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h; sourceTree = ""; }; + 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods-AltServer */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-AltServer"; path = Pods_AltServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F7B9B3B1B8F4396FF9E72686DF1DC32 /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionComparisonProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h; sourceTree = ""; }; + 901AD8E7CBC8AF5535A123C22D245A62 /* RSTPlaceholderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTPlaceholderView.m; path = Roxas/RSTPlaceholderView.m; sourceTree = ""; }; 9026A63464A722BDC5FABA1D5E7D6D94 /* Pods-AltStore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-Info.plist"; sourceTree = ""; }; - 9BEBBA7C80440353F3AF8ED301122C28 /* SUExport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUExport.h; path = Sparkle.framework/Versions/A/Headers/SUExport.h; sourceTree = ""; }; - 9C315B5C8481268E01408DD2A5F0CFC8 /* SUAppcast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcast.h; path = Sparkle.framework/Versions/A/Headers/SUAppcast.h; sourceTree = ""; }; - 9D4B1C1370ECE6475CD600CCB4C10AC8 /* KeychainAccess.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.release.xcconfig; sourceTree = ""; }; + 982612F2D6A959E05FF90BBD069CF7C1 /* RSTDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTDefines.h; path = Roxas/RSTDefines.h; sourceTree = ""; }; + 99854153B2530CDCF1A901DE740A0BB7 /* UICollectionViewCell+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewCell+CellContent.m"; path = "Roxas/UICollectionViewCell+CellContent.m"; sourceTree = ""; }; + 9B08BE47A11F28EEA0821E63CBD694F5 /* ImageTaskMetrics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTaskMetrics.swift; path = Sources/ImageTaskMetrics.swift; sourceTree = ""; }; + 9C2F67BBB8A861FD1730930F512323A2 /* RSTCellContentDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCellContentDataSource.m; path = Roxas/RSTCellContentDataSource.m; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; A05A6067150CD1AC941487A81E57B327 /* Pods-AltServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltServer-dummy.m"; sourceTree = ""; }; - A1CFC228917998470347609C970E2250 /* STPrivilegedTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = STPrivilegedTask.m; sourceTree = ""; }; - A369E1EAE3950C58981EBE17388E2BF9 /* AppCenter-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "AppCenter-xcframeworks.sh"; sourceTree = ""; }; - A444C51407C51AB3AF06B6129DEC9BF4 /* Pods_AltStoreCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AltStoreCore.framework; path = "Pods-AltStoreCore.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - A4BCC5F27B4DCF31A5028F0902818A8F /* AppCenterCrashes.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = AppCenterCrashes.xcframework; path = "AppCenter-SDK-Apple/AppCenterCrashes.xcframework"; sourceTree = ""; }; - A696D9DC947268F7CB8E503ED3D94F08 /* SPUDownloaderSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderSession.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderSession.h; sourceTree = ""; }; - A877252A18D311874262B3B2DFD173FC /* Sparkle.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Sparkle.debug.xcconfig; sourceTree = ""; }; - A8A6F643F7EF9DF00939CAD8ACD3AC04 /* Nuke.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nuke.debug.xcconfig; sourceTree = ""; }; - A8AB1AB566B7FC1DA06D7A123EDE7F5B /* STPrivilegedTask-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-prefix.pch"; sourceTree = ""; }; - AA4056B922A0E5FD0C05DA6E40E93CC7 /* Nuke.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nuke.release.xcconfig; sourceTree = ""; }; + A09C1D844A5134FBB37F0C74D0FC2A42 /* UIAlertAction+Actions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertAction+Actions.h"; path = "Roxas/UIAlertAction+Actions.h"; sourceTree = ""; }; + A0ADA62CDC2BB7350DB8E862AE9A6FC9 /* RSTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTError.m; path = Roxas/RSTError.m; sourceTree = ""; }; + A0B38C2A2E3092705AC243CB3C0A6357 /* RSTHasher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTHasher.m; path = Roxas/RSTHasher.m; sourceTree = ""; }; + A2902617976A3F2AE91FE3F7A6AB6DB3 /* RSTRelationshipPreservingMergePolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTRelationshipPreservingMergePolicy.m; path = Roxas/RSTRelationshipPreservingMergePolicy.m; sourceTree = ""; }; + A3883B4539B6F99E7D404CFB3080D1C2 /* RSTArrayDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTArrayDataSource.h; path = Roxas/RSTArrayDataSource.h; sourceTree = ""; }; + A444C51407C51AB3AF06B6129DEC9BF4 /* Pods-AltStoreCore */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-AltStoreCore"; path = Pods_AltStoreCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A51FDB1AECA5927A89FC7B7444A782D4 /* UISpringTimingParameters+Conveniences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISpringTimingParameters+Conveniences.m"; path = "Roxas/UISpringTimingParameters+Conveniences.m"; sourceTree = ""; }; + A94F76764A01E59F17E8B266B438F732 /* ImagePreheater.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePreheater.swift; path = Sources/ImagePreheater.swift; sourceTree = ""; }; + A9CD32DAA97ACF0A8C4FCEC5E6309D65 /* RSTCellContentCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentCell.h; path = Roxas/RSTCellContentCell.h; sourceTree = ""; }; + A9E7DF90AFB81E34831EC61A835AC30C /* RSTCellContentChange.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCellContentChange.m; path = Roxas/RSTCellContentChange.m; sourceTree = ""; }; AA4A5DDA885076CF053E3B9E6843228A /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; - B0EDA861355A15CEE856BBBC62986E0A /* DataCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataCache.swift; path = Sources/DataCache.swift; sourceTree = ""; }; - B7D252FB70C45B71C2F10A56DE6A941D /* ImageTaskMetrics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTaskMetrics.swift; path = Sources/ImageTaskMetrics.swift; sourceTree = ""; }; - B8D137C60036874A0557CCEE73BBCB2C /* STPrivilegedTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = STPrivilegedTask.h; sourceTree = ""; }; + AA907ED8CA68CE9E673A6F35054D3D2D /* Sparkle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Sparkle.h; path = Sparkle.framework/Versions/A/Headers/Sparkle.h; sourceTree = ""; }; + AABFF1FB1BE00D8F7D52DE9AD629B944 /* SPUDownloadData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloadData.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloadData.h; sourceTree = ""; }; + ABD8B044A5433BE517993E1B72807578 /* AppCenter.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppCenter.debug.xcconfig; sourceTree = ""; }; + AEAEE9E4B4388D6243CEBD8DDBF8A389 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; + B02113D5FF98151C1A9EC82B06A1283F /* KeychainAccess-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KeychainAccess-dummy.m"; sourceTree = ""; }; + B104594AF1A3B76C7F47038BE02DF925 /* STPrivilegedTask.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = STPrivilegedTask.release.xcconfig; sourceTree = ""; }; + B306DAE41B3D2D572DBE1527F5A8EA43 /* RSTSeparatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTSeparatorView.h; path = Roxas/RSTSeparatorView.h; sourceTree = ""; }; + B3402CA95D16B5F61CED4DE024C420AF /* UITableViewCell+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableViewCell+CellContent.m"; path = "Roxas/UITableViewCell+CellContent.m"; sourceTree = ""; }; + B662D13AB8546C0B12ED190B7ADD64E7 /* KeychainAccess.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.release.xcconfig; sourceTree = ""; }; + B6AAADED8E6D42CDB0E10C81294315AF /* RSTCompositeDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCompositeDataSource.m; path = Roxas/RSTCompositeDataSource.m; sourceTree = ""; }; + B6B05D721CDB02148D7E51457F344363 /* NSString+Localization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+Localization.m"; path = "Roxas/NSString+Localization.m"; sourceTree = ""; }; + B729CE7EF76E97C8F5ED04FDC0375C88 /* NSPredicate+Search.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSPredicate+Search.h"; path = "Roxas/NSPredicate+Search.h"; sourceTree = ""; }; + B72AD19D325CBF1919BC66B95A52B207 /* NSString+Localization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+Localization.h"; path = "Roxas/NSString+Localization.h"; sourceTree = ""; }; + B885138E3974C04183ECB19225C13F6F /* RSTCollectionViewGridLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCollectionViewGridLayout.h; path = Roxas/RSTCollectionViewGridLayout.h; sourceTree = ""; }; B90925EC13EFE976213481D834DD261B /* Pods-AltServer-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltServer-acknowledgements.markdown"; sourceTree = ""; }; - BD17EF0036ACFEF9C2AF1EA32225D417 /* SPUURLRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUURLRequest.h; path = Sparkle.framework/Versions/A/Headers/SPUURLRequest.h; sourceTree = ""; }; + B938E7EDD038CDE6806C5A327BA5BA93 /* RSTBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTBlockOperation.h; path = Roxas/RSTBlockOperation.h; sourceTree = ""; }; + B9B3424B2AED353DAA453E497C5B5176 /* ImageDecoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDecoding.swift; path = Sources/ImageDecoding.swift; sourceTree = ""; }; + BA04BF5574C6D6BBF14B3B2A8BB173D0 /* NSFileManager+URLs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileManager+URLs.h"; path = "Roxas/NSFileManager+URLs.h"; sourceTree = ""; }; + BCF6A5E0D8A63E7DA71C9D407D31FFDC /* UICollectionView+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionView+CellContent.m"; path = "Roxas/UICollectionView+CellContent.m"; sourceTree = ""; }; + BD93650C80B1B6C1839653C4A8CEC50A /* KeychainAccess-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-prefix.pch"; sourceTree = ""; }; + BFE97B6E513C1F41F628104FAEA6FDB4 /* UIView+AnimatedHide.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+AnimatedHide.m"; path = "Roxas/UIView+AnimatedHide.m"; sourceTree = ""; }; C0BCC2DFA3EA0AA630D0C1029C235141 /* Pods-AltStoreCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStoreCore-Info.plist"; sourceTree = ""; }; + C10FDEC61889403493C9A8EFE488EDD6 /* STPrivilegedTask.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = STPrivilegedTask.modulemap; sourceTree = ""; }; + C13AE8E706552D4FC68531B447999912 /* Roxas.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Roxas.release.xcconfig; sourceTree = ""; }; C153AAA772361221DBAAFFF077D00F3F /* Pods-AltStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltStore-dummy.m"; sourceTree = ""; }; - C2477C1B5D52605D8048AB5C57581E8E /* Nuke-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nuke-prefix.pch"; sourceTree = ""; }; C2C64D53D7A5548EE3E98E3805E46156 /* Pods-AltStoreCore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltStoreCore-umbrella.h"; sourceTree = ""; }; + C3CD75081E6364656A58D9985497AE32 /* RSTNavigationController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTNavigationController.m; path = Roxas/RSTNavigationController.m; sourceTree = ""; }; + C41D40D59346642A228A444069047B4E /* SPUDownloaderSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderSession.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderSession.h; sourceTree = ""; }; + C4582601C7A86AC7ED7C5AB54891139B /* Nuke.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nuke.modulemap; sourceTree = ""; }; + C6581F0D17D32C22D6C22A1C56925190 /* RSTFetchedResultsDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTFetchedResultsDataSource.m; path = Roxas/RSTFetchedResultsDataSource.m; sourceTree = ""; }; + C968207E2FD3F8782AE58D72DE6E3FA7 /* UITableViewCell+CellContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableViewCell+CellContent.h"; path = "Roxas/UITableViewCell+CellContent.h"; sourceTree = ""; }; CAC29D24D26CC8214B6B5A283B48A108 /* Pods-AltStoreCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStoreCore.release.xcconfig"; sourceTree = ""; }; - CC20798924CD1044DBBAA606FD644B6F /* Nuke-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nuke-dummy.m"; sourceTree = ""; }; - CD9B4AA0EED5F74091C87174E00497E2 /* Sparkle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Sparkle.h; path = Sparkle.framework/Versions/A/Headers/Sparkle.h; sourceTree = ""; }; + CD859130F5EA8CD673F351DB802A5A93 /* RSTCellContentDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentDataSource.h; path = Roxas/RSTCellContentDataSource.h; sourceTree = ""; }; + CE2402416AF3FFF1EF9AEDF5065AB7C6 /* NSLayoutConstraint+Edges.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+Edges.m"; path = "Roxas/NSLayoutConstraint+Edges.m"; sourceTree = ""; }; CE9549A2323CDDA0B3FFED8BAD991538 /* 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; }; - D0F3BEB981062CD0A2C4300D6EB14E7E /* SUUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUUpdater.h; path = Sparkle.framework/Versions/A/Headers/SUUpdater.h; sourceTree = ""; }; - D3E987EE832369F7EC0B46E863347CF5 /* STPrivilegedTask.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = STPrivilegedTask.debug.xcconfig; sourceTree = ""; }; - DAA48E570EA5C04F1F274755A077BDCC /* SUVersionDisplayProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionDisplayProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h; sourceTree = ""; }; - DCD71D15D5236B317587164B75C7E272 /* KeychainAccess.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.debug.xcconfig; sourceTree = ""; }; - E21E032064AC86B919F264C91C264649 /* ImageProcessing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProcessing.swift; path = Sources/ImageProcessing.swift; sourceTree = ""; }; - E3287DAF99F2D87FAF6C63B0E3271BBA /* Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Internal.swift; path = Sources/Internal.swift; sourceTree = ""; }; - E4A9EAB8FA23FF042492BA5A74B42F47 /* KeychainAccess.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KeychainAccess.modulemap; sourceTree = ""; }; - E62130D560E00D918EFBB99242B176D9 /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionComparisonProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h; sourceTree = ""; }; - E7F457514020E4FC88FF09F657120026 /* Nuke.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nuke.modulemap; sourceTree = ""; }; - E8E0D1117F42D292F46872724389035A /* STPrivilegedTask.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = STPrivilegedTask.modulemap; sourceTree = ""; }; - E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = KeychainAccess.framework; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = STPrivilegedTask.framework; path = STPrivilegedTask.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CFD9A1DF01A5DA1FB9D610809705D845 /* UIKit+ActivityIndicating.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIKit+ActivityIndicating.m"; path = "Roxas/UIKit+ActivityIndicating.m"; sourceTree = ""; }; + D1BB3AFFB49668D7EB6302C2B56318D6 /* UITableView+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+CellContent.m"; path = "Roxas/UITableView+CellContent.m"; sourceTree = ""; }; + D2B509167705B54B1F7FD8FABA88F27F /* Sparkle-copy-dsyms.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Sparkle-copy-dsyms.sh"; sourceTree = ""; }; + D5D006C94B879BB4105846A9FFE256A5 /* RSTOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTOperation.h; path = Roxas/RSTOperation.h; sourceTree = ""; }; + D670F08DE3226B1F323D67FCB183CAD5 /* DataCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataCache.swift; path = Sources/DataCache.swift; sourceTree = ""; }; + D885DAC483B938A3480724C55DAD45EF /* RSTRelationshipPreservingMergePolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTRelationshipPreservingMergePolicy.h; path = Roxas/RSTRelationshipPreservingMergePolicy.h; sourceTree = ""; }; + D99A652854B524DA24D43853AB5F47D4 /* Nuke.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nuke.debug.xcconfig; sourceTree = ""; }; + DD0FCE812AD2B62D4D4A27874DF04BDF /* RSTFetchedResultsDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTFetchedResultsDataSource.h; path = Roxas/RSTFetchedResultsDataSource.h; sourceTree = ""; }; + E19DBD13983B8819CFF59D971E9F0428 /* RSTCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RSTCollectionViewCell.xib; path = Roxas/RSTCollectionViewCell.xib; sourceTree = ""; }; + E4EC14C42A28EE6A1F479FF1DD802AA2 /* RSTCellContentChangeOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCellContentChangeOperation.m; path = Roxas/RSTCellContentChangeOperation.m; sourceTree = ""; }; + E7003D80DFC75D02036F586B9A09C53B /* UICollectionViewCell+Nibs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewCell+Nibs.h"; path = "Roxas/UICollectionViewCell+Nibs.h"; sourceTree = ""; }; + E7A92378B38445C1EFB4A7B0F68EB829 /* SUUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUUpdater.h; path = Sparkle.framework/Versions/A/Headers/SUUpdater.h; sourceTree = ""; }; + E897BC7E1C7670AD9ED8F4F9097297B3 /* RSTTintedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTTintedImageView.m; path = Roxas/RSTTintedImageView.m; sourceTree = ""; }; + E8A2AD505940EBB9CB4196F14CA3CC34 /* RSTCellContentChange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentChange.h; path = Roxas/RSTCellContentChange.h; sourceTree = ""; }; + E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = KeychainAccess; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = STPrivilegedTask; path = STPrivilegedTask.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ED7901EBD09B6990F7DDC1A40A6F2904 /* UIAlertAction+Actions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAlertAction+Actions.m"; path = "Roxas/UIAlertAction+Actions.m"; sourceTree = ""; }; + ED836BCF177DDF01D739F65ED5A0310E /* Nuke-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nuke-dummy.m"; sourceTree = ""; }; EDEB14F6E4E7943294EFE2582BEB14B2 /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.release.xcconfig"; sourceTree = ""; }; - F07AB92C0524D3BDBA133732CE36095B /* KeychainAccess-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-prefix.pch"; sourceTree = ""; }; - F2EC05A19268D1FA57BEAC595A83FD4F /* ImagePreheater.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePreheater.swift; path = Sources/ImagePreheater.swift; sourceTree = ""; }; - F316BE11AE0CDBB8BA9184213EB15FAB /* STPrivilegedTask-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-umbrella.h"; sourceTree = ""; }; - F5EAE6C63FB3CBB2AD003D19B0F0F7A8 /* STPrivilegedTask-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "STPrivilegedTask-dummy.m"; sourceTree = ""; }; + F4128CC19DD8935BCBC0E321EC9A2432 /* Roxas.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Roxas.debug.xcconfig; sourceTree = ""; }; + F68D53BE6F60EBA5A86D080469E23339 /* Nuke.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nuke.release.xcconfig; sourceTree = ""; }; F6D7232D2E51E5ED3A8B9A35A10E4147 /* Pods-AltStoreCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStoreCore.debug.xcconfig"; sourceTree = ""; }; - F7BBB22AD47C5E69FB8476205752FDAA /* SPUDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloader.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloader.h; sourceTree = ""; }; + F81AAAE48D28FF2999E35B4DE3DF5825 /* SUErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUErrors.h; path = Sparkle.framework/Versions/A/Headers/SUErrors.h; sourceTree = ""; }; + F952D2D7B6FFCB382D4A7F6C86D8B7B3 /* RSTTintedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTTintedImageView.h; path = Roxas/RSTTintedImageView.h; sourceTree = ""; }; + F977C59946BA3F6F12EEF1B3E9CA0E75 /* RSTLaunchViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTLaunchViewController.h; path = Roxas/RSTLaunchViewController.h; sourceTree = ""; }; + FB9247F1D65CCABD4D73022CB9AE8BA4 /* RSTPlaceholderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTPlaceholderView.h; path = Roxas/RSTPlaceholderView.h; sourceTree = ""; }; + FBB4DB919497378BECB198339FEB69A8 /* UIView+AnimatedHide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+AnimatedHide.h"; path = "Roxas/UIView+AnimatedHide.h"; sourceTree = ""; }; + FBF2A8A8D11E7DFE95FB6FA1615F90A2 /* RSTNavigationController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTNavigationController.h; path = Roxas/RSTNavigationController.h; sourceTree = ""; }; FC06C26AB5F79243816DC9878A128284 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.debug.xcconfig"; sourceTree = ""; }; + FCC9568E2015D97C38C350F6CA6568BB /* RSTCollectionViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCollectionViewCell.h; path = Roxas/RSTCollectionViewCell.h; sourceTree = ""; }; + FF93520BBC24F13DD9336F194F4A7401 /* RSTArrayDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTArrayDataSource.m; path = Roxas/RSTArrayDataSource.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 18A5AE474A881ABD37F19EE4BC42E160 /* Frameworks */ = { + 3A1FFE2816B782A8FB9ABE0A80BBB5A0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ABACFC5E3F5F7EFE422E08A7B3B8F521 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40DA66070FA10D7F6ABE8A46F1ECD5B4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4FA06B7BA0049C7097AFCE013DD8E4FF /* Cocoa.framework in Frameworks */, + 13B9FC95038E2226EBCB2F16D9F15344 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 22B4AE26F3BF4AC5FA7795C443344798 /* Frameworks */ = { + 436A83F9AF52DE8608685BFA557D09D6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CED73A304A066E228931B0FF819800E5 /* Foundation.framework in Frameworks */, + B677862BD2C18CD450FE05D9785A101F /* Cocoa.framework in Frameworks */, + C551BAB6CA0F8299344693075C7FDC97 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5F011871410CDADCC4458FBF149C21D5 /* Frameworks */ = { + 4936004E5A6C594F4609987C43BA4C2F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9C1A5CD26B70F65FD16ADDFAD3A74C05 /* Foundation.framework in Frameworks */, + 8ABEF6DD6164653480C20BF8DE5FE804 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7668D0A8468B5894E555ECAA4EC50BC1 /* Frameworks */ = { + 61A2EC0AB6F1423BBB0D97DFA9CC1E1B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C47A1C638C0E97C4ECCBD18FD494BB34 /* Foundation.framework in Frameworks */, + AE13D3FA75FDFB448DD60361E8EDD711 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C03CEEE3B6E689DE71ACE9A302A6C84F /* Frameworks */ = { + 8BC2032ECB47758A61DA937668B9F6ED /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D26C339E4215DFB7CF7AB6AD30BAEABC /* Foundation.framework in Frameworks */, + C5381F52F6765D3C9DF1FF5DE903C3D9 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - DF55D5C41519A5A52DAE534296270AF5 /* Frameworks */ = { + C4F2881CB973D4C4E71C962AEEC66D56 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 24BAC5D9B402DA5717134F154C052B15 /* Cocoa.framework in Frameworks */, - 1E7F998AB1D5D0E4330B09809539FD46 /* Security.framework in Frameworks */, + F50496746B25522BE0C0166F7C2B8991 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0971F1B1E5DD3D955C00C670D51F7E78 /* Analytics */ = { + 0DD240E22F67591C4CC864E2118F83C0 /* Crashes */ = { isa = PBXGroup; children = ( - A3E38A6354B2256101CC3C62330F0823 /* Frameworks */, + 32D8DA8C3FEB9B3BBD16C10D79C56C45 /* Frameworks */, ); - name = Analytics; + name = Crashes; sourceTree = ""; }; - 1CB0278FF975C4E1105EC4C41689B092 /* Support Files */ = { + 1031AF1552E43DFCAC681D5B27EA76CF /* AppCenter */ = { isa = PBXGroup; children = ( - E4A9EAB8FA23FF042492BA5A74B42F47 /* KeychainAccess.modulemap */, - 4C416643DFAD0FBE3052377FB5DD4A1A /* KeychainAccess-dummy.m */, - 75EF7160B8581CFF81149378273DD6A0 /* KeychainAccess-Info.plist */, - F07AB92C0524D3BDBA133732CE36095B /* KeychainAccess-prefix.pch */, - 57E1673ED561752C44095839002D6186 /* KeychainAccess-umbrella.h */, - DCD71D15D5236B317587164B75C7E272 /* KeychainAccess.debug.xcconfig */, - 9D4B1C1370ECE6475CD600CCB4C10AC8 /* KeychainAccess.release.xcconfig */, + 9BF59400ED83ED17C37F5B4F3E8371CD /* Analytics */, + 99BD8A3BFF9A7E9362393A623C810908 /* Core */, + 0DD240E22F67591C4CC864E2118F83C0 /* Crashes */, + 9BD3C722D7AABCC8D329ABFBDF137973 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/KeychainAccess"; + name = AppCenter; + path = AppCenter; sourceTree = ""; }; - 1DA1A52E4BFBED4DB804D234A44ED796 /* Core */ = { + 1117F9C00483888036365D6D6CAEAA3F /* Nuke */ = { isa = PBXGroup; children = ( - BA92B09126EFE41671F6020596A02775 /* Frameworks */, + D670F08DE3226B1F323D67FCB183CAD5 /* DataCache.swift */, + 14D68D7487B0045B3CA2DF2EE9041AC3 /* DataLoader.swift */, + 7D6D9FF1108395B5C60753D06CA25496 /* ImageCache.swift */, + B9B3424B2AED353DAA453E497C5B5176 /* ImageDecoding.swift */, + 2B11E804355254B1DBD00C3A4251AC19 /* ImagePipeline.swift */, + A94F76764A01E59F17E8B266B438F732 /* ImagePreheater.swift */, + 55DD58CB791224B1D2C1B5BD990919BB /* ImageProcessing.swift */, + 5222047D98566C4B1954F4CAD13372B0 /* ImageRequest.swift */, + 9B08BE47A11F28EEA0821E63CBD694F5 /* ImageTaskMetrics.swift */, + 34BE4656B2B3F4C0954A905EB340064B /* ImageView.swift */, + 354377715DD9118C2821F0B86ED113F6 /* Internal.swift */, + 7793DD61A03CDF353A93055692F67B0F /* Support Files */, ); - name = Core; + name = Nuke; + path = Nuke; + sourceTree = ""; + }; + 15E51987DD23CD2C39ADE34C345DD06A /* Support Files */ = { + isa = PBXGroup; + children = ( + D2B509167705B54B1F7FD8FABA88F27F /* Sparkle-copy-dsyms.sh */, + 202A90AD326A6C4CFB8C03C4DE1146BC /* Sparkle.debug.xcconfig */, + 8867DC6130EBDE8AD3FDA0E2BFCC2E57 /* Sparkle.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/Sparkle"; sourceTree = ""; }; 1F2756FA33ADF6C93A690B06B2893188 /* Targets Support Files */ = { @@ -306,6 +557,27 @@ name = "Targets Support Files"; sourceTree = ""; }; + 32D8DA8C3FEB9B3BBD16C10D79C56C45 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 734065B89C7DB79B860A94E34A17FB78 /* AppCenterCrashes.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 46A8BCA4B8463AF658BFB09614533934 /* Pods */ = { + isa = PBXGroup; + children = ( + 1031AF1552E43DFCAC681D5B27EA76CF /* AppCenter */, + D404F57E99ECBE8BDC51ABC8B04DAA0D /* KeychainAccess */, + 1117F9C00483888036365D6D6CAEAA3F /* Nuke */, + F139EB99BACF23BEE27DBAC47E9CFA1C /* Roxas */, + 8003375624DCE2B5FFD06BD355CB0B29 /* Sparkle */, + 7D9011D23BF7E44BAFBD2964AFD9B8E6 /* STPrivilegedTask */, + ); + name = Pods; + sourceTree = ""; + }; 4988D931D0AFC58813D8849F9F5EEEB3 /* Pods-AltStore */ = { isa = PBXGroup; children = ( @@ -323,6 +595,14 @@ path = "Target Support Files/Pods-AltStore"; sourceTree = ""; }; + 509C9201FCDDA7CF8F0FB22862E3E3D5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AEAEE9E4B4388D6243CEBD8DDBF8A389 /* Sparkle.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 593D7DAC07FA8FD14F5AB883876DF3AF /* iOS */ = { isa = PBXGroup; children = ( @@ -331,6 +611,15 @@ name = iOS; sourceTree = ""; }; + 67BE78698F1925637EF47A549930E704 /* Resources */ = { + isa = PBXGroup; + children = ( + E19DBD13983B8819CFF59D971E9F0428 /* RSTCollectionViewCell.xib */, + 70BEA18D738E32E76A8C8FE62C59BB25 /* RSTPlaceholderView.xib */, + ); + name = Resources; + sourceTree = ""; + }; 68BD33BC8B36D15872A78A285FFBC295 /* OS X */ = { isa = PBXGroup; children = ( @@ -340,106 +629,108 @@ name = "OS X"; sourceTree = ""; }; - 6BE188542514B1C4367A14C60F711BA1 /* Sparkle */ = { + 7793DD61A03CDF353A93055692F67B0F /* Support Files */ = { isa = PBXGroup; children = ( - CD9B4AA0EED5F74091C87174E00497E2 /* Sparkle.h */, - 6C792150C408736085A739A6D6D0F7A2 /* SPUDownloadData.h */, - F7BBB22AD47C5E69FB8476205752FDAA /* SPUDownloader.h */, - 3DED1633B61DDB88FFF2EF9160AE78B4 /* SPUDownloaderDelegate.h */, - 013E8EEE8514DE883489B953F797AD37 /* SPUDownloaderDeprecated.h */, - 36139C28A280E919519D04785B845AB8 /* SPUDownloaderProtocol.h */, - A696D9DC947268F7CB8E503ED3D94F08 /* SPUDownloaderSession.h */, - BD17EF0036ACFEF9C2AF1EA32225D417 /* SPUURLRequest.h */, - 9C315B5C8481268E01408DD2A5F0CFC8 /* SUAppcast.h */, - 0FCE2684F80D0006CD8ED57D1127B7D6 /* SUAppcastItem.h */, - 49D21985E7FF5D855DBC3005BC15FEA8 /* SUCodeSigningVerifier.h */, - 71E0327FEA5BFACFD142FB37BC1FD0C6 /* SUErrors.h */, - 9BEBBA7C80440353F3AF8ED301122C28 /* SUExport.h */, - 64BA64A78FD1D70EC4284D19CC0F6877 /* SUStandardVersionComparator.h */, - D0F3BEB981062CD0A2C4300D6EB14E7E /* SUUpdater.h */, - 726288F5802DA2301E5D48A0D14E84B2 /* SUUpdaterDelegate.h */, - E62130D560E00D918EFBB99242B176D9 /* SUVersionComparisonProtocol.h */, - DAA48E570EA5C04F1F274755A077BDCC /* SUVersionDisplayProtocol.h */, - 84A3A17D0CF37E7B1F5A39D33A09E980 /* Frameworks */, - D1565045C80086A09C5085168A12184F /* Support Files */, + C4582601C7A86AC7ED7C5AB54891139B /* Nuke.modulemap */, + ED836BCF177DDF01D739F65ED5A0310E /* Nuke-dummy.m */, + 7578D05FD324913490C146F67BE61CB1 /* Nuke-Info.plist */, + 45E1DD5CF10E3947B58AC976F70BDBA6 /* Nuke-prefix.pch */, + 74C3D3A652516D5EC76560DD60A3DB11 /* Nuke-umbrella.h */, + D99A652854B524DA24D43853AB5F47D4 /* Nuke.debug.xcconfig */, + F68D53BE6F60EBA5A86D080469E23339 /* Nuke.release.xcconfig */, ); - name = Sparkle; - path = Sparkle; + name = "Support Files"; + path = "../Target Support Files/Nuke"; sourceTree = ""; }; - 74233BDE6B4516104F5A64C6BA7691D7 /* Products */ = { + 7D9011D23BF7E44BAFBD2964AFD9B8E6 /* STPrivilegedTask */ = { isa = PBXGroup; children = ( - E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess.framework */, - 2DAD7D76FC007F48AE48F2FD15BF01BB /* Nuke.framework */, - 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods_AltServer.framework */, - 676644EB1805E96CE47F7882733262B3 /* Pods_AltStore.framework */, - A444C51407C51AB3AF06B6129DEC9BF4 /* Pods_AltStoreCore.framework */, - ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask.framework */, + 2A877417BF240B8C5A90981AC6D106CA /* STPrivilegedTask.h */, + 2681701BFBBA179650CD1270C82C8305 /* STPrivilegedTask.m */, + F58AF0744039A4652D82AFBA29A9FFCF /* Support Files */, ); - name = Products; + name = STPrivilegedTask; + path = STPrivilegedTask; sourceTree = ""; }; - 79584D489062D852882C00014009E164 /* Support Files */ = { + 8003375624DCE2B5FFD06BD355CB0B29 /* Sparkle */ = { isa = PBXGroup; children = ( - E8E0D1117F42D292F46872724389035A /* STPrivilegedTask.modulemap */, - F5EAE6C63FB3CBB2AD003D19B0F0F7A8 /* STPrivilegedTask-dummy.m */, - 1039F21D1F7B28216C110D5F6B8EEED3 /* STPrivilegedTask-Info.plist */, - A8AB1AB566B7FC1DA06D7A123EDE7F5B /* STPrivilegedTask-prefix.pch */, - F316BE11AE0CDBB8BA9184213EB15FAB /* STPrivilegedTask-umbrella.h */, - D3E987EE832369F7EC0B46E863347CF5 /* STPrivilegedTask.debug.xcconfig */, - 7AC06D8ACD831E3BB90FB9DDABA13EAE /* STPrivilegedTask.release.xcconfig */, + AA907ED8CA68CE9E673A6F35054D3D2D /* Sparkle.h */, + AABFF1FB1BE00D8F7D52DE9AD629B944 /* SPUDownloadData.h */, + 0FF18D35398602C0A9A9DC990E5E641D /* SPUDownloader.h */, + 3F033D3AEE2F95A91947F1F99139E676 /* SPUDownloaderDelegate.h */, + 3E0BCF517BC2F75162C56CACCD3D6EA1 /* SPUDownloaderDeprecated.h */, + 7BC92B848F28D58BD3FE1D3945929E81 /* SPUDownloaderProtocol.h */, + C41D40D59346642A228A444069047B4E /* SPUDownloaderSession.h */, + 0372D5630449EC4331836FEDDABE5BC6 /* SPUURLRequest.h */, + 64FA03DB2C62A6BB4CEFAFFA46E86B7B /* SUAppcast.h */, + 6D6DE4B8CF4C0665DE049927333479D3 /* SUAppcastItem.h */, + 7DAE89A2CB0DA519569D6ADBABBEDDAF /* SUCodeSigningVerifier.h */, + F81AAAE48D28FF2999E35B4DE3DF5825 /* SUErrors.h */, + 5802ED484D1D61B1CF81E4FF3FA2B803 /* SUExport.h */, + 8BEA796A0759EC432CAC1FB1E8224AF2 /* SUStandardVersionComparator.h */, + E7A92378B38445C1EFB4A7B0F68EB829 /* SUUpdater.h */, + 0FCBF23E5EBFD42D6DBE79AA5B00D31F /* SUUpdaterDelegate.h */, + 8F7B9B3B1B8F4396FF9E72686DF1DC32 /* SUVersionComparisonProtocol.h */, + 4EA899DD342B0F16248F91CC648655DC /* SUVersionDisplayProtocol.h */, + 509C9201FCDDA7CF8F0FB22862E3E3D5 /* Frameworks */, + 15E51987DD23CD2C39ADE34C345DD06A /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/STPrivilegedTask"; + name = Sparkle; + path = Sparkle; sourceTree = ""; }; - 84A3A17D0CF37E7B1F5A39D33A09E980 /* Frameworks */ = { + 8D319F6889A24A580F4F18FCCDFAE40E /* Frameworks */ = { isa = PBXGroup; children = ( - 403E5DC2A495655EAFFCE6EFF9F1D835 /* Sparkle.framework */, + 5BC893B0CFD82C226515798DD53D16C4 /* AppCenter.xcframework */, ); name = Frameworks; sourceTree = ""; }; - 8C42D6741D3E3322387DEBA09FA29A39 /* KeychainAccess */ = { + 99BD8A3BFF9A7E9362393A623C810908 /* Core */ = { isa = PBXGroup; children = ( - 5E4DC852E46ECF185858E535CA3D5AB6 /* Keychain.swift */, - 1CB0278FF975C4E1105EC4C41689B092 /* Support Files */, + 8D319F6889A24A580F4F18FCCDFAE40E /* Frameworks */, ); - name = KeychainAccess; - path = KeychainAccess; + name = Core; sourceTree = ""; }; - A3CE797213FD3A029F25F79F20959332 /* Nuke */ = { + 9BD3C722D7AABCC8D329ABFBDF137973 /* Support Files */ = { isa = PBXGroup; children = ( - B0EDA861355A15CEE856BBBC62986E0A /* DataCache.swift */, - 49CC7623E693F5C7F50DEF8134CE6BAC /* DataLoader.swift */, - 1B667B4D06855E6E379D5CCFDA63534B /* ImageCache.swift */, - 274574E44800D14033BF5E84D9A0DCEC /* ImageDecoding.swift */, - 60016998149B9BA38069733A808141B4 /* ImagePipeline.swift */, - F2EC05A19268D1FA57BEAC595A83FD4F /* ImagePreheater.swift */, - E21E032064AC86B919F264C91C264649 /* ImageProcessing.swift */, - 5D23734EBAFBCF54FB7BF0708BF213B9 /* ImageRequest.swift */, - B7D252FB70C45B71C2F10A56DE6A941D /* ImageTaskMetrics.swift */, - 289DA2913B70BAC4123A36BE7B5DB854 /* ImageView.swift */, - E3287DAF99F2D87FAF6C63B0E3271BBA /* Internal.swift */, - CD28BF876EACA0513F4E4A4FF1424D4B /* Support Files */, + 5A5E7BD1B5572E67B4B00A9CD9568CEC /* AppCenter-xcframeworks.sh */, + ABD8B044A5433BE517993E1B72807578 /* AppCenter.debug.xcconfig */, + 7C2A1391A7949FA60B67301106708FBC /* AppCenter.release.xcconfig */, ); - name = Nuke; - path = Nuke; + name = "Support Files"; + path = "../Target Support Files/AppCenter"; sourceTree = ""; }; - A3E38A6354B2256101CC3C62330F0823 /* Frameworks */ = { + 9BD82A8DBF906557856062533E62FF7B /* Support Files */ = { isa = PBXGroup; children = ( - 3E76193172022F9DA3BC2236D39255F4 /* AppCenterAnalytics.xcframework */, + 69FCF3438994E0791403C7BC03D2E3AD /* KeychainAccess.modulemap */, + B02113D5FF98151C1A9EC82B06A1283F /* KeychainAccess-dummy.m */, + 17D82A179695F84FD926BF2A30DA5B53 /* KeychainAccess-Info.plist */, + BD93650C80B1B6C1839653C4A8CEC50A /* KeychainAccess-prefix.pch */, + 7519F1C62C67B302B027FE101E12AE94 /* KeychainAccess-umbrella.h */, + 7FB301535CE7A8491DDB1E4DA23A7D95 /* KeychainAccess.debug.xcconfig */, + B662D13AB8546C0B12ED190B7ADD64E7 /* KeychainAccess.release.xcconfig */, ); - name = Frameworks; + name = "Support Files"; + path = "../Target Support Files/KeychainAccess"; + sourceTree = ""; + }; + 9BF59400ED83ED17C37F5B4F3E8371CD /* Analytics */ = { + isa = PBXGroup; + children = ( + F0976E249FCBF412DA7FA47EE7E46639 /* Frameworks */, + ); + name = Analytics; sourceTree = ""; }; A78C7CBC44986F797EC1BB49078F5A84 /* Pods-AltServer */ = { @@ -459,36 +750,6 @@ path = "Target Support Files/Pods-AltServer"; sourceTree = ""; }; - ADD5DFADA87E4C4BD53112F50DE17F53 /* Support Files */ = { - isa = PBXGroup; - children = ( - A369E1EAE3950C58981EBE17388E2BF9 /* AppCenter-xcframeworks.sh */, - 3EC264C0322EA7D294325E719E778C0D /* AppCenter.debug.xcconfig */, - 76A8F2F82B71022E55FDEF484B6CE216 /* AppCenter.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AppCenter"; - sourceTree = ""; - }; - BA92B09126EFE41671F6020596A02775 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7327F856DC1511F7F2FC7D48F0D527ED /* AppCenter.xcframework */, - ); - name = Frameworks; - sourceTree = ""; - }; - BDE5CABE525866F9C71E53B6CA540F6D /* STPrivilegedTask */ = { - isa = PBXGroup; - children = ( - B8D137C60036874A0557CCEE73BBCB2C /* STPrivilegedTask.h */, - A1CFC228917998470347609C970E2250 /* STPrivilegedTask.m */, - 79584D489062D852882C00014009E164 /* Support Files */, - ); - name = STPrivilegedTask; - path = STPrivilegedTask; - sourceTree = ""; - }; BEAF173CF7BAF5537488976CEC756DA3 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -498,19 +759,18 @@ name = Frameworks; sourceTree = ""; }; - CD28BF876EACA0513F4E4A4FF1424D4B /* Support Files */ = { + C7C54C6B014C02819FBF393BFDDAB6C5 /* Products */ = { isa = PBXGroup; children = ( - E7F457514020E4FC88FF09F657120026 /* Nuke.modulemap */, - CC20798924CD1044DBBAA606FD644B6F /* Nuke-dummy.m */, - 0382F0C2A6CFC9B6577C7E07FE90F84F /* Nuke-Info.plist */, - C2477C1B5D52605D8048AB5C57581E8E /* Nuke-prefix.pch */, - 3708F938147E2EA0A2E0C4B41AC7FAFB /* Nuke-umbrella.h */, - A8A6F643F7EF9DF00939CAD8ACD3AC04 /* Nuke.debug.xcconfig */, - AA4056B922A0E5FD0C05DA6E40E93CC7 /* Nuke.release.xcconfig */, + E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess */, + 2DAD7D76FC007F48AE48F2FD15BF01BB /* Nuke */, + 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods-AltServer */, + 676644EB1805E96CE47F7882733262B3 /* Pods-AltStore */, + A444C51407C51AB3AF06B6129DEC9BF4 /* Pods-AltStoreCore */, + 4405793D5AF1EFD9D2BDA30AA0D2E514 /* Roxas */, + ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask */, ); - name = "Support Files"; - path = "../Target Support Files/Nuke"; + name = Products; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { @@ -518,29 +778,20 @@ children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, BEAF173CF7BAF5537488976CEC756DA3 /* Frameworks */, - F0FB8585D826364405CCE3309EDB717E /* Pods */, - 74233BDE6B4516104F5A64C6BA7691D7 /* Products */, + 46A8BCA4B8463AF658BFB09614533934 /* Pods */, + C7C54C6B014C02819FBF393BFDDAB6C5 /* Products */, 1F2756FA33ADF6C93A690B06B2893188 /* Targets Support Files */, ); sourceTree = ""; }; - D1565045C80086A09C5085168A12184F /* Support Files */ = { + D404F57E99ECBE8BDC51ABC8B04DAA0D /* KeychainAccess */ = { isa = PBXGroup; children = ( - 316A35BB104F5F22465DA1FDA196B618 /* Sparkle-copy-dsyms.sh */, - A877252A18D311874262B3B2DFD173FC /* Sparkle.debug.xcconfig */, - 7540408582AD7792C66E59D59C1CE8E6 /* Sparkle.release.xcconfig */, + 72FD4BF17583598D5706E1CB8B479D30 /* Keychain.swift */, + 9BD82A8DBF906557856062533E62FF7B /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Sparkle"; - sourceTree = ""; - }; - D7DFF5FA24B2F31FCEC40F520C04276D /* Crashes */ = { - isa = PBXGroup; - children = ( - DA94CFF017B024B7471510372C7745C7 /* Frameworks */, - ); - name = Crashes; + name = KeychainAccess; + path = KeychainAccess; sourceTree = ""; }; D9A1E15AF5ACDD9E2505B0BDD14DB108 /* Pods-AltStoreCore */ = { @@ -559,87 +810,261 @@ path = "Target Support Files/Pods-AltStoreCore"; sourceTree = ""; }; - DA94CFF017B024B7471510372C7745C7 /* Frameworks */ = { + EF733762937FFA4CDA3F90A2623D8D8F /* Support Files */ = { isa = PBXGroup; children = ( - A4BCC5F27B4DCF31A5028F0902818A8F /* AppCenterCrashes.xcframework */, + 4C5A0226224800FC8E0702FCDF036AE6 /* Roxas.modulemap */, + 0582AE952AD1E7FB50E2A01A5D248D87 /* Roxas-dummy.m */, + 2BACB1073EB7C7FCD5CD35B5D3AEFF9C /* Roxas-Info.plist */, + 04DDB67A6D6A466ADE3497E5E5334BD9 /* Roxas-prefix.pch */, + 0DB422AB9A436A02608C3FEA5E9C67B9 /* Roxas-umbrella.h */, + F4128CC19DD8935BCBC0E321EC9A2432 /* Roxas.debug.xcconfig */, + C13AE8E706552D4FC68531B447999912 /* Roxas.release.xcconfig */, ); - name = Frameworks; + name = "Support Files"; + path = "../Target Support Files/Roxas"; sourceTree = ""; }; - E91F869B1A4DFD937480CDED6B224AC1 /* AppCenter */ = { + F0976E249FCBF412DA7FA47EE7E46639 /* Frameworks */ = { isa = PBXGroup; children = ( - 0971F1B1E5DD3D955C00C670D51F7E78 /* Analytics */, - 1DA1A52E4BFBED4DB804D234A44ED796 /* Core */, - D7DFF5FA24B2F31FCEC40F520C04276D /* Crashes */, - ADD5DFADA87E4C4BD53112F50DE17F53 /* Support Files */, + 543FD9853B8DB0B6685C508777C25C7B /* AppCenterAnalytics.xcframework */, ); - name = AppCenter; - path = AppCenter; + name = Frameworks; + sourceTree = ""; + }; + F139EB99BACF23BEE27DBAC47E9CFA1C /* Roxas */ = { + isa = PBXGroup; + children = ( + 3C54676785BABD9C4D102A5F7FA78647 /* NSBundle+Extensions.h */, + 05539BC315302080021A21DC52AE7695 /* NSBundle+Extensions.m */, + 3EE5C6E86B982C8F4757006446F46C39 /* NSConstraintConflict+Conveniences.h */, + 1CDA5986FD8D6B2D023233F629C57E83 /* NSConstraintConflict+Conveniences.m */, + BA04BF5574C6D6BBF14B3B2A8BB173D0 /* NSFileManager+URLs.h */, + 1C4679224B773F1C60D3624295693103 /* NSFileManager+URLs.m */, + 6E2D4EC2A849D37FD9D97A34A1B45893 /* NSLayoutConstraint+Edges.h */, + CE2402416AF3FFF1EF9AEDF5065AB7C6 /* NSLayoutConstraint+Edges.m */, + B729CE7EF76E97C8F5ED04FDC0375C88 /* NSPredicate+Search.h */, + 62283A07B00B6466072D6D606FEAEA94 /* NSPredicate+Search.m */, + B72AD19D325CBF1919BC66B95A52B207 /* NSString+Localization.h */, + B6B05D721CDB02148D7E51457F344363 /* NSString+Localization.m */, + 7971F6FE5B14977FF0269B56A59B8064 /* NSUserDefaults+DynamicProperties.h */, + 3B467FCC755F466193881232B4400CF4 /* NSUserDefaults+DynamicProperties.m */, + 855D496D4E72460CA46C6AAB4BE9095C /* Roxas.h */, + 00FDCE4C2ADECCEC9E6BE40108579188 /* RSTActivityIndicating.h */, + A3883B4539B6F99E7D404CFB3080D1C2 /* RSTArrayDataSource.h */, + FF93520BBC24F13DD9336F194F4A7401 /* RSTArrayDataSource.m */, + B938E7EDD038CDE6806C5A327BA5BA93 /* RSTBlockOperation.h */, + 2AC98B1BDDA357D581A5280ABCAF8752 /* RSTBlockOperation.m */, + A9CD32DAA97ACF0A8C4FCEC5E6309D65 /* RSTCellContentCell.h */, + E8A2AD505940EBB9CB4196F14CA3CC34 /* RSTCellContentChange.h */, + A9E7DF90AFB81E34831EC61A835AC30C /* RSTCellContentChange.m */, + 6BF14078A67C9C90190CE4FC612CE5FA /* RSTCellContentChangeOperation.h */, + E4EC14C42A28EE6A1F479FF1DD802AA2 /* RSTCellContentChangeOperation.m */, + CD859130F5EA8CD673F351DB802A5A93 /* RSTCellContentDataSource.h */, + 9C2F67BBB8A861FD1730930F512323A2 /* RSTCellContentDataSource.m */, + 3A7D311B825C5F60E4DD9965713AA31D /* RSTCellContentDataSource_Subclasses.h */, + 000D19C82B3171923E6C2C0823C4E093 /* RSTCellContentPrefetchingDataSource.h */, + 391057E3175199846C1B199BA3102E30 /* RSTCellContentView.h */, + FCC9568E2015D97C38C350F6CA6568BB /* RSTCollectionViewCell.h */, + 3DD9B2B97B3F0B1561628DCBB07A8312 /* RSTCollectionViewCell.m */, + B885138E3974C04183ECB19225C13F6F /* RSTCollectionViewGridLayout.h */, + 22250A22949B8C9281E83B53A687EF5A /* RSTCollectionViewGridLayout.m */, + 6DC172C2032DD52C3C218A690797648A /* RSTCompositeDataSource.h */, + B6AAADED8E6D42CDB0E10C81294315AF /* RSTCompositeDataSource.m */, + 184C8F93B79916804B69FDD3EA135131 /* RSTConstants.h */, + 982612F2D6A959E05FF90BBD069CF7C1 /* RSTDefines.h */, + 28FF6298DF1DDD1BAE8C363FFB0950DC /* RSTDynamicDataSource.h */, + 44C0AD6C5A773DE6555B31E3947F1FBB /* RSTDynamicDataSource.m */, + 82411FA06A338D0969EC7E6B4E29733F /* RSTError.h */, + A0ADA62CDC2BB7350DB8E862AE9A6FC9 /* RSTError.m */, + DD0FCE812AD2B62D4D4A27874DF04BDF /* RSTFetchedResultsDataSource.h */, + C6581F0D17D32C22D6C22A1C56925190 /* RSTFetchedResultsDataSource.m */, + 0598C5BC5B0CFDE8E4CBB51F548F67AB /* RSTHasher.h */, + A0B38C2A2E3092705AC243CB3C0A6357 /* RSTHasher.m */, + 136B30081E5CF1676172761D9A6B8F73 /* RSTHelperFile.h */, + 1E690185E212FD343956BAF3A478E3E1 /* RSTHelperFile.m */, + F977C59946BA3F6F12EEF1B3E9CA0E75 /* RSTLaunchViewController.h */, + 493F618D583BA4BDCB71229DEFC35E4C /* RSTLaunchViewController.m */, + 29FE92ADAEB930DE5E5C9334C20BB7BB /* RSTLoadOperation.h */, + 4CD7C632192C9984033D154DA29DBF0F /* RSTLoadOperation.m */, + FBF2A8A8D11E7DFE95FB6FA1615F90A2 /* RSTNavigationController.h */, + C3CD75081E6364656A58D9985497AE32 /* RSTNavigationController.m */, + 4E660B3FFA68CDA39A6926B349B07A2F /* RSTNibView.h */, + 78689809D5F2F0A07985384D3D9EE52F /* RSTNibView.m */, + D5D006C94B879BB4105846A9FFE256A5 /* RSTOperation.h */, + 31DAAD8C241938CA0F25B272CE2A5105 /* RSTOperation.m */, + 5441A4582AC3C39D8383319AF616CE88 /* RSTOperation_Subclasses.h */, + 4BE455F30597C3E68B65915C7E87EEF3 /* RSTOperationQueue.h */, + 6271230E5F68DF0335AF0A3985BA53F3 /* RSTOperationQueue.m */, + 32D0B2786BAEBD26ADEA97EFA0CDCEC9 /* RSTPersistentContainer.h */, + 2024D3AD1FCEE2FDB79AE6BC8D74F177 /* RSTPersistentContainer.m */, + FB9247F1D65CCABD4D73022CB9AE8BA4 /* RSTPlaceholderView.h */, + 901AD8E7CBC8AF5535A123C22D245A62 /* RSTPlaceholderView.m */, + D885DAC483B938A3480724C55DAD45EF /* RSTRelationshipPreservingMergePolicy.h */, + A2902617976A3F2AE91FE3F7A6AB6DB3 /* RSTRelationshipPreservingMergePolicy.m */, + 0BC26A428551B042F67BCD22457F504F /* RSTSearchController.h */, + 06C761F945C2A54FD9EF242395C294A0 /* RSTSearchController.m */, + B306DAE41B3D2D572DBE1527F5A8EA43 /* RSTSeparatorView.h */, + 638CA2DA48C316E97D6C8C8B548B1FAD /* RSTSeparatorView.m */, + F952D2D7B6FFCB382D4A7F6C86D8B7B3 /* RSTTintedImageView.h */, + E897BC7E1C7670AD9ED8F4F9097297B3 /* RSTTintedImageView.m */, + 629A8524B052802080B35312C8811886 /* RSTToastView.h */, + 6158699BCE6A6719A22C4096F9129197 /* RSTToastView.m */, + A09C1D844A5134FBB37F0C74D0FC2A42 /* UIAlertAction+Actions.h */, + ED7901EBD09B6990F7DDC1A40A6F2904 /* UIAlertAction+Actions.m */, + 79AC0AF30D97003ECBD93274AD72C525 /* UICollectionView+CellContent.h */, + BCF6A5E0D8A63E7DA71C9D407D31FFDC /* UICollectionView+CellContent.m */, + 0ED11C9FB35153A785C51C7FE97BBAE5 /* UICollectionViewCell+CellContent.h */, + 99854153B2530CDCF1A901DE740A0BB7 /* UICollectionViewCell+CellContent.m */, + E7003D80DFC75D02036F586B9A09C53B /* UICollectionViewCell+Nibs.h */, + 2250FBA16C2F495D635889180FA9A05B /* UICollectionViewCell+Nibs.m */, + 2298822B64BC7858C2207F5F44A8FBCD /* UIImage+Manipulation.h */, + 134ECBBEA382123A4E1F7B6C0337164B /* UIImage+Manipulation.m */, + 3E0F534230B5A292BDE6948842FC447B /* UIKit+ActivityIndicating.h */, + CFD9A1DF01A5DA1FB9D610809705D845 /* UIKit+ActivityIndicating.m */, + 01E581B09957A5D1B521FB357D0E154A /* UISpringTimingParameters+Conveniences.h */, + A51FDB1AECA5927A89FC7B7444A782D4 /* UISpringTimingParameters+Conveniences.m */, + 46FC523634A6D40610DCFB4E602C2A3D /* UITableView+CellContent.h */, + D1BB3AFFB49668D7EB6302C2B56318D6 /* UITableView+CellContent.m */, + C968207E2FD3F8782AE58D72DE6E3FA7 /* UITableViewCell+CellContent.h */, + B3402CA95D16B5F61CED4DE024C420AF /* UITableViewCell+CellContent.m */, + FBB4DB919497378BECB198339FEB69A8 /* UIView+AnimatedHide.h */, + BFE97B6E513C1F41F628104FAEA6FDB4 /* UIView+AnimatedHide.m */, + 55DE68EA396C56C3E22B38FCE3822000 /* UIViewController+TransitionState.h */, + 3685B0203BCA40D6359C18FF9D7CCF12 /* UIViewController+TransitionState.m */, + 67BE78698F1925637EF47A549930E704 /* Resources */, + EF733762937FFA4CDA3F90A2623D8D8F /* Support Files */, + ); + name = Roxas; + path = Roxas; sourceTree = ""; }; - F0FB8585D826364405CCE3309EDB717E /* Pods */ = { + F58AF0744039A4652D82AFBA29A9FFCF /* Support Files */ = { isa = PBXGroup; children = ( - E91F869B1A4DFD937480CDED6B224AC1 /* AppCenter */, - 8C42D6741D3E3322387DEBA09FA29A39 /* KeychainAccess */, - A3CE797213FD3A029F25F79F20959332 /* Nuke */, - 6BE188542514B1C4367A14C60F711BA1 /* Sparkle */, - BDE5CABE525866F9C71E53B6CA540F6D /* STPrivilegedTask */, + C10FDEC61889403493C9A8EFE488EDD6 /* STPrivilegedTask.modulemap */, + 73F0FA626B0FECFBD8F1ADD9BB9C9FEE /* STPrivilegedTask-dummy.m */, + 0C07EBA0C41CD6E57D19EF5FB6F419C1 /* STPrivilegedTask-Info.plist */, + 1BC741FD87BC3E922F8259C8BF927335 /* STPrivilegedTask-prefix.pch */, + 3FB2F8E3D003AB295EDDD18C6352771C /* STPrivilegedTask-umbrella.h */, + 221135939AA1D93F367C6347FA99855B /* STPrivilegedTask.debug.xcconfig */, + B104594AF1A3B76C7F47038BE02DF925 /* STPrivilegedTask.release.xcconfig */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/STPrivilegedTask"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 23F39F9B06CA496FC7FEE1BFE0C21019 /* Headers */ = { + 220B425E4B5047BBC10701E0908D1723 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 581C76CCC867C284BA38EF4ADA4054B5 /* Pods-AltStore-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37DC7D982C908F8FA82E943190C1C911 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CF22B95F4979B5384D3FF75A8637128F /* Nuke-umbrella.h in Headers */, + 03862A0004397D15BFBE813F11AFA836 /* Pods-AltStoreCore-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 39CC3E71CEA7805FCA03E3A1CC052EEA /* Headers */ = { + 857CB1C69F867B81728BE2FE9D75C771 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - EEADFC5C1C5EC6E3E20506B8E069931D /* KeychainAccess-umbrella.h in Headers */, + 9FE26C0C44CEA56FAEAC60A57D2CF11A /* STPrivilegedTask.h in Headers */, + 6AECD5FFBED294A030312066C6458FBA /* STPrivilegedTask-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5A0720C096941A3006070216308EE5E4 /* Headers */ = { + 8D66FADE4CE9409BAE0629E5856D723E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - DA1CB5949B054973CAE7C668F3506B1D /* STPrivilegedTask-umbrella.h in Headers */, - 9D0E99B326D76B98393DF8B1B3EB5AD5 /* STPrivilegedTask.h in Headers */, + 2DDEB2192477E63CC8BAADACDD0B28F4 /* Pods-AltServer-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 64CEC9C6BED1578AAD33B80BF3B4AF20 /* Headers */ = { + 9786DBA104F9985F077B0E7D7FA060FE /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - DC6A713AE0E7CB18DFA8960F125DB73D /* Pods-AltStoreCore-umbrella.h in Headers */, + 8915AB3DEC6378EA8931FCDA637AAD30 /* NSBundle+Extensions.h in Headers */, + C3E58E541F28459FA1CCB145A1A8DCC4 /* NSConstraintConflict+Conveniences.h in Headers */, + A50B038D09E1961A85C42AFD6BF1A346 /* NSFileManager+URLs.h in Headers */, + E9894EBDF31A8E10E48C640BECADC1A8 /* NSLayoutConstraint+Edges.h in Headers */, + A64A992AA7EFEDF63EA52FA8FA4DFCAD /* NSPredicate+Search.h in Headers */, + 21A2C00BF1A798A4801CC1943AAA0518 /* NSString+Localization.h in Headers */, + 6E49BABA5629759CAF577C6555D41A83 /* NSUserDefaults+DynamicProperties.h in Headers */, + E3B62887F28704DB6705478491CF60DF /* Roxas.h in Headers */, + 3B3800A1919F27B9496F011849EE4CE3 /* Roxas-umbrella.h in Headers */, + 6781BFCDCC02B7F5EF9A979655A2BB2A /* RSTActivityIndicating.h in Headers */, + 9267C6528CF936A8897868D502343D02 /* RSTArrayDataSource.h in Headers */, + 2C000B46826CDCB452C5FE09A02E5850 /* RSTBlockOperation.h in Headers */, + 92100BACCE616FB6CAE71B6F52D7CF3C /* RSTCellContentCell.h in Headers */, + 0613CE8304A0277F087EC82E13BE3A5A /* RSTCellContentChange.h in Headers */, + 28BBB015A40C2ACAF8136D7D7EC1A27C /* RSTCellContentChangeOperation.h in Headers */, + C20639D9861176103B97DCC5D1052E13 /* RSTCellContentDataSource.h in Headers */, + 6EE881CD2532EB6A5A63AB426CAE02F6 /* RSTCellContentDataSource_Subclasses.h in Headers */, + 1AAC83FB605F1D1D1E030FA0BAEF2DCB /* RSTCellContentPrefetchingDataSource.h in Headers */, + FF74081E618C329D80297C9674B76B81 /* RSTCellContentView.h in Headers */, + CFA3674E413D9F218A59D057B6603019 /* RSTCollectionViewCell.h in Headers */, + 7E80A62AE53F95DD8AC072EF87623717 /* RSTCollectionViewGridLayout.h in Headers */, + D3861C37DCA5E40335419D6B7CED74E4 /* RSTCompositeDataSource.h in Headers */, + 5BEA1009E4391A8C93EC699D9EB2631F /* RSTConstants.h in Headers */, + D7E5A152352878BCB4D16DFAF5E86009 /* RSTDefines.h in Headers */, + 4FE950E6C1C7C5995CC64B59A2DDE36F /* RSTDynamicDataSource.h in Headers */, + 3CDA53D407452C07754BC64EFD02512B /* RSTError.h in Headers */, + 3AFB8AEF3E34B7A6FC44A63AC068D5CA /* RSTFetchedResultsDataSource.h in Headers */, + 504DCA4F68EED7A1A033E0A7CB559B91 /* RSTHasher.h in Headers */, + C168E8B39B5779EFAFB01875389A544D /* RSTHelperFile.h in Headers */, + 84988A9AA75618FD101E1612309FE670 /* RSTLaunchViewController.h in Headers */, + 8324B7758B4BB4987CE16942F0248C0A /* RSTLoadOperation.h in Headers */, + 61D95410429A89A605C67F8C0242BF63 /* RSTNavigationController.h in Headers */, + 1CC663C5D323D3B27B12FFE703AB3240 /* RSTNibView.h in Headers */, + DED7EFF94FA761E2E396C77411B4F7BB /* RSTOperation.h in Headers */, + 55F0366B3AA8B9A43F32DA3F5530D487 /* RSTOperation_Subclasses.h in Headers */, + 52484B0223124B4E17BB6132B75D3442 /* RSTOperationQueue.h in Headers */, + AC74F6DF3173D5E8BC4133542536D964 /* RSTPersistentContainer.h in Headers */, + 23E7EDEE05EB271B63C0C03B36AAC4ED /* RSTPlaceholderView.h in Headers */, + 7D409E80972B8AEB97B48D8B18A22A6A /* RSTRelationshipPreservingMergePolicy.h in Headers */, + 60FD17DB796856E35A1D7C3CA9951AC9 /* RSTSearchController.h in Headers */, + 5744AA27C2E6EE1AC05EB2AA7F3E6070 /* RSTSeparatorView.h in Headers */, + D9AEBF2769844613DDAF8FDC51EDFCA5 /* RSTTintedImageView.h in Headers */, + E2D33133B88E4875795B7B77202CB024 /* RSTToastView.h in Headers */, + 98A44336A6E361382C06259BE492EEF2 /* UIAlertAction+Actions.h in Headers */, + 6234DDD702595CA1FC5B4A93FF3042F5 /* UICollectionView+CellContent.h in Headers */, + EB53E838F345C08123E84D79B8F311B8 /* UICollectionViewCell+CellContent.h in Headers */, + A7CD4B7656B444B91FC210C874109754 /* UICollectionViewCell+Nibs.h in Headers */, + C82D9BB29314F21FF2F2037894691C3F /* UIImage+Manipulation.h in Headers */, + 3154FB9B22FA969AA6D8FA05AA8172C8 /* UIKit+ActivityIndicating.h in Headers */, + C4242EDFB749F2C7C4ED1DA7A5C80316 /* UISpringTimingParameters+Conveniences.h in Headers */, + CFABD048F9FCCA96F0C597B7DA9593AA /* UITableView+CellContent.h in Headers */, + D878F44D1B200700A490ACB68F00F440 /* UITableViewCell+CellContent.h in Headers */, + BCEBE0663DEF68CCC3726A00CA03B890 /* UIView+AnimatedHide.h in Headers */, + E56B9EA2F656433C7AE32C049022508A /* UIViewController+TransitionState.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 76C937BD6FC3B9014739F59EAD90E714 /* Headers */ = { + AA2EFE354AE38577880AE5F576878CFA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - D8BF963F7EA268998C24355CB9CB7336 /* Pods-AltStore-umbrella.h in Headers */, + C8310ED9905E053FA35E150B865413B4 /* Nuke-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 84BEA10467B4EC9AAF2B28BDBC10DD88 /* Headers */ = { + BF75125526618A4F89C7DE0AA396B82A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 769D8B0C5A187741B64AD32B0C73E1D4 /* Pods-AltServer-umbrella.h in Headers */, + BF90BFF34BBAD8B2C7A6CE9641145561 /* KeychainAccess-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -648,12 +1073,12 @@ /* Begin PBXNativeTarget section */ 05327B1DB6967DBAA19D1ED734FDBD96 /* STPrivilegedTask */ = { isa = PBXNativeTarget; - buildConfigurationList = 54208ED19403AA500F1198EEF237E880 /* Build configuration list for PBXNativeTarget "STPrivilegedTask" */; + buildConfigurationList = EB7216580AC9671E7A16548748D142EB /* Build configuration list for PBXNativeTarget "STPrivilegedTask" */; buildPhases = ( - 5A0720C096941A3006070216308EE5E4 /* Headers */, - 71DB8ED63E9ECF590D94A4935840514D /* Sources */, - DF55D5C41519A5A52DAE534296270AF5 /* Frameworks */, - 7B197823109A7BA51E3F4BCDAE203339 /* Resources */, + 857CB1C69F867B81728BE2FE9D75C771 /* Headers */, + AC5DE12E3205955D8D58D98E1622404E /* Sources */, + 436A83F9AF52DE8608685BFA557D09D6 /* Frameworks */, + 8BABCA870ED658E3ECCEAA39D4B0DAF2 /* Resources */, ); buildRules = ( ); @@ -661,17 +1086,17 @@ ); name = STPrivilegedTask; productName = STPrivilegedTask; - productReference = ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask.framework */; + productReference = ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask */; productType = "com.apple.product-type.framework"; }; 062A64896E847A6749F58B6BA9A931B1 /* Nuke */ = { isa = PBXNativeTarget; - buildConfigurationList = 31404833434413200237F603FEA40587 /* Build configuration list for PBXNativeTarget "Nuke" */; + buildConfigurationList = 54F019FDA0202CB87BF2A3FA2BFEF159 /* Build configuration list for PBXNativeTarget "Nuke" */; buildPhases = ( - 23F39F9B06CA496FC7FEE1BFE0C21019 /* Headers */, - 2FCE441B86282D780CE9CA9653F794FE /* Sources */, - 5F011871410CDADCC4458FBF149C21D5 /* Frameworks */, - 6FCBC73113287540180C33E89AFBED90 /* Resources */, + AA2EFE354AE38577880AE5F576878CFA /* Headers */, + 2FC7F61B72DE8C921B10AF1FD039370B /* Sources */, + 8BC2032ECB47758A61DA937668B9F6ED /* Frameworks */, + 9891C0AE8DE9FD77564A0965064067EE /* Resources */, ); buildRules = ( ); @@ -679,36 +1104,37 @@ ); name = Nuke; productName = Nuke; - productReference = 2DAD7D76FC007F48AE48F2FD15BF01BB /* Nuke.framework */; + productReference = 2DAD7D76FC007F48AE48F2FD15BF01BB /* Nuke */; productType = "com.apple.product-type.framework"; }; 50CF9516C3135DF9E9C562D57B086168 /* Pods-AltStoreCore */ = { isa = PBXNativeTarget; - buildConfigurationList = F21FDDBBEE883C64EE2A3A59711CBBCC /* Build configuration list for PBXNativeTarget "Pods-AltStoreCore" */; + buildConfigurationList = 8CD3BAA9571048B9CD3D49868D6E7C1C /* Build configuration list for PBXNativeTarget "Pods-AltStoreCore" */; buildPhases = ( - 64CEC9C6BED1578AAD33B80BF3B4AF20 /* Headers */, - 1DB9A6E36283EE3BA3DBF98902174A93 /* Sources */, - 22B4AE26F3BF4AC5FA7795C443344798 /* Frameworks */, - 5F28E35E7B6DB0313CA923C26B790B57 /* Resources */, + 37DC7D982C908F8FA82E943190C1C911 /* Headers */, + F920956AA874D73ECBC5BFDE03E0FB66 /* Sources */, + C4F2881CB973D4C4E71C962AEEC66D56 /* Frameworks */, + C92E15031ABA77FC2C289D84B5A29179 /* Resources */, ); buildRules = ( ); dependencies = ( - 7C4FA8EE408E941576842BF279FB0840 /* PBXTargetDependency */, + F1BAAB17AE317A71EABF2A6007F46087 /* PBXTargetDependency */, + 9BE841B74DB0AA91B72ED6EEF83163B4 /* PBXTargetDependency */, ); name = "Pods-AltStoreCore"; - productName = "Pods-AltStoreCore"; - productReference = A444C51407C51AB3AF06B6129DEC9BF4 /* Pods_AltStoreCore.framework */; + productName = Pods_AltStoreCore; + productReference = A444C51407C51AB3AF06B6129DEC9BF4 /* Pods-AltStoreCore */; productType = "com.apple.product-type.framework"; }; 615C831BCE925ED486B225B87E44926D /* KeychainAccess */ = { isa = PBXNativeTarget; - buildConfigurationList = 4BEE926243448802ACA6F07A75D9C025 /* Build configuration list for PBXNativeTarget "KeychainAccess" */; + buildConfigurationList = 8186AABF55F555DDAD74F17BA7EC1698 /* Build configuration list for PBXNativeTarget "KeychainAccess" */; buildPhases = ( - 39CC3E71CEA7805FCA03E3A1CC052EEA /* Headers */, - C4DE4004EE1661FE4BC4E6C40415F599 /* Sources */, - 7668D0A8468B5894E555ECAA4EC50BC1 /* Frameworks */, - AE292B4411627ABE21EB769134C1E8BB /* Resources */, + BF75125526618A4F89C7DE0AA396B82A /* Headers */, + 3CA247B210AE409280F27D97CC981D9D /* Sources */, + 61A2EC0AB6F1423BBB0D97DFA9CC1E1B /* Frameworks */, + 57833CBC64D40DF1355638A2FC2ACC60 /* Resources */, ); buildRules = ( ); @@ -716,48 +1142,67 @@ ); name = KeychainAccess; productName = KeychainAccess; - productReference = E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess.framework */; + productReference = E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess */; productType = "com.apple.product-type.framework"; }; 7083360F3F274C756CA77375F9D2A2BD /* Pods-AltStore */ = { isa = PBXNativeTarget; - buildConfigurationList = 1E7F65B40CD1C2040F5373A9CFB9771B /* Build configuration list for PBXNativeTarget "Pods-AltStore" */; + buildConfigurationList = 46AFB8CBDBE4648ABD1A48CBBF03A492 /* Build configuration list for PBXNativeTarget "Pods-AltStore" */; buildPhases = ( - 76C937BD6FC3B9014739F59EAD90E714 /* Headers */, - E150835A5A23D406E7E0021F764C7A3A /* Sources */, - C03CEEE3B6E689DE71ACE9A302A6C84F /* Frameworks */, - CD12FCFE864C68FB4C7290E98462D81B /* Resources */, + 220B425E4B5047BBC10701E0908D1723 /* Headers */, + FEC1F07CB8772005D107D0343AE945F6 /* Sources */, + 3A1FFE2816B782A8FB9ABE0A80BBB5A0 /* Frameworks */, + BF90413C2741924A2F812235CA7B5ABD /* Resources */, ); buildRules = ( ); dependencies = ( - D7A0E24FA463B3F4B572FBC9FF80618B /* PBXTargetDependency */, - FFF2259EB24A6715C931248B8D877947 /* PBXTargetDependency */, - D10670AC0159B62AAA3308BDE653B517 /* PBXTargetDependency */, + 1CEA830AC18CB36AF27301003449D537 /* PBXTargetDependency */, + 18F9C325981544D816616DBFA02838D2 /* PBXTargetDependency */, + A09523E2B5A64C1C5F936FEEC641A198 /* PBXTargetDependency */, + 8E56DF66B975D5C65D3EC0E79A95B89D /* PBXTargetDependency */, ); name = "Pods-AltStore"; - productName = "Pods-AltStore"; - productReference = 676644EB1805E96CE47F7882733262B3 /* Pods_AltStore.framework */; + productName = Pods_AltStore; + productReference = 676644EB1805E96CE47F7882733262B3 /* Pods-AltStore */; productType = "com.apple.product-type.framework"; }; 89B529DD288896C2EFC49575065F70FB /* Pods-AltServer */ = { isa = PBXNativeTarget; - buildConfigurationList = 08FBBE177E59CE0F1E0406D3E43AD06E /* Build configuration list for PBXNativeTarget "Pods-AltServer" */; + buildConfigurationList = F321B3910F364B719B3DCD65934F8DC5 /* Build configuration list for PBXNativeTarget "Pods-AltServer" */; buildPhases = ( - 84BEA10467B4EC9AAF2B28BDBC10DD88 /* Headers */, - 008804C3B8304EFB3A909B61025D6E71 /* Sources */, - 18A5AE474A881ABD37F19EE4BC42E160 /* Frameworks */, - B4F5106730C6927A8CFC44301285D0D1 /* Resources */, + 8D66FADE4CE9409BAE0629E5856D723E /* Headers */, + BB2F86383297CA953C22A475FDAA9BA6 /* Sources */, + 40DA66070FA10D7F6ABE8A46F1ECD5B4 /* Frameworks */, + 3CBD30201BB79F68C3C5E78250C03C87 /* Resources */, ); buildRules = ( ); dependencies = ( - D12D5B23C8E10F296B7C986EB29B8B0D /* PBXTargetDependency */, - 867202E3CB62EC6FC3AD2E0BA46A74FA /* PBXTargetDependency */, + 5FC5D427B2765FCE29B985EF17434679 /* PBXTargetDependency */, + AB80E1B93D710C7FD2A71DA197DE02BA /* PBXTargetDependency */, ); name = "Pods-AltServer"; - productName = "Pods-AltServer"; - productReference = 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods_AltServer.framework */; + productName = Pods_AltServer; + productReference = 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods-AltServer */; + productType = "com.apple.product-type.framework"; + }; + B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */ = { + isa = PBXNativeTarget; + buildConfigurationList = C1911554C1D806DDB7F8495BED1150CB /* Build configuration list for PBXNativeTarget "Roxas" */; + buildPhases = ( + 9786DBA104F9985F077B0E7D7FA060FE /* Headers */, + 7513362983345C5D8BD2259FA92C1052 /* Sources */, + 4936004E5A6C594F4609987C43BA4C2F /* Frameworks */, + EED29A25DF5534C9FCF3ED0F040C6228 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Roxas; + productName = Roxas; + productReference = 4405793D5AF1EFD9D2BDA30AA0D2E514 /* Roxas */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -766,19 +1211,19 @@ BFDFE7DC352907FC980B868725387E98 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1100; - LastUpgradeCheck = 1100; + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1240; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 11.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - en, Base, + en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 74233BDE6B4516104F5A64C6BA7691D7 /* Products */; + productRefGroup = C7C54C6B014C02819FBF393BFDDAB6C5 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -788,6 +1233,7 @@ 89B529DD288896C2EFC49575065F70FB /* Pods-AltServer */, 7083360F3F274C756CA77375F9D2A2BD /* Pods-AltStore */, 50CF9516C3135DF9E9C562D57B086168 /* Pods-AltStoreCore */, + B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */, ED77B4B88587C894E85C361023D67C53 /* Sparkle */, 05327B1DB6967DBAA19D1ED734FDBD96 /* STPrivilegedTask */, ); @@ -795,48 +1241,57 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 5F28E35E7B6DB0313CA923C26B790B57 /* Resources */ = { + 3CBD30201BB79F68C3C5E78250C03C87 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 6FCBC73113287540180C33E89AFBED90 /* Resources */ = { + 57833CBC64D40DF1355638A2FC2ACC60 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 7B197823109A7BA51E3F4BCDAE203339 /* Resources */ = { + 8BABCA870ED658E3ECCEAA39D4B0DAF2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - AE292B4411627ABE21EB769134C1E8BB /* Resources */ = { + 9891C0AE8DE9FD77564A0965064067EE /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - B4F5106730C6927A8CFC44301285D0D1 /* Resources */ = { + BF90413C2741924A2F812235CA7B5ABD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - CD12FCFE864C68FB4C7290E98462D81B /* Resources */ = { + C92E15031ABA77FC2C289D84B5A29179 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; + EED29A25DF5534C9FCF3ED0F040C6228 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 32E4AC774A99B4B555259E401533764C /* RSTCollectionViewCell.xib in Resources */, + 1A173DDC45B8AE5597E27E294AE7770F /* RSTPlaceholderView.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -877,181 +1332,213 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 008804C3B8304EFB3A909B61025D6E71 /* Sources */ = { + 2FC7F61B72DE8C921B10AF1FD039370B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D617B7A93E7B6E63261966D27C68177D /* DataCache.swift in Sources */, + 8D250860E7CCA9820CA22D9CC988BF5D /* DataLoader.swift in Sources */, + 46858D6B5BF7128F7E713CFEAF6B3058 /* ImageCache.swift in Sources */, + 8B76E1BD8239C7A0AC9D794F883C59F4 /* ImageDecoding.swift in Sources */, + B986F3FA08612EE9146384B4540ECF5B /* ImagePipeline.swift in Sources */, + 6E5E15546CDAB98ADAA048CFACBD78B3 /* ImagePreheater.swift in Sources */, + 52CF75B65F1465E136E6D7FC5FC9A4E1 /* ImageProcessing.swift in Sources */, + D5D4BB33BB18C4F7F8697B4A8C0A2291 /* ImageRequest.swift in Sources */, + 981127D06C5B3621E0BE1EC7941C3423 /* ImageTaskMetrics.swift in Sources */, + 13A8490FBB232054B6DA7FBBBDAA1E80 /* ImageView.swift in Sources */, + D17D07F6EAC0F743BC455C83CDEBADEF /* Internal.swift in Sources */, + EF5A7CDE9B2DE0433E5BBA49B45ADCBB /* Nuke-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CA247B210AE409280F27D97CC981D9D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75B4A7A6112970E8F5CFD2364703B060 /* Pods-AltServer-dummy.m in Sources */, + 2C9022F02292EA5FB21AB5FFC27D05F8 /* Keychain.swift in Sources */, + EEA3892D8746DA47A2889A0717514533 /* KeychainAccess-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1DB9A6E36283EE3BA3DBF98902174A93 /* Sources */ = { + 7513362983345C5D8BD2259FA92C1052 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 93F219AC97237A7AC1DF77381CD77D9E /* Pods-AltStoreCore-dummy.m in Sources */, + 31CB9CFE7F71217168BEEAAC6E24E104 /* NSBundle+Extensions.m in Sources */, + C8C64FF2779A1A751946D1E9C837841C /* NSConstraintConflict+Conveniences.m in Sources */, + DB0267A9CFE7B5700FAEF29B43876864 /* NSFileManager+URLs.m in Sources */, + 7051AAA2691A0B8715271A5B1B9CD686 /* NSLayoutConstraint+Edges.m in Sources */, + A38B0265BC301B8DE0384086AA0B1B5B /* NSPredicate+Search.m in Sources */, + 8F671ED07A9164D370378777456F629B /* NSString+Localization.m in Sources */, + 4AC4801E048A40929BC2FB30127E9ACF /* NSUserDefaults+DynamicProperties.m in Sources */, + A28E1C0FB50D8CF2B860C6444BAEC741 /* Roxas-dummy.m in Sources */, + A511A66CE762DB3AC0A86217890BD2DB /* RSTArrayDataSource.m in Sources */, + C7AF883ABE83270B267EDF52E56BFEDF /* RSTBlockOperation.m in Sources */, + 90C121B0B1699DBD4BB271FDDC8EAE6D /* RSTCellContentChange.m in Sources */, + E9D6E9A2D05C8B175ACD9F31E4E89572 /* RSTCellContentChangeOperation.m in Sources */, + 849BB0B93593B6AE5F1E88B8754FCDDF /* RSTCellContentDataSource.m in Sources */, + DB79BCBB450D5207B6E088BFBD0A6161 /* RSTCollectionViewCell.m in Sources */, + CC551CB63C84AB8B26741A3806529219 /* RSTCollectionViewGridLayout.m in Sources */, + 3D10A92DA0557CD4F5FE9C4E38DA0DB8 /* RSTCompositeDataSource.m in Sources */, + 41AC04EF8F0F903C57EF019E65DB9303 /* RSTDynamicDataSource.m in Sources */, + 837007986460E8E522E9B67904FAF738 /* RSTError.m in Sources */, + 7209B9265151465C3F60C63FDF4D79FD /* RSTFetchedResultsDataSource.m in Sources */, + 3EB58B07E02E22708AC25F6398E41EEE /* RSTHasher.m in Sources */, + E86B4C3125B99E4E66C6D05198D46935 /* RSTHelperFile.m in Sources */, + FD4865931FC924F79CE8764F002D6B6C /* RSTLaunchViewController.m in Sources */, + 93EED161964228EB07C03C35A6FE071C /* RSTLoadOperation.m in Sources */, + A7B5E6CB83FF33FB86813B789FF6F862 /* RSTNavigationController.m in Sources */, + 403D1F6BD05A3671FB09C9BE8E185777 /* RSTNibView.m in Sources */, + 4243BABC6A0E2E74318CDD303C29085D /* RSTOperation.m in Sources */, + 13D643DD57F7B4D3420E0FA3ED171954 /* RSTOperationQueue.m in Sources */, + 116348E683238B29CAA0A81CB5AD2517 /* RSTPersistentContainer.m in Sources */, + 22E07EC63D0629BA661B44FD591B0113 /* RSTPlaceholderView.m in Sources */, + 3DBD498C0CB8EE3EDFD64B780D639088 /* RSTRelationshipPreservingMergePolicy.m in Sources */, + 8BAD77D8C45F5DF5D7EF1EE7C0D243A2 /* RSTSearchController.m in Sources */, + A22DED79F1EF75562FE86DFD7C8DB51A /* RSTSeparatorView.m in Sources */, + 6AAB89CD5368A51A3DE1095474D3F649 /* RSTTintedImageView.m in Sources */, + 411693EAF7513CB78749E8391272761A /* RSTToastView.m in Sources */, + 48E6FECE016205D2AC8ACDA7B942173E /* UIAlertAction+Actions.m in Sources */, + 553D202EAD0E64F7AA3640EE159CC4FD /* UICollectionView+CellContent.m in Sources */, + 8EACC8D80F13140D9EE8A64D490DDF8A /* UICollectionViewCell+CellContent.m in Sources */, + 91CD8E15991EAB3F71623683E851B7B3 /* UICollectionViewCell+Nibs.m in Sources */, + 980120349877F09287F791C5E21D4A69 /* UIImage+Manipulation.m in Sources */, + 58350126CC5DEA3C5831781CE9071224 /* UIKit+ActivityIndicating.m in Sources */, + 0ECE641479E31CB2088B89C77653B76B /* UISpringTimingParameters+Conveniences.m in Sources */, + 0A7815D9BC3B8F5F53FE00D2D6A4B4D8 /* UITableView+CellContent.m in Sources */, + 444A18B009C8651A9F155B85AC7A1FF4 /* UITableViewCell+CellContent.m in Sources */, + 8F6F2C97DDBA42B8B26C04CBDF817B08 /* UIView+AnimatedHide.m in Sources */, + 9FD66D2FE52225EDABC11CD1CB9862FA /* UIViewController+TransitionState.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2FCE441B86282D780CE9CA9653F794FE /* Sources */ = { + AC5DE12E3205955D8D58D98E1622404E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B4FCE86BA184325487EE0465261CA111 /* DataCache.swift in Sources */, - 28F30B593B87BBEFA3E693BE2A11174E /* DataLoader.swift in Sources */, - 7119ECC671B5D507C856BCFDE65A611D /* ImageCache.swift in Sources */, - C847535FFFA08E19CFEFD1E181C09C7C /* ImageDecoding.swift in Sources */, - B170EA97951E165F51FA8F7686669271 /* ImagePipeline.swift in Sources */, - C106C9DB0B20B01498730530DC0C18CF /* ImagePreheater.swift in Sources */, - 2C063B3BEF3C581E33B9B66C7C4D803B /* ImageProcessing.swift in Sources */, - E20BCE120A0B306A42F6F017203E0C66 /* ImageRequest.swift in Sources */, - 3141D17F016A1C7B1B33DAA9D4CE07FC /* ImageTaskMetrics.swift in Sources */, - F84AC07D59C30C6F85EF8AF51206BB1A /* ImageView.swift in Sources */, - D775C176C73D3FCBE660D3642F0ECC4C /* Internal.swift in Sources */, - 1298CF38DF60AC4A56A7FD2CBA026972 /* Nuke-dummy.m in Sources */, + 3826A30459DE5A0E96693170CED95052 /* STPrivilegedTask.m in Sources */, + 1BF697A8040A30EFCE68604CC0852E0D /* STPrivilegedTask-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 71DB8ED63E9ECF590D94A4935840514D /* Sources */ = { + BB2F86383297CA953C22A475FDAA9BA6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8C84999B38A1A4FC9172A12F6A3D1C69 /* STPrivilegedTask-dummy.m in Sources */, - 642FC67C045E71923C63F4C7DF552543 /* STPrivilegedTask.m in Sources */, + EC7F48F27325892B2B267FEC2DD6EA61 /* Pods-AltServer-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C4DE4004EE1661FE4BC4E6C40415F599 /* Sources */ = { + F920956AA874D73ECBC5BFDE03E0FB66 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0441B3E976E5F55E22731AECFF0DBA88 /* Keychain.swift in Sources */, - 4AEB48FE18565A59266480250E7C3FEA /* KeychainAccess-dummy.m in Sources */, + C1773258FBCBFD3A13133C4068EA1A3D /* Pods-AltStoreCore-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E150835A5A23D406E7E0021F764C7A3A /* Sources */ = { + FEC1F07CB8772005D107D0343AE945F6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C4898169FC59160DE4C08711226774E0 /* Pods-AltStore-dummy.m in Sources */, + 5AACC2F9F4CECD5341A252A7B12BD559 /* Pods-AltStore-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 7C4FA8EE408E941576842BF279FB0840 /* PBXTargetDependency */ = { + 18F9C325981544D816616DBFA02838D2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = KeychainAccess; target = 615C831BCE925ED486B225B87E44926D /* KeychainAccess */; - targetProxy = E3407AC00A49F98BFB508824A46399C3 /* PBXContainerItemProxy */; - }; - 867202E3CB62EC6FC3AD2E0BA46A74FA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Sparkle; - target = ED77B4B88587C894E85C361023D67C53 /* Sparkle */; - targetProxy = 64D630002D0AAEE7CC4BA807A38271F9 /* PBXContainerItemProxy */; + targetProxy = 965C37A011BBB6B4B657FFB0CBBFA471 /* PBXContainerItemProxy */; }; - D10670AC0159B62AAA3308BDE653B517 /* PBXTargetDependency */ = { + 1CEA830AC18CB36AF27301003449D537 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Nuke; - target = 062A64896E847A6749F58B6BA9A931B1 /* Nuke */; - targetProxy = 9171572156107EE505BA2730D1360B4E /* PBXContainerItemProxy */; + name = AppCenter; + target = A3282A5B2437E609EEB85861D7ECE717 /* AppCenter */; + targetProxy = 723DC6DF3F91F46A46235D09E6C543C1 /* PBXContainerItemProxy */; }; - D12D5B23C8E10F296B7C986EB29B8B0D /* PBXTargetDependency */ = { + 5FC5D427B2765FCE29B985EF17434679 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = STPrivilegedTask; target = 05327B1DB6967DBAA19D1ED734FDBD96 /* STPrivilegedTask */; - targetProxy = 3567E4665F97E6889AF0EB5590AB2976 /* PBXContainerItemProxy */; + targetProxy = 74C9737A6CD62AC5E5216A991D7B14A8 /* PBXContainerItemProxy */; }; - D7A0E24FA463B3F4B572FBC9FF80618B /* PBXTargetDependency */ = { + 8E56DF66B975D5C65D3EC0E79A95B89D /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = AppCenter; - target = A3282A5B2437E609EEB85861D7ECE717 /* AppCenter */; - targetProxy = 7AC4C92BEAB80F767E1D3BD2A6549F48 /* PBXContainerItemProxy */; + name = Roxas; + target = B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */; + targetProxy = 486D70FB2D36ED4F4080698C9A0FE16A /* PBXContainerItemProxy */; + }; + 9BE841B74DB0AA91B72ED6EEF83163B4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Roxas; + target = B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */; + targetProxy = 16CD2B0D13842734CF9D63E7E266EB8A /* PBXContainerItemProxy */; + }; + A09523E2B5A64C1C5F936FEEC641A198 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Nuke; + target = 062A64896E847A6749F58B6BA9A931B1 /* Nuke */; + targetProxy = A71CEA2294616C51899FB3EFBAE33F50 /* PBXContainerItemProxy */; }; - FFF2259EB24A6715C931248B8D877947 /* PBXTargetDependency */ = { + AB80E1B93D710C7FD2A71DA197DE02BA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Sparkle; + target = ED77B4B88587C894E85C361023D67C53 /* Sparkle */; + targetProxy = 693795A02CA7CCAE8E95687301865A75 /* PBXContainerItemProxy */; + }; + F1BAAB17AE317A71EABF2A6007F46087 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = KeychainAccess; target = 615C831BCE925ED486B225B87E44926D /* KeychainAccess */; - targetProxy = A603DD85ADDA29C5C939837DEF071D77 /* PBXContainerItemProxy */; + targetProxy = 4D47F5080C8593C4CA5D621BCEFEA24C /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 089ED43FBC1050BA6464BCA0B2E42CA5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DCD71D15D5236B317587164B75C7E272 /* KeychainAccess.debug.xcconfig */; - buildSettings = { - "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/KeychainAccess/KeychainAccess-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/KeychainAccess/KeychainAccess-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/KeychainAccess/KeychainAccess.modulemap"; - PRODUCT_MODULE_NAME = KeychainAccess; - PRODUCT_NAME = KeychainAccess; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.1; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 0B798805C750571A4E8E7AB024386B5F /* Debug */ = { + 083D185F861C76F2E59250E8DFB35E8F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FC06C26AB5F79243816DC9878A128284 /* Pods-AltStore.debug.xcconfig */; + baseConfigurationReference = 69E5907F89168B3114EBDAFF7E6C140A /* Pods-AltServer.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + 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*]" = ""; + COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-AltServer/Pods-AltServer-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", - "@executable_path/Frameworks", + "@executable_path/../Frameworks", "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore.modulemap"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MODULEMAP_FILE = "Target Support Files/Pods-AltServer/Pods-AltServer.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; + SDKROOT = macosx; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 188C5FA592A502477F5C3F51D69E7670 /* Release */ = { + 16BF7466C389B20DD7CD6F533A06E465 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = CAC29D24D26CC8214B6B5A283B48A108 /* Pods-AltStoreCore.release.xcconfig */; buildSettings = { @@ -1089,9 +1576,9 @@ }; name = Release; }; - 47A867CE36294A1CAA54592349FB167B /* Debug */ = { + 1CD41CFF2093F53D38B1D5C7895D2B53 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D3E987EE832369F7EC0B46E863347CF5 /* STPrivilegedTask.debug.xcconfig */; + baseConfigurationReference = B104594AF1A3B76C7F47038BE02DF925 /* STPrivilegedTask.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1123,11 +1610,11 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 5FDA0DCFA4FC82C7C71E2368976FFE3A /* Debug */ = { + 32805AB02CDFEF43F7E0C36E255FBE34 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A8A6F643F7EF9DF00939CAD8ACD3AC04 /* Nuke.debug.xcconfig */; + baseConfigurationReference = D99A652854B524DA24D43853AB5F47D4 /* Nuke.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1162,7 +1649,7 @@ }; 64C065F5D8E00A7569B9220163F6A238 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7540408582AD7792C66E59D59C1CE8E6 /* Sparkle.release.xcconfig */; + baseConfigurationReference = 8867DC6130EBDE8AD3FDA0E2BFCC2E57 /* Sparkle.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -1178,48 +1665,47 @@ }; name = Release; }; - 6B44EBFBF075D3AC133D89F87A6BA55E /* Release */ = { + 6B36D986530A20FFD43310C5C2A456DE /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3B0CB9417531308D22740344089FEEFD /* Pods-AltServer.release.xcconfig */; + baseConfigurationReference = EDEB14F6E4E7943294EFE2582BEB14B2 /* Pods-AltStore.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - 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*]" = ""; - COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-AltServer/Pods-AltServer-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", - "@executable_path/../Frameworks", + "@executable_path/Frameworks", "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MODULEMAP_FILE = "Target Support Files/Pods-AltServer/Pods-AltServer.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = macosx; + SDKROOT = iphoneos; SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 7400962835B0CEF4B9EFF3A5645E7179 /* Debug */ = { + 720CF962093F274A13FF6E82ACEBB678 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 69E5907F89168B3114EBDAFF7E6C140A /* Pods-AltServer.debug.xcconfig */; + baseConfigurationReference = 3B0CB9417531308D22740344089FEEFD /* Pods-AltServer.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; @@ -1254,11 +1740,11 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; 75015716975841C5EDFB269B50341487 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 76A8F2F82B71022E55FDEF484B6CE216 /* AppCenter.release.xcconfig */; + baseConfigurationReference = 7C2A1391A7949FA60B67301106708FBC /* AppCenter.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1273,9 +1759,27 @@ }; name = Release; }; - 85C3604D7AF56B115EF6BD1326A59B46 /* Release */ = { + 95AC6B34604C895BE85469E05EA5A6C3 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 202A90AD326A6C4CFB8C03C4DE1146BC /* Sparkle.debug.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + COMBINE_HIDPI_IMAGES = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.7; + SDKROOT = macosx; + }; + name = Debug; + }; + 9D5A747341C9C227317DB0CBBFAF0372 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D4B1C1370ECE6475CD600CCB4C10AC8 /* KeychainAccess.release.xcconfig */; + baseConfigurationReference = B662D13AB8546C0B12ED190B7ADD64E7 /* KeychainAccess.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1308,10 +1812,11 @@ }; name = Release; }; - 86959C5FEFABE64F7EEC3F6C9ED07961 /* Release */ = { + AE7283801351A86783201CE788FB4659 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA4056B922A0E5FD0C05DA6E40E93CC7 /* Nuke.release.xcconfig */; + baseConfigurationReference = F6D7232D2E51E5ED3A8B9A35A10E4147 /* Pods-AltStoreCore.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1321,8 +1826,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Nuke/Nuke-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nuke/Nuke-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = ( @@ -1330,36 +1834,19 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/Nuke/Nuke.modulemap"; - PRODUCT_MODULE_NAME = Nuke; - PRODUCT_NAME = Nuke; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.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.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; - }; - 95AC6B34604C895BE85469E05EA5A6C3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A877252A18D311874262B3B2DFD173FC /* Sparkle.debug.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - COMBINE_HIDPI_IMAGES = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.7; - SDKROOT = macosx; - }; name = Debug; }; B728C0A3F11707064CD14D0D5C56D6BD /* Debug */ = { @@ -1429,11 +1916,10 @@ }; name = Debug; }; - CAB1D8FA507F3D86CCB0E1CB16C21547 /* Debug */ = { + D27B5CE3F9ED73658999A12323517A77 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F6D7232D2E51E5ED3A8B9A35A10E4147 /* Pods-AltStoreCore.debug.xcconfig */; + baseConfigurationReference = F4128CC19DD8935BCBC0E321EC9A2432 /* Roxas.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1443,7 +1929,8 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Roxas/Roxas-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Roxas/Roxas-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = ( @@ -1451,24 +1938,22 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.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/Roxas/Roxas.modulemap"; + PRODUCT_MODULE_NAME = Roxas; + PRODUCT_NAME = Roxas; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - D595F772204ECC88FBF24036924BBFF2 /* Release */ = { + D3AEA770AA019FCB7324EA5B07F51DCF /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EDEB14F6E4E7943294EFE2582BEB14B2 /* Pods-AltStore.release.xcconfig */; + baseConfigurationReference = FC06C26AB5F79243816DC9878A128284 /* Pods-AltStore.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1498,6 +1983,147 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D83CF22EB2350ACD4E8AE7E6F7D7C2F1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C13AE8E706552D4FC68531B447999912 /* Roxas.release.xcconfig */; + buildSettings = { + 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/Roxas/Roxas-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Roxas/Roxas-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Roxas/Roxas.modulemap"; + PRODUCT_MODULE_NAME = Roxas; + PRODUCT_NAME = Roxas; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DCBBBC566B0F5BCB51D20E5672052020 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 221135939AA1D93F367C6347FA99855B /* STPrivilegedTask.debug.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + COMBINE_HIDPI_IMAGES = YES; + 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/STPrivilegedTask/STPrivilegedTask-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/STPrivilegedTask/STPrivilegedTask-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.8; + MODULEMAP_FILE = "Target Support Files/STPrivilegedTask/STPrivilegedTask.modulemap"; + PRODUCT_MODULE_NAME = STPrivilegedTask; + PRODUCT_NAME = STPrivilegedTask; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + E3E6271245A64430488FE5E3A6B25231 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7FB301535CE7A8491DDB1E4DA23A7D95 /* KeychainAccess.debug.xcconfig */; + buildSettings = { + "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/KeychainAccess/KeychainAccess-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/KeychainAccess/KeychainAccess-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/KeychainAccess/KeychainAccess.modulemap"; + PRODUCT_MODULE_NAME = KeychainAccess; + PRODUCT_NAME = KeychainAccess; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.1; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F03A6D2BE099C2414CB324468B281C1D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F68D53BE6F60EBA5A86D080469E23339 /* Nuke.release.xcconfig */; + buildSettings = { + 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/Nuke/Nuke-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nuke/Nuke-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Nuke/Nuke.modulemap"; + PRODUCT_MODULE_NAME = Nuke; + PRODUCT_NAME = Nuke; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1567,45 +2193,9 @@ }; name = Release; }; - FA7F10435C04B6D07B3EF8C903E31A3F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AC06D8ACD831E3BB90FB9DDABA13EAE /* STPrivilegedTask.release.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - COMBINE_HIDPI_IMAGES = YES; - 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/STPrivilegedTask/STPrivilegedTask-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/STPrivilegedTask/STPrivilegedTask-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.8; - MODULEMAP_FILE = "Target Support Files/STPrivilegedTask/STPrivilegedTask.modulemap"; - PRODUCT_MODULE_NAME = STPrivilegedTask; - PRODUCT_NAME = STPrivilegedTask; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; FEC95B7CD72F3B3708DC09E7E2EB397F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3EC264C0322EA7D294325E719E778C0D /* AppCenter.debug.xcconfig */; + baseConfigurationReference = ABD8B044A5433BE517993E1B72807578 /* AppCenter.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1622,83 +2212,92 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 08FBBE177E59CE0F1E0406D3E43AD06E /* Build configuration list for PBXNativeTarget "Pods-AltServer" */ = { + 31C3FA8CADE61CE3FE2492EDBA06C452 /* Build configuration list for PBXAggregateTarget "Sparkle" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7400962835B0CEF4B9EFF3A5645E7179 /* Debug */, - 6B44EBFBF075D3AC133D89F87A6BA55E /* Release */, + 95AC6B34604C895BE85469E05EA5A6C3 /* Debug */, + 64C065F5D8E00A7569B9220163F6A238 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1E7F65B40CD1C2040F5373A9CFB9771B /* Build configuration list for PBXNativeTarget "Pods-AltStore" */ = { + 46AFB8CBDBE4648ABD1A48CBBF03A492 /* Build configuration list for PBXNativeTarget "Pods-AltStore" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0B798805C750571A4E8E7AB024386B5F /* Debug */, - D595F772204ECC88FBF24036924BBFF2 /* Release */, + D3AEA770AA019FCB7324EA5B07F51DCF /* Debug */, + 6B36D986530A20FFD43310C5C2A456DE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 31404833434413200237F603FEA40587 /* Build configuration list for PBXNativeTarget "Nuke" */ = { + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5FDA0DCFA4FC82C7C71E2368976FFE3A /* Debug */, - 86959C5FEFABE64F7EEC3F6C9ED07961 /* Release */, + B728C0A3F11707064CD14D0D5C56D6BD /* Debug */, + F65DF8E32CAC10ECB043121D18BA7CFF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 31C3FA8CADE61CE3FE2492EDBA06C452 /* Build configuration list for PBXAggregateTarget "Sparkle" */ = { + 5242D03FC5C1EAA4F817066052F80607 /* Build configuration list for PBXAggregateTarget "AppCenter" */ = { isa = XCConfigurationList; buildConfigurations = ( - 95AC6B34604C895BE85469E05EA5A6C3 /* Debug */, - 64C065F5D8E00A7569B9220163F6A238 /* Release */, + FEC95B7CD72F3B3708DC09E7E2EB397F /* Debug */, + 75015716975841C5EDFB269B50341487 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + 54F019FDA0202CB87BF2A3FA2BFEF159 /* Build configuration list for PBXNativeTarget "Nuke" */ = { isa = XCConfigurationList; buildConfigurations = ( - B728C0A3F11707064CD14D0D5C56D6BD /* Debug */, - F65DF8E32CAC10ECB043121D18BA7CFF /* Release */, + 32805AB02CDFEF43F7E0C36E255FBE34 /* Debug */, + F03A6D2BE099C2414CB324468B281C1D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4BEE926243448802ACA6F07A75D9C025 /* Build configuration list for PBXNativeTarget "KeychainAccess" */ = { + 8186AABF55F555DDAD74F17BA7EC1698 /* Build configuration list for PBXNativeTarget "KeychainAccess" */ = { isa = XCConfigurationList; buildConfigurations = ( - 089ED43FBC1050BA6464BCA0B2E42CA5 /* Debug */, - 85C3604D7AF56B115EF6BD1326A59B46 /* Release */, + E3E6271245A64430488FE5E3A6B25231 /* Debug */, + 9D5A747341C9C227317DB0CBBFAF0372 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5242D03FC5C1EAA4F817066052F80607 /* Build configuration list for PBXAggregateTarget "AppCenter" */ = { + 8CD3BAA9571048B9CD3D49868D6E7C1C /* Build configuration list for PBXNativeTarget "Pods-AltStoreCore" */ = { isa = XCConfigurationList; buildConfigurations = ( - FEC95B7CD72F3B3708DC09E7E2EB397F /* Debug */, - 75015716975841C5EDFB269B50341487 /* Release */, + AE7283801351A86783201CE788FB4659 /* Debug */, + 16BF7466C389B20DD7CD6F533A06E465 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C1911554C1D806DDB7F8495BED1150CB /* Build configuration list for PBXNativeTarget "Roxas" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D27B5CE3F9ED73658999A12323517A77 /* Debug */, + D83CF22EB2350ACD4E8AE7E6F7D7C2F1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 54208ED19403AA500F1198EEF237E880 /* Build configuration list for PBXNativeTarget "STPrivilegedTask" */ = { + EB7216580AC9671E7A16548748D142EB /* Build configuration list for PBXNativeTarget "STPrivilegedTask" */ = { isa = XCConfigurationList; buildConfigurations = ( - 47A867CE36294A1CAA54592349FB167B /* Debug */, - FA7F10435C04B6D07B3EF8C903E31A3F /* Release */, + DCBBBC566B0F5BCB51D20E5672052020 /* Debug */, + 1CD41CFF2093F53D38B1D5C7895D2B53 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F21FDDBBEE883C64EE2A3A59711CBBCC /* Build configuration list for PBXNativeTarget "Pods-AltStoreCore" */ = { + F321B3910F364B719B3DCD65934F8DC5 /* Build configuration list for PBXNativeTarget "Pods-AltServer" */ = { isa = XCConfigurationList; buildConfigurations = ( - CAB1D8FA507F3D86CCB0E1CB16C21547 /* Debug */, - 188C5FA592A502477F5C3F51D69E7670 /* Release */, + 083D185F861C76F2E59250E8DFB35E8F /* Debug */, + 720CF962093F274A13FF6E82ACEBB678 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Roxas/Roxas/NSBundle+Extensions.h b/Pods/Roxas/Roxas/NSBundle+Extensions.h new file mode 100644 index 000000000..a1202b156 --- /dev/null +++ b/Pods/Roxas/Roxas/NSBundle+Extensions.h @@ -0,0 +1,15 @@ +// +// NSBundle+Extensions.h +// Roxas +// +// Created by Riley Testut on 12/14/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +@import Foundation; + +@interface NSBundle (Extensions) + ++ (BOOL)isAppExtension; + +@end diff --git a/Pods/Roxas/Roxas/NSBundle+Extensions.m b/Pods/Roxas/Roxas/NSBundle+Extensions.m new file mode 100644 index 000000000..fd244c491 --- /dev/null +++ b/Pods/Roxas/Roxas/NSBundle+Extensions.m @@ -0,0 +1,18 @@ +// +// NSBundle+Extensions.m +// Roxas +// +// Created by Riley Testut on 12/14/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +#import "NSBundle+Extensions.h" + +@implementation NSBundle (Extensions) + ++ (BOOL)isAppExtension +{ + return [[[self mainBundle] executablePath] containsString:@".appex/"]; +} + +@end diff --git a/Pods/Roxas/Roxas/NSConstraintConflict+Conveniences.h b/Pods/Roxas/Roxas/NSConstraintConflict+Conveniences.h new file mode 100644 index 000000000..11caf145d --- /dev/null +++ b/Pods/Roxas/Roxas/NSConstraintConflict+Conveniences.h @@ -0,0 +1,23 @@ +// +// NSConstraintConflict+Conveniences.h +// Roxas +// +// Created by Riley Testut on 10/4/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import CoreData; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSConstraintConflict (Conveniences) + +@property (nonatomic, readonly) NSSet *allObjects; + +@property (nonatomic, readonly) NSMapTable *> *snapshots; + ++ (NSMapTable *> *)cacheSnapshotsForConflicts:(NSArray *)conflicts; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/NSConstraintConflict+Conveniences.m b/Pods/Roxas/Roxas/NSConstraintConflict+Conveniences.m new file mode 100644 index 000000000..7cfda1f7a --- /dev/null +++ b/Pods/Roxas/Roxas/NSConstraintConflict+Conveniences.m @@ -0,0 +1,108 @@ +// +// NSConstraintConflict+Conveniences.m +// Roxas +// +// Created by Riley Testut on 10/4/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "NSConstraintConflict+Conveniences.h" + +@import ObjectiveC.runtime; + +@interface NSManagedObject (ConstraintConflict) +@end + +@implementation NSManagedObject (ConstraintConflict) + +- (NSDictionary *)rst_snapshot +{ + NSArray *keys = self.entity.propertiesByName.allKeys; + + NSDictionary *snapshot = [self dictionaryWithValuesForKeys:keys]; + return snapshot; +} + +@end + +@implementation NSConstraintConflict (Conveniences) + +- (NSSet *)allObjects +{ + NSMutableSet *allObjects = [NSMutableSet setWithArray:self.conflictingObjects]; + if (self.databaseObject != nil) + { + [allObjects addObject:self.databaseObject]; + } + + return allObjects; +} + +- (NSMapTable *> *)snapshots +{ + NSMapTable *> *snapshots = objc_getAssociatedObject(self, @selector(snapshots)); + if (snapshots != nil) + { + return snapshots; + } + + snapshots = [NSMapTable strongToStrongObjectsMapTable]; + + for (NSManagedObject *managedObject in self.allObjects) + { + NSMutableDictionary *snapshot = [NSMutableDictionary dictionary]; + + for (NSPropertyDescription *property in managedObject.entity.properties) + { + if ([property isTransient] || [property isKindOfClass:[NSFetchedPropertyDescription class]]) + { + continue; + } + + id value = [managedObject valueForKey:property.name]; + + if ([property isKindOfClass:[NSRelationshipDescription class]] && [(NSRelationshipDescription *)property isToMany]) + { + // Must create a mutable set then add objects to it to prevent rare crash when relationship is still a fault. + NSMutableSet *relationshipObjects = [[NSMutableSet alloc] init]; + + NSSet *set = (NSSet *)value; + for (id value in set) + { + [relationshipObjects addObject:value]; + } + + snapshot[property.name] = relationshipObjects; + } + else + { + snapshot[property.name] = value; + } + } + + [snapshots setObject:snapshot forKey:managedObject]; + } + + objc_setAssociatedObject(self, @selector(snapshots), snapshots, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + return snapshots; +} + ++ (NSMapTable *> *)cacheSnapshotsForConflicts:(NSArray *)conflicts +{ + NSMapTable *> *snapshots = [NSMapTable strongToStrongObjectsMapTable]; + + for (NSConstraintConflict *conflict in conflicts) + { + NSMapTable *> *conflictSnapshots = conflict.snapshots; + for (NSManagedObject *managedObject in conflictSnapshots) + { + NSDictionary *snapshot = [conflictSnapshots objectForKey:managedObject]; + [snapshots setObject:snapshot forKey:managedObject]; + } + } + + return snapshots; +} + +@end diff --git a/Pods/Roxas/Roxas/NSFileManager+URLs.h b/Pods/Roxas/Roxas/NSFileManager+URLs.h new file mode 100644 index 000000000..9b020234c --- /dev/null +++ b/Pods/Roxas/Roxas/NSFileManager+URLs.h @@ -0,0 +1,29 @@ +// +// NSFileManager+URLs.h +// Roxas +// +// Created by Riley Testut on 12/21/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +@import Foundation; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSFileManager (URLs) + +@property (readonly, copy) NSURL *documentsDirectory; +@property (readonly, copy) NSURL *libraryDirectory; +@property (readonly, copy) NSURL *applicationSupportDirectory; +@property (readonly, copy) NSURL *cachesDirectory; + +- (NSURL *)uniqueTemporaryURL; + +// Automatically removes item at temporaryURL upon returning from block. Synchronous. +- (void)prepareTemporaryURL:(void(^)(NSURL *temporaryURL))fileHandlingBlock; + +- (BOOL)copyItemAtURL:(NSURL *)sourceURL toURL:(NSURL *)destinationURL shouldReplace:(BOOL)shouldReplace error:(NSError *__autoreleasing _Nullable *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/NSFileManager+URLs.m b/Pods/Roxas/Roxas/NSFileManager+URLs.m new file mode 100644 index 000000000..806953d7e --- /dev/null +++ b/Pods/Roxas/Roxas/NSFileManager+URLs.m @@ -0,0 +1,108 @@ +// +// NSFileManager+URLs.m +// Roxas +// +// Created by Riley Testut on 12/21/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +#import "NSFileManager+URLs.h" + +@implementation NSFileManager (URLs) + +- (void)prepareTemporaryURL:(void (^)(NSURL *))fileHandlingBlock +{ + if (fileHandlingBlock == nil) + { + return; + } + + NSURL *temporaryURL = [self uniqueTemporaryURL]; + + fileHandlingBlock(temporaryURL); + + NSError *error = nil; + if (![self removeItemAtURL:temporaryURL error:&error]) + { + // Ignore this error, because it means the client has manually removed the file themselves + if (error.code != NSFileNoSuchFileError) + { + ELog(error); + } + } +} + +- (BOOL)copyItemAtURL:(NSURL *)sourceURL toURL:(NSURL *)destinationURL shouldReplace:(BOOL)shouldReplace error:(NSError *__autoreleasing _Nullable *)error +{ + if (!shouldReplace) + { + return [self copyItemAtURL:sourceURL toURL:destinationURL error:error]; + } + + NSURL *temporaryDirectory = [self URLForDirectory:NSItemReplacementDirectory inDomain:NSUserDomainMask appropriateForURL:destinationURL create:YES error:error]; + if (temporaryDirectory == nil) + { + return NO; + } + + void (^removeDirectory)(void) = ^{ + NSError *error = nil; + if (![self removeItemAtURL:temporaryDirectory error:&error]) + { + ELog(error); + } + }; + + NSURL *temporaryURL = [temporaryDirectory URLByAppendingPathComponent:[[NSUUID UUID] UUIDString]]; + if (![self copyItemAtURL:sourceURL toURL:temporaryURL error:error]) + { + removeDirectory(); + return NO; + } + + if (![self replaceItemAtURL:destinationURL withItemAtURL:temporaryURL backupItemName:nil options:0 resultingItemURL:nil error:error]) + { + removeDirectory(); + return NO; + } + + removeDirectory(); + return YES; +} + +#pragma mark - Getters/Setters - + +- (NSURL *)uniqueTemporaryURL +{ + NSURL *temporaryDirectoryURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; + NSString *uniqueIdentifier = [[NSProcessInfo processInfo] globallyUniqueString]; + + NSURL *temporaryURL = [temporaryDirectoryURL URLByAppendingPathComponent:uniqueIdentifier]; + return temporaryURL; +} + +- (NSURL *)documentsDirectory +{ + NSURL *documentsDirectory = [self URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject; + return documentsDirectory; +} + +- (NSURL *)libraryDirectory +{ + NSURL *libraryDirectory = [self URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask].firstObject; + return libraryDirectory; +} + +- (NSURL *)applicationSupportDirectory +{ + NSURL *applicationSupportDirectory = [self URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask].firstObject; + return applicationSupportDirectory; +} + +- (NSURL *)cachesDirectory +{ + NSURL *cachesDirectory = [self URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask].firstObject; + return cachesDirectory; +} + +@end diff --git a/Pods/Roxas/Roxas/NSLayoutConstraint+Edges.h b/Pods/Roxas/Roxas/NSLayoutConstraint+Edges.h new file mode 100644 index 000000000..0e76317b0 --- /dev/null +++ b/Pods/Roxas/Roxas/NSLayoutConstraint+Edges.h @@ -0,0 +1,31 @@ +// +// NSLayoutConstraint+Edges.h +// Roxas +// +// Created by Riley Testut on 5/2/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSLayoutConstraint (Edges) + ++ (NSArray *)constraintsPinningEdgesOfView:(UIView *)view1 toEdgesOfView:(UIView *)view2; ++ (NSArray *)constraintsPinningEdgesOfView:(UIView *)view1 toEdgesOfView:(UIView *)view2 withInsets:(UIEdgeInsets)insets; + +@end + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +@interface UIView (PinnedEdges) + +- (void)addSubview:(UIView *)view pinningEdgesWithInsets:(UIEdgeInsets)insets; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/NSLayoutConstraint+Edges.m b/Pods/Roxas/Roxas/NSLayoutConstraint+Edges.m new file mode 100644 index 000000000..97dcf84e3 --- /dev/null +++ b/Pods/Roxas/Roxas/NSLayoutConstraint+Edges.m @@ -0,0 +1,42 @@ +// +// NSLayoutConstraint+Edges.m +// Roxas +// +// Created by Riley Testut on 5/2/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "NSLayoutConstraint+Edges.h" + +@implementation NSLayoutConstraint (Edges) + ++ (NSArray *)constraintsPinningEdgesOfView:(UIView *)view1 toEdgesOfView:(UIView *)view2 +{ + return [self constraintsPinningEdgesOfView:view1 toEdgesOfView:view2 withInsets:UIEdgeInsetsZero]; +} + ++ (NSArray *)constraintsPinningEdgesOfView:(UIView *)view1 toEdgesOfView:(UIView *)view2 withInsets:(UIEdgeInsets)insets +{ + NSLayoutConstraint *topConstraint = [view1.topAnchor constraintEqualToAnchor:view2.topAnchor constant:insets.top]; + NSLayoutConstraint *bottomConstraint = [view2.bottomAnchor constraintEqualToAnchor:view1.bottomAnchor constant:insets.bottom]; + NSLayoutConstraint *leftConstraint = [view1.leftAnchor constraintEqualToAnchor:view2.leftAnchor constant:insets.left]; + NSLayoutConstraint *rightConstraint = [view2.rightAnchor constraintEqualToAnchor:view1.rightAnchor constant:insets.right]; + + return @[topConstraint, bottomConstraint, leftConstraint, rightConstraint]; +} + +@end + + +@implementation UIView (PinnedEdges) + +- (void)addSubview:(UIView *)view pinningEdgesWithInsets:(UIEdgeInsets)insets +{ + view.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:view]; + + NSArray *pinningConstraints = [NSLayoutConstraint constraintsPinningEdgesOfView:view toEdgesOfView:self withInsets:insets]; + [NSLayoutConstraint activateConstraints:pinningConstraints]; +} + +@end diff --git a/Pods/Roxas/Roxas/NSPredicate+Search.h b/Pods/Roxas/Roxas/NSPredicate+Search.h new file mode 100644 index 000000000..54682c14b --- /dev/null +++ b/Pods/Roxas/Roxas/NSPredicate+Search.h @@ -0,0 +1,19 @@ +// +// NSPredicate+Search.h +// Roxas +// +// Created by Riley Testut on 2/14/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import Foundation; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSPredicate (Search) + ++ (instancetype)predicateForSearchingForText:(NSString *)searchText inValuesForKeyPaths:(NSSet *)keyPaths; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/NSPredicate+Search.m b/Pods/Roxas/Roxas/NSPredicate+Search.m new file mode 100644 index 000000000..77f07012c --- /dev/null +++ b/Pods/Roxas/Roxas/NSPredicate+Search.m @@ -0,0 +1,64 @@ +// +// NSPredicate+Search.m +// Roxas +// +// Created by Riley Testut on 2/14/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "NSPredicate+Search.h" + +@implementation NSPredicate (Search) + ++ (instancetype)predicateForSearchingForText:(NSString *)searchText inValuesForKeyPaths:(NSSet *)keyPaths +{ + if (keyPaths.count == 0) + { + return [NSPredicate predicateWithValue:NO]; + } + + if (searchText.length == 0) + { + return [NSPredicate predicateWithValue:YES]; + } + + // Strip out all the leading and trailing spaces. + NSString *strippedString = [searchText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + // Break up the search terms (separated by spaces). + NSArray *searchTerms = [strippedString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + + NSMutableArray *subpredicates = [NSMutableArray arrayWithCapacity:keyPaths.count]; + + for (NSString *searchTerm in searchTerms) + { + // Every search term must exist in at least ONE keyPath value. + // To accomplish this, we use an OR predicate when iterating keyPaths (since only one needs to return true), + // and then combine them with an AND predicate at the end (to ensure each search term exists somewhere). + + NSMutableArray *andPredicates = [NSMutableArray array]; + + for (NSString *keyPath in keyPaths) + { + // Determine whether lhs (valueForKeyPath) contains rhs (a term from searchText) + NSExpression *lhs = [NSExpression expressionForKeyPath:keyPath]; + NSExpression *rhs = [NSExpression expressionForConstantValue:searchTerm]; + + NSPredicate *predicate = [NSComparisonPredicate predicateWithLeftExpression:lhs + rightExpression:rhs + modifier:NSDirectPredicateModifier + type:NSContainsPredicateOperatorType + options:NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption]; + + [andPredicates addObject:predicate]; + } + + NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:andPredicates]; + [subpredicates addObject:compoundPredicate]; + } + + NSCompoundPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; + return predicate; +} + +@end diff --git a/Pods/Roxas/Roxas/NSString+Localization.h b/Pods/Roxas/Roxas/NSString+Localization.h new file mode 100644 index 000000000..5ac0e783e --- /dev/null +++ b/Pods/Roxas/Roxas/NSString+Localization.h @@ -0,0 +1,19 @@ +// +// NSString+Localization.h +// Roxas +// +// Created by Riley Testut on 1/13/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import Foundation; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (Localization) + +NSString *RSTSystemLocalizedString(NSString *); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/NSString+Localization.m b/Pods/Roxas/Roxas/NSString+Localization.m new file mode 100644 index 000000000..b6e7bbbf5 --- /dev/null +++ b/Pods/Roxas/Roxas/NSString+Localization.m @@ -0,0 +1,37 @@ +// +// NSString+Localization.m +// Roxas +// +// Created by Riley Testut on 1/13/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "NSString+Localization.h" + +@import UIKit; + +NSString *RSTSystemLocalizedStringNotFound = @"com.rileytestut.RSTSystemLocalizedStringNotFound"; + +@implementation NSString (Localization) + +NSString *RSTSystemLocalizedString(NSString *string) +{ + NSBundle *bundle = [NSBundle bundleForClass:UIApplication.class]; + + NSString *localizedString = [bundle localizedStringForKey:string value:RSTSystemLocalizedStringNotFound table:nil]; + + if ([localizedString isEqualToString:RSTSystemLocalizedStringNotFound]) + { + NSString *assertMessage = [NSString stringWithFormat:@"'%@' is not a system localized string.", string]; + + // Throw exception in debug builds if string is not a system localized string. + NSCAssert(NO, assertMessage); + + // Assign localizedString to string so release builds simply return the input string. + localizedString = string; + } + + return localizedString; +} + +@end diff --git a/Pods/Roxas/Roxas/NSUserDefaults+DynamicProperties.h b/Pods/Roxas/Roxas/NSUserDefaults+DynamicProperties.h new file mode 100644 index 000000000..660d03c79 --- /dev/null +++ b/Pods/Roxas/Roxas/NSUserDefaults+DynamicProperties.h @@ -0,0 +1,13 @@ +// +// NSUserDefaults+DynamicProperties.h +// Roxas +// +// Created by Riley Testut on 6/27/15. +// Copyright (c) 2015 Riley Testut. All rights reserved. +// + +@import Foundation; + +@interface NSUserDefaults (DynamicProperties) + +@end diff --git a/Pods/Roxas/Roxas/NSUserDefaults+DynamicProperties.m b/Pods/Roxas/Roxas/NSUserDefaults+DynamicProperties.m new file mode 100644 index 000000000..ca498c68f --- /dev/null +++ b/Pods/Roxas/Roxas/NSUserDefaults+DynamicProperties.m @@ -0,0 +1,378 @@ +// +// NSUserDefaults+DynamicProperties.m +// Roxas +// +// Created by Riley Testut on 6/27/15. +// Copyright (c) 2015 Riley Testut. All rights reserved. +// + +#import "NSUserDefaults+DynamicProperties.h" + +@import ObjectiveC.runtime; + +static NSDictionary *_propertyAccessorMethodsMappingDictionary = nil; + +typedef NS_ENUM(char, RSTObjCEncoding) +{ + // Normally I'd prefix these with the enum type, but in this case it's far more readable in practice + + Bool = 'B', + Char = 'c', + Float = 'f', + Double = 'd', + Int = 'i', + Long = 'l', + LongLong = 'q', + Object = '@', +}; + + +@interface RSTDummyObject : NSObject + +// Primitives +@property (assign, nonatomic) BOOL boolProperty; +@property (assign, nonatomic) float floatProperty; +@property (assign, nonatomic) double doubleProperty; +@property (assign, nonatomic) NSInteger integerProperty; + +// Objects +@property (copy, nonatomic) NSURL *URLProperty; +@property (strong, nonatomic) id objectProperty; + +@end + +@implementation RSTDummyObject +@end + + +@implementation NSUserDefaults (DynamicProperties) + ++ (void)initialize +{ + if (self != [NSUserDefaults class]) + { + return; + } + + unsigned int count = 0; + objc_property_t *properties = class_copyPropertyList([self class], &count); + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + for (unsigned int i = 0; i < count; i++) + { + objc_property_t property = properties[i]; + + const char *name = property_getName(property); + if (name == NULL) + { + continue; + } + + char *isDynamic = property_copyAttributeValue(property, "D"); + if (isDynamic != NULL) + { + // Property is a dynamic property + free(isDynamic); + } + else + { + // Not a dynamic property, so we'll ignore + continue; + } + + NSString *propertyName = [NSString stringWithCString:name encoding:[NSString defaultCStringEncoding]]; + + char *getter = property_copyAttributeValue(property, "G"); + if (getter != NULL) + { + // Use custom getter method as dictionary key + NSString *getterName = [NSString stringWithCString:getter encoding:[NSString defaultCStringEncoding]]; + dictionary[getterName] = propertyName; + + free(getter); + } + else + { + // Use property name as getter method for dictionary key (as per Cocoa conventions) + dictionary[propertyName] = propertyName; + } + + char *setter = property_copyAttributeValue(property, "S"); + if (setter != NULL) + { + // Use custom setter method as dictionary key + NSString *setterName = [NSString stringWithCString:setter encoding:[NSString defaultCStringEncoding]]; + dictionary[setterName] = propertyName; + + free(setter); + } + else + { + // Transform property name into setProperty: format for dictionary key (as per Cocoa conventions) + NSString *firstCharacter = [[propertyName substringWithRange:NSMakeRange(0, 1)] uppercaseString]; + + NSMutableString *setterName = [propertyName mutableCopy]; + [setterName replaceCharactersInRange:NSMakeRange(0, 1) withString:firstCharacter]; + [setterName insertString:@"set" atIndex:0]; + [setterName appendString:@":"]; + + dictionary[setterName] = propertyName; + } + } + + _propertyAccessorMethodsMappingDictionary = [dictionary copy]; + + free(properties); +} + ++ (BOOL)resolveInstanceMethod:(SEL)selector +{ + if ([super resolveInstanceMethod:selector]) + { + return YES; + } + + NSString *methodName = NSStringFromSelector(selector); + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[methodName]; + + if (propertyName == nil) + { + return NO; + } + + objc_property_t property = class_getProperty(self, [propertyName cStringUsingEncoding:[NSString defaultCStringEncoding]]); + if (propertyName == NULL) + { + return NO; + } + + char *propertyEncoding = property_copyAttributeValue(property, "T"); + if (propertyEncoding == NULL) + { + return NO; + } + + BOOL isSetter = [[methodName substringFromIndex:methodName.length - 1] isEqualToString:@":"]; + + IMP imp = NULL; + const char *types = NULL; + + switch (*propertyEncoding) + { + case Bool: + case Char: + { + if (isSetter) + { + imp = (IMP)rst_setBoolValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(setBoolProperty:))); + } + else + { + imp = (IMP)rst_boolValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(boolProperty))); + } + + break; + } + + case Float: + { + if (isSetter) + { + imp = (IMP)rst_setFloatValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(setFloatProperty:))); + } + else + { + imp = (IMP)rst_floatValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(floatProperty))); + } + + break; + } + + case Double: + { + if (isSetter) + { + imp = (IMP)rst_setDoubleValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(setDoubleProperty:))); + } + else + { + imp = (IMP)rst_doubleValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(doubleProperty))); + } + + break; + } + + case Int: + case Long: + case LongLong: + { + if (isSetter) + { + imp = (IMP)rst_setIntegerValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(setIntegerProperty:))); + } + else + { + imp = (IMP)rst_integerValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(integerProperty))); + } + + break; + } + + case Object: + { + NSMutableString *propertyType = [NSMutableString stringWithUTF8String:propertyEncoding]; + [propertyType replaceOccurrencesOfString:@"@" withString:@"" options:0 range:NSMakeRange(0, propertyType.length)]; + [propertyType replaceOccurrencesOfString:@"\"" withString:@"" options:0 range:NSMakeRange(0, propertyType.length)]; + + BOOL isURL = NO; + + // From NSObject.mm (-[NSObject isKindOfClass:]) + for (Class class = NSClassFromString(propertyType); class; class = class_getSuperclass(class)) + { + if (class == [NSURL class]) + { + isURL = YES; + break; + } + } + + if (isURL) + { + if (isSetter) + { + imp = (IMP)rst_setURLValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(setURLProperty:))); + } + else + { + imp = (IMP)rst_URLValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(URLProperty))); + } + } + else + { + if (isSetter) + { + imp = (IMP)rst_setObjectValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(setObjectProperty:))); + } + else + { + imp = (IMP)rst_objectValue; + types = method_getTypeEncoding(class_getInstanceMethod([RSTDummyObject class], @selector(objectProperty))); + } + } + + break; + } + + default: + { + @throw [NSException exceptionWithName:@"Unsupported Property Type" + reason:@"NSUserDefaults+DynamicProperties only supports dynamic properties of supported NSUserDefaults types. Check the NSUserDefaults documentation or header file to see what types can be directly set." + userInfo:nil]; + break; + } + } + + class_addMethod(self, selector, imp, types); + + return YES; +} + +#pragma mark - IMPs - + +#pragma mark - BOOL + +void rst_setBoolValue(id self, SEL _cmd, BOOL value) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + [self setBool:value forKey:propertyName]; +} + +BOOL rst_boolValue(id self, SEL _cmd) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self boolForKey:propertyName]; +} + +#pragma mark - Float + +void rst_setFloatValue(id self, SEL _cmd, float value) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self setFloat:value forKey:propertyName]; +} + +float rst_floatValue(id self, SEL _cmd) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self floatForKey:propertyName]; +} + +#pragma mark - Double + +void rst_setDoubleValue(id self, SEL _cmd, double value) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self setDouble:value forKey:propertyName]; +} + +double rst_doubleValue(id self, SEL _cmd) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self doubleForKey:propertyName]; +} + +#pragma mark - Integer + +void rst_setIntegerValue(id self, SEL _cmd, NSInteger value) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self setInteger:value forKey:propertyName]; +} + +NSInteger rst_integerValue(id self, SEL _cmd) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self integerForKey:propertyName]; +} + +#pragma mark - URL + +void rst_setURLValue(id self, SEL _cmd, NSURL *value) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self setURL:[value copy] forKey:propertyName]; +} + +NSURL *rst_URLValue(id self, SEL _cmd) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self URLForKey:propertyName]; +} + +#pragma mark - Object + +void rst_setObjectValue(id self, SEL _cmd, id value) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self setObject:value forKey:propertyName]; +} + +id rst_objectValue(id self, SEL _cmd) +{ + NSString *propertyName = _propertyAccessorMethodsMappingDictionary[NSStringFromSelector(_cmd)]; + return [self objectForKey:propertyName]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTActivityIndicating.h b/Pods/Roxas/Roxas/RSTActivityIndicating.h new file mode 100644 index 000000000..4beffd8d9 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTActivityIndicating.h @@ -0,0 +1,24 @@ +// +// RSTActivityIndicating.h +// Roxas +// +// Created by Riley Testut on 4/2/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@protocol RSTActivityIndicating + +@property (nonatomic, getter=isIndicatingActivity) BOOL indicatingActivity; + +@property (nonatomic, readonly) NSUInteger activityCount; + +- (void)incrementActivityCount; +- (void)decrementActivityCount; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTArrayDataSource.h b/Pods/Roxas/Roxas/RSTArrayDataSource.h new file mode 100644 index 000000000..9c304cf6d --- /dev/null +++ b/Pods/Roxas/Roxas/RSTArrayDataSource.h @@ -0,0 +1,58 @@ +// +// RSTArrayDataSource.h +// Roxas +// +// Created by Riley Testut on 2/13/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentDataSource.h" +#import "RSTCellContentPrefetchingDataSource.h" + +@class RSTCellContentChange; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTArrayDataSource *, ViewType: UIScrollView *, DataSourceType> : RSTCellContentDataSource + +@property (copy, nonatomic) NSArray *items; + +- (instancetype)initWithItems:(NSArray *)items NS_DESIGNATED_INITIALIZER; + +- (void)setItems:(NSArray *)items withChanges:(nullable NSArray *)changes; + +- (instancetype)init NS_UNAVAILABLE; + +@end + + +@interface RSTArrayPrefetchingDataSource *, ViewType: UIScrollView *, DataSourceType, PrefetchContentType> : RSTArrayDataSource + +@property (nonatomic) NSCache *prefetchItemCache; + +@property (nullable, copy, nonatomic) NSOperation *_Nullable (^prefetchHandler)(ContentType item, NSIndexPath *indexPath, void (^completionHandler)(_Nullable PrefetchContentType item, NSError *_Nullable error)); +@property (nullable, copy, nonatomic) void (^prefetchCompletionHandler)(CellType cell, _Nullable PrefetchContentType item, NSIndexPath *indexPath, NSError *_Nullable error); + +@end + +NS_ASSUME_NONNULL_END + + +// Concrete Subclasses + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTArrayTableViewDataSource : RSTArrayDataSource> +@end + +@interface RSTArrayCollectionViewDataSource : RSTArrayDataSource> +@end + + +@interface RSTArrayTableViewPrefetchingDataSource : RSTArrayPrefetchingDataSource, PrefetchContentType> +@end + +@interface RSTArrayCollectionViewPrefetchingDataSource : RSTArrayPrefetchingDataSource, PrefetchContentType> +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTArrayDataSource.m b/Pods/Roxas/Roxas/RSTArrayDataSource.m new file mode 100644 index 000000000..c0ca59a79 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTArrayDataSource.m @@ -0,0 +1,135 @@ +// +// RSTArrayDataSource.m +// Roxas +// +// Created by Riley Testut on 2/13/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTArrayDataSource.h" +#import "RSTCellContentDataSource_Subclasses.h" + +#import "RSTHelperFile.h" + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTArrayDataSource () + +@property (nullable, copy, nonatomic) NSArray *filteredItems; + +@end + +NS_ASSUME_NONNULL_END + + +@implementation RSTArrayDataSource + +- (instancetype)initWithItems:(NSArray *)items +{ + self = [super init]; + if (self) + { + _items = [items copy]; + } + + return self; +} + +#pragma mark - RSTCellContentDataSource - + +- (id)itemAtIndexPath:(NSIndexPath *)indexPath +{ + NSArray *items = self.filteredItems ?: self.items; + return items[indexPath.row]; +} + +- (NSInteger)numberOfSectionsInContentView:(__kindof UIView *)contentView +{ + return 1; +} + +- (NSInteger)contentView:(__kindof UIView *)contentView numberOfItemsInSection:(NSInteger)section +{ + NSArray *items = self.filteredItems ?: self.items; + return items.count; +} + +- (void)filterContentWithPredicate:(nullable NSPredicate *)predicate +{ + if (predicate == nil) + { + self.filteredItems = nil; + } + else + { + self.filteredItems = [self.items filteredArrayUsingPredicate:predicate]; + } +} + +#pragma mark - Getters/Setters - + +- (void)setItems:(NSArray *)items +{ + [self setItems:items withChanges:nil]; +} + +- (void)setItems:(NSArray *)items withChanges:(NSArray *)changes +{ + _items = [items copy]; + + if (self.filteredItems) + { + [self filterContentWithPredicate:self.predicate]; + + rst_dispatch_sync_on_main_thread(^{ + [self.contentView reloadData]; + }); + } + else + { + if (changes) + { + [self.contentView beginUpdates]; + + for (RSTCellContentChange *change in changes) + { + [self addChange:change]; + } + + [self.contentView endUpdates]; + } + else + { + rst_dispatch_sync_on_main_thread(^{ + [self.contentView reloadData]; + }); + } + } +} + +@end + +@implementation RSTArrayTableViewDataSource +@end + +@implementation RSTArrayCollectionViewDataSource +@end + +@implementation RSTArrayPrefetchingDataSource +@dynamic prefetchItemCache; +@dynamic prefetchHandler; +@dynamic prefetchCompletionHandler; + +- (BOOL)isPrefetchingDataSource +{ + return YES; +} + +@end + +@implementation RSTArrayTableViewPrefetchingDataSource +@end + +@implementation RSTArrayCollectionViewPrefetchingDataSource +@end diff --git a/Pods/Roxas/Roxas/RSTBlockOperation.h b/Pods/Roxas/Roxas/RSTBlockOperation.h new file mode 100644 index 000000000..b40c102b0 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTBlockOperation.h @@ -0,0 +1,42 @@ +// +// RSTBlockOperation.h +// Roxas +// +// Created by Riley Testut on 2/20/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +// Similar to NSBlockOperation, but passes a reference to itself into executionBlock. +// This allows the code inside executionBlock to determine whether the operation has been cancelled, +// without resulting in a strong reference cycle. +@interface RSTBlockOperation : RSTOperation + +@property (copy, nonatomic, readonly) void (^executionBlock)(__weak RSTBlockOperation *); +@property (nullable, copy, nonatomic) void (^cancellationBlock)(void); + ++ (instancetype)blockOperationWithExecutionBlock:(void (^)(__weak RSTBlockOperation *))executionBlock; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTAsyncBlockOperation : RSTBlockOperation + +@property (copy, nonatomic, readonly) void (^executionBlock)(__weak RSTAsyncBlockOperation *); + ++ (instancetype)blockOperationWithExecutionBlock:(void (^)(__weak RSTAsyncBlockOperation *))executionBlock; + +- (void)finish; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTBlockOperation.m b/Pods/Roxas/Roxas/RSTBlockOperation.m new file mode 100644 index 000000000..c5fdddb12 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTBlockOperation.m @@ -0,0 +1,73 @@ +// +// RSTBlockOperation.m +// Roxas +// +// Created by Riley Testut on 2/20/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTBlockOperation.h" +#import "RSTOperation_Subclasses.h" + +@interface RSTBlockOperation () + +@property (copy, nonatomic, readwrite) void (^executionBlock)(__weak RSTBlockOperation *); + +@end + +@implementation RSTBlockOperation + +- (instancetype)initWithExecutionBlock:(void (^)(__weak RSTBlockOperation * _Nonnull))executionBlock +{ + self = [super init]; + if (self) + { + _executionBlock = [executionBlock copy]; + } + + return self; +} + ++ (instancetype)blockOperationWithExecutionBlock:(void (^)(__weak RSTBlockOperation * _Nonnull))executionBlock +{ + RSTBlockOperation *operation = [[self.class alloc] initWithExecutionBlock:executionBlock]; + return operation; +} + +- (void)main +{ + self.executionBlock(self); +} + +- (void)cancel +{ + [super cancel]; + + if (self.cancellationBlock) + { + self.cancellationBlock(); + } +} + +@end + + +@implementation RSTAsyncBlockOperation +@dynamic executionBlock; + +- (BOOL)isAsynchronous +{ + return YES; +} + ++ (instancetype)blockOperationWithExecutionBlock:(void (^)(__weak RSTAsyncBlockOperation * _Nonnull))executionBlock +{ + return [super blockOperationWithExecutionBlock:(void(^_Nonnull)(RSTBlockOperation *_Nonnull __weak))executionBlock]; +} + +- (void)finish +{ + [super finish]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTCellContentCell.h b/Pods/Roxas/Roxas/RSTCellContentCell.h new file mode 100644 index 000000000..5f5630dad --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentCell.h @@ -0,0 +1,21 @@ +// +// RSTCellContentCell.h +// Roxas +// +// Created by Riley Testut on 2/20/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@protocol RSTCellContentCell + +@property (class, nullable, nonatomic, readonly) UINib *nib; + ++ (nullable instancetype)instantiateWithNib:(UINib *)nib; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCellContentChange.h b/Pods/Roxas/Roxas/RSTCellContentChange.h new file mode 100644 index 000000000..7e2d8d534 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentChange.h @@ -0,0 +1,57 @@ +// +// RSTCellContentChange.h +// Roxas +// +// Created by Riley Testut on 8/2/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTDefines.h" + +@import UIKit; +@import CoreData; + +@class RSTCellContentChange; + +NS_ASSUME_NONNULL_BEGIN + +extern NSInteger RSTUnknownSectionIndex; + +typedef NS_ENUM(NSInteger, RSTCellContentChangeType) +{ + RSTCellContentChangeInsert = NSFetchedResultsChangeInsert, + RSTCellContentChangeDelete = NSFetchedResultsChangeDelete, + RSTCellContentChangeMove = NSFetchedResultsChangeMove, + RSTCellContentChangeUpdate = NSFetchedResultsChangeUpdate, +}; + +RST_EXTERN RSTCellContentChangeType RSTCellContentChangeTypeFromFetchedResultsChangeType(NSFetchedResultsChangeType type); +RST_EXTERN NSFetchedResultsChangeType NSFetchedResultsChangeTypeFromCellContentChangeType(RSTCellContentChangeType type); + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCellContentChange : NSObject + +@property (nonatomic, readonly) RSTCellContentChangeType type; + +@property (nullable, copy, nonatomic, readonly) NSIndexPath *currentIndexPath; +@property (nullable, copy, nonatomic, readonly) NSIndexPath *destinationIndexPath; + +// Defaults to RSTUnknownSectionIndex if not representing a section. +@property (nonatomic, readonly) NSInteger sectionIndex; + +// Animation to use when applied to a UITableView. +@property (nonatomic) UITableViewRowAnimation rowAnimation; + +- (instancetype)initWithType:(RSTCellContentChangeType)type currentIndexPath:(nullable NSIndexPath *)currentIndexPath destinationIndexPath:(nullable NSIndexPath *)destinationIndexPath NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithType:(RSTCellContentChangeType)type sectionIndex:(NSInteger)sectionIndex NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCellContentChange.m b/Pods/Roxas/Roxas/RSTCellContentChange.m new file mode 100644 index 000000000..b6e58f1dc --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentChange.m @@ -0,0 +1,114 @@ +// +// RSTCellContentChange.m +// Roxas +// +// Created by Riley Testut on 8/2/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTCellContentChange.h" + +NSInteger RSTUnknownSectionIndex = -1; + +RSTCellContentChangeType RSTCellContentChangeTypeFromFetchedResultsChangeType(NSFetchedResultsChangeType type) +{ + switch (type) + { + case NSFetchedResultsChangeInsert: return RSTCellContentChangeInsert; + case NSFetchedResultsChangeDelete: return RSTCellContentChangeDelete; + case NSFetchedResultsChangeMove: return RSTCellContentChangeMove; + case NSFetchedResultsChangeUpdate: return RSTCellContentChangeUpdate; + } +} + +NSFetchedResultsChangeType NSFetchedResultsChangeTypeFromCellContentChangeType(RSTCellContentChangeType type) +{ + switch (type) + { + case RSTCellContentChangeInsert: return NSFetchedResultsChangeInsert; + case RSTCellContentChangeDelete: return NSFetchedResultsChangeDelete; + case RSTCellContentChangeMove: return NSFetchedResultsChangeMove; + case RSTCellContentChangeUpdate: return NSFetchedResultsChangeUpdate; + } +} + +@implementation RSTCellContentChange + +- (instancetype)initWithType:(RSTCellContentChangeType)type currentIndexPath:(NSIndexPath *)currentIndexPath destinationIndexPath:(NSIndexPath *)destinationIndexPath +{ + self = [super init]; + if (self) + { + _type = type; + + _currentIndexPath = [currentIndexPath copy]; + _destinationIndexPath = [destinationIndexPath copy]; + + _sectionIndex = RSTUnknownSectionIndex; + + _rowAnimation = UITableViewRowAnimationAutomatic; + } + + return self; +} + +- (instancetype)initWithType:(RSTCellContentChangeType)type sectionIndex:(NSInteger)sectionIndex +{ + self = [super init]; + if (self) + { + _type = type; + _sectionIndex = sectionIndex; + + _rowAnimation = UITableViewRowAnimationAutomatic; + } + + return self; +} + +#pragma mark - NSObject - + +- (NSString *)description +{ + NSString *type = nil; + switch (self.type) + { + case RSTCellContentChangeInsert: + type = @"Insert"; + break; + + case RSTCellContentChangeDelete: + type = @"Delete"; + break; + + case RSTCellContentChangeUpdate: + type = @"Update"; + break; + + case RSTCellContentChangeMove: + type = @"Move"; + break; + } + + return [NSString stringWithFormat:@"<%@: %p, Type: %@, Index Path: %@, New Index Path: %@>", NSStringFromClass([self class]), self, type, self.currentIndexPath, self.destinationIndexPath]; +} + +#pragma mark - - + +- (instancetype)copyWithZone:(NSZone *)zone +{ + RSTCellContentChange *change = nil; + + if (self.sectionIndex != RSTUnknownSectionIndex) + { + change = [[RSTCellContentChange alloc] initWithType:self.type sectionIndex:self.sectionIndex]; + } + else + { + change = [[RSTCellContentChange alloc] initWithType:self.type currentIndexPath:self.currentIndexPath destinationIndexPath:self.destinationIndexPath]; + } + + return change; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTCellContentChangeOperation.h b/Pods/Roxas/Roxas/RSTCellContentChangeOperation.h new file mode 100644 index 000000000..6b91669d7 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentChangeOperation.h @@ -0,0 +1,44 @@ +// +// RSTCellContentChangeOperation.h +// Roxas +// +// Created by Riley Testut on 8/2/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTOperation.h" + +@import UIKit; + +@class RSTCellContentChange; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCellContentChangeOperation : RSTOperation + +@property (copy, nonatomic, readonly) RSTCellContentChange *change; + +- (instancetype)init NS_UNAVAILABLE; + +@end + + +@interface RSTTableViewChangeOperation : RSTCellContentChangeOperation + +@property (nullable, weak, nonatomic, readonly) UITableView *tableView; + +- (instancetype)initWithChange:(RSTCellContentChange *)change tableView:(nullable UITableView *)tableView NS_DESIGNATED_INITIALIZER; + +@end + + +@interface RSTCollectionViewChangeOperation : RSTCellContentChangeOperation + +@property (nullable, weak, nonatomic, readonly) UICollectionView *collectionView; + +- (instancetype)initWithChange:(RSTCellContentChange *)change collectionView:(nullable UICollectionView *)collectionView NS_DESIGNATED_INITIALIZER; + +@end + + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCellContentChangeOperation.m b/Pods/Roxas/Roxas/RSTCellContentChangeOperation.m new file mode 100644 index 000000000..dc642c451 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentChangeOperation.m @@ -0,0 +1,150 @@ +// +// RSTCellContentChangeOperation.m +// Roxas +// +// Created by Riley Testut on 8/2/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTCellContentChangeOperation.h" + +#import "RSTCellContentChange.h" + +@implementation RSTCellContentChangeOperation + +- (instancetype)initWithChange:(RSTCellContentChange *)change +{ + self = [super init]; + if (self) + { + _change = [change copy]; + } + + return self; +} + +@end + + +@implementation RSTTableViewChangeOperation + +- (instancetype)initWithChange:(RSTCellContentChange *)change tableView:(nullable UITableView *)tableView +{ + self = [super initWithChange:change]; + if (self) + { + _tableView = tableView; + } + + return self; +} + +- (void)main +{ + switch (self.change.type) + { + case NSFetchedResultsChangeInsert: + { + if (self.change.sectionIndex != RSTUnknownSectionIndex) + { + [self.tableView insertSections:[NSIndexSet indexSetWithIndex:self.change.sectionIndex] withRowAnimation:self.change.rowAnimation]; + } + else + { + [self.tableView insertRowsAtIndexPaths:@[self.change.destinationIndexPath] withRowAnimation:self.change.rowAnimation]; + } + + break; + } + + case NSFetchedResultsChangeDelete: + { + if (self.change.sectionIndex != RSTUnknownSectionIndex) + { + [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:self.change.sectionIndex] withRowAnimation:self.change.rowAnimation]; + } + else + { + [self.tableView deleteRowsAtIndexPaths:@[self.change.currentIndexPath] withRowAnimation:self.change.rowAnimation]; + } + + break; + } + + case NSFetchedResultsChangeMove: + { + [self.tableView moveRowAtIndexPath:self.change.currentIndexPath toIndexPath:self.change.destinationIndexPath]; + break; + } + + case NSFetchedResultsChangeUpdate: + { + [self.tableView reloadRowsAtIndexPaths:@[self.change.currentIndexPath] withRowAnimation:self.change.rowAnimation]; + break; + } + } +} + +@end + + +@implementation RSTCollectionViewChangeOperation + +- (instancetype)initWithChange:(RSTCellContentChange *)change collectionView:(UICollectionView *)collectionView +{ + self = [super initWithChange:change]; + if (self) + { + _collectionView = collectionView; + } + + return self; +} + +- (void)main +{ + switch (self.change.type) + { + case NSFetchedResultsChangeInsert: + { + if (self.change.sectionIndex != RSTUnknownSectionIndex) + { + [self.collectionView insertSections:[NSIndexSet indexSetWithIndex:self.change.sectionIndex]]; + } + else + { + [self.collectionView insertItemsAtIndexPaths:@[self.change.destinationIndexPath]]; + } + + break; + } + + case NSFetchedResultsChangeDelete: + { + if (self.change.sectionIndex != RSTUnknownSectionIndex) + { + [self.collectionView deleteSections:[NSIndexSet indexSetWithIndex:self.change.sectionIndex]]; + } + else + { + [self.collectionView deleteItemsAtIndexPaths:@[self.change.currentIndexPath]]; + } + + break; + } + + case NSFetchedResultsChangeMove: + { + [self.collectionView moveItemAtIndexPath:self.change.currentIndexPath toIndexPath:self.change.destinationIndexPath]; + break; + } + + case NSFetchedResultsChangeUpdate: + { + [self.collectionView reloadItemsAtIndexPaths:@[self.change.currentIndexPath]]; + break; + } + } +} + +@end diff --git a/Pods/Roxas/Roxas/RSTCellContentDataSource.h b/Pods/Roxas/Roxas/RSTCellContentDataSource.h new file mode 100644 index 000000000..999cb893e --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentDataSource.h @@ -0,0 +1,70 @@ +// +// RSTCellContentDataSource.h +// Roxas +// +// Created by Riley Testut on 2/7/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentChange.h" + +#import "UITableView+CellContent.h" +#import "UITableViewCell+CellContent.h" + +#import "UICollectionView+CellContent.h" +#import "UICollectionViewCell+CellContent.h" + +@import UIKit; + +@class RSTSearchController; +@class RSTCellContentChange; + +NS_ASSUME_NONNULL_BEGIN + +RST_EXTERN NSString *RSTCellContentGenericCellIdentifier; + +@interface RSTCellContentDataSource *, ViewType: UIScrollView *, DataSourceType> : NSObject + +// The view containing the content cells. +@property (nullable, weak, nonatomic, readonly) ViewType contentView; + +// RSTSearchController for easily adding support for searching through content. +// Lazily initialized upon first access. +@property (nonatomic, readonly) RSTSearchController *searchController; + +// Object to forward optional contentView.dataSource methods to. +@property (nullable, weak, nonatomic) DataSourceType proxy; + +// Block to determine the cell reuse identifier to use for a given index path. +// Defaults to using RSTCellContentGenericCellIdentifier for all index paths. +@property (copy, nonatomic) NSString * (^cellIdentifierHandler)(NSIndexPath *indexPath); + +// Block to configure a cell before it is displayed. +// Defaults to setting textLabel.text to item.description if CellType is UITableViewCell. +@property (copy, nonatomic) void (^cellConfigurationHandler)(CellType cell, ContentType item, NSIndexPath *indexPath); + +// Optional predicate to filter content, and refreshes content immediately. +// To set predicate without refreshing content, call -[RSTCellContentDataSource setPredicate:refreshContent:] and pass NO to refreshContent:. +@property (nullable, copy, nonatomic) NSPredicate *predicate; + +// A view to display when there is no content available. +// RSTBackgroundView preferred, but any UIView is valid. +// Defaults to nil. +@property (nullable, nonatomic) __kindof UIView *placeholderView; + +// Animation to use when animating changes in a UITableView. +@property (nonatomic) UITableViewRowAnimation rowAnimation; + +// Total number of items to be displayed in contentView. +@property (nonatomic, readonly) NSInteger itemCount; + +// Returns content item at indexPath. Performs no bounds-checking. +- (ContentType)itemAtIndexPath:(NSIndexPath *)indexPath; + +// Sets an optional predicate to filter content. +// Refreshes content immediately if passed YES for refreshContent:, otherwise refreshes at some later point (such as when calling [contentView reloadData]). +- (void)setPredicate:(NSPredicate * _Nullable)predicate refreshContent:(BOOL)refreshContent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCellContentDataSource.m b/Pods/Roxas/Roxas/RSTCellContentDataSource.m new file mode 100644 index 000000000..3dc0dd2bc --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentDataSource.m @@ -0,0 +1,667 @@ +// +// RSTCellContentDataSource.m +// Roxas +// +// Created by Riley Testut on 2/7/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentDataSource_Subclasses.h" +#import "RSTSearchController.h" +#import "RSTOperationQueue.h" +#import "RSTBlockOperation.h" + +#import "RSTHelperFile.h" + +@import ObjectiveC.runtime; + +typedef void (^PrefetchCompletionHandler)(_Nullable id prefetchItem, NSError *_Nullable error); + +NSString *RSTCellContentGenericCellIdentifier = @"Cell"; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCellContentDataSource () + +@property (nonatomic, getter=isPlaceholderViewVisible) BOOL placeholderViewVisible; + +@property (nonatomic, readonly) RSTOperationQueue *prefetchOperationQueue; + +@property (nonatomic, readonly) NSMapTable *> *prefetchCompletionHandlers; + +@end + +NS_ASSUME_NONNULL_END + + +@implementation RSTCellContentDataSource +{ + UITableViewCellSeparatorStyle _previousSeparatorStyle; + UIView *_previousBackgroundView; + BOOL _previousScrollEnabled; + + NSInteger _sectionsCount; + NSInteger _itemsCount; +} +@synthesize searchController = _searchController; +@synthesize prefetchItemCache = _prefetchItemCache; +@synthesize prefetchHandler = _prefetchHandler; +@synthesize prefetchCompletionHandler = _prefetchCompletionHandler; + +- (instancetype)init +{ + self = [super init]; + if (self) + { + _cellIdentifierHandler = [^NSString *(NSIndexPath *indexPath) { + return RSTCellContentGenericCellIdentifier; + } copy]; + + _cellConfigurationHandler = [^(id cell, id item, NSIndexPath *indexPath) { + if ([cell isKindOfClass:[UITableViewCell class]]) + { + [(UITableViewCell *)cell textLabel].text = [item description]; + } + } copy]; + + __weak RSTCellContentDataSource *weakSelf = self; + _defaultSearchHandler = [^NSOperation *(RSTSearchValue *searchValue, RSTSearchValue *previousSearchValue) { + weakSelf.predicate = searchValue.predicate; + return nil; + } copy]; + + _rowAnimation = UITableViewRowAnimationAutomatic; + + _prefetchItemCache = [[NSCache alloc] init]; + + _prefetchOperationQueue = [[RSTOperationQueue alloc] init]; + _prefetchOperationQueue.name = @"com.rileytestut.Roxas.RSTCellContentDataSource.prefetchOperationQueue"; + _prefetchOperationQueue.qualityOfService = NSQualityOfServiceUserInitiated; + + _prefetchCompletionHandlers = [NSMapTable strongToStrongObjectsMapTable]; + } + + return self; +} + +#pragma mark - NSObject - + +- (BOOL)dataSourceProtocolContainsSelector:(SEL)aSelector +{ + Protocol *dataSourceProtocol = self.contentView.dataSourceProtocol; + if (dataSourceProtocol == nil) + { + return NO; + } + + struct objc_method_description dataSourceSelector = protocol_getMethodDescription(dataSourceProtocol, aSelector, NO, YES); + + BOOL containsSelector = (dataSourceSelector.name != NULL); + return containsSelector; +} + +- (BOOL)respondsToSelector:(SEL)aSelector +{ + if ([super respondsToSelector:aSelector]) + { + return YES; + } + + if ([self dataSourceProtocolContainsSelector:aSelector]) + { + return [self.proxy respondsToSelector:aSelector]; + } + + return NO; +} + +- (id)forwardingTargetForSelector:(SEL)aSelector +{ + if ([self dataSourceProtocolContainsSelector:aSelector]) + { + return self.proxy; + } + + return nil; +} + +#pragma mark - RSTCellContentDataSource - + +#pragma mark Placeholder View + +- (void)showPlaceholderView +{ + if ([self isPlaceholderViewVisible]) + { + return; + } + + if (self.placeholderView == nil || self.contentView == nil) + { + return; + } + + self.placeholderViewVisible = YES; + + if ([self.contentView isKindOfClass:[UITableView class]]) + { + UITableView *tableView = (UITableView *)self.contentView; + + _previousSeparatorStyle = tableView.separatorStyle; + tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + } + + _previousScrollEnabled = self.contentView.scrollEnabled; + self.contentView.scrollEnabled = NO; + + _previousBackgroundView = self.contentView.backgroundView; + self.contentView.backgroundView = self.placeholderView; + +} + +- (void)hidePlaceholderView +{ + if (![self isPlaceholderViewVisible]) + { + return; + } + + self.placeholderViewVisible = NO; + + if ([self.contentView isKindOfClass:[UITableView class]]) + { + UITableView *tableView = (UITableView *)self.contentView; + tableView.separatorStyle = _previousSeparatorStyle; + } + + self.contentView.scrollEnabled = _previousScrollEnabled; + self.contentView.backgroundView = _previousBackgroundView; +} + +#pragma mark Prefetching + +- (void)prefetchItemAtIndexPath:(NSIndexPath *)indexPath completionHandler:(void (^_Nullable)(id prefetchItem, NSError *error))completionHandler +{ + if (self.prefetchHandler == nil || self.prefetchCompletionHandler == nil) + { + return; + } + + id item = [self itemAtIndexPath:indexPath]; + + // Disable prefetching for NSProxy items to prevent obscure crashes. + if ([item isProxy]) + { + return; + } + + if (completionHandler) + { + // Each completionHandler is mapped to an item, and then to the indexPath originally requested. + // This allows us to prevent multiple fetches for the same item, but also handle the case where the prefetch item is needed by multiple cells, or the cell has moved. + + NSMutableDictionary *completionHandlers = [self.prefetchCompletionHandlers objectForKey:item]; + if (completionHandlers == nil) + { + completionHandlers = [NSMutableDictionary dictionary]; + [self.prefetchCompletionHandlers setObject:completionHandlers forKey:item]; + } + + completionHandlers[indexPath] = completionHandler; + } + + // If prefetch operation is currently in progress, return. + if (self.prefetchOperationQueue[item] != nil) + { + return; + } + + void (^prefetchCompletionHandler)(id, NSError *) = ^(id prefetchItem, NSError *error) { + if (prefetchItem) + { + [self.prefetchItemCache setObject:prefetchItem forKey:item]; + } + + NSMutableDictionary *completionHandlers = [self.prefetchCompletionHandlers objectForKey:item]; + [completionHandlers enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *indexPath, PrefetchCompletionHandler completionHandler, BOOL *stop) { + completionHandler(prefetchItem, error); + }]; + [self.prefetchCompletionHandlers removeObjectForKey:item]; + }; + + id cachedItem = [self.prefetchItemCache objectForKey:item]; + if (cachedItem) + { + // Prefetch item has been cached, so use it immediately. + + rst_dispatch_sync_on_main_thread(^{ + prefetchCompletionHandler(cachedItem, nil); + }); + } + else + { + // Prefetch item has not been cached, so perform operation to retrieve it. + + __weak __block NSOperation *weakOperation = nil; + + NSOperation *operation = self.prefetchHandler(item, indexPath, ^(id prefetchItem, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + + if (![weakOperation isCancelled]) + { + prefetchCompletionHandler(prefetchItem, error); + } + + if ([weakOperation isKindOfClass:[RSTAsyncBlockOperation class]]) + { + // Automatically call finish for RSTAsyncBlockOperations. + [(RSTAsyncBlockOperation *)weakOperation finish]; + } + }); + }); + + weakOperation = operation; + + if (operation) + { + [self.prefetchOperationQueue addOperation:operation forKey:item]; + } + } +} + +#pragma mark Validation + +- (BOOL)isValidIndexPath:(NSIndexPath *)indexPath +{ + if (indexPath.section >= [self numberOfSectionsInContentView:self.contentView]) + { + return NO; + } + + if (indexPath.item >= [self contentView:self.contentView numberOfItemsInSection:indexPath.section]) + { + return NO; + } + + return YES; +} + +#pragma mark Filtering + +- (void)filterContentWithPredicate:(NSPredicate *)predicate refreshContent:(BOOL)refreshContent +{ + [self filterContentWithPredicate:predicate]; + + if (refreshContent) + { + rst_dispatch_sync_on_main_thread(^{ + [self.contentView reloadData]; + }); + } +} + +#pragma mark Changes + +- (void)addChange:(RSTCellContentChange *)change +{ + RSTCellContentChange *transformedChange = nil; + + if (change.sectionIndex == RSTUnknownSectionIndex) + { + NSIndexPath *currentIndexPath = change.currentIndexPath; + if (currentIndexPath != nil) + { + currentIndexPath = [self.indexPathTranslator dataSource:self globalIndexPathForLocalIndexPath:currentIndexPath] ?: currentIndexPath; + } + + NSIndexPath *destinationIndexPath = change.destinationIndexPath; + if (destinationIndexPath != nil) + { + destinationIndexPath = [self.indexPathTranslator dataSource:self globalIndexPathForLocalIndexPath:destinationIndexPath] ?: destinationIndexPath; + } + + transformedChange = [[RSTCellContentChange alloc] initWithType:change.type currentIndexPath:currentIndexPath destinationIndexPath:destinationIndexPath]; + + NSIndexPath *indexPathForRemovingFromCache = nil; + switch (change.type) + { + case RSTCellContentChangeUpdate: + indexPathForRemovingFromCache = change.currentIndexPath; + break; + + case RSTCellContentChangeMove: + // At this point, the data source has already changed index paths of objects. + // So to remove the old cached item, we need to get the item at the _new_ index path. + indexPathForRemovingFromCache = change.destinationIndexPath; + break; + + case RSTCellContentChangeDelete: + case RSTCellContentChangeInsert: + break; + } + + if (indexPathForRemovingFromCache != nil) + { + // Remove cached prefetched item since the object has been changed. + id item = [self itemAtIndexPath:indexPathForRemovingFromCache]; + [self.prefetchItemCache removeObjectForKey:item]; + } + } + else + { + NSIndexPath *sectionIndexPath = [NSIndexPath indexPathForItem:0 inSection:change.sectionIndex]; + NSIndexPath *indexPath = [self.indexPathTranslator dataSource:self globalIndexPathForLocalIndexPath:sectionIndexPath] ?: sectionIndexPath; + + transformedChange = [[RSTCellContentChange alloc] initWithType:change.type sectionIndex:indexPath.section]; + } + + [self.contentView addChange:transformedChange]; +} + +#pragma mark - RSTCellContentDataSource Subclass Methods - + +- (NSInteger)numberOfSectionsInContentView:(__kindof UIView *)contentView +{ + [self doesNotRecognizeSelector:_cmd]; + return 0; +} + +- (NSInteger)contentView:(__kindof UIView *)contentView numberOfItemsInSection:(NSInteger)section +{ + [self doesNotRecognizeSelector:_cmd]; + return 0; +} + +- (id)itemAtIndexPath:(NSIndexPath *)indexPath +{ + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (void)filterContentWithPredicate:(NSPredicate *)predicate +{ + [self doesNotRecognizeSelector:_cmd]; +} + +#pragma mark - Data Source - + +- (NSInteger)_numberOfSectionsInContentView:(UIScrollView *)contentView +{ + self.contentView = contentView; + + NSInteger sections = [self numberOfSectionsInContentView:contentView]; + + if (sections == 0) + { + [self showPlaceholderView]; + } + + _itemsCount = 0; + _sectionsCount = sections; + + return sections; +} + +- (NSInteger)_contentView:(UIScrollView *)contentView numberOfItemsInSection:(NSInteger)section +{ + NSInteger items = [self contentView:contentView numberOfItemsInSection:section]; + _itemsCount += items; + + if (section == _sectionsCount - 1) + { + if (_itemsCount == 0) + { + [self showPlaceholderView]; + } + else + { + [self hidePlaceholderView]; + } + + _itemsCount = 0; + _sectionsCount = 0; + } + + return items; +} + +- (__kindof UIView *)_contentView:(UIScrollView *)contentView cellForItemAtIndexPath:(NSIndexPath *)indexPath +{ + NSString *identifier = self.cellIdentifierHandler(indexPath); + id item = [self itemAtIndexPath:indexPath]; + + id cell = [contentView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; + self.cellConfigurationHandler(cell, item, indexPath); + + // We store the completionHandler, and it's not guaranteed to be nil'd out (since prefetch may take a long time), so we use a weak reference to self inside the block to prevent strong reference cycle. + RSTCellContentDataSource *__weak weakSelf = self; + [self prefetchItemAtIndexPath:indexPath completionHandler:^(id prefetchItem, NSError *error) { + NSIndexPath *cellIndexPath = [contentView indexPathForCell:cell]; + + if (cellIndexPath) + { + id cellItem = [weakSelf itemAtIndexPath:cellIndexPath]; + if ([item isEqual:cellItem]) + { + // Cell is in use, but its current index path still corresponds to the same item, so update. + weakSelf.prefetchCompletionHandler(cell, prefetchItem, cellIndexPath, error); + } + else + { + // Cell is in use, but its new index path does *not* correspond to the same item, so ignore. + } + } + else + { + // Cell is currently being configured for use, so update. + weakSelf.prefetchCompletionHandler(cell, prefetchItem, indexPath, error); + } + }]; + + return cell; +} + +#pragma mark Prefetching + +- (void)_contentView:(UIScrollView *)contentView prefetchItemsAtIndexPaths:(NSArray *)indexPaths +{ + for (NSIndexPath *indexPath in indexPaths) + { + if (![self isValidIndexPath:indexPath]) + { + continue; + } + + [self prefetchItemAtIndexPath:indexPath completionHandler:nil]; + } +} + +- (void)_contentView:(UIScrollView *)contentView cancelPrefetchingItemsForIndexPaths:(NSArray *)indexPaths +{ + for (NSIndexPath *indexPath in indexPaths) + { + if (![self isValidIndexPath:indexPath]) + { + continue; + } + + id item = [self itemAtIndexPath:indexPath]; + + NSOperation *operation = self.prefetchOperationQueue[item]; + [operation cancel]; + } +} + +#pragma mark - - + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return [self _numberOfSectionsInContentView:tableView]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return [self _contentView:tableView numberOfItemsInSection:section]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return [self _contentView:tableView cellForItemAtIndexPath:indexPath]; +} + +#pragma mark - - + +- (void)tableView:(UITableView *)tableView prefetchRowsAtIndexPaths:(NSArray *)indexPaths +{ + [self _contentView:tableView prefetchItemsAtIndexPaths:indexPaths]; +} + +- (void)tableView:(UITableView *)tableView cancelPrefetchingForRowsAtIndexPaths:(NSArray *)indexPaths +{ + [self _contentView:tableView cancelPrefetchingItemsForIndexPaths:indexPaths]; +} + +#pragma mark - - + +- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView +{ + return [self _numberOfSectionsInContentView:collectionView]; +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section +{ + return [self _contentView:collectionView numberOfItemsInSection:section]; +} + +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath +{ + return [self _contentView:collectionView cellForItemAtIndexPath:indexPath]; +} + +#pragma mark - - + +- (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray *)indexPaths +{ + [self _contentView:collectionView prefetchItemsAtIndexPaths:indexPaths]; +} + +- (void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray *)indexPaths +{ + [self _contentView:collectionView cancelPrefetchingItemsForIndexPaths:indexPaths]; +} + +#pragma mark - Getters/Setters - + +- (RSTSearchController *)searchController +{ + if (_searchController == nil) + { + _searchController = [[RSTSearchController alloc] initWithSearchResultsController:nil]; + + __weak RSTCellContentDataSource *weakSelf = self; + _searchController.searchHandler = ^NSOperation *(RSTSearchValue *searchValue, RSTSearchValue *previousSearchValue) { + weakSelf.predicate = searchValue.predicate; + return nil; + }; + } + + return _searchController; +} + +- (void)setContentView:(UIScrollView *)contentView +{ + if (contentView == _contentView) + { + return; + } + + _contentView = contentView; + + if (contentView.dataSource == self) + { + // Must set ourselves as dataSource again to refresh respondsToSelector: cache. + contentView.dataSource = nil; + contentView.dataSource = self; + } + + if (self.contentView != nil) + { + if ([self isPrefetchingDataSource]) + { + if (self.contentView.prefetchDataSource == nil) + { + NSLog(@"%@ is a prefetching data source, but its content view's prefetchDataSource is nil. Did you forget to assign it?", self); + } + } + } +} + +- (void)setPredicate:(NSPredicate *)predicate +{ + [self setPredicate:predicate refreshContent:YES]; +} + +- (void)setPredicate:(NSPredicate *)predicate refreshContent:(BOOL)refreshContent +{ + _predicate = predicate; + + [self filterContentWithPredicate:_predicate refreshContent:refreshContent]; +} + +- (void)setPlaceholderView:(UIView *)placeholderView +{ + if (_placeholderView != nil && self.contentView.backgroundView == _placeholderView) + { + self.contentView.backgroundView = placeholderView; + } + + _placeholderView = placeholderView; + _placeholderView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + + if (self.contentView) + { + // Show placeholder only if there are no items to display. + + BOOL shouldShowPlaceholderView = YES; + + for (int i = 0; i < [self numberOfSectionsInContentView:self.contentView]; i++) + { + if ([self contentView:self.contentView numberOfItemsInSection:i] > 0) + { + shouldShowPlaceholderView = NO; + break; + } + } + + if (shouldShowPlaceholderView) + { + [self showPlaceholderView]; + } + else + { + [self hidePlaceholderView]; + } + } +} + +- (NSInteger)itemCount +{ + NSInteger itemCount = 0; + + for (int section = 0; section < [self numberOfSectionsInContentView:self.contentView]; section++) + { + for (int item = 0; item < [self contentView:self.contentView numberOfItemsInSection:section]; item++) + { + itemCount++; + } + } + + return itemCount; +} + +- (BOOL)isPrefetchingDataSource +{ + return NO; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTCellContentDataSource_Subclasses.h b/Pods/Roxas/Roxas/RSTCellContentDataSource_Subclasses.h new file mode 100644 index 000000000..df8c2eb62 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentDataSource_Subclasses.h @@ -0,0 +1,50 @@ +// +// RSTCellContentDataSource_Subclasses.h +// Roxas +// +// Created by Riley Testut on 2/7/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentDataSource.h" +#import "RSTCellContentPrefetchingDataSource.h" + +@class RSTSearchValue; + +NS_ASSUME_NONNULL_BEGIN + +@protocol RSTCellContentIndexPathTranslating + +- (nullable NSIndexPath *)dataSource:(RSTCellContentDataSource *)dataSource globalIndexPathForLocalIndexPath:(NSIndexPath *)indexPath; + +@end + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +// Privately declare conformance to DataSource protocols so clients must use a concrete subclass (which provides correct generic parameters to superclass). +@interface RSTCellContentDataSource () + +@property (nullable, weak, readwrite) UIScrollView *contentView; + +// Defaults to synchronously setting RSTCellContentDataSource's predicate to searchValue.predicate. +// Subclasses can customize if needed, such as by returning an NSOperation inside handler to enable asynchronous RSTSearchController search results. +@property (copy, nonatomic) NSOperation *_Nullable (^defaultSearchHandler)(RSTSearchValue *searchValue, RSTSearchValue *_Nullable previousSearchValue); + +@property (nullable, weak, nonatomic) id indexPathTranslator; + +@property (nonatomic, readonly, getter=isPrefetchingDataSource) BOOL prefetchingDataSource; + +- (NSInteger)numberOfSectionsInContentView:(__kindof UIScrollView *)contentView; +- (NSInteger)contentView:(__kindof UIScrollView *)contentView numberOfItemsInSection:(NSInteger)section; + +- (void)prefetchItemAtIndexPath:(NSIndexPath *)indexPath completionHandler:(void (^_Nullable)(id prefetchItem, NSError *error))completionHandler; +- (void)filterContentWithPredicate:(nullable NSPredicate *)predicate; + +- (void)addChange:(RSTCellContentChange *)change; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCellContentPrefetchingDataSource.h b/Pods/Roxas/Roxas/RSTCellContentPrefetchingDataSource.h new file mode 100644 index 000000000..7f3a9da8a --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentPrefetchingDataSource.h @@ -0,0 +1,24 @@ +// +// RSTCellContentPrefetchingDataSource.h +// Roxas +// +// Created by Riley Testut on 7/6/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentCell.h" + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@protocol RSTCellContentPrefetchingDataSource + +@property (nonatomic) NSCache *prefetchItemCache; + +@property (nullable, copy, nonatomic) NSOperation *_Nullable (^prefetchHandler)(id item, NSIndexPath *indexPath, void (^completionHandler)(_Nullable id item, NSError *_Nullable error)); +@property (nullable, copy, nonatomic) void (^prefetchCompletionHandler)(__kindof UIView *cell, _Nullable id item, NSIndexPath *indexPath, NSError *_Nullable error); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCellContentView.h b/Pods/Roxas/Roxas/RSTCellContentView.h new file mode 100644 index 000000000..95a1ae479 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCellContentView.h @@ -0,0 +1,39 @@ +// +// RSTCellContentView.h +// Roxas +// +// Created by Riley Testut on 2/13/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentCell.h" + +@import UIKit; + +@class RSTCellContentChange; + +NS_ASSUME_NONNULL_BEGIN + +@protocol RSTCellContentView + +@property (nonatomic, nullable) id dataSource; +@property (nonatomic, nullable) id prefetchDataSource; + +@property (nonatomic, readonly) Protocol *dataSourceProtocol; + +@property (nonatomic, nullable) UIView *backgroundView; + +- (void)beginUpdates; +- (void)endUpdates; + +- (void)addChange:(RSTCellContentChange *)change; + +- (nullable id)indexPathForCell:(id)cell; + +- (id)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath; + +@end + + + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCollectionViewCell.h b/Pods/Roxas/Roxas/RSTCollectionViewCell.h new file mode 100644 index 000000000..02a3806be --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCollectionViewCell.h @@ -0,0 +1,23 @@ +// +// RSTCollectionViewCell.h +// Roxas +// +// Created by Riley Testut on 5/7/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCollectionViewCell : UICollectionViewCell + +@property (nonatomic, readonly) UILabel *textLabel; +@property (nonatomic, readonly) UILabel *detailTextLabel; +@property (nonatomic, readonly) UIImageView *imageView; + +@property (nonatomic, readonly) UIStackView *stackView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCollectionViewCell.m b/Pods/Roxas/Roxas/RSTCollectionViewCell.m new file mode 100644 index 000000000..bdd469c8c --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCollectionViewCell.m @@ -0,0 +1,114 @@ +// +// RSTCollectionViewCell.m +// Roxas +// +// Created by Riley Testut on 5/7/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTCollectionViewCell.h" +#import "RSTCollectionViewGridLayout.h" + +#import "UICollectionViewCell+Nibs.h" +#import "NSLayoutConstraint+Edges.h" + +static void *RSTCollectionViewCellKVOContext = &RSTCollectionViewCellKVOContext; + +@interface RSTCollectionViewCell () + +@property (nonatomic, readwrite) IBOutlet UILabel *textLabel; +@property (nonatomic, readwrite) IBOutlet UILabel *detailTextLabel; +@property (nonatomic, readwrite) IBOutlet UIImageView *imageView; + +@property (nonatomic, readwrite) IBOutlet UIStackView *stackView; + +@end + +@implementation RSTCollectionViewCell + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (void)initialize +{ + UINib *nib = [RSTCollectionViewCell nib]; + [nib instantiateWithOwner:self options:nil]; + + [self.contentView addSubview:self.stackView pinningEdgesWithInsets:UIEdgeInsetsZero]; + + [self.textLabel addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionNew context:RSTCollectionViewCellKVOContext]; + [self.detailTextLabel addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionNew context:RSTCollectionViewCellKVOContext]; + + self.textLabel.text = nil; + self.detailTextLabel.text = nil; +} + +- (void)dealloc +{ + [self.textLabel removeObserver:self forKeyPath:NSStringFromSelector(@selector(text)) context:RSTCollectionViewCellKVOContext]; + [self.detailTextLabel removeObserver:self forKeyPath:NSStringFromSelector(@selector(text)) context:RSTCollectionViewCellKVOContext]; +} + +#pragma mark - UIView - + +- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes +{ + if (![layoutAttributes isKindOfClass:[RSTCollectionViewGridLayoutAttributes class]]) + { + return [super preferredLayoutAttributesFittingAttributes:layoutAttributes]; + } + + RSTCollectionViewGridLayoutAttributes *gridLayoutAttributes = (RSTCollectionViewGridLayoutAttributes *)layoutAttributes; + + NSArray *constraints = @[[self.imageView.widthAnchor constraintEqualToConstant:gridLayoutAttributes.preferredItemSize.width], + [self.imageView.heightAnchor constraintEqualToConstant:gridLayoutAttributes.preferredItemSize.height]]; + + for (NSLayoutConstraint *constraint in constraints) + { + // Prevent conflicting with potential UIView-Encapsulated-Layout-Height when activating constraints. + // Still results in correct size when calling [super preferredLayoutAttributesFittingAttributes]. + constraint.priority = 999; + } + + [NSLayoutConstraint activateConstraints:constraints]; + + UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes]; + + [NSLayoutConstraint deactivateConstraints:constraints]; + + return attributes; +} + +#pragma mark - KVO - + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (context != RSTCollectionViewCellKVOContext) + { + return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } + + UILabel *label = object; + label.hidden = (label.text.length == 0); +} + +@end diff --git a/Pods/Roxas/Roxas/RSTCollectionViewCell.xib b/Pods/Roxas/Roxas/RSTCollectionViewCell.xib new file mode 100644 index 000000000..a7b8e46f8 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCollectionViewCell.xib @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Roxas/Roxas/RSTCollectionViewGridLayout.h b/Pods/Roxas/Roxas/RSTCollectionViewGridLayout.h new file mode 100644 index 000000000..66b6f9df3 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCollectionViewGridLayout.h @@ -0,0 +1,42 @@ +// +// RSTCollectionViewGridLayout.h +// Roxas +// +// Created by Riley Testut on 5/7/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import UIKit; + +typedef NS_ENUM(NSInteger, RSTCollectionViewGridLayoutDistribution) +{ + RSTCollectionViewGridLayoutDistributionFlow, + RSTCollectionViewGridLayoutDistributionFill +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCollectionViewGridLayoutAttributes : UICollectionViewLayoutAttributes + +@property (nonatomic) CGSize preferredItemSize; + +@end + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCollectionViewGridLayout : UICollectionViewFlowLayout + +#if TARGET_INTERFACE_BUILDER +@property (nonatomic) IBInspectable NSInteger distribution; +#else +@property (nonatomic) IBInspectable RSTCollectionViewGridLayoutDistribution distribution; +#endif + +@property (nonatomic) IBInspectable BOOL automaticallyAdjustsSectionInsets; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCollectionViewGridLayout.m b/Pods/Roxas/Roxas/RSTCollectionViewGridLayout.m new file mode 100644 index 000000000..579d7ea2c --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCollectionViewGridLayout.m @@ -0,0 +1,327 @@ +// +// RSTCollectionViewGridLayout.m +// Roxas +// +// Created by Riley Testut on 5/7/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTCollectionViewGridLayout.h" + +@implementation RSTCollectionViewGridLayoutAttributes + +- (id)copyWithZone:(NSZone *)zone +{ + RSTCollectionViewGridLayoutAttributes *copy = [super copyWithZone:zone]; + copy.preferredItemSize = self.preferredItemSize; + return copy; +} + +@end + +@interface RSTCollectionViewGridLayout () + +@property (nonatomic, readonly) CGFloat contentWidth; +@property (nonatomic, readonly) NSUInteger maximumItemsPerRow; +@property (nonatomic, readonly) CGFloat interitemSpacing; + +@property (nonatomic, readonly) NSMutableDictionary *cachedLayoutAttributes; +@property (nonatomic, readonly) NSMutableDictionary *initialLayoutAttributes; + +@end + +@implementation RSTCollectionViewGridLayout + ++ (Class)layoutAttributesClass +{ + return [RSTCollectionViewGridLayoutAttributes class]; +} + +- (instancetype)init +{ + self = [super init]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (void)initialize +{ + _distribution = RSTCollectionViewGridLayoutDistributionFlow; + _automaticallyAdjustsSectionInsets = YES; + + _cachedLayoutAttributes = [NSMutableDictionary dictionary]; + _initialLayoutAttributes = [NSMutableDictionary dictionary]; + + if (@available(iOS 11.0, *)) + { + self.sectionInsetReference = UICollectionViewFlowLayoutSectionInsetFromSafeArea; + } + + self.estimatedItemSize = self.itemSize; +} + +#pragma mark - Preparations - + +- (void)prepareLayout +{ + [super prepareLayout]; + + if (self.automaticallyAdjustsSectionInsets) + { + UIEdgeInsets inset = self.sectionInset; + inset.left = self.interitemSpacing; + inset.right = self.interitemSpacing; + self.sectionInset = inset; + } +} + +- (void)finalizeCollectionViewUpdates +{ + [super finalizeCollectionViewUpdates]; + + [self.initialLayoutAttributes removeAllObjects]; +} + +#pragma mark - Invalidation - + +- (UICollectionViewLayoutInvalidationContext *)invalidationContextForPreferredLayoutAttributes:(UICollectionViewLayoutAttributes *)preferredAttributes withOriginalAttributes:(UICollectionViewLayoutAttributes *)originalAttributes +{ + UICollectionViewLayoutInvalidationContext *context = [super invalidationContextForPreferredLayoutAttributes:preferredAttributes withOriginalAttributes:originalAttributes]; + + // Update the initial attributes because the size may have changed since returning from initialLayoutAttributesForAppearingItemAtIndexPath. + UICollectionViewLayoutAttributes *initialAttributes = self.initialLayoutAttributes[preferredAttributes.indexPath]; + if (initialAttributes != nil) + { + CGRect rect = CGRectMake(0, 0, self.collectionViewContentSize.width, self.collectionViewContentSize.height); + + // Must call layoutAttributesForElementsInRect for the layout to recalculate the correct frames. + NSArray *layoutAttributes = [self layoutAttributesForElementsInRect:rect]; + for (UICollectionViewLayoutAttributes *attributes in layoutAttributes) + { + if ([attributes.indexPath isEqual:initialAttributes.indexPath]) + { + initialAttributes.frame = attributes.frame; + break; + } + } + } + + return context; +} + +#pragma mark - Returning Layout Attributes - + +- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath +{ + UICollectionViewLayoutAttributes *attributes = self.cachedLayoutAttributes[indexPath]; + if (attributes != nil) + { + return attributes; + } + + return [super layoutAttributesForItemAtIndexPath:indexPath]; +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect +{ + NSMutableArray *layoutAttributes = [NSMutableArray array]; + + for (UICollectionViewLayoutAttributes *attributes in [super layoutAttributesForElementsInRect:rect]) + { + UICollectionViewLayoutAttributes *updatedAttributes = [self transformedLayoutAttributesFromLayoutAttributes:attributes]; + [layoutAttributes addObject:updatedAttributes]; + } + + [self alignLayoutAttributes:layoutAttributes]; + + for (UICollectionViewLayoutAttributes *attributes in layoutAttributes) + { + // Cache layout attributes to ensure layoutAttributesForItemAtIndexPath returns correct attributes. + self.cachedLayoutAttributes[attributes.indexPath] = attributes; + } + + return layoutAttributes; +} + +- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath +{ + UICollectionViewLayoutAttributes *attributes = [[super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath] copy]; + self.initialLayoutAttributes[itemIndexPath] = attributes; + return attributes; +} + +#pragma mark - Transforming Layout Attributes - + +- (UICollectionViewLayoutAttributes *)transformedLayoutAttributesFromLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes +{ + RSTCollectionViewGridLayoutAttributes *transformedLayoutAttributes = [attributes copy]; + transformedLayoutAttributes.preferredItemSize = self.itemSize; + + if (attributes.representedElementCategory == UICollectionElementCategoryCell) + { + if (attributes.indexPath.item == 0) + { + // When using self-sizing cells, a bug in UICollectionViewFlowLayout causes cells in sections with only one (currently visible) item to be centered horizontally. + // To compensate, we manually set the correct horizontal offset. + + CGRect frame = transformedLayoutAttributes.frame; + frame.origin.x = self.sectionInset.left; + transformedLayoutAttributes.frame = frame; + } + } + + return transformedLayoutAttributes; +} + +- (void)alignLayoutAttributes:(NSArray *)layoutAttributes +{ + NSNumber *minimumY = nil; + NSNumber *maximumY = nil; + + NSMutableArray *currentRowLayoutAttributes = [NSMutableArray array]; + + BOOL isSingleRow = YES; + + for (UICollectionViewLayoutAttributes *attributes in layoutAttributes) + { + if (attributes.representedElementCategory != UICollectionElementCategoryCell) + { + continue; + } + + if (minimumY != nil && maximumY != nil) + { + if (CGRectGetMinY(attributes.frame) > [maximumY doubleValue]) + { + // attributes.frame.minY is greater than maximumY, so this is a new row. + // As a result, we need to align all current row frame origins to the same Y-value (minimumY). + [self alignLayoutAttributes:currentRowLayoutAttributes toOriginY:[minimumY doubleValue]]; + + // Reset variables for new row. + [currentRowLayoutAttributes removeAllObjects]; + minimumY = nil; + maximumY = nil; + + isSingleRow = NO; + } + } + + // Update minimumY if needed. + if (minimumY == nil || CGRectGetMinY(attributes.frame) < [minimumY doubleValue]) + { + minimumY = @(CGRectGetMinY(attributes.frame)); + } + + // Update maximumY if needed. + if (maximumY == nil || CGRectGetMaxY(attributes.frame) > [maximumY doubleValue]) + { + maximumY = @(CGRectGetMaxY(attributes.frame)); + } + + [currentRowLayoutAttributes addObject:attributes]; + } + + // Handle remaining currentRowLayoutAttributes. + if (minimumY != nil) + { + [self alignLayoutAttributes:currentRowLayoutAttributes toOriginY:[minimumY doubleValue]]; + + if (isSingleRow && self.distribution == RSTCollectionViewGridLayoutDistributionFill) + { + CGFloat spacing = (self.contentWidth - (self.itemSize.width * currentRowLayoutAttributes.count)) / (currentRowLayoutAttributes.count + 1.0); + + [currentRowLayoutAttributes enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes * _Nonnull attributes, NSUInteger index, BOOL * _Nonnull stop) { + CGRect frame = attributes.frame; + frame.origin.x = spacing + (spacing + self.itemSize.width) * index; + attributes.frame = frame; + }]; + } + } +} + +- (void)alignLayoutAttributes:(NSArray *)layoutAttributes toOriginY:(CGFloat)originY +{ + for (UICollectionViewLayoutAttributes *attributes in layoutAttributes) + { + CGRect frame = attributes.frame; + frame.origin.y = originY; + attributes.frame = frame; + } +} + +#pragma mark - Getters/Setters - + +- (CGFloat)contentWidth +{ + if (self.collectionView == nil) + { + return 0.0; + } + + CGFloat contentWidth = CGRectGetWidth(self.collectionView.bounds); + + if (!self.automaticallyAdjustsSectionInsets) + { + UIEdgeInsets insets = self.collectionView.contentInset; + if (@available(iOS 11, *)) + { + insets = self.collectionView.adjustedContentInset; + } + + contentWidth -= (insets.left + insets.right); + } + + return contentWidth; +} + +- (NSUInteger)maximumItemsPerRow +{ + NSUInteger maximumItemsPerRow = (self.contentWidth - self.minimumInteritemSpacing) / (self.itemSize.width + self.minimumInteritemSpacing); + return maximumItemsPerRow; +} + +- (CGFloat)interitemSpacing +{ + CGFloat interitemSpacing = (self.contentWidth - self.maximumItemsPerRow * self.itemSize.width) / (self.maximumItemsPerRow + 1.0); + return interitemSpacing; +} + +- (void)setDistribution:(RSTCollectionViewGridLayoutDistribution)distribution +{ + _distribution = distribution; + + [self invalidateLayout]; +} + +- (void)setAutomaticallyAdjustsSectionInsets:(BOOL)automaticallyAdjustsSectionInsets +{ + _automaticallyAdjustsSectionInsets = automaticallyAdjustsSectionInsets; + + [self invalidateLayout]; +} + +- (void)setItemSize:(CGSize)itemSize +{ + [super setItemSize:itemSize]; + + self.estimatedItemSize = itemSize; + + [self invalidateLayout]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTCompositeDataSource.h b/Pods/Roxas/Roxas/RSTCompositeDataSource.h new file mode 100644 index 000000000..dcaa5486e --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCompositeDataSource.h @@ -0,0 +1,58 @@ +// +// RSTCompositeDataSource.h +// Roxas +// +// Created by Riley Testut on 12/19/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentDataSource.h" +#import "RSTCellContentPrefetchingDataSource.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCompositeDataSource *, ViewType: UIScrollView *, DataSourceType> : RSTCellContentDataSource + +@property (nonatomic, copy, readonly) NSArray *> *dataSources; + +@property (nonatomic) BOOL shouldFlattenSections; + +- (instancetype)initWithDataSources:(NSArray *> *)dataSources; + +- (nullable RSTCellContentDataSource *)dataSourceForIndexPath:(NSIndexPath *)indexPath; + +- (instancetype)init NS_UNAVAILABLE; + +@end + + +@interface RSTCompositePrefetchingDataSource *, ViewType: UIScrollView *, DataSourceType, PrefetchContentType> : RSTCompositeDataSource + +@property (nonatomic) NSCache *prefetchItemCache; + +@property (nullable, copy, nonatomic) NSOperation *_Nullable (^prefetchHandler)(ContentType item, NSIndexPath *indexPath, void (^completionHandler)(_Nullable PrefetchContentType item, NSError *_Nullable error)); +@property (nullable, copy, nonatomic) void (^prefetchCompletionHandler)(CellType cell, _Nullable PrefetchContentType item, NSIndexPath *indexPath, NSError *_Nullable error); + +@end + +NS_ASSUME_NONNULL_END + + +// Concrete Subclasses + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCompositeTableViewDataSource : RSTCompositeDataSource> +@end + +@interface RSTCompositeCollectionViewDataSource : RSTCompositeDataSource> +@end + + +@interface RSTCompositeTableViewPrefetchingDataSource : RSTCompositePrefetchingDataSource, PrefetchContentType> +@end + +@interface RSTCompositeCollectionViewPrefetchingDataSource : RSTCompositePrefetchingDataSource, PrefetchContentType> +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTCompositeDataSource.m b/Pods/Roxas/Roxas/RSTCompositeDataSource.m new file mode 100644 index 000000000..07f99caf3 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTCompositeDataSource.m @@ -0,0 +1,337 @@ +// +// RSTCompositeDataSource.m +// Roxas +// +// Created by Riley Testut on 12/19/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCompositeDataSource.h" +#import "RSTCellContentDataSource_Subclasses.h" + +#import "RSTHelperFile.h" + +// Allow NSValue-boxing literals for NSRange. +typedef struct __attribute__((objc_boxable)) _NSRange NSRange; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTCompositeDataSource () + +@property (nonatomic, readonly) NSMapTable *dataSourceRanges; + +@end + +NS_ASSUME_NONNULL_END + +@implementation RSTCompositeDataSource + +- (instancetype)initWithDataSources:(NSArray *)dataSources +{ + self = [super init]; + if (self) + { + _dataSources = [dataSources copy]; + _dataSourceRanges = [NSMapTable strongToStrongObjectsMapTable]; + + for (RSTCellContentDataSource *dataSource in _dataSources) + { + dataSource.indexPathTranslator = self; + } + + __weak RSTCompositeDataSource *weakSelf = self; + + self.cellIdentifierHandler = ^NSString * _Nonnull(NSIndexPath *_Nonnull indexPath) { + RSTCellContentDataSource *dataSource = [weakSelf dataSourceForIndexPath:indexPath]; + if (dataSource == nil) + { + return RSTCellContentGenericCellIdentifier; + } + + NSIndexPath *localIndexPath = [weakSelf dataSource:dataSource localIndexPathForGlobalIndexPath:indexPath]; + + NSString *identifier = dataSource.cellIdentifierHandler(localIndexPath); + return identifier; + }; + + self.cellConfigurationHandler = ^(id _Nonnull cell, id _Nonnull item, NSIndexPath *_Nonnull indexPath) { + RSTCellContentDataSource *dataSource = [weakSelf dataSourceForIndexPath:indexPath]; + if (dataSource == nil) + { + return; + } + + NSIndexPath *localIndexPath = [weakSelf dataSource:dataSource localIndexPathForGlobalIndexPath:indexPath]; + dataSource.cellConfigurationHandler(cell, item, localIndexPath); + }; + + self.prefetchCompletionHandler = ^(__kindof UIView * _Nonnull cell, id _Nullable item, NSIndexPath * _Nonnull indexPath, NSError * _Nullable error) { + RSTCellContentDataSource *dataSource = [weakSelf dataSourceForIndexPath:indexPath]; + if (dataSource == nil || dataSource.prefetchCompletionHandler == nil) + { + return; + } + + NSIndexPath *localIndexPath = [weakSelf dataSource:dataSource localIndexPathForGlobalIndexPath:indexPath]; + dataSource.prefetchCompletionHandler(cell, item, localIndexPath, error); + }; + } + + return self; +} + +#pragma mark - RSTCompositeDataSource - + +- (RSTCellContentDataSource *)dataSourceForIndexPath:(NSIndexPath *)indexPath +{ + for (RSTCellContentDataSource *key in self.dataSourceRanges.copy) + { + NSRange range = [[self.dataSourceRanges objectForKey:key] rangeValue]; + + NSInteger index = [self shouldFlattenSections] ? indexPath.item : indexPath.section; + if (NSLocationInRange(index, range)) + { + return key; + } + } + + return nil; +} + +- (NSInteger)sectionForItem:(NSInteger)item dataSource:(RSTCellContentDataSource *)dataSource +{ + NSInteger section = 0; + + NSInteger itemCount = 0; + + for (int i = 0; i < [dataSource numberOfSectionsInContentView:self.contentView]; i++) + { + NSInteger count = [dataSource contentView:self.contentView numberOfItemsInSection:i]; + itemCount += count; + + if (itemCount > item) + { + section = i; + break; + } + } + + return section; +} + +#pragma mark - RSTCellContentDataSource - + +- (NSInteger)numberOfSectionsInContentView:(__kindof UIView *)contentView +{ + if ([self shouldFlattenSections]) + { + return 1; + } + + NSInteger numberOfSections = 0; + for (RSTCellContentDataSource *dataSource in self.dataSources) + { + NSInteger sections = [dataSource numberOfSectionsInContentView:contentView]; + + NSRange range = NSMakeRange(numberOfSections, sections); + [self.dataSourceRanges setObject:@(range) forKey:dataSource]; + + numberOfSections += sections; + } + + return numberOfSections; +} + +- (NSInteger)contentView:(__kindof UIView *)contentView numberOfItemsInSection:(NSInteger)section +{ + if ([self shouldFlattenSections]) + { + NSInteger itemCount = 0; + + for (RSTCellContentDataSource *dataSource in self.dataSources) + { + NSRange range = NSMakeRange(itemCount, dataSource.itemCount); + [self.dataSourceRanges setObject:@(range) forKey:dataSource]; + + itemCount += range.length; + } + + return itemCount; + } + else + { + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section]; + + RSTCellContentDataSource *dataSource = [self dataSourceForIndexPath:indexPath]; + if (dataSource == nil) + { + return 0; + } + + NSIndexPath *localIndexPath = [self dataSource:dataSource localIndexPathForGlobalIndexPath:indexPath]; + + NSInteger numberOfItems = [dataSource contentView:contentView numberOfItemsInSection:localIndexPath.section]; + return numberOfItems; + } +} + +- (id)itemAtIndexPath:(NSIndexPath *)indexPath +{ + RSTCellContentDataSource *dataSource = [self dataSourceForIndexPath:indexPath]; + if (dataSource == nil) + { + @throw [NSException exceptionWithName:NSRangeException reason:nil userInfo:nil]; + } + + NSIndexPath *localIndexPath = [self dataSource:dataSource localIndexPathForGlobalIndexPath:indexPath]; + + id item = [dataSource itemAtIndexPath:localIndexPath]; + return item; +} + +- (void)prefetchItemAtIndexPath:(NSIndexPath *)indexPath completionHandler:(void (^_Nullable)(id prefetchItem, NSError *error))completionHandler +{ + if (self.prefetchHandler != nil) + { + return [super prefetchItemAtIndexPath:indexPath completionHandler:completionHandler]; + } + + RSTCellContentDataSource *dataSource = [self dataSourceForIndexPath:indexPath]; + if (dataSource == nil) + { + @throw [NSException exceptionWithName:NSRangeException reason:nil userInfo:nil]; + } + + NSIndexPath *localIndexPath = [self dataSource:dataSource localIndexPathForGlobalIndexPath:indexPath]; + [dataSource prefetchItemAtIndexPath:localIndexPath completionHandler:completionHandler]; +} + +- (void)filterContentWithPredicate:(nullable NSPredicate *)predicate +{ + for (RSTCellContentDataSource *dataSource in self.dataSources) + { + [dataSource filterContentWithPredicate:predicate]; + } +} + +#pragma mark - - + +- (nullable NSIndexPath *)dataSource:(RSTCellContentDataSource *)dataSource localIndexPathForGlobalIndexPath:(nonnull NSIndexPath *)indexPath +{ + NSValue *rangeValue = [self.dataSourceRanges objectForKey:dataSource]; + if (rangeValue == nil) + { + return nil; + } + + NSRange range = [rangeValue rangeValue]; + + NSIndexPath *localIndexPath = nil; + + if ([self shouldFlattenSections]) + { + NSInteger item = indexPath.item - range.location; + NSInteger section = [self sectionForItem:item dataSource:dataSource]; + + for (int i = 0; i < section; i++) + { + NSInteger count = [dataSource contentView:self.contentView numberOfItemsInSection:i]; + item -= count; + } + + localIndexPath = [NSIndexPath indexPathForItem:item inSection:section]; + } + else + { + localIndexPath = [NSIndexPath indexPathForItem:indexPath.item inSection:indexPath.section - range.location]; + } + + return localIndexPath; +} + +- (nullable NSIndexPath *)dataSource:(RSTCellContentDataSource *)dataSource globalIndexPathForLocalIndexPath:(nonnull NSIndexPath *)indexPath +{ + NSValue *rangeValue = [self.dataSourceRanges objectForKey:dataSource]; + if (rangeValue == nil) + { + return nil; + } + + NSRange range = [rangeValue rangeValue]; + + NSIndexPath *globalIndexPath = nil; + + if ([self shouldFlattenSections]) + { + NSInteger item = indexPath.item; + + for (int i = 0; i < indexPath.section; i++) + { + NSInteger count = [dataSource contentView:self.contentView numberOfItemsInSection:i]; + item += count; + } + + globalIndexPath = [NSIndexPath indexPathForItem:item inSection:0]; + } + else + { + globalIndexPath = [NSIndexPath indexPathForItem:indexPath.item inSection:indexPath.section + range.location]; + } + + if (self.indexPathTranslator != nil) + { + globalIndexPath = [self.indexPathTranslator dataSource:self globalIndexPathForLocalIndexPath:globalIndexPath]; + } + + return globalIndexPath; +} + +#pragma mark - Getters/Setters - + +- (void)setContentView:(UIScrollView *)contentView +{ + [super setContentView:contentView]; + + for (RSTCellContentDataSource *dataSource in self.dataSources) + { + dataSource.contentView = contentView; + } +} + +- (void)setShouldFlattenSections:(BOOL)shouldFlattenSections +{ + if (shouldFlattenSections == _shouldFlattenSections) + { + return; + } + + _shouldFlattenSections = shouldFlattenSections; + + [self.contentView reloadData]; +} + +@end + +@implementation RSTCompositeTableViewDataSource +@end + +@implementation RSTCompositeCollectionViewDataSource +@end + +@implementation RSTCompositePrefetchingDataSource +@dynamic prefetchItemCache; +@dynamic prefetchHandler; +@dynamic prefetchCompletionHandler; + +- (BOOL)isPrefetchingDataSource +{ + return YES; +} + +@end + +@implementation RSTCompositeTableViewPrefetchingDataSource +@end + +@implementation RSTCompositeCollectionViewPrefetchingDataSource +@end diff --git a/Pods/Roxas/Roxas/RSTConstants.h b/Pods/Roxas/Roxas/RSTConstants.h new file mode 100644 index 000000000..482dea394 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTConstants.h @@ -0,0 +1,16 @@ +// +// RSTConstants.h +// Roxas +// +// Created by Riley Testut on 1/23/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#ifndef RSTConstants_h +#define RSTConstants_h + +@import UIKit; + +static UIViewAnimationOptions RSTSystemTransitionAnimationCurve = (7 << 16); + +#endif /* RSTConstants_h */ diff --git a/Pods/Roxas/Roxas/RSTDefines.h b/Pods/Roxas/Roxas/RSTDefines.h new file mode 100644 index 000000000..c94c9c48f --- /dev/null +++ b/Pods/Roxas/Roxas/RSTDefines.h @@ -0,0 +1,38 @@ +// +// RSTDefines.h +// Roxas +// +// Created by Riley Testut on 12/6/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +#ifndef Roxas_RSTDefines_h +#define Roxas_RSTDefines_h + +#if defined(__cplusplus) +#define RST_EXTERN extern "C" +#else +#define RST_EXTERN extern +#endif + +/*** Logging ***/ + +// http://stackoverflow.com/questions/969130/how-to-print-out-the-method-name-and-line-number-and-conditionally-disable-nslog +#ifdef DEBUG +# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) +#else +# define DLog(...) +#endif + +// ALog always displays output regardless of the DEBUG setting +#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) + +#ifdef DEBUG +# define ULog(fmt, ...) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%s\n [Line %d] ", __PRETTY_FUNCTION__, __LINE__] message:[NSString stringWithFormat:fmt, ##__VA_ARGS__] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } +#else +# define ULog(...) +#endif + +#define ELog(error) NSLog(@"%s [Line %d] Error:\n%@\n%@\n%@", __PRETTY_FUNCTION__, __LINE__, [error localizedDescription], [error localizedRecoverySuggestion], [error userInfo]) + +#endif diff --git a/Pods/Roxas/Roxas/RSTDynamicDataSource.h b/Pods/Roxas/Roxas/RSTDynamicDataSource.h new file mode 100644 index 000000000..cb36fd835 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTDynamicDataSource.h @@ -0,0 +1,50 @@ +// +// RSTDynamicDataSource.h +// Roxas +// +// Created by Riley Testut on 1/2/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTCellContentDataSource.h" +#import "RSTCellContentPrefetchingDataSource.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTDynamicDataSource *, ViewType: UIScrollView *, DataSourceType> : RSTCellContentDataSource + +@property (copy, nonatomic) NSInteger (^numberOfSectionsHandler)(void); +@property (copy, nonatomic) NSInteger (^numberOfItemsHandler)(NSInteger section); + +@end + +@interface RSTDynamicPrefetchingDataSource *, ViewType: UIScrollView *, DataSourceType, PrefetchContentType> : RSTDynamicDataSource + +@property (nonatomic) NSCache *prefetchItemCache; + +@property (nullable, copy, nonatomic) NSOperation *_Nullable (^prefetchHandler)(ContentType item, NSIndexPath *indexPath, void (^completionHandler)(_Nullable PrefetchContentType item, NSError *_Nullable error)); +@property (nullable, copy, nonatomic) void (^prefetchCompletionHandler)(CellType cell, _Nullable PrefetchContentType item, NSIndexPath *indexPath, NSError *_Nullable error); + +@end + +NS_ASSUME_NONNULL_END + + +// Concrete Subclasses + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTDynamicTableViewDataSource : RSTDynamicDataSource> +@end + +@interface RSTDynamicCollectionViewDataSource : RSTDynamicDataSource> +@end + + +@interface RSTDynamicTableViewPrefetchingDataSource : RSTDynamicPrefetchingDataSource, PrefetchContentType> +@end + +@interface RSTDynamicCollectionViewPrefetchingDataSource : RSTDynamicPrefetchingDataSource, PrefetchContentType> +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTDynamicDataSource.m b/Pods/Roxas/Roxas/RSTDynamicDataSource.m new file mode 100644 index 000000000..41a43a59c --- /dev/null +++ b/Pods/Roxas/Roxas/RSTDynamicDataSource.m @@ -0,0 +1,96 @@ +// +// RSTDynamicDataSource.m +// Roxas +// +// Created by Riley Testut on 1/2/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTDynamicDataSource.h" +#import "RSTCellContentDataSource_Subclasses.h" + +@interface RSTPlaceholderItem : NSProxy +@end + +@implementation RSTPlaceholderItem + +- (instancetype)init +{ + return self; +} + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + @throw [NSException exceptionWithName:@"Accessed placeholder item." reason:@"You cannot access the provided item in RSTDynamicDataSource's cellConfigurationHandler." userInfo:nil]; +} + +@end + +@implementation RSTDynamicDataSource + +- (instancetype)init +{ + self = [super init]; + if (self) + { + _numberOfSectionsHandler = [^NSInteger (void) { + return 0; + } copy]; + + _numberOfItemsHandler = [^NSInteger (NSInteger section) { + return 0; + } copy]; + } + + return self; +} + +#pragma mark - RSTCellContentDataSource - + +- (NSInteger)numberOfSectionsInContentView:(__kindof UIScrollView *)contentView +{ + NSInteger numberOfSections = self.numberOfSectionsHandler(); + return numberOfSections; +} + +- (NSInteger)contentView:(__kindof UIScrollView *)contentView numberOfItemsInSection:(NSInteger)section +{ + NSInteger numberOfItems = self.numberOfItemsHandler(section); + return numberOfItems; +} + +- (id)itemAtIndexPath:(NSIndexPath *)indexPath +{ + RSTPlaceholderItem *placeholder = [[RSTPlaceholderItem alloc] init]; + return placeholder; +} + +- (void)filterContentWithPredicate:(NSPredicate *)predicate +{ +} + +@end + +@implementation RSTDynamicTableViewDataSource +@end + +@implementation RSTDynamicCollectionViewDataSource +@end + +@implementation RSTDynamicPrefetchingDataSource +@dynamic prefetchItemCache; +@dynamic prefetchHandler; +@dynamic prefetchCompletionHandler; + +- (BOOL)isPrefetchingDataSource +{ + return YES; +} + +@end + +@implementation RSTDynamicTableViewPrefetchingDataSource +@end + +@implementation RSTDynamicCollectionViewPrefetchingDataSource +@end diff --git a/Pods/Roxas/Roxas/RSTError.h b/Pods/Roxas/Roxas/RSTError.h new file mode 100644 index 000000000..24abe2cea --- /dev/null +++ b/Pods/Roxas/Roxas/RSTError.h @@ -0,0 +1,25 @@ +// +// RSTError.h +// Roxas +// +// Created by Riley Testut on 1/30/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +@import Foundation; + +extern NSErrorDomain const RoxasErrorDomain; + +typedef NS_ERROR_ENUM(RoxasErrorDomain, RSTError) +{ + RSTErrorMissingManagedObjectModel = -23, + RSTErrorMissingMappingModel = -24, + RSTErrorMissingPersistentStore = -25, +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSError (Roxas) +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTError.m b/Pods/Roxas/Roxas/RSTError.m new file mode 100644 index 000000000..8749c8857 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTError.m @@ -0,0 +1,44 @@ +// +// RSTError.m +// Roxas +// +// Created by Riley Testut on 1/30/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +#import "RSTError.h" + +NSErrorDomain const RoxasErrorDomain = @"com.rileytestut.Roxas"; + +@implementation NSError (Roxas) + ++ (void)load +{ + [NSError setUserInfoValueProviderForDomain:RoxasErrorDomain provider:^id _Nullable(NSError * _Nonnull error, NSErrorUserInfoKey _Nonnull userInfoKey) { + if ([userInfoKey isEqualToString:NSLocalizedDescriptionKey]) + { + return [error rst_localizedDescription]; + } + + return nil; + }]; +} + +- (nullable NSString *)rst_localizedDescription +{ + switch (self.code) + { + case RSTErrorMissingManagedObjectModel: + return NSLocalizedString(@"Unable to find any managed object models.", @""); + + case RSTErrorMissingMappingModel: + return NSLocalizedString(@"Unable to find a valid mapping model.", @""); + + case RSTErrorMissingPersistentStore: + return NSLocalizedString(@"Unable to find a persistent store.", @""); + } + + return nil; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTFetchedResultsDataSource.h b/Pods/Roxas/Roxas/RSTFetchedResultsDataSource.h new file mode 100644 index 000000000..d1a8824fe --- /dev/null +++ b/Pods/Roxas/Roxas/RSTFetchedResultsDataSource.h @@ -0,0 +1,59 @@ +// +// RSTFetchedResultsDataSource.h +// Roxas +// +// Created by Riley Testut on 8/12/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTCellContentDataSource.h" +#import "RSTCellContentPrefetchingDataSource.h" + +@import CoreData; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTFetchedResultsDataSource *, ViewType: UIScrollView *, DataSourceType> : RSTCellContentDataSource + +@property (nonatomic) NSInteger liveFetchLimit; + +@property (nonatomic) NSFetchedResultsController *fetchedResultsController; + +- (instancetype)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)managedObjectContext; +- (instancetype)initWithFetchedResultsController:(NSFetchedResultsController *)fetchedResultsController NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +@end + + +@interface RSTFetchedResultsPrefetchingDataSource *, ViewType: UIScrollView *, DataSourceType, PrefetchContentType> : RSTFetchedResultsDataSource + +@property (nonatomic) NSCache *prefetchItemCache; + +@property (nullable, copy, nonatomic) NSOperation *_Nullable (^prefetchHandler)(ContentType item, NSIndexPath *indexPath, void (^completionHandler)(_Nullable PrefetchContentType item, NSError *_Nullable error)); +@property (nullable, copy, nonatomic) void (^prefetchCompletionHandler)(CellType cell, _Nullable PrefetchContentType item, NSIndexPath *indexPath, NSError *_Nullable error); + +@end + +NS_ASSUME_NONNULL_END + + +// Concrete Subclasses + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTFetchedResultsTableViewDataSource : RSTFetchedResultsDataSource> +@end + +@interface RSTFetchedResultsCollectionViewDataSource : RSTFetchedResultsDataSource> +@end + + +@interface RSTFetchedResultsTableViewPrefetchingDataSource : RSTFetchedResultsPrefetchingDataSource, PrefetchContentType> +@end + +@interface RSTFetchedResultsCollectionViewPrefetchingDataSource : RSTFetchedResultsPrefetchingDataSource, PrefetchContentType> +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTFetchedResultsDataSource.m b/Pods/Roxas/Roxas/RSTFetchedResultsDataSource.m new file mode 100644 index 000000000..bcb356578 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTFetchedResultsDataSource.m @@ -0,0 +1,420 @@ +// +// RSTFetchedResultsDataSource.m +// Roxas +// +// Created by Riley Testut on 8/12/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTFetchedResultsDataSource.h" +#import "RSTCellContentDataSource_Subclasses.h" + +#import "RSTBlockOperation.h" +#import "RSTSearchController.h" + +#import "RSTHelperFile.h" + +static void *RSTFetchedResultsDataSourceContext = &RSTFetchedResultsDataSourceContext; + + +NS_ASSUME_NONNULL_BEGIN + +// Declare custom NSPredicate subclass so we can detect whether NSFetchedResultsController's predicate was changed externally or by us. +@interface RSTProxyPredicate : NSCompoundPredicate + +- (instancetype)initWithPredicate:(nullable NSPredicate *)predicate externalPredicate:(nullable NSPredicate *)externalPredicate; + +@end + +NS_ASSUME_NONNULL_END + + +@implementation RSTProxyPredicate + +- (instancetype)initWithPredicate:(nullable NSPredicate *)predicate externalPredicate:(nullable NSPredicate *)externalPredicate +{ + NSMutableArray *subpredicates = [NSMutableArray array]; + + if (externalPredicate != nil) + { + [subpredicates addObject:externalPredicate]; + } + + if (predicate != nil) + { + [subpredicates addObject:predicate]; + } + + self = [super initWithType:NSAndPredicateType subpredicates:subpredicates]; + return self; +} + +@end + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTFetchedResultsDataSource () + +@property (nonatomic, copy, nullable) NSPredicate *externalPredicate; + +@end + +NS_ASSUME_NONNULL_END + + +@implementation RSTFetchedResultsDataSource + +- (instancetype)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)managedObjectContext +{ + NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; + + self = [self initWithFetchedResultsController:fetchedResultsController]; + return self; +} + +- (instancetype)initWithFetchedResultsController:(NSFetchedResultsController *)fetchedResultsController +{ + self = [super init]; + if (self) + { + [self setFetchedResultsController:fetchedResultsController]; + + __weak RSTFetchedResultsDataSource *weakSelf = self; + self.defaultSearchHandler = ^NSOperation *(RSTSearchValue *searchValue, RSTSearchValue *previousSearchValue) { + return [RSTBlockOperation blockOperationWithExecutionBlock:^(RSTBlockOperation * _Nonnull __weak operation) { + [weakSelf setPredicate:searchValue.predicate refreshContent:NO]; + + // Only refresh content if search operation has not been cancelled, such as when the search text changes. + if (operation != nil && ![operation isCancelled]) + { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf.contentView reloadData]; + }); + } + }]; + }; + } + + return self; +} + +- (void)dealloc +{ + [_fetchedResultsController removeObserver:self forKeyPath:@"fetchRequest.predicate" context:RSTFetchedResultsDataSourceContext]; +} + +#pragma mark - RSTCellContentViewDataSource - + +- (id)itemAtIndexPath:(NSIndexPath *)indexPath +{ + id item = [self.fetchedResultsController objectAtIndexPath:indexPath]; + return item; +} + +- (NSInteger)numberOfSectionsInContentView:(__kindof UIView *)contentView +{ + if (self.fetchedResultsController.sections == nil) + { + NSError *error = nil; + if (![self.fetchedResultsController performFetch:&error]) + { + ELog(error); + } + } + + NSInteger numberOfSections = self.fetchedResultsController.sections.count; + return numberOfSections; +} + +- (NSInteger)contentView:(__kindof UIView *)contentView numberOfItemsInSection:(NSInteger)section +{ + id sectionInfo = self.fetchedResultsController.sections[section]; + + if (self.liveFetchLimit == 0) + { + return sectionInfo.numberOfObjects; + } + else + { + return MIN(sectionInfo.numberOfObjects, self.liveFetchLimit); + } +} + +- (void)filterContentWithPredicate:(nullable NSPredicate *)predicate +{ + RSTProxyPredicate *proxyPredicate = [[RSTProxyPredicate alloc] initWithPredicate:predicate externalPredicate:self.externalPredicate]; + self.fetchedResultsController.fetchRequest.predicate = proxyPredicate; + + NSError *error = nil; + if (![self.fetchedResultsController performFetch:&error]) + { + ELog(error); + } +} + +#pragma mark - KVO - + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (context != RSTFetchedResultsDataSourceContext) + { + return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } + + NSPredicate *predicate = change[NSKeyValueChangeNewKey]; + if (![predicate isKindOfClass:[RSTProxyPredicate class]]) + { + self.externalPredicate = predicate; + + RSTProxyPredicate *proxyPredicate = [[RSTProxyPredicate alloc] initWithPredicate:self.predicate externalPredicate:self.externalPredicate]; + [[(NSFetchedResultsController *)object fetchRequest] setPredicate:proxyPredicate]; + } +} + +#pragma mark - - + +- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller +{ + if (self.contentView.window == nil) + { + // Don't update content view if it's not in window hierarchy. + return; + } + + [self.contentView beginUpdates]; +} + +- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type +{ + if (self.contentView.window == nil) + { + return; + } + + RSTCellContentChangeType changeType = RSTCellContentChangeTypeFromFetchedResultsChangeType(type); + + RSTCellContentChange *change = [[RSTCellContentChange alloc] initWithType:changeType sectionIndex:sectionIndex]; + change.rowAnimation = self.rowAnimation; + [self addChange:change]; +} + +- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath +{ + if (self.contentView.window == nil) + { + return; + } + + RSTCellContentChangeType changeType = RSTCellContentChangeTypeFromFetchedResultsChangeType(type); + + RSTCellContentChange *change = nil; + + if (type == NSFetchedResultsChangeUpdate && ![indexPath isEqual:newIndexPath]) + { + // Sometimes NSFetchedResultsController incorrectly reports moves as updates with different index paths. + // This can cause assertion failures and strange UI issues. + // To compensate, we manually check for these "updates" and turn them into moves. + change = [[RSTCellContentChange alloc] initWithType:RSTCellContentChangeMove currentIndexPath:indexPath destinationIndexPath:newIndexPath]; + } + else + { + change = [[RSTCellContentChange alloc] initWithType:changeType currentIndexPath:indexPath destinationIndexPath:newIndexPath]; + } + + change.rowAnimation = self.rowAnimation; + + if (self.liveFetchLimit > 0) + { + NSInteger itemCount = self.itemCount; + + switch (change.type) + { + case RSTCellContentChangeInsert: + if (newIndexPath.item >= self.liveFetchLimit) + { + return; + } + + break; + + case RSTCellContentChangeDelete: + if (indexPath.item >= self.liveFetchLimit) + { + return; + } + + if (itemCount >= self.liveFetchLimit) + { + // Unlike insertions, deletions don't also report the items that moved. + // To ensure consistency, we manually insert an item previously hidden by fetch limit. + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.liveFetchLimit - 1 inSection:0]; + + RSTCellContentChange *change = [[RSTCellContentChange alloc] initWithType:RSTCellContentChangeInsert currentIndexPath:nil destinationIndexPath:indexPath]; + [self.contentView addChange:change]; + } + + break; + + case RSTCellContentChangeUpdate: + if (indexPath.item >= self.liveFetchLimit) + { + return; + } + + break; + + case RSTCellContentChangeMove: + if (indexPath.item >= self.liveFetchLimit && newIndexPath.item >= self.liveFetchLimit) + { + return; + } + else if (indexPath.item >= self.liveFetchLimit && newIndexPath.item < self.liveFetchLimit) + { + change = [[RSTCellContentChange alloc] initWithType:RSTCellContentChangeInsert currentIndexPath:nil destinationIndexPath:newIndexPath]; + } + else if (indexPath.item < self.liveFetchLimit && newIndexPath.item >= self.liveFetchLimit) + { + change = [[RSTCellContentChange alloc] initWithType:RSTCellContentChangeDelete currentIndexPath:indexPath destinationIndexPath:nil]; + } + + break; + } + } + + [self addChange:change]; +} + +- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller +{ + if (self.contentView.window == nil) + { + // Don't update content view if it's not in window hierarchy. + return; + } + + [self.contentView endUpdates]; +} + +#pragma mark - Getters/Setters - + +- (void)setFetchedResultsController:(NSFetchedResultsController *)fetchedResultsController +{ + if (fetchedResultsController == _fetchedResultsController) + { + return; + } + + // Clean up previous _fetchedResultsController. + [_fetchedResultsController removeObserver:self forKeyPath:@"fetchRequest.predicate" context:RSTFetchedResultsDataSourceContext]; + + _fetchedResultsController.fetchRequest.predicate = self.externalPredicate; + self.externalPredicate = nil; + + + // Prepare new _fetchedResultsController. + _fetchedResultsController = fetchedResultsController; + + if (_fetchedResultsController.delegate == nil) + { + _fetchedResultsController.delegate = self; + } + + self.externalPredicate = _fetchedResultsController.fetchRequest.predicate; + + RSTProxyPredicate *proxyPredicate = [[RSTProxyPredicate alloc] initWithPredicate:self.predicate externalPredicate:self.externalPredicate]; + _fetchedResultsController.fetchRequest.predicate = proxyPredicate; + + [_fetchedResultsController addObserver:self forKeyPath:@"fetchRequest.predicate" options:NSKeyValueObservingOptionNew context:RSTFetchedResultsDataSourceContext]; + + rst_dispatch_sync_on_main_thread(^{ + [self.contentView reloadData]; + }); +} + +- (void)setLiveFetchLimit:(NSInteger)liveFetchLimit +{ + if (liveFetchLimit == _liveFetchLimit) + { + return; + } + + NSInteger previousLiveFetchLimit = _liveFetchLimit; + _liveFetchLimit = liveFetchLimit; + + // Turn 0 -> NSIntegerMax to simplify calculations. + if (liveFetchLimit == 0) + { + liveFetchLimit = NSIntegerMax; + } + + if (previousLiveFetchLimit == 0) + { + previousLiveFetchLimit = NSIntegerMax; + } + + [self.contentView beginUpdates]; + + id sectionInfo = self.fetchedResultsController.sections.firstObject; + NSInteger itemCount = sectionInfo.numberOfObjects; + + if (liveFetchLimit > previousLiveFetchLimit) + { + for (NSInteger i = previousLiveFetchLimit; i < itemCount; i++) + { + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; + + RSTCellContentChange *change = [[RSTCellContentChange alloc] initWithType:RSTCellContentChangeInsert currentIndexPath:nil destinationIndexPath:indexPath]; + [self addChange:change]; + } + } + else + { + for (NSInteger i = liveFetchLimit; i < itemCount && i < previousLiveFetchLimit; i++) + { + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; + + RSTCellContentChange *change = [[RSTCellContentChange alloc] initWithType:RSTCellContentChangeDelete currentIndexPath:indexPath destinationIndexPath:nil]; + [self addChange:change]; + } + } + + [self.contentView endUpdates]; +} + +- (NSInteger)itemCount +{ + if (self.fetchedResultsController.fetchedObjects == nil) + { + return [super itemCount]; + } + + NSUInteger itemCount = self.fetchedResultsController.fetchedObjects.count; + return itemCount; +} + +@end + +@implementation RSTFetchedResultsTableViewDataSource +@end + +@implementation RSTFetchedResultsCollectionViewDataSource +@end + +@implementation RSTFetchedResultsPrefetchingDataSource +@dynamic prefetchItemCache; +@dynamic prefetchHandler; +@dynamic prefetchCompletionHandler; + +- (BOOL)isPrefetchingDataSource +{ + return YES; +} + +@end + +@implementation RSTFetchedResultsTableViewPrefetchingDataSource +@end + +@implementation RSTFetchedResultsCollectionViewPrefetchingDataSource +@end diff --git a/Pods/Roxas/Roxas/RSTHasher.h b/Pods/Roxas/Roxas/RSTHasher.h new file mode 100644 index 000000000..a92e9bbf3 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTHasher.h @@ -0,0 +1,22 @@ +// +// RSTHasher.h +// Roxas +// +// Created by Riley Testut on 11/7/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import Foundation; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTHasher : NSObject + ++ (nullable NSString *)sha1HashOfFileAtURL:(NSURL *)fileURL error:(NSError **)error; ++ (NSString *)sha1HashOfData:(NSData *)data; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTHasher.m b/Pods/Roxas/Roxas/RSTHasher.m new file mode 100644 index 000000000..731787d7a --- /dev/null +++ b/Pods/Roxas/Roxas/RSTHasher.m @@ -0,0 +1,75 @@ +// +// RSTHasher.m +// Roxas +// +// Created by Riley Testut on 11/7/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTHasher.h" + +@import CommonCrypto; + +@implementation RSTHasher + ++ (nullable NSString *)sha1HashOfFileAtURL:(NSURL *)fileURL error:(NSError * _Nullable __autoreleasing * _Nullable)error +{ + NSInteger bufferSize = 1024 * 1024; + + NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:fileURL error:error]; + if (fileHandle == nil) + { + return nil; + } + + CC_SHA1_CTX context; + CC_SHA1_Init(&context); + + while (true) + { + @autoreleasepool + { + NSData *data = [fileHandle readDataOfLength:bufferSize]; + if (data.length == 0) + { + break; + } + + CC_SHA1_Update(&context, [data bytes], (unsigned int)data.length); + } + } + + unsigned char digest[CC_SHA1_DIGEST_LENGTH]; + CC_SHA1_Final(digest, &context); + + NSString *hashString = [RSTHasher hashStringFromDigest:digest]; + return hashString; +} + ++ (NSString *)sha1HashOfData:(NSData *)data +{ + CC_SHA1_CTX context; + CC_SHA1_Init(&context); + + CC_SHA1_Update(&context, [data bytes], (unsigned int)data.length); + + unsigned char digest[CC_SHA1_DIGEST_LENGTH]; + CC_SHA1_Final(digest, &context); + + NSString *hashString = [RSTHasher hashStringFromDigest:digest]; + return hashString; +} + ++ (NSString *)hashStringFromDigest:(unsigned char[CC_SHA1_DIGEST_LENGTH])digest +{ + NSMutableString *hashString = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; + + for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) + { + [hashString appendFormat:@"%02x", digest[i]]; + } + + return [hashString copy]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTHelperFile.h b/Pods/Roxas/Roxas/RSTHelperFile.h new file mode 100644 index 000000000..7c87490bb --- /dev/null +++ b/Pods/Roxas/Roxas/RSTHelperFile.h @@ -0,0 +1,51 @@ +// +// RSTHelperFile.h +// Hoot +// +// Created by Riley Testut on 3/16/13. +// Copyright (c) 2013 Riley Testut. All rights reserved. +// + +#import "RSTNavigationController.h" + +@import UIKit; + +/*** Math ***/ + +static inline CGFloat RSTDegreesFromRadians(CGFloat radians) +{ + return radians * (180.0 / M_PI); +} + +static inline CGFloat RSTRadiansFromDegrees(CGFloat degrees) +{ + return (degrees * M_PI) / 180.0; +} + +static inline BOOL CGFloatEqualToFloat(CGFloat float1, CGFloat float2) +{ + if (float1 == float2) + { + return YES; + } + + if (ABS(float1 - float2) < FLT_EPSILON) + { + return YES; + } + + return NO; +} + +/*** Private Debugging ***/ + +// Daniel Eggert, http://www.objc.io/issue-2/low-level-concurrency-apis.html +// Returns average number of nanoseconds needed to perform task +RST_EXTERN uint64_t rst_benchmark(size_t count, void (^block)(void)); + + +/*** Concurrency ***/ + +RST_EXTERN void rst_dispatch_sync_on_main_thread(dispatch_block_t block); +RST_EXTERN UIBackgroundTaskIdentifier RSTBeginBackgroundTask(NSString *name); +RST_EXTERN void RSTEndBackgroundTask(UIBackgroundTaskIdentifier backgroundTask); diff --git a/Pods/Roxas/Roxas/RSTHelperFile.m b/Pods/Roxas/Roxas/RSTHelperFile.m new file mode 100644 index 000000000..4afdfccb1 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTHelperFile.m @@ -0,0 +1,57 @@ +// +// RSTHelperFile.m +// Hoot +// +// Created by Riley Testut on 3/16/13. +// Copyright (c) 2013 Riley Testut. All rights reserved. +// + +#import "RSTHelperFile.h" + +#ifdef DEBUG + +uint64_t dispatch_benchmark(size_t count, void (^block)(void)); + +uint64_t rst_benchmark(size_t count, void (^block)(void)) +{ + return dispatch_benchmark(count, block);; +} + +#else + +uint64_t rst_benchmark(size_t count, void (^block)(void)) +{ + return 0; +} + +#endif + +void rst_dispatch_sync_on_main_thread(dispatch_block_t block) +{ + if ([NSThread isMainThread]) + { + if (block) + { + block(); + } + } + else + { + dispatch_sync(dispatch_get_main_queue(), block); + } +} + +UIBackgroundTaskIdentifier RSTBeginBackgroundTask(NSString *name) +{ + __block UIBackgroundTaskIdentifier backgroundTask = [[[UIApplication class] sharedApplication] beginBackgroundTaskWithName:name expirationHandler:^{ + RSTEndBackgroundTask(backgroundTask); + }]; + + return backgroundTask; +}; + +void RSTEndBackgroundTask(UIBackgroundTaskIdentifier backgroundTask) +{ + [[[UIApplication class] sharedApplication] endBackgroundTask:backgroundTask]; + backgroundTask = UIBackgroundTaskInvalid; +} \ No newline at end of file diff --git a/Pods/Roxas/Roxas/RSTLaunchViewController.h b/Pods/Roxas/Roxas/RSTLaunchViewController.h new file mode 100644 index 000000000..3437539ef --- /dev/null +++ b/Pods/Roxas/Roxas/RSTLaunchViewController.h @@ -0,0 +1,40 @@ +// +// RSTLaunchViewController.h +// Roxas +// +// Created by Riley Testut on 3/24/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTLaunchCondition : NSObject + +@property (nonatomic, copy, readonly) BOOL (^condition)(void); +@property (nonatomic, copy, readonly) void (^action)(void (^completionHandler)(NSError *_Nullable error)); + +- (instancetype)initWithCondition:(BOOL (^)(void))condition action:(void (^)(void (^completionHandler)(NSError *_Nullable error)))action; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTLaunchViewController : UIViewController + +@property (nonatomic, readonly) NSArray *launchConditions; + +- (void)handleLaunchConditions; +- (void)handleLaunchError:(NSError *)error; + +- (void)finishLaunching; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTLaunchViewController.m b/Pods/Roxas/Roxas/RSTLaunchViewController.m new file mode 100644 index 000000000..a4b16fd11 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTLaunchViewController.m @@ -0,0 +1,148 @@ +// +// RSTLaunchViewController.m +// Roxas +// +// Created by Riley Testut on 3/24/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTLaunchViewController.h" +#import "RSTHelperFile.h" +#import "NSLayoutConstraint+Edges.h" + +@implementation RSTLaunchCondition + +- (instancetype)initWithCondition:(BOOL (^)(void))condition action:(void (^)(void (^completionHandler)(NSError *_Nullable error)))action +{ + self = [super init]; + if (self) + { + _condition = [condition copy]; + _action = [action copy]; + } + + return self; +} + +@end + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTLaunchViewController () + +@property (nonatomic, nullable) UIView *launchView; + +@end + +NS_ASSUME_NONNULL_END + + +@implementation RSTLaunchViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + NSString *storyboardName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UILaunchStoryboardName"]; + if (storyboardName == nil) + { + return; + } + + if ([[NSBundle mainBundle] URLForResource:storyboardName withExtension:@"nib"] != nil) + { + UINib *launchNib = [UINib nibWithNibName:storyboardName bundle:[NSBundle mainBundle]]; + + NSArray *objects = [launchNib instantiateWithOwner:nil options:nil]; + + for (UIView *view in objects) + { + if ([view isKindOfClass:[UIView class]]) + { + self.launchView = view; + break; + } + } + } + else + { + UIStoryboard *launchStoryboard = [UIStoryboard storyboardWithName:storyboardName bundle:[NSBundle mainBundle]]; + + UIViewController *initialViewController = [launchStoryboard instantiateInitialViewController]; + self.launchView = initialViewController.view; + } + + if (self.launchView == nil) + { + return; + } + + [self.view addSubview:self.launchView pinningEdgesWithInsets:UIEdgeInsetsZero]; + [self.view sendSubviewToBack:self.launchView]; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + [self handleLaunchConditions]; +} + +#pragma mark - RSTLaunchViewController - + +- (void)handleLaunchConditions +{ + [self handleLaunchConditionAtIndex:0]; +} + +- (void)handleLaunchConditionAtIndex:(NSInteger)index +{ + if (![NSThread isMainThread]) + { + dispatch_async(dispatch_get_main_queue(), ^{ + [self handleLaunchConditionAtIndex:index]; + }); + + return; + } + + if (index >= self.launchConditions.count) + { + [self finishLaunching]; + + return; + } + + RSTLaunchCondition *condition = self.launchConditions[index]; + + if (condition.condition()) + { + [self handleLaunchConditionAtIndex:index + 1]; + } + else + { + condition.action(^(NSError *_Nullable error) { + if (error != nil) + { + rst_dispatch_sync_on_main_thread(^{ + [self handleLaunchError:error]; + }); + + return; + } + + [self handleLaunchConditionAtIndex:index + 1]; + }); + } +} + +- (void)handleLaunchError:(NSError *)error +{ + DLog(@"Launch Error: %@", [error localizedDescription]); +} + +- (void)finishLaunching +{ +} + +@end diff --git a/Pods/Roxas/Roxas/RSTLoadOperation.h b/Pods/Roxas/Roxas/RSTLoadOperation.h new file mode 100644 index 000000000..2cefb1233 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTLoadOperation.h @@ -0,0 +1,29 @@ +// +// RSTLoadOperation.h +// Roxas +// +// Created by Riley Testut on 2/21/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTLoadOperation : RSTOperation + +@property (nullable, nonatomic) CacheKeyType cacheKey; + +@property (copy, nonatomic) void (^resultHandler)(_Nullable ResultType, NSError *_Nullable); +@property (nullable, nonatomic) NSCache *resultsCache; + +- (instancetype)initWithCacheKey:(nullable CacheKeyType)cacheKey NS_DESIGNATED_INITIALIZER; + +// Overridden by subclasses to return result. +- (void)loadResultWithCompletion:(void (^)(_Nullable ResultType, NSError *_Nullable))completion; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTLoadOperation.m b/Pods/Roxas/Roxas/RSTLoadOperation.m new file mode 100644 index 000000000..844243e49 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTLoadOperation.m @@ -0,0 +1,110 @@ +// +// RSTLoadOperation.m +// Roxas +// +// Created by Riley Testut on 2/21/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTLoadOperation.h" +#import "RSTOperation_Subclasses.h" + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTLoadOperation () + +@property (nullable, strong, nonatomic) id result; +@property (nullable, strong, nonatomic) id error; + +@end + +NS_ASSUME_NONNULL_END + + +@implementation RSTLoadOperation + +- (instancetype)initWithCacheKey:(id)cacheKey +{ + self = [super init]; + if (self) + { + _cacheKey = cacheKey; + } + + return self; +} + +- (void)main +{ + id cachedResult = nil; + if (self.cacheKey) + { + cachedResult = [self.resultsCache objectForKey:self.cacheKey]; + } + + if (cachedResult) + { + self.result = cachedResult; + + if ([self isAsynchronous]) + { + [self finish]; + } + + return; + } + + [self loadResultWithCompletion:^(id _Nullable result, NSError *_Nullable error) { + + if ([self isCancelled]) + { + return; + } + + self.result = result; + self.error = error; + + if (self.result && self.cacheKey) + { + [self.resultsCache setObject:result forKey:self.cacheKey]; + } + + if ([self isAsynchronous]) + { + [self finish]; + } + }]; +} + +- (void)loadResultWithCompletion:(void (^)(id _Nullable, NSError *_Nullable error))completion +{ + completion(nil, nil); +} + +- (void)finish +{ + [super finish]; + + if (self.resultHandler) + { + self.resultHandler(self.result, self.error); + } +} + +#pragma mark - Getters/Setters - + +- (void)setResultsCache:(NSCache *)resultsCache +{ + _resultsCache = resultsCache; + + if (self.cacheKey && [_resultsCache objectForKey:self.cacheKey]) + { + // Ensures if an item is cached, it will be returned immediately. + // This is useful to prevent temporary flashes of placeholder images. + self.immediate = YES; + } +} + +@end diff --git a/Pods/Roxas/Roxas/RSTNavigationController.h b/Pods/Roxas/Roxas/RSTNavigationController.h new file mode 100644 index 000000000..db06c7df0 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTNavigationController.h @@ -0,0 +1,15 @@ +// +// RSTNavigationController.h +// Roxas +// +// Created by Riley Testut on 11/5/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +@import UIKit; + +@interface RSTNavigationController : UINavigationController + +@end + +RST_EXTERN RSTNavigationController *RSTContainInNavigationController(UIViewController *viewController); diff --git a/Pods/Roxas/Roxas/RSTNavigationController.m b/Pods/Roxas/Roxas/RSTNavigationController.m new file mode 100644 index 000000000..a452e17c4 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTNavigationController.m @@ -0,0 +1,53 @@ +// +// RSTNavigationController.m +// Roxas +// +// Created by Riley Testut on 11/5/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +#import "RSTNavigationController.h" + +@interface RSTNavigationController () + +@end + +@implementation RSTNavigationController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - Rotation - + +- (BOOL)shouldAutorotate +{ + return [self.topViewController shouldAutorotate]; +} + +- (UIInterfaceOrientationMask)supportedInterfaceOrientations +{ + return [self.topViewController supportedInterfaceOrientations]; +} + +- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation +{ + return [self.topViewController preferredInterfaceOrientationForPresentation]; +} + +@end + + +RSTNavigationController *RSTContainInNavigationController(UIViewController *viewController) +{ + RSTNavigationController *navigationController = [[RSTNavigationController alloc] initWithRootViewController:viewController]; + return navigationController; +} \ No newline at end of file diff --git a/Pods/Roxas/Roxas/RSTNibView.h b/Pods/Roxas/Roxas/RSTNibView.h new file mode 100644 index 000000000..1ac73271d --- /dev/null +++ b/Pods/Roxas/Roxas/RSTNibView.h @@ -0,0 +1,16 @@ +// +// RSTNibView.h +// Roxas +// +// Created by Riley Testut on 8/23/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTNibView : UIView +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTNibView.m b/Pods/Roxas/Roxas/RSTNibView.m new file mode 100644 index 000000000..859bd23c8 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTNibView.m @@ -0,0 +1,54 @@ +// +// RSTNibView.m +// Roxas +// +// Created by Riley Testut on 8/23/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTNibView.h" + +#import "NSLayoutConstraint+Edges.h" + +@implementation RSTNibView + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + [self initializeFromNib]; + } + + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self initializeFromNib]; + } + + return self; +} + +- (void)initializeFromNib +{ + NSString *name = NSStringFromClass(self.class); + + NSArray *components = [name componentsSeparatedByString:@"."]; + name = [components lastObject]; + + UINib *nib = [UINib nibWithNibName:name bundle:[NSBundle bundleForClass:self.class]]; + NSArray *views = [nib instantiateWithOwner:self options:nil]; + + UIView *nibView = [views firstObject]; + NSAssert(nibView != nil && [nibView isKindOfClass:[UIView class]], @"The nib for %@ must contain a root UIView.", name); + + nibView.preservesSuperviewLayoutMargins = YES; + [self addSubview:nibView pinningEdgesWithInsets:UIEdgeInsetsZero]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTOperation.h b/Pods/Roxas/Roxas/RSTOperation.h new file mode 100644 index 000000000..4c33590c6 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTOperation.h @@ -0,0 +1,18 @@ +// +// RSTOperation.h +// Roxas +// +// Created by Riley Testut on 3/14/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +@import Foundation; + +@interface RSTOperation : NSOperation + +// Immediate operations, when added to an RSTOperationQueue, are performed immediately and synchronously. +// Essentially, immediate operations act the same as if they were synchronous operations started outside of an operation queue. +// Because of this, they block whatever thread they were added to the operation queue on, so be careful! +@property (nonatomic, getter=isImmediate) BOOL immediate; + +@end diff --git a/Pods/Roxas/Roxas/RSTOperation.m b/Pods/Roxas/Roxas/RSTOperation.m new file mode 100644 index 000000000..55b94e4c7 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTOperation.m @@ -0,0 +1,124 @@ +// +// RSTOperation.m +// Roxas +// +// Created by Riley Testut on 3/14/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTOperation.h" +#import "RSTOperation_Subclasses.h" + +static void *RSTOperationKVOContext = &RSTOperationKVOContext; + +@implementation RSTOperation + +- (void)start +{ + if (![self isAsynchronous]) + { + [self addObserver:self forKeyPath:NSStringFromSelector(@selector(isFinished)) options:NSKeyValueObservingOptionNew context:RSTOperationKVOContext]; + + [super start]; + + return; + } + + if ([self isFinished]) + { + return; + } + + if ([self isCancelled]) + { + [self finish]; + } + else + { + [self willChangeValueForKey:@"isExecuting"]; + _isExecuting = YES; + [self didChangeValueForKey:@"isExecuting"]; + + [self main]; + } +} + +- (void)finish +{ + if (![self isAsynchronous]) + { + return; + } + + [self willChangeValueForKey:@"isFinished"]; + [self willChangeValueForKey:@"isExecuting"]; + + _isExecuting = NO; + _isFinished = YES; + + [self didChangeValueForKey:@"isExecuting"]; + [self didChangeValueForKey:@"isFinished"]; +} + +- (BOOL)isExecuting +{ + if (![self isAsynchronous]) + { + return [super isExecuting]; + } + + return _isExecuting; +} + +- (BOOL)isFinished +{ + if (![self isAsynchronous]) + { + return [super isFinished]; + } + + return _isFinished; +} + +#pragma mark - KVO - + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (context != RSTOperationKVOContext) + { + return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } + + if ([change[NSKeyValueChangeNewKey] boolValue]) + { + // Manually call finish for synchronous subclasses that override it to know when operation is finished. + [self finish]; + + [self removeObserver:self forKeyPath:keyPath context:RSTOperationKVOContext]; + } +} + +#pragma mark - Getters/Setters - + +- (void)setImmediate:(BOOL)immediate +{ + if (immediate == _immediate) + { + return; + } + + _immediate = immediate; + + if (immediate) + { + self.qualityOfService = NSQualityOfServiceUserInitiated; + self.queuePriority = NSOperationQueuePriorityHigh; + } + else + { + self.qualityOfService = NSQualityOfServiceDefault; + self.queuePriority = NSOperationQueuePriorityNormal; + } +} + +@end diff --git a/Pods/Roxas/Roxas/RSTOperationQueue.h b/Pods/Roxas/Roxas/RSTOperationQueue.h new file mode 100644 index 000000000..0a3f85674 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTOperationQueue.h @@ -0,0 +1,25 @@ +// +// RSTOperationQueue.h +// Roxas +// +// Created by Riley Testut on 3/14/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +@import Foundation; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTOperationQueue : NSOperationQueue + +- (void)addOperation:(NSOperation *)operation forKey:(id)key; +- (nullable __kindof NSOperation *)operationForKey:(id)key; + +- (nullable __kindof NSOperation *)objectForKeyedSubscript:(id)key; + +// Unavailable +- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait __attribute__((unavailable("waitUntilFinished conflicts with RSTOperation's immediate property."))); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTOperationQueue.m b/Pods/Roxas/Roxas/RSTOperationQueue.m new file mode 100644 index 000000000..18fa2de95 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTOperationQueue.m @@ -0,0 +1,80 @@ +// +// RSTOperationQueue.m +// Roxas +// +// Created by Riley Testut on 3/14/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTOperationQueue.h" +#import "RSTOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTOperationQueue () + +@property (copy, nonatomic, readonly) NSMapTable *operationsMapTable; + +@end + +NS_ASSUME_NONNULL_END + +@implementation RSTOperationQueue + +#pragma mark - NSOperationQueue - + +- (instancetype)init +{ + self = [super init]; + if (self) + { + _operationsMapTable = [NSMapTable strongToWeakObjectsMapTable]; + } + + return self; +} + +- (void)addOperation:(NSOperation *)operation +{ + [super addOperation:operation]; + + if ([operation isKindOfClass:[RSTOperation class]] && [(RSTOperation *)operation isImmediate]) + { + // Maintain a reference to completion block, and then nil it out so it isn't called automatically + void (^completionBlock)(void) = operation.completionBlock; + operation.completionBlock = nil; + + [operation waitUntilFinished]; + + if (completionBlock) + { + // Call the completion block ourselves to ensure it gets called synchronously *after* waitUntilFinished returns, but *before* this method returns + completionBlock(); + } + } +} + +#pragma mark - RSTOperationQueue - + +- (void)addOperation:(NSOperation *)operation forKey:(id)key +{ + NSOperation *previousOperation = [self operationForKey:key]; + [previousOperation cancel]; + + [self.operationsMapTable setObject:operation forKey:key]; + + [self addOperation:operation]; +} + +- (NSOperation *)operationForKey:(id)key +{ + NSOperation *operation = [self.operationsMapTable objectForKey:key]; + return operation; +} + +- (NSOperation *)objectForKeyedSubscript:(id)key +{ + return [self operationForKey:key]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTOperation_Subclasses.h b/Pods/Roxas/Roxas/RSTOperation_Subclasses.h new file mode 100644 index 000000000..e6b2b516c --- /dev/null +++ b/Pods/Roxas/Roxas/RSTOperation_Subclasses.h @@ -0,0 +1,19 @@ +// +// RSTOperation_Subclasses.h +// Roxas +// +// Created by Riley Testut on 3/14/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTOperation.h" + +@interface RSTOperation () +{ + @protected BOOL _isExecuting; + @protected BOOL _isFinished; +} + +- (void)finish NS_REQUIRES_SUPER; + +@end diff --git a/Pods/Roxas/Roxas/RSTPersistentContainer.h b/Pods/Roxas/Roxas/RSTPersistentContainer.h new file mode 100644 index 000000000..5f338e95f --- /dev/null +++ b/Pods/Roxas/Roxas/RSTPersistentContainer.h @@ -0,0 +1,29 @@ +// +// RSTPersistentContainer.h +// Roxas +// +// Created by Riley Testut on 7/16/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import CoreData; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTPersistentContainer : NSPersistentContainer + +@property (assign) BOOL shouldAddStoresAsynchronously; + +@property (nonatomic) NSMergePolicy *preferredMergePolicy; + +- (instancetype)initWithName:(NSString *)name bundle:(NSBundle *)bundle; +- (instancetype)initWithName:(NSString *)name managedObjectModel:(NSManagedObjectModel *)model; + +- (NSManagedObjectContext *)newBackgroundSavingViewContext; + +- (NSManagedObjectContext *)newViewContextWithParent:(NSManagedObjectContext *)parent; +- (NSManagedObjectContext *)newBackgroundContextWithParent:(NSManagedObjectContext *)parent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTPersistentContainer.m b/Pods/Roxas/Roxas/RSTPersistentContainer.m new file mode 100644 index 000000000..11df8f491 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTPersistentContainer.m @@ -0,0 +1,371 @@ +// +// RSTPersistentContainer.m +// Roxas +// +// Created by Riley Testut on 7/16/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTPersistentContainer.h" +#import "RSTRelationshipPreservingMergePolicy.h" + +#import "RSTError.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTPersistentContainer () + +@property (readonly, nonatomic) NSHashTable *parentBackgroundContexts; +@property (readonly, nonatomic) NSHashTable *pendingSaveParentBackgroundContexts; + +@end + +NS_ASSUME_NONNULL_END + +@implementation RSTPersistentContainer + +- (instancetype)initWithName:(NSString *)name bundle:(NSBundle *)bundle +{ + NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:@[bundle]]; + + self = [super initWithName:name managedObjectModel:managedObjectModel]; + if (self) + { + [self initialize]; + } + return self; +} + +- (instancetype)initWithName:(NSString *)name managedObjectModel:(NSManagedObjectModel *)model +{ + self = [super initWithName:name managedObjectModel:model]; + if (self) + { + [self initialize]; + } + return self; +} + +- (void)initialize +{ + _shouldAddStoresAsynchronously = NO; + + _preferredMergePolicy = [[RSTRelationshipPreservingMergePolicy alloc] init]; + + _parentBackgroundContexts = [NSHashTable weakObjectsHashTable]; + _pendingSaveParentBackgroundContexts = [NSHashTable weakObjectsHashTable]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rst_managedObjectContextWillSave:) name:NSManagedObjectContextWillSaveNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rst_managedObjectContextObjectsDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:nil]; +} + +- (void)loadPersistentStoresWithCompletionHandler:(void (^)(NSPersistentStoreDescription * _Nonnull, NSError * _Nullable))completionHandler +{ + dispatch_group_t dispatchGroup = dispatch_group_create(); + + for (NSPersistentStoreDescription *description in self.persistentStoreDescriptions) + { + description.shouldAddStoreAsynchronously = self.shouldAddStoresAsynchronously; + + NSDictionary *metadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:description.type URL:description.URL options:description.options error:nil]; + if (metadata == nil) + { + continue; + } + + if (![self.managedObjectModel isConfiguration:nil compatibleWithStoreMetadata:metadata] && description.shouldMigrateStoreAutomatically) + { + // Migrate database if incompatible with managed object model. + + dispatch_group_enter(dispatchGroup); + + [self progressivelyMigratePersistentStoreToModel:self.managedObjectModel + configuration:description.configuration + isAsynchronous:description.shouldAddStoreAsynchronously + completionHandler:^(NSError * _Nullable error) { + if (error != nil) + { + ELog(error); + } + + dispatch_group_leave(dispatchGroup); + }]; + } + } + + void (^finish)(NSPersistentStoreDescription *, NSError *) = ^(NSPersistentStoreDescription *description, NSError *error) { + [self configureManagedObjectContext:self.viewContext parent:nil]; + completionHandler(description, error); + }; + + if (self.shouldAddStoresAsynchronously) + { + dispatch_group_notify(dispatchGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [super loadPersistentStoresWithCompletionHandler:finish]; + }); + } + else + { + dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER); + + [super loadPersistentStoresWithCompletionHandler:finish]; + } +} + +- (NSManagedObjectContext *)newBackgroundContext +{ + NSManagedObjectContext *context = [super newBackgroundContext]; + [self configureManagedObjectContext:context parent:nil]; + return context; +} + +- (NSManagedObjectContext *)newBackgroundSavingViewContext +{ + NSManagedObjectContext *parentBackgroundContext = [self newBackgroundContext]; + [self.parentBackgroundContexts addObject:parentBackgroundContext]; + + NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; + [self configureManagedObjectContext:context parent:parentBackgroundContext]; + return context; +} + +- (NSManagedObjectContext *)newViewContextWithParent:(NSManagedObjectContext *)parentContext +{ + NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; + [self configureManagedObjectContext:context parent:parentContext]; + return context; +} + +- (NSManagedObjectContext *)newBackgroundContextWithParent:(NSManagedObjectContext *)parentContext +{ + NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; + [self configureManagedObjectContext:context parent:parentContext]; + return context; +} + +- (void)configureManagedObjectContext:(NSManagedObjectContext *)context parent:(nullable NSManagedObjectContext *)parent +{ + if (parent != nil) + { + context.parentContext = parent; + } + + context.automaticallyMergesChangesFromParent = YES; + context.mergePolicy = self.preferredMergePolicy; +} + +#pragma mark - Migrations - + +// Migration logic based off of https://www.objc.io/issues/4-core-data/core-data-migration/ + +- (void)progressivelyMigratePersistentStoreToModel:(NSManagedObjectModel *)model configuration:(nullable NSString *)configuration isAsynchronous:(BOOL)asynchronous completionHandler:(void (^)(NSError * _Nullable))completionHandler +{ + void (^migrate)(void) = ^(void) { + NSError *error = nil; + BOOL success = [self _progressivelyMigratePersistentStoreToModel:model configuration:configuration error:&error]; + + if (success) + { + completionHandler(nil); + } + else + { + completionHandler(error); + } + }; + + if (asynchronous) + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + migrate(); + }); + } + else + { + migrate(); + } +} + +- (BOOL)_progressivelyMigratePersistentStoreToModel:(NSManagedObjectModel *)model configuration:(nullable NSString *)configuration error:(NSError * _Nonnull *)error +{ + NSPersistentStoreDescription *description = self.persistentStoreDescriptions.firstObject; + if (description == nil) + { + *error = [NSError errorWithDomain:RoxasErrorDomain code:RSTErrorMissingPersistentStore userInfo:nil]; + return NO; + } + + NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:description.type URL:description.URL options:description.options error:error]; + if (sourceMetadata == nil) + { + return NO; + } + + if ([self.managedObjectModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata]) + { + // The store is now compatible with the managed object model, so we're done. + return YES; + } + + NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:NSBundle.allBundles forStoreMetadata:sourceMetadata]; + if (sourceModel == nil) + { + *error = [NSError errorWithDomain:RoxasErrorDomain code:RSTErrorMissingManagedObjectModel userInfo:nil]; + return NO; + } + + NSMappingModel *mappingModel = nil; + NSMigrationManager *migrationManager = [self progressiveMigrationManagerForSourceModel:sourceModel destinationModel:model configuration:configuration mappingModel:&mappingModel]; + if (migrationManager == nil) + { + *error = [NSError errorWithDomain:RoxasErrorDomain code:RSTErrorMissingMappingModel userInfo:nil]; + return NO; + } + + NSString *temporaryFilename = [[[NSUUID UUID] UUIDString] stringByAppendingFormat:@".%@", description.URL.pathExtension]; + NSURL *temporaryDestinationURL = [NSFileManager.defaultManager.temporaryDirectory URLByAppendingPathComponent:temporaryFilename]; + + BOOL success = [migrationManager migrateStoreFromURL:description.URL + type:description.type + options:description.options + withMappingModel:mappingModel // migrationManager.mappingModel is nil for some reason + toDestinationURL:temporaryDestinationURL + destinationType:description.type + destinationOptions:description.options + error:error]; + if (!success) + { + return NO; + } + + BOOL replacementSuccess = [self.persistentStoreCoordinator replacePersistentStoreAtURL:description.URL + destinationOptions:description.options + withPersistentStoreFromURL:temporaryDestinationURL + sourceOptions:description.options + storeType:description.type + error:error]; + if (!replacementSuccess) + { + return NO; + } + + NSError *deletionError = nil; + if (![self.persistentStoreCoordinator destroyPersistentStoreAtURL:temporaryDestinationURL withType:description.type options:description.options error:&deletionError]) + { + ELog(deletionError); + } + + return [self _progressivelyMigratePersistentStoreToModel:model configuration:configuration error:error]; +} + +- (nullable NSMigrationManager *)progressiveMigrationManagerForSourceModel:(NSManagedObjectModel *)sourceModel destinationModel:(NSManagedObjectModel *)destinationModel configuration:(nullable NSString *)configuration mappingModel:(NSMappingModel **)outMappingModel +{ + NSArray *managedObjectModelURLs = [self managedObjectModelURLs]; + for (NSURL *modelURL in managedObjectModelURLs) + { + NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; + NSMappingModel *mappingModel = [NSMappingModel mappingModelFromBundles:NSBundle.allBundles + forSourceModel:sourceModel + destinationModel:model]; + if (mappingModel == nil) + { + continue; + } + + // If this model contains at least one entity that belongs to our configuration, + // we can assume that this is a valid mapping model for the configuration. + BOOL isValidForConfiguration = NO; + + // sourceModel doesn't properly merge configurations, so retrieve configuration entities via self.managedObjectModel. + for (NSEntityDescription *entityDescription in [self.managedObjectModel entitiesForConfiguration:configuration]) + { + if (model.entitiesByName[entityDescription.name] != nil) + { + isValidForConfiguration = YES; + break; + } + } + + if (!isValidForConfiguration) + { + continue; + } + + *outMappingModel = mappingModel; + + NSMigrationManager *migrationManager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:model]; + return migrationManager; + } + + // Fallback to inferring mapping model. + + NSError *error = nil; + NSMappingModel *inferredMappingModel = [NSMappingModel inferredMappingModelForSourceModel:sourceModel destinationModel:destinationModel error:&error]; + + if (inferredMappingModel == nil) + { + NSLog(@"Error inferring mapping: %@", error); + return nil; + } + + *outMappingModel = inferredMappingModel; + + NSMigrationManager *migrationManager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:destinationModel]; + return migrationManager; +} + +- (NSArray *)managedObjectModelURLs +{ + NSMutableArray *modelURLs = [NSMutableArray array]; + + for (NSBundle *bundle in NSBundle.allBundles) + { + NSArray *momdURLs = [bundle URLsForResourcesWithExtension:@"momd" subdirectory:nil]; + for (NSURL *URL in momdURLs) + { + NSString *resourceDirectory = [URL lastPathComponent]; + + NSArray *momURLs = [bundle URLsForResourcesWithExtension:@"mom" subdirectory:resourceDirectory]; + [modelURLs addObjectsFromArray:momURLs]; + } + + NSArray *momURLs = [bundle URLsForResourcesWithExtension:@"mom" subdirectory:nil]; + [modelURLs addObjectsFromArray:momURLs]; + } + + return modelURLs; +} + +#pragma mark - NSNotifications - + +// Use rst_ prefix to prevent collisions with subclasses. +- (void)rst_managedObjectContextWillSave:(NSNotification *)notification +{ + NSManagedObjectContext *context = notification.object; + if (![self.parentBackgroundContexts containsObject:context.parentContext]) + { + return; + } + + [self.pendingSaveParentBackgroundContexts addObject:context.parentContext]; +} + +// Use rst_ prefix to prevent collisions with subclasses. +- (void)rst_managedObjectContextObjectsDidChange:(NSNotification *)notification +{ + NSManagedObjectContext *context = notification.object; + if (![self.pendingSaveParentBackgroundContexts containsObject:context]) + { + return; + } + + NSError *error = nil; + if (![context save:&error]) + { + ELog(error); + } + + [self.pendingSaveParentBackgroundContexts removeObject:context]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTPlaceholderView.h b/Pods/Roxas/Roxas/RSTPlaceholderView.h new file mode 100644 index 000000000..60b5be8d1 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTPlaceholderView.h @@ -0,0 +1,27 @@ +// +// RSTPlaceholderView.h +// Roxas +// +// Created by Riley Testut on 11/21/15. +// Copyright © 2015 Riley Testut. All rights reserved. +// + +#import + +@import UIKit; + +IB_DESIGNABLE +@interface RSTPlaceholderView : RSTNibView + +// Visible by default +@property (nonnull, nonatomic, readonly) UILabel *textLabel; +@property (nonnull, nonatomic, readonly) UILabel *detailTextLabel; + +// Hidden by default +@property (nonnull, nonatomic, readonly) UIActivityIndicatorView *activityIndicatorView; +@property (nonnull, nonatomic, readonly) UIImageView *imageView; + +// Layout +@property (nonnull, nonatomic, readonly) UIStackView *stackView; + +@end diff --git a/Pods/Roxas/Roxas/RSTPlaceholderView.m b/Pods/Roxas/Roxas/RSTPlaceholderView.m new file mode 100644 index 000000000..48b8815b0 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTPlaceholderView.m @@ -0,0 +1,57 @@ +// +// RSTPlaceholderView.m +// Roxas +// +// Created by Riley Testut on 11/21/15. +// Copyright © 2015 Riley Testut. All rights reserved. +// + +#import "RSTPlaceholderView.h" + +@interface RSTPlaceholderView () + +@property (nonnull, nonatomic, readwrite) IBOutlet UILabel *textLabel; +@property (nonnull, nonatomic, readwrite) IBOutlet UILabel *detailTextLabel; +@property (nonnull, nonatomic, readwrite) IBOutlet UIActivityIndicatorView *activityIndicatorView; +@property (nonnull, nonatomic, readwrite) IBOutlet UIImageView *imageView; +@property (nonnull, nonatomic, readwrite) IBOutlet UIStackView *stackView; + +@end + +@implementation RSTPlaceholderView + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (void)initialize +{ + self.activityIndicatorView.hidden = YES; + self.imageView.hidden = YES; + + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomTV) + { + self.stackView.spacing = 15; + self.detailTextLabel.font = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0.0]; + } +} + +@end diff --git a/Pods/Roxas/Roxas/RSTPlaceholderView.xib b/Pods/Roxas/Roxas/RSTPlaceholderView.xib new file mode 100644 index 000000000..190a0b990 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTPlaceholderView.xib @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Roxas/Roxas/RSTRelationshipPreservingMergePolicy.h b/Pods/Roxas/Roxas/RSTRelationshipPreservingMergePolicy.h new file mode 100644 index 000000000..be3c1af19 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTRelationshipPreservingMergePolicy.h @@ -0,0 +1,21 @@ +// +// RSTRelationshipPreservingMergePolicy.h +// Roxas +// +// Created by Riley Testut on 7/16/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import CoreData; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTRelationshipPreservingMergePolicy : NSMergePolicy + +- (instancetype)init; + +- (instancetype)initWithMergeType:(NSMergePolicyType)mergeType NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTRelationshipPreservingMergePolicy.m b/Pods/Roxas/Roxas/RSTRelationshipPreservingMergePolicy.m new file mode 100644 index 000000000..3b416f538 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTRelationshipPreservingMergePolicy.m @@ -0,0 +1,139 @@ +// +// RSTRelationshipPreservingMergePolicy.m +// Roxas +// +// Created by Riley Testut on 7/16/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTRelationshipPreservingMergePolicy.h" + +#import "NSConstraintConflict+Conveniences.h" + +@implementation RSTRelationshipPreservingMergePolicy + +- (instancetype)init +{ + self = [super initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]; + return self; +} + +- (BOOL)resolveConstraintConflicts:(NSArray *)conflicts error:(NSError * _Nullable __autoreleasing *)error +{ + [NSConstraintConflict cacheSnapshotsForConflicts:conflicts]; + + BOOL success = [super resolveConstraintConflicts:conflicts error:error]; + + for (NSConstraintConflict *conflict in conflicts) + { + if (conflict.databaseObject == nil) + { + // Only handle database-level conflicts. + continue; + } + + NSManagedObject *databaseObject = conflict.databaseObject; + NSManagedObject *updatedObject = conflict.conflictingObjects.firstObject; + + NSDictionary *databaseSnapshot = [conflict.snapshots objectForKey:databaseObject]; + NSDictionary *updatedSnapshot = [conflict.snapshots objectForKey:updatedObject]; + + if (databaseObject == nil || updatedObject == nil || databaseSnapshot == nil || updatedSnapshot == nil) + { + continue; + } + + [databaseObject.entity.relationshipsByName enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSRelationshipDescription *relationship, BOOL *stop) { + if ([relationship isToMany]) + { + // Superclass already handles to-many relationships correctly, so ignore this relationship. + return; + } + + NSManagedObject *relationshipObject = nil; + + NSManagedObject *previousRelationshipObject = databaseSnapshot[name]; + NSManagedObject *updatedRelationshipObject = updatedSnapshot[name]; + + if (previousRelationshipObject != nil) + { + if (updatedRelationshipObject == nil) + { + if (updatedObject.changedValues[name] == nil) + { + // Previously non-nil, updated to nil, but was _not_ explicitly set to nil, so restore previous relationship. + relationshipObject = previousRelationshipObject; + } + else + { + // Same as above, but _was_ explicitly set to nil, so should remain nil. + relationshipObject = nil; + } + } + else + { + if ([databaseObject valueForKey:name] == nil) + { + // Previously non-nil, updated to non-nil, but resulted in nil, so restore previous relationship (since the new relationship has been deleted). + relationshipObject = previousRelationshipObject; + } + else if (updatedRelationshipObject.managedObjectContext == nil) + { + // Previously non-nil, updated to non-nil, but the updated snapshot points to an outdated relationship object, so restore previous relationship. + relationshipObject = previousRelationshipObject; + } + else + { + // Previously non-nil, updated to non-nil, so ensure relationship object is the updated relationship object. + relationshipObject = updatedRelationshipObject; + } + } + } + else + { + if (updatedRelationshipObject != nil) + { + // Previously nil, updated to non-nil, so restore updated relationship. + relationshipObject = updatedRelationshipObject; + } + else + { + // Previously nil, remained nil, so no need to fix anything. + relationshipObject = nil; + } + } + + if ([databaseObject valueForKey:name] == relationshipObject) + { + return; + } + + if (relationshipObject.managedObjectContext == nil) + { + return; + } + + [databaseObject setValue:relationshipObject forKey:name]; + + NSRelationshipDescription *inverseRelationship = relationship.inverseRelationship; + if (inverseRelationship != nil && ![inverseRelationship isToMany]) + { + // We need to also update to-one inverse relationships. + + if (relationshipObject != nil) + { + [relationshipObject setValue:databaseObject forKey:inverseRelationship.name]; + } + else + { + [previousRelationshipObject setValue:nil forKey:inverseRelationship.name]; + [updatedRelationshipObject setValue:nil forKey:inverseRelationship.name]; + } + } + }]; + } + + return success; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTSearchController.h b/Pods/Roxas/Roxas/RSTSearchController.h new file mode 100644 index 000000000..094e8fe1d --- /dev/null +++ b/Pods/Roxas/Roxas/RSTSearchController.h @@ -0,0 +1,41 @@ +// +// RSTSearchResultsController.h +// Roxas +// +// Created by Riley Testut on 2/7/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTSearchValue : NSObject + +@property (nonatomic, readonly) NSString *text; +@property (nonatomic, readonly) NSPredicate *predicate; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTSearchController : UISearchController + +// Used to generate RSTSearchValue predicates. +@property (copy, nonatomic) NSSet *searchableKeyPaths; + +// Handler called when the search text changes. +// To perform a synchronous search, perform the necessary search logic synchronously in the handler, and return nil. +// To perform an asynchronous search, return an NSOperation that will perform the search logic. +// When searching asynchronously, the previous search NSOperation will be cancelled when the search text changes. +// To ensure outdated results are not displayed, make sure to check that -[NSOperation isCancelled] is NO before updating results. +@property (nullable, copy, nonatomic) NSOperation *_Nullable (^searchHandler)(RSTSearchValue *searchValue, RSTSearchValue *_Nullable previousSearchValue); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTSearchController.m b/Pods/Roxas/Roxas/RSTSearchController.m new file mode 100644 index 000000000..bc513dd52 --- /dev/null +++ b/Pods/Roxas/Roxas/RSTSearchController.m @@ -0,0 +1,112 @@ +// +// RSTSearchResultsController.m +// Roxas +// +// Created by Riley Testut on 2/7/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTSearchController.h" +#import "RSTOperationQueue.h" + +#import "NSPredicate+Search.h" + +@implementation RSTSearchValue + +- (instancetype)initWithText:(NSString *)text predicate:(NSPredicate *)predicate +{ + self = [super init]; + if (self) + { + _text = [text copy]; + _predicate = [predicate copy]; + } + + return self; +} + +- (id)copyWithZone:(NSZone *)zone +{ + RSTSearchValue *copy = [[RSTSearchValue alloc] initWithText:self.text predicate:self.predicate]; + return copy; +} + +- (BOOL)isEqual:(id)object +{ + if (![object isKindOfClass:[RSTSearchValue class]]) + { + return NO; + } + + return [self.text isEqual:[(RSTSearchValue *)object text]]; +} + +- (NSUInteger)hash +{ + return self.text.hash; +} + +@end + + +@interface RSTSearchController () + +@property (nullable, copy, nonatomic) RSTSearchValue *previousSearchValue; + +@property (nonatomic, readonly) RSTOperationQueue *searchOperationQueue; + +@end + + +@implementation RSTSearchController + +- (instancetype)initWithSearchResultsController:(UIViewController *)searchResultsController +{ + self = [super initWithSearchResultsController:searchResultsController]; + if (self) + { + _searchableKeyPaths = [NSSet setWithObject:@"self"]; + + _searchOperationQueue = [[RSTOperationQueue alloc] init]; + _searchOperationQueue.qualityOfService = NSOperationQualityOfServiceUserInitiated; + + // We want a concurrent queue, since this allows an operation to start before the previous operation has finished. + // However, because we cancel the previous operation before adding a new one, there's no issue with finishing out of order. + // _searchOperationQueue.maxConcurrentOperationCount = 1; + + self.searchResultsUpdater = self; + + if (searchResultsController == nil) + { + self.obscuresBackgroundDuringPresentation = NO; + } + } + + return self; +} + +#pragma mark - - + +- (void)updateSearchResultsForSearchController:(UISearchController *)searchController +{ + NSString *searchText = [searchController.searchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] ?: @""; + NSPredicate *searchPredicate = [NSPredicate predicateForSearchingForText:searchText inValuesForKeyPaths:self.searchableKeyPaths]; + + RSTSearchValue *searchValue = [[RSTSearchValue alloc] initWithText:searchText predicate:searchPredicate]; + + NSOperation *previousSearchOperation = self.searchOperationQueue[self.previousSearchValue]; + [previousSearchOperation cancel]; + + if (self.searchHandler) + { + NSOperation *searchOperation = self.searchHandler(searchValue, self.previousSearchValue); + if (searchOperation) + { + [self.searchOperationQueue addOperation:searchOperation forKey:searchValue]; + } + } + + self.previousSearchValue = searchValue; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTSeparatorView.h b/Pods/Roxas/Roxas/RSTSeparatorView.h new file mode 100644 index 000000000..41ffdf3cd --- /dev/null +++ b/Pods/Roxas/Roxas/RSTSeparatorView.h @@ -0,0 +1,22 @@ +// +// RSTSeparatorView.h +// Roxas +// +// Created by Riley Testut on 6/29/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +IB_DESIGNABLE +@interface RSTSeparatorView : UIView + +@property (null_resettable, nonatomic) UIColor *tintColor; + +@property (nonatomic) IBInspectable CGFloat lineWidth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTSeparatorView.m b/Pods/Roxas/Roxas/RSTSeparatorView.m new file mode 100644 index 000000000..b63e6a58b --- /dev/null +++ b/Pods/Roxas/Roxas/RSTSeparatorView.m @@ -0,0 +1,116 @@ +// +// RSTSeparatorView.m +// Roxas +// +// Created by Riley Testut on 6/29/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTSeparatorView.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTSeparatorView () +{ + BOOL _layoutMarginsDidChange; +} + +@property (nonatomic, readonly) UIView *separator; + +@end + +NS_ASSUME_NONNULL_END + +@implementation RSTSeparatorView + +#pragma mark - Initialization - + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (void)initialize +{ + _lineWidth = 0.5; + + self.userInteractionEnabled = NO; + self.backgroundColor = nil; + + _separator = [[UIView alloc] initWithFrame:self.frame]; + _separator.translatesAutoresizingMaskIntoConstraints = NO; + _separator.backgroundColor = self.tintColor; + [self addSubview:_separator]; + + if (!_layoutMarginsDidChange) + { + self.layoutMargins = UIEdgeInsetsZero; + } + + [NSLayoutConstraint activateConstraints:@[[_separator.leadingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.leadingAnchor], + [_separator.trailingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.trailingAnchor], + [_separator.topAnchor constraintEqualToAnchor:self.layoutMarginsGuide.topAnchor], + [_separator.bottomAnchor constraintEqualToAnchor:self.layoutMarginsGuide.bottomAnchor]]]; +} + +#pragma mark - UIView - + +- (CGSize)intrinsicContentSize +{ + return CGSizeMake(self.lineWidth, self.lineWidth); +} + +- (void)tintColorDidChange +{ + self.separator.backgroundColor = self.tintColor; +} + +- (void)layoutMarginsDidChange +{ + _layoutMarginsDidChange = YES; +} + +#pragma mark - Getters/Setters - + +- (UIColor *)tintColor +{ + // Must override tintColor accessor methods and call super. + // Otherwise, tintColor may not work as intended 🤷‍♂️. + return [super tintColor]; +} + +- (void)setTintColor:(UIColor *)tintColor +{ + [super setTintColor:tintColor]; +} + +- (void)setLineWidth:(CGFloat)lineWidth +{ + if (lineWidth == _lineWidth) + { + return; + } + + _lineWidth = lineWidth; + + [self invalidateIntrinsicContentSize]; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTTintedImageView.h b/Pods/Roxas/Roxas/RSTTintedImageView.h new file mode 100644 index 000000000..46d1b937e --- /dev/null +++ b/Pods/Roxas/Roxas/RSTTintedImageView.h @@ -0,0 +1,17 @@ +// +// RSTTintedImageView.h +// Roxas +// +// Created by Riley Testut on 8/29/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTTintedImageView : UIImageView + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTTintedImageView.m b/Pods/Roxas/Roxas/RSTTintedImageView.m new file mode 100644 index 000000000..ffb46bc4c --- /dev/null +++ b/Pods/Roxas/Roxas/RSTTintedImageView.m @@ -0,0 +1,25 @@ +// +// RSTTintedImageView.m +// Roxas +// +// Created by Riley Testut on 8/29/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTTintedImageView.h" + +@implementation RSTTintedImageView + +- (void)awakeFromNib +{ + [super awakeFromNib]; + + // When loading from nib, the image is not tinted with the tint color. + // To fix this, we set the tint color to nil, then back to the original tint color. + + UIColor *tintColor = self.tintColor; + self.tintColor = nil; + self.tintColor = tintColor; +} + +@end diff --git a/Pods/Roxas/Roxas/RSTToastView.h b/Pods/Roxas/Roxas/RSTToastView.h new file mode 100644 index 000000000..c017d9f4f --- /dev/null +++ b/Pods/Roxas/Roxas/RSTToastView.h @@ -0,0 +1,58 @@ +// +// RSTToastView.h +// Roxas +// +// Created by Riley Testut on 5/2/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import UIKit; + +typedef NS_ENUM(NSInteger, RSTViewEdge) { + RSTViewEdgeNone, + RSTViewEdgeTop, + RSTViewEdgeBottom, + RSTViewEdgeLeft, + RSTViewEdgeRight +}; + +NS_ASSUME_NONNULL_BEGIN + +RST_EXTERN NSNotificationName const RSTToastViewWillShowNotification NS_SWIFT_NAME(RSTToastView.willShowNotification); +RST_EXTERN NSNotificationName const RSTToastViewDidShowNotification NS_SWIFT_NAME(RSTToastView.didShowNotification); +RST_EXTERN NSNotificationName const RSTToastViewWillDismissNotification NS_SWIFT_NAME(RSTToastView.willDismissNotification); +RST_EXTERN NSNotificationName const RSTToastViewDidDismissNotification NS_SWIFT_NAME(RSTToastView.didDismissNotification); + +typedef NSString *RSTToastViewUserInfoKey NS_TYPED_EXTENSIBLE_ENUM; + +RST_EXTERN RSTToastViewUserInfoKey const RSTToastViewUserInfoKeyPropertyAnimator; + +NS_CLASS_AVAILABLE_IOS(11_0) +@interface RSTToastView : UIControl + +@property (null_resettable, nonatomic) UIColor *tintColor UI_APPEARANCE_SELECTOR; + +@property (nonatomic, readonly) UILabel *textLabel; +@property (nonatomic, readonly) UILabel *detailTextLabel; +@property (nonatomic, readonly) UIActivityIndicatorView *activityIndicatorView; + +@property (nonatomic) RSTViewEdge presentationEdge UI_APPEARANCE_SELECTOR; +@property (nonatomic) RSTViewEdge alignmentEdge UI_APPEARANCE_SELECTOR; + +@property (nonatomic) UIOffset edgeOffset; + +@property (nonatomic, readonly, getter=isShown) BOOL shown; + +- (instancetype)initWithText:(NSString *)text detailText:(nullable NSString *)detailedText NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithError:(NSError *)error; + +- (void)showInView:(UIView *)view; +- (void)showInView:(UIView *)view duration:(NSTimeInterval)duration; + +- (void)dismiss; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/RSTToastView.m b/Pods/Roxas/Roxas/RSTToastView.m new file mode 100644 index 000000000..6dba48fbd --- /dev/null +++ b/Pods/Roxas/Roxas/RSTToastView.m @@ -0,0 +1,502 @@ +// +// RSTToastView.m +// Roxas +// +// Created by Riley Testut on 5/2/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTToastView.h" + +#import "NSLayoutConstraint+Edges.h" +#import "UISpringTimingParameters+Conveniences.h" + +NSNotificationName const RSTToastViewWillShowNotification = @"RSTToastViewWillShowNotification"; +NSNotificationName const RSTToastViewDidShowNotification = @"RSTToastViewDidShowNotification"; +NSNotificationName const RSTToastViewWillDismissNotification = @"RSTToastViewWillDismissNotification"; +NSNotificationName const RSTToastViewDidDismissNotification = @"RSTToastViewDidDismissNotification"; + +RSTToastViewUserInfoKey const RSTToastViewUserInfoKeyPropertyAnimator = @"RSTToastViewUserInfoKeyPropertyAnimator"; + +static void *RSTToastViewContext = &RSTToastViewContext; + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTToastView () + +@property (nonatomic, readwrite, getter=isShown) BOOL shown; + +@property (nonatomic, readonly) UIView *dimmingView; +@property (nonatomic, readonly) UIStackView *stackView; + +@property (nullable, nonatomic) NSTimer *dismissTimer; + +@property (nullable, nonatomic) NSLayoutConstraint *axisConstraint; +@property (nullable, nonatomic) NSLayoutConstraint *hiddenAxisConstraint; + +@property (nullable, nonatomic) NSLayoutConstraint *alignmentConstraint; + +@property (nullable, nonatomic) NSLayoutConstraint *widthConstraint; +@property (nullable, nonatomic) NSLayoutConstraint *heightConstraint; + +@end + +NS_ASSUME_NONNULL_END + +@implementation RSTToastView +@dynamic tintColor; + +- (instancetype)initWithText:(NSString *)text detailText:(NSString *)detailText +{ + self = [super initWithFrame:CGRectZero]; + if (self) + { + [self initialize]; + + _textLabel.text = text; + _detailTextLabel.text = detailText; + } + + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self initialize]; + } + + return self; +} + +- (instancetype)initWithError:(NSError *)error +{ + self = [self initWithText:error.localizedDescription detailText:error.localizedFailureReason]; + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [self initWithText:@"" detailText:nil]; + return self; +} + +- (void)initialize +{ + _edgeOffset = UIOffsetMake(15, 15); + + _dimmingView = [[UIView alloc] initWithFrame:CGRectZero]; + _dimmingView.backgroundColor = [UIColor blackColor]; + _dimmingView.alpha = 0.1; + _dimmingView.hidden = YES; + [self addSubview:_dimmingView pinningEdgesWithInsets:UIEdgeInsetsZero]; + + UIFontDescriptor *detailTextLabelFontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleSubheadline]; + UIFontDescriptor *textLabelFontDescriptor = [detailTextLabelFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; + + _textLabel = [[UILabel alloc] init]; + _textLabel.font = [UIFont fontWithDescriptor:textLabelFontDescriptor size:0.0]; + _textLabel.textColor = [UIColor whiteColor]; + _textLabel.minimumScaleFactor = 0.75; + _textLabel.numberOfLines = 0; + [_textLabel addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionOld context:RSTToastViewContext]; + + _detailTextLabel = [[UILabel alloc] init]; + _detailTextLabel.font = [UIFont fontWithDescriptor:detailTextLabelFontDescriptor size:0.0]; + _detailTextLabel.textColor = [UIColor whiteColor]; + _detailTextLabel.minimumScaleFactor = 0.75; + _detailTextLabel.numberOfLines = 0; + [_detailTextLabel addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionOld context:RSTToastViewContext]; + + _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; + _activityIndicatorView.hidesWhenStopped = YES; + + UIStackView *labelsStackView = [[UIStackView alloc] initWithArrangedSubviews:@[_textLabel, _detailTextLabel]]; + labelsStackView.axis = UILayoutConstraintAxisVertical; + labelsStackView.alignment = UIStackViewAlignmentFill; + labelsStackView.spacing = 2.0; + + _stackView = [[UIStackView alloc] initWithArrangedSubviews:@[_activityIndicatorView, labelsStackView]]; + _stackView.translatesAutoresizingMaskIntoConstraints = NO; + _stackView.userInteractionEnabled = NO; + _stackView.axis = UILayoutConstraintAxisHorizontal; + _stackView.alignment = UIStackViewAlignmentCenter; + _stackView.spacing = 8.0; + _stackView.layoutMarginsRelativeArrangement = YES; + _stackView.insetsLayoutMarginsFromSafeArea = NO; + [self addSubview:_stackView]; + + _presentationEdge = RSTViewEdgeBottom; + _alignmentEdge = RSTViewEdgeNone; + + // Motion Effects + UIInterpolatingMotionEffect *xAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; + xAxis.minimumRelativeValue = @(-10); + xAxis.maximumRelativeValue = @(10); + + UIInterpolatingMotionEffect *yAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]; + yAxis.minimumRelativeValue = @(-10); + yAxis.maximumRelativeValue = @(10); + + UIMotionEffectGroup *group = [[UIMotionEffectGroup alloc] init]; + group.motionEffects = @[xAxis, yAxis]; + [self addMotionEffect:group]; + + self.clipsToBounds = YES; + self.translatesAutoresizingMaskIntoConstraints = NO; + + self.layoutMargins = UIEdgeInsetsMake(5, 10, 5, 10); + self.preservesSuperviewLayoutMargins = NO; + self.insetsLayoutMarginsFromSafeArea = NO; + + // Light blue + self.backgroundColor = [UIColor colorWithRed:61.0/255.0 green:172.0/255.0 blue:247.0/255.0 alpha:1]; + + // Actions + [self addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside]; + + // Notifications + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toastViewWillShow:) name:RSTToastViewWillShowNotification object:nil]; +} + +#pragma mark - UIView - + +- (CGSize)intrinsicContentSize +{ + if (self.superview != nil) + { + CGFloat width = CGRectGetWidth(self.superview.bounds); + CGFloat preferredMaxLayoutWidth = width - (self.edgeOffset.horizontal * 2) - (self.layoutMargins.left + self.layoutMargins.right); + + self.textLabel.preferredMaxLayoutWidth = preferredMaxLayoutWidth; + self.detailTextLabel.preferredMaxLayoutWidth = preferredMaxLayoutWidth; + } + + CGSize intrinsicContentSize = [self.stackView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; + return intrinsicContentSize; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + CGFloat cornerRadius = MIN(10, CGRectGetMidY(self.bounds)); + self.layer.cornerRadius = cornerRadius; + + self.textLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.superview.bounds) - self.superview.safeAreaInsets.left - self.superview.safeAreaInsets.right - self.edgeOffset.horizontal * 2; + self.detailTextLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.superview.bounds) - self.superview.safeAreaInsets.left - self.superview.safeAreaInsets.right - self.edgeOffset.horizontal * 2; + + [self invalidateIntrinsicContentSize]; +} + +- (void)updateConstraints +{ + if (self.axisConstraint != nil || self.alignmentConstraint != nil) + { + return [super updateConstraints]; + } + + if (self.superview == nil) + { + return [super updateConstraints]; + } + + // Axis Constraints + switch (self.presentationEdge) + { + case RSTViewEdgeLeft: + self.axisConstraint = [self.leftAnchor constraintEqualToAnchor:self.superview.safeAreaLayoutGuide.leftAnchor constant:self.edgeOffset.horizontal]; + self.hiddenAxisConstraint = [self.superview.leftAnchor constraintEqualToAnchor:self.rightAnchor]; + break; + + case RSTViewEdgeRight: + self.axisConstraint = [self.superview.safeAreaLayoutGuide.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:self.edgeOffset.horizontal]; + self.hiddenAxisConstraint = [self.leftAnchor constraintEqualToAnchor:self.superview.rightAnchor]; + break; + + case RSTViewEdgeTop: + self.axisConstraint = [self.topAnchor constraintEqualToAnchor:self.superview.safeAreaLayoutGuide.topAnchor constant:self.edgeOffset.vertical]; + self.hiddenAxisConstraint = [self.superview.topAnchor constraintEqualToAnchor:self.bottomAnchor]; + break; + + case RSTViewEdgeBottom: + case RSTViewEdgeNone: + self.axisConstraint = [self.superview.safeAreaLayoutGuide.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:self.edgeOffset.vertical]; + self.hiddenAxisConstraint = [self.topAnchor constraintEqualToAnchor:self.superview.bottomAnchor]; + break; + } + + // Alignment Constraints + switch (self.presentationEdge) + { + case RSTViewEdgeLeft: + case RSTViewEdgeRight: + { + switch (self.alignmentEdge) + { + case RSTViewEdgeTop: + self.alignmentConstraint = [self.topAnchor constraintEqualToAnchor:self.superview.safeAreaLayoutGuide.topAnchor constant:self.edgeOffset.vertical]; + break; + + case RSTViewEdgeBottom: + self.alignmentConstraint = [self.superview.safeAreaLayoutGuide.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:self.edgeOffset.vertical]; + break; + + case RSTViewEdgeLeft: + case RSTViewEdgeRight: + case RSTViewEdgeNone: + self.alignmentConstraint = [self.centerYAnchor constraintEqualToAnchor:self.superview.safeAreaLayoutGuide.centerYAnchor]; + break; + } + + break; + } + + case RSTViewEdgeTop: + case RSTViewEdgeBottom: + case RSTViewEdgeNone: + { + switch (self.alignmentEdge) + { + case RSTViewEdgeLeft: + self.alignmentConstraint = [self.leftAnchor constraintEqualToAnchor:self.superview.safeAreaLayoutGuide.leftAnchor constant:self.edgeOffset.horizontal]; + break; + + case RSTViewEdgeRight: + self.alignmentConstraint = [self.superview.safeAreaLayoutGuide.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:self.edgeOffset.horizontal]; + break; + + case RSTViewEdgeTop: + case RSTViewEdgeBottom: + case RSTViewEdgeNone: + self.alignmentConstraint = [self.centerXAnchor constraintEqualToAnchor:self.superview.safeAreaLayoutGuide.centerXAnchor]; + break; + } + + break; + } + } + + self.widthConstraint = [self.widthAnchor constraintLessThanOrEqualToAnchor:self.superview.safeAreaLayoutGuide.widthAnchor constant:-(self.edgeOffset.horizontal * 2)]; + self.heightConstraint = [self.heightAnchor constraintLessThanOrEqualToAnchor:self.superview.safeAreaLayoutGuide.heightAnchor constant:-(self.edgeOffset.vertical * 2)]; + + [NSLayoutConstraint activateConstraints:@[self.hiddenAxisConstraint, self.alignmentConstraint, self.widthConstraint, self.heightConstraint]]; + + [super updateConstraints]; +} + +- (void)tintColorDidChange +{ + [super tintColorDidChange]; + + self.backgroundColor = self.tintColor; +} + +#pragma mark - Showing/Dismissing - + +- (void)showInView:(UIView *)view +{ + [self showInView:view duration:0]; +} + +- (void)showInView:(UIView *)view duration:(NSTimeInterval)duration +{ + [self.dismissTimer invalidate]; + + if (duration > 0) + { + self.dismissTimer = [NSTimer scheduledTimerWithTimeInterval:duration target:self selector:@selector(dismiss) userInfo:nil repeats:NO]; + } + else + { + self.dismissTimer = nil; + } + + if ([self isShown]) + { + return; + } + + self.shown = YES; + + // Set to a large value to ensure labels don't prematurely wrap content. + // self.widthConstraint will ensure labels wrap to stay within superview safe area inset by self.edgeOffset. + self.textLabel.preferredMaxLayoutWidth = CGRectGetWidth(view.bounds); + self.detailTextLabel.preferredMaxLayoutWidth = CGRectGetWidth(view.bounds); + + [view addSubview:self]; + [view layoutIfNeeded]; + + self.hiddenAxisConstraint.active = NO; + self.axisConstraint.active = YES; + + CGFloat distance = 0; + CGFloat overshoot = 10; + + switch (self.presentationEdge) + { + case RSTViewEdgeLeft: + distance = CGRectGetWidth(self.bounds) + self.edgeOffset.horizontal + self.superview.safeAreaInsets.left; + break; + + case RSTViewEdgeRight: + distance = CGRectGetWidth(self.bounds) + self.edgeOffset.horizontal + self.superview.safeAreaInsets.right; + break; + + case RSTViewEdgeTop: + distance = CGRectGetHeight(self.bounds) + self.edgeOffset.vertical + self.superview.safeAreaInsets.top; + break; + + case RSTViewEdgeBottom: + case RSTViewEdgeNone: + distance = CGRectGetHeight(self.bounds) + self.edgeOffset.vertical + self.superview.safeAreaInsets.bottom; + break; + } + + CGFloat percentOvershoot = overshoot / distance; + CGFloat dampingRatio = -log(percentOvershoot) / sqrt( pow(M_PI, 2) + pow(log(percentOvershoot), 2) ); + + UISpringTimingParameters *timingParameters = [[UISpringTimingParameters alloc] initWithStiffness:RSTSpringStiffnessDefault dampingRatio:dampingRatio]; + + UIViewPropertyAnimator *animator = [[UIViewPropertyAnimator alloc] initWithSpringTimingParameters:timingParameters animations:^{ + [view layoutIfNeeded]; + }]; + [animator addCompletion:^(UIViewAnimatingPosition finalPosition) { + [[NSNotificationCenter defaultCenter] postNotificationName:RSTToastViewDidShowNotification object:self]; + }]; + [animator startAnimation]; + + [[NSNotificationCenter defaultCenter] postNotificationName:RSTToastViewWillShowNotification object:self userInfo:@{RSTToastViewUserInfoKeyPropertyAnimator: animator}]; +} + +- (void)dismiss +{ + if (![self isShown]) + { + return; + } + + // Set to NO immediately to prevent potential concurrent dismissals. + self.shown = NO; + + if (self.superview != nil) + { + self.axisConstraint.active = NO; + self.hiddenAxisConstraint.active = YES; + } + + UISpringTimingParameters *timingParameters = [[UISpringTimingParameters alloc] initWithStiffness:RSTSpringStiffnessDefault dampingRatio:1.0]; + + UIViewPropertyAnimator *animator = [[UIViewPropertyAnimator alloc] initWithSpringTimingParameters:timingParameters animations:^{ + [self.superview layoutIfNeeded]; + }]; + [animator addCompletion:^(UIViewAnimatingPosition finalPosition) { + if (finalPosition != UIViewAnimatingPositionEnd) + { + return; + } + + [self removeFromSuperview]; + + self.axisConstraint = nil; + self.hiddenAxisConstraint = nil; + self.alignmentConstraint = nil; + + [[NSNotificationCenter defaultCenter] postNotificationName:RSTToastViewDidDismissNotification object:self]; + }]; + [animator startAnimation]; + + [[NSNotificationCenter defaultCenter] postNotificationName:RSTToastViewWillDismissNotification object:self userInfo:@{RSTToastViewUserInfoKeyPropertyAnimator: animator}]; +} + +#pragma mark - KVO - + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (context != RSTToastViewContext) + { + return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } + + [self invalidateIntrinsicContentSize]; + + UILabel *label = (UILabel *)object; + NSString *previousText = change[NSKeyValueChangeOldKey]; + + if (self.superview != nil) + { + CGFloat initialAlpha = 1.0; + CGFloat finalAlpha = 1.0; + + if (previousText.length == 0 && label.text.length != 0) + { + initialAlpha = 0.0; + finalAlpha = 1.0; + } + else if (previousText.length != 0 && label.text.length == 0) + { + initialAlpha = 1.0; + finalAlpha = 0.0; + } + + label.alpha = initialAlpha; + + UIViewPropertyAnimator *animator = [[UIViewPropertyAnimator alloc] initWithSpringTimingParameters:[UISpringTimingParameters new] animations:^{ + label.alpha = finalAlpha; + [self.superview layoutIfNeeded]; + }]; + [animator startAnimation]; + } +} + +#pragma mark - Notifications - + +- (void)toastViewWillShow:(NSNotification *)notification +{ + RSTToastView *toastView = notification.object; + + if (toastView == self) + { + return; + } + + if (toastView.presentationEdge != self.presentationEdge) + { + return; + } + + [self dismiss]; +} + +#pragma mark - Getters/Setters - + +- (void)setHighlighted:(BOOL)highlighted +{ + [super setHighlighted:highlighted]; + + self.dimmingView.hidden = !highlighted; +} + +- (void)setPresentationEdge:(RSTViewEdge)presentationEdge +{ + if (presentationEdge == RSTViewEdgeNone) + { + presentationEdge = RSTViewEdgeBottom; + } + + _presentationEdge = presentationEdge; +} + +- (void)setLayoutMargins:(UIEdgeInsets)layoutMargins +{ + [super setLayoutMargins:layoutMargins]; + + // For some reason, setting stackView.preservesSuperviewLayoutMargins to YES might result + // in some insets becoming zero when re-laying out (such as after updating label text). + // We compensate by overriding setLayoutMargins: and manually updating stackView's margins. + self.stackView.layoutMargins = layoutMargins; +} + +@end diff --git a/Pods/Roxas/Roxas/Roxas-Prefix.pch b/Pods/Roxas/Roxas/Roxas-Prefix.pch new file mode 100644 index 000000000..ec4e8ad98 --- /dev/null +++ b/Pods/Roxas/Roxas/Roxas-Prefix.pch @@ -0,0 +1,24 @@ +// +// Roxas-Prefix.pch +// Roxas +// +// Created by Riley Testut on 12/6/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +#ifndef Roxas_Roxas_Prefix_pch +#define Roxas_Roxas_Prefix_pch + +#import + +#ifndef __IPHONE_8_0 +#warning "This project uses features only available in iOS SDK 8.0 and later." +#endif + +#ifdef __OBJC__ + +#import "RSTDefines.h" + +#endif + +#endif diff --git a/Pods/Roxas/Roxas/Roxas.h b/Pods/Roxas/Roxas/Roxas.h new file mode 100644 index 000000000..e21af7560 --- /dev/null +++ b/Pods/Roxas/Roxas/Roxas.h @@ -0,0 +1,103 @@ +// +// Roxas.h +// Roxas +// +// Created by Riley Testut on 8/27/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +@import Foundation; + +//! Project version number for Roxas. +FOUNDATION_EXPORT double RoxasVersionNumber; + +//! Project version string for Roxas. +FOUNDATION_EXPORT const unsigned char RoxasVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +// Generic +#import +#import +#import +#import + +// Operations +#import +#import +#import + +// Operations - Block Operations +#import + +// Operations - Load Operations +#import + +// Cell Content +#import +#import + +// Cell Content - Changes +#import +#import + +// Cell Content - Data Sources +#import +#import +#import +#import +#import +#import + +// Cell Content - Search +#import + +// Cell Content - Collection View Layouts +#import + +// Cell Content - Cells +#import + +// Core Data +#import +#import + +// Visual Components +#import +#import +#import +#import +#import +#import + +// Containers +#import + +// Functionality +#import + +// Categories +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +// Categories - RSTActivityIndicating +#import +#import + +// Categories - Cell Content +#import +#import +#import +#import + + diff --git a/Pods/Roxas/Roxas/UIAlertAction+Actions.h b/Pods/Roxas/Roxas/UIAlertAction+Actions.h new file mode 100644 index 000000000..4fe128cfe --- /dev/null +++ b/Pods/Roxas/Roxas/UIAlertAction+Actions.h @@ -0,0 +1,20 @@ +// +// UIAlertAction+Actions.h +// Roxas +// +// Created by Riley Testut on 5/9/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIAlertAction (Actions) + +@property (class, nonatomic, readonly) UIAlertAction *okAction; +@property (class, nonatomic, readonly) UIAlertAction *cancelAction; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UIAlertAction+Actions.m b/Pods/Roxas/Roxas/UIAlertAction+Actions.m new file mode 100644 index 000000000..57005079e --- /dev/null +++ b/Pods/Roxas/Roxas/UIAlertAction+Actions.m @@ -0,0 +1,24 @@ +// +// UIAlertAction+Actions.m +// Roxas +// +// Created by Riley Testut on 5/9/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "UIAlertAction+Actions.h" +#import "NSString+Localization.h" + +@implementation UIAlertAction (Actions) + ++ (UIAlertAction *)okAction +{ + return [UIAlertAction actionWithTitle:RSTSystemLocalizedString(@"OK") style:UIAlertActionStyleDefault handler:nil]; +} + ++ (UIAlertAction *)cancelAction +{ + return [UIAlertAction actionWithTitle:RSTSystemLocalizedString(@"Cancel") style:UIAlertActionStyleCancel handler:nil]; +} + +@end diff --git a/Pods/Roxas/Roxas/UICollectionView+CellContent.h b/Pods/Roxas/Roxas/UICollectionView+CellContent.h new file mode 100644 index 000000000..df622b499 --- /dev/null +++ b/Pods/Roxas/Roxas/UICollectionView+CellContent.h @@ -0,0 +1,18 @@ +// +// UICollectionView+CellContent.h +// Roxas +// +// Created by Riley Testut on 8/2/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTCellContentView.h" + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UICollectionView (CellContent) +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UICollectionView+CellContent.m b/Pods/Roxas/Roxas/UICollectionView+CellContent.m new file mode 100644 index 000000000..f166a96dd --- /dev/null +++ b/Pods/Roxas/Roxas/UICollectionView+CellContent.m @@ -0,0 +1,153 @@ +// +// UICollectionView+CellContent.m +// Roxas +// +// Created by Riley Testut on 8/2/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "UICollectionView+CellContent.h" +#import "RSTCellContentChange.h" + +#import "RSTCellContentChangeOperation.h" + +@import ObjectiveC.runtime; + +@interface UICollectionView () + +@property (nonatomic) NSInteger rst_nestedUpdatesCounter; +@property (nullable, nonatomic) NSMutableArray *rst_operations; + +@end + +@implementation UICollectionView (CellContent) + +- (void)beginUpdates +{ + if (self.rst_nestedUpdatesCounter == 0) + { + self.rst_operations = [NSMutableArray array]; + } + + self.rst_nestedUpdatesCounter++; +} + +- (void)endUpdates +{ + if (self.rst_nestedUpdatesCounter <= 0) + { + return; + } + + self.rst_nestedUpdatesCounter--; + + if (self.rst_nestedUpdatesCounter > 0) + { + return; + } + + NSArray *operations = [self.rst_operations copy]; + self.rst_operations = nil; + + // According to documentation: + // Move is reported when an object changes in a manner that affects its position in the results. An update of the object is assumed in this case, no separate update message is sent to the delegate. + + // Therefore, we need to manually send another update message to items that moved after move is complete + // (because it may crash if you try to update an item that is moving in the same batch updates block...) + __block NSMutableArray *postMoveUpdateOperations = [NSMutableArray array]; + for (RSTCellContentChangeOperation *operation in operations) + { + if (operation.change.type != RSTCellContentChangeMove) + { + continue; + } + + RSTCellContentChange *change = [[RSTCellContentChange alloc] initWithType:RSTCellContentChangeUpdate currentIndexPath:operation.change.destinationIndexPath destinationIndexPath:nil]; + + RSTCollectionViewChangeOperation *updateOperation = [[RSTCollectionViewChangeOperation alloc] initWithChange:change collectionView:self]; + [postMoveUpdateOperations addObject:updateOperation]; + } + + __block BOOL isFinished = NO; + + void (^finish)(void) = ^{ + if (isFinished) + { + // Ensure finish() only runs once, despite (most likely) being called twice. + return; + } + + isFinished = YES; + + if (postMoveUpdateOperations.count == 0) + { + return; + } + + // Perform additional updates after any moved items have been moved. + // These additional updates must be performed after the first batch of operations have finished animating, or else the animation looks weird. + [self performBatchUpdates:^{ + for (RSTCellContentChangeOperation *operation in postMoveUpdateOperations) + { + [operation start]; + } + } completion:nil]; + }; + + [CATransaction begin]; + [CATransaction setCompletionBlock:^{ + // The completion block for performBatchUpdates: is only called if the updates result in an animation. + // Since there is no way to know if an animation will actually occur (dependent on multiple factors), we also explicitly create our own CATransaction as a fallback. + // If there are no animations, this CATransaction completion block will call finish() immediately. + // Otherwise, finish() will be called from performBatchUpdates:'s completion block after the animations finish. + finish(); + }]; + + [self performBatchUpdates:^{ + for (RSTCellContentChangeOperation *operation in operations) + { + [operation start]; + } + } completion:^(BOOL finished) { + // Call finish() in case CATransaction's completion block has not yet run (which might be delayed indefinitely). + finish(); + }]; + + [CATransaction commit]; +} + +- (void)addChange:(RSTCellContentChange *)change +{ + RSTCollectionViewChangeOperation *operation = [[RSTCollectionViewChangeOperation alloc] initWithChange:change collectionView:self]; + [self.rst_operations addObject:operation]; +} + +#pragma mark - Getters/Setters - + +- (Protocol *)dataSourceProtocol +{ + return @protocol(UICollectionViewDataSource); +} + +- (NSInteger)rst_nestedUpdatesCounter +{ + return [objc_getAssociatedObject(self, @selector(rst_nestedUpdatesCounter)) integerValue]; +} + +- (void)setRst_nestedUpdatesCounter:(NSInteger)rst_nestedUpdatesCounter +{ + NSNumber *value = (rst_nestedUpdatesCounter != 0) ? @(rst_nestedUpdatesCounter) : nil; + objc_setAssociatedObject(self, @selector(rst_nestedUpdatesCounter), value, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +- (NSMutableArray *)rst_operations +{ + return objc_getAssociatedObject(self, @selector(rst_operations)); +} + +- (void)setRst_operations:(NSMutableArray *)rst_operations +{ + objc_setAssociatedObject(self, @selector(rst_operations), rst_operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end diff --git a/Pods/Roxas/Roxas/UICollectionViewCell+CellContent.h b/Pods/Roxas/Roxas/UICollectionViewCell+CellContent.h new file mode 100644 index 000000000..ee527d4c8 --- /dev/null +++ b/Pods/Roxas/Roxas/UICollectionViewCell+CellContent.h @@ -0,0 +1,18 @@ +// +// UICollectionViewCell+CellContent.h +// Roxas +// +// Created by Riley Testut on 8/3/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTCellContentCell.h" + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UICollectionViewCell (CellContent) +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UICollectionViewCell+CellContent.m b/Pods/Roxas/Roxas/UICollectionViewCell+CellContent.m new file mode 100644 index 000000000..cef474030 --- /dev/null +++ b/Pods/Roxas/Roxas/UICollectionViewCell+CellContent.m @@ -0,0 +1,32 @@ +// +// UICollectionViewCell+CellContent.m +// Roxas +// +// Created by Riley Testut on 8/3/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "UICollectionViewCell+CellContent.h" + +@implementation UICollectionViewCell (CellContent) + ++ (nullable instancetype)instantiateWithNib:(UINib *)nib +{ + NSArray *contents = [nib instantiateWithOwner:nil options:nil]; + + UICollectionViewCell *cell = [contents firstObject]; + return cell; +} + ++ (UINib *)nib +{ + NSString *className = NSStringFromClass(self); + + // Handle Swift names that are prefixed with module name + NSArray *components = [className componentsSeparatedByString:@"."]; + + UINib *nib = [UINib nibWithNibName:components.lastObject bundle:[NSBundle bundleForClass:self]]; + return nib; +} + +@end diff --git a/Pods/Roxas/Roxas/UICollectionViewCell+Nibs.h b/Pods/Roxas/Roxas/UICollectionViewCell+Nibs.h new file mode 100644 index 000000000..d09acfe15 --- /dev/null +++ b/Pods/Roxas/Roxas/UICollectionViewCell+Nibs.h @@ -0,0 +1,21 @@ +// +// UICollectionViewCell+Nibs.h +// Roxas +// +// Created by Riley Testut on 8/3/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UICollectionViewCell (Nibs) + +@property (class, nullable, nonatomic, readonly) UINib *nib; + ++ (nullable instancetype)instantiateWithNib:(UINib *)nib; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UICollectionViewCell+Nibs.m b/Pods/Roxas/Roxas/UICollectionViewCell+Nibs.m new file mode 100644 index 000000000..25fab4db4 --- /dev/null +++ b/Pods/Roxas/Roxas/UICollectionViewCell+Nibs.m @@ -0,0 +1,32 @@ +// +// UICollectionViewCell+Nibs.m +// Roxas +// +// Created by Riley Testut on 8/3/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "UICollectionViewCell+Nibs.h" + +@implementation UICollectionViewCell (Nibs) + ++ (instancetype)instantiateWithNib:(UINib *)nib; +{ + NSArray *contents = [nib instantiateWithOwner:nil options:nil]; + + UICollectionViewCell *cell = [contents firstObject]; + return cell; +} + ++ (UINib *)nib +{ + NSString *className = NSStringFromClass(self); + + // Handle Swift names that are prefixed with module name + NSArray *components = [className componentsSeparatedByString:@"."]; + + UINib *nib = [UINib nibWithNibName:components.lastObject bundle:[NSBundle bundleForClass:self]]; + return nib; +} + +@end diff --git a/Pods/Roxas/Roxas/UIImage+Manipulation.h b/Pods/Roxas/Roxas/UIImage+Manipulation.h new file mode 100644 index 000000000..aeb8cff6d --- /dev/null +++ b/Pods/Roxas/Roxas/UIImage+Manipulation.h @@ -0,0 +1,45 @@ +// +// UIImage+Manipulation.h +// Hoot +// +// Created by Riley Testut on 9/23/14. +// Copyright (c) 2014 TMT. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, UIImageMetadataOrientation) +{ + UIImageMetadataOrientationUp = 1, + UIImageMetadataOrientationDown = 3, + UIImageMetadataOrientationLeft = 8, + UIImageMetadataOrientationRight = 6, + UIImageMetadataOrientationUpMirrored = 2, + UIImageMetadataOrientationDownMirrored = 4, + UIImageMetadataOrientationLeftMirrored = 5, + UIImageMetadataOrientationRightMirrored = 7, +}; + +RST_EXTERN UIImageMetadataOrientation UIImageMetadataOrientationFromImageOrientation(UIImageOrientation imageOrientation); +RST_EXTERN UIImageOrientation UIImageOrientationFromMetadataOrientation(UIImageMetadataOrientation metadataOrientation); + +@interface UIImage (Manipulation) + +// Resizing +- (nullable UIImage *)imageByResizingToSize:(CGSize)size; +- (nullable UIImage *)imageByResizingToFitSize:(CGSize)size; +- (nullable UIImage *)imageByResizingToFillSize:(CGSize)size; + +// Rounded Corners +- (nullable UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius; +- (nullable UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius inset:(UIEdgeInsets)inset; + +// Rotating +- (nullable UIImage *)imageByRotatingToImageOrientation:(UIImageOrientation)imageOrientation NS_SWIFT_NAME(rotatedToImageOrientation(_:)); +- (nullable UIImage *)imageByRotatingToIntrinsicOrientation NS_SWIFT_NAME(rotatedToIntrinsicOrientation()); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UIImage+Manipulation.m b/Pods/Roxas/Roxas/UIImage+Manipulation.m new file mode 100644 index 000000000..2741fea0e --- /dev/null +++ b/Pods/Roxas/Roxas/UIImage+Manipulation.m @@ -0,0 +1,389 @@ +// +// UIImage+Manipulation.m +// Hoot +// +// Created by Riley Testut on 9/23/14. +// Copyright (c) 2014 TMT. All rights reserved. +// + +#import "UIImage+Manipulation.h" + +@implementation UIImage (Manipulation) + +#pragma mark - Resizing - + +- (UIImage *)imageByResizingToFitSize:(CGSize)size +{ + CGSize imageSize = self.size; + + CGFloat horizontalScale = size.width / imageSize.width; + CGFloat verticalScale = size.height / imageSize.height; + + // Resizing to minimum scale (ex: 1/20 instead of 1/2) ensures image will retain aspect ratio, and fit inside size + CGFloat scale = MIN(horizontalScale, verticalScale); + size = CGSizeMake(imageSize.width * scale, imageSize.height * scale); + + return [self imageByResizingToSize:size]; +} + +- (UIImage *)imageByResizingToFillSize:(CGSize)size +{ + CGSize imageSize = self.size; + + CGFloat horizontalScale = size.width / imageSize.width; + CGFloat verticalScale = size.height / imageSize.height; + + // Resizing to maximum scale (ex: 1/2 instead of 1/20) ensures image will retain aspect ratio, and will fill size + CGFloat scale = MAX(horizontalScale, verticalScale); + size = CGSizeMake(imageSize.width * scale, imageSize.height * scale); + + return [self imageByResizingToSize:size]; +} + +- (UIImage *)imageByResizingToSize:(CGSize)size +{ + switch (self.imageOrientation) + { + case UIImageOrientationLeft: + case UIImageOrientationLeftMirrored: + case UIImageOrientationRight: + case UIImageOrientationRightMirrored: + size = CGSizeMake(size.height, size.width); + break; + + default: + break; + } + + CGRect rect = CGRectIntegral(CGRectMake(0, 0, size.width * self.scale, size.height * self.scale)); + + CGContextRef context = [self createContextWithRect:rect]; + if (context == nil) + { + return nil; + } + + CGContextDrawImage(context, rect, self.CGImage); + + CGImageRef imageRef = CGBitmapContextCreateImage(context); + UIImage *image = [[UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation] imageWithRenderingMode:self.renderingMode]; + + CFRelease(imageRef); + CFRelease(context); + + return image; +} + +#pragma mark - Rounded Corners - + +- (UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius +{ + return [self imageWithCornerRadius:cornerRadius inset:UIEdgeInsetsZero]; +} + +- (UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius inset:(UIEdgeInsets)inset +{ + UIEdgeInsets correctedInset = inset; + + switch (self.imageOrientation) + { + case UIImageOrientationLeft: + case UIImageOrientationLeftMirrored: + correctedInset.top = inset.left; + correctedInset.bottom = inset.right; + correctedInset.left = inset.bottom; + correctedInset.right = inset.top; + break; + + case UIImageOrientationRight: + case UIImageOrientationRightMirrored: + correctedInset.top = inset.right; + correctedInset.bottom = inset.left; + correctedInset.left = inset.top; + correctedInset.right = inset.bottom; + break; + + case UIImageOrientationDown: + case UIImageOrientationDownMirrored: + correctedInset.top = inset.bottom; + correctedInset.bottom = inset.top; + correctedInset.left = inset.left; + correctedInset.right = inset.right; + break; + + default: + break; + } + + CGFloat imageScale = self.scale; + + CGRect clippedRect = CGRectMake(0, 0, self.size.width - correctedInset.left - correctedInset.right, self.size.height - correctedInset.top - correctedInset.bottom); + CGRect drawingRect = CGRectMake(-correctedInset.left, -correctedInset.top, self.size.width, self.size.height); + + clippedRect = CGRectApplyAffineTransform(clippedRect, CGAffineTransformMakeScale(imageScale, imageScale)); + drawingRect = CGRectApplyAffineTransform(drawingRect, CGAffineTransformMakeScale(imageScale, imageScale)); + + CGContextRef context = [self createContextWithRect:clippedRect]; + if (context == nil) + { + return nil; + } + + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:clippedRect cornerRadius:cornerRadius * imageScale]; + + CGContextAddPath(context, path.CGPath); + CGContextClip(context); + + CGContextDrawImage(context, drawingRect, self.CGImage); + + CGImageRef imageRef = CGBitmapContextCreateImage(context); + UIImage *image = [[UIImage imageWithCGImage:imageRef scale:imageScale orientation:self.imageOrientation] imageWithRenderingMode:self.renderingMode]; + + CFRelease(imageRef); + CFRelease(context); + + return image; +} + +#pragma mark - Rotating - + +- (UIImage *)imageByRotatingToImageOrientation:(UIImageOrientation)imageOrientation +{ + UIImage *image = [UIImage imageWithCGImage:self.CGImage scale:self.scale orientation:imageOrientation]; + UIImage *rotatedImage = [image imageByRotatingToIntrinsicOrientation]; + + return rotatedImage; +} + +- (nullable UIImage *)imageByRotatingToIntrinsicOrientation +{ + if (self.imageOrientation == UIImageOrientationUp) + { + // Image orientation is already UIImageOrientationUp, so no need to do anything. + return self; + } + + CGAffineTransform transform = CGAffineTransformIdentity; + + switch (self.imageOrientation) + { + case UIImageOrientationUp: + case UIImageOrientationUpMirrored: + break; + + case UIImageOrientationDown: + case UIImageOrientationDownMirrored: + transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); + transform = CGAffineTransformRotate(transform, M_PI); + break; + + case UIImageOrientationLeft: + case UIImageOrientationLeftMirrored: + transform = CGAffineTransformTranslate(transform, self.size.width, 0); + transform = CGAffineTransformRotate(transform, M_PI_2); + break; + + case UIImageOrientationRight: + case UIImageOrientationRightMirrored: + transform = CGAffineTransformTranslate(transform, 0, self.size.height); + transform = CGAffineTransformRotate(transform, -M_PI_2); + break; + } + + switch (self.imageOrientation) + { + case UIImageOrientationUpMirrored: + case UIImageOrientationDownMirrored: + transform = CGAffineTransformTranslate(transform, self.size.width, 0); + transform = CGAffineTransformScale(transform, -1, 1); + break; + + case UIImageOrientationLeftMirrored: + case UIImageOrientationRightMirrored: + transform = CGAffineTransformTranslate(transform, self.size.height, 0); + transform = CGAffineTransformScale(transform, -1, 1); + break; + + case UIImageOrientationUp: + case UIImageOrientationDown: + case UIImageOrientationLeft: + case UIImageOrientationRight: + break; + } + + CGRect rect = CGRectIntegral(CGRectMake(0, 0, self.size.width * self.scale, self.size.height * self.scale)); + + CGContextRef context = [self createContextWithRect:rect]; + if (context == nil) + { + return nil; + } + + CGContextConcatCTM(context, transform); + + switch (self.imageOrientation) + { + case UIImageOrientationLeft: + case UIImageOrientationLeftMirrored: + case UIImageOrientationRight: + case UIImageOrientationRightMirrored: + CGContextDrawImage(context, CGRectMake(0, 0, CGRectGetHeight(rect), CGRectGetWidth(rect)), self.CGImage); + break; + + default: + CGContextDrawImage(context, rect, self.CGImage); + break; + } + + CGImageRef imageRef = CGBitmapContextCreateImage(context); + UIImage *image = [[UIImage imageWithCGImage:imageRef scale:self.scale orientation:UIImageOrientationUp] imageWithRenderingMode:self.renderingMode]; + + CFRelease(imageRef); + CFRelease(context); + + return image; +} + +#pragma mark - Graphics Context - + +- (nullable CGContextRef)createContextWithRect:(CGRect)rect +{ + size_t bitsPerComponent = CGImageGetBitsPerComponent(self.CGImage); + CGColorSpaceRef imageColorSpace = CGImageGetColorSpace(self.CGImage); + + CGColorSpaceRef outputColorSpace = imageColorSpace; + if (!CGColorSpaceSupportsOutput(imageColorSpace)) + { + outputColorSpace = CGColorSpaceCreateDeviceRGB(); + } + + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(self.CGImage); + CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(self.CGImage); + + bitmapInfo &= ~(kCGBitmapAlphaInfoMask & alphaInfo); + + switch (alphaInfo) + { + case kCGImageAlphaNone: + case kCGImageAlphaLast: + alphaInfo = kCGImageAlphaNoneSkipLast; + break; + + case kCGImageAlphaPremultipliedLast: + alphaInfo = kCGImageAlphaPremultipliedFirst; + break; + + default: break; + } + + bitmapInfo |= (kCGBitmapAlphaInfoMask & alphaInfo); + + CGContextRef context = CGBitmapContextCreate(NULL, + CGRectGetWidth(rect), + CGRectGetHeight(rect), + bitsPerComponent, + 0, // CGImageGetBytesPerRow(self.CGImage) crashes on malformed UIImages (such as Crossy Road's). Passing 0 = automatic calculation, and is safer + outputColorSpace, + bitmapInfo); + + if (!CGColorSpaceSupportsOutput(imageColorSpace)) + { + CGColorSpaceRelease(outputColorSpace); + } + + if (context == NULL) + { + return nil; + } + + CGContextSetInterpolationQuality(context, kCGInterpolationHigh); + + return context; +} + +@end + + +UIImageMetadataOrientation UIImageMetadataOrientationFromImageOrientation(UIImageOrientation imageOrientation) +{ + UIImageMetadataOrientation metadataOrientation = UIImageMetadataOrientationUp; + + switch (imageOrientation) + { + case UIImageOrientationUp: + metadataOrientation = UIImageMetadataOrientationUp; + break; + + case UIImageOrientationDown: + metadataOrientation = UIImageMetadataOrientationDown; + break; + + case UIImageOrientationLeft: + metadataOrientation = UIImageMetadataOrientationLeft; + break; + + case UIImageOrientationRight: + metadataOrientation = UIImageMetadataOrientationRight; + break; + + case UIImageOrientationUpMirrored: + metadataOrientation = UIImageMetadataOrientationUpMirrored; + break; + + case UIImageOrientationDownMirrored: + metadataOrientation = UIImageMetadataOrientationDownMirrored; + break; + + case UIImageOrientationLeftMirrored: + metadataOrientation = UIImageMetadataOrientationLeftMirrored; + break; + + case UIImageOrientationRightMirrored: + metadataOrientation = UIImageMetadataOrientationRightMirrored; + break; + } + + return metadataOrientation; +} + +UIImageOrientation UIImageOrientationFromMetadataOrientation(UIImageMetadataOrientation metadataOrientation) +{ + UIImageOrientation imageOrientation = UIImageOrientationUp; + + switch (metadataOrientation) + { + case UIImageMetadataOrientationUp: + imageOrientation = UIImageOrientationUp; + break; + + case UIImageMetadataOrientationDown: + imageOrientation = UIImageOrientationDown; + break; + + case UIImageMetadataOrientationLeft: + imageOrientation = UIImageOrientationLeft; + break; + + case UIImageMetadataOrientationRight: + imageOrientation = UIImageOrientationRight; + break; + + case UIImageMetadataOrientationUpMirrored: + imageOrientation = UIImageOrientationUpMirrored; + break; + + case UIImageMetadataOrientationDownMirrored: + imageOrientation = UIImageOrientationDownMirrored; + break; + + case UIImageMetadataOrientationLeftMirrored: + imageOrientation = UIImageOrientationLeftMirrored; + break; + + case UIImageMetadataOrientationRightMirrored: + imageOrientation = UIImageOrientationRightMirrored; + break; + } + + return imageOrientation; +} diff --git a/Pods/Roxas/Roxas/UIKit+ActivityIndicating.h b/Pods/Roxas/Roxas/UIKit+ActivityIndicating.h new file mode 100644 index 000000000..98fcbc7db --- /dev/null +++ b/Pods/Roxas/Roxas/UIKit+ActivityIndicating.h @@ -0,0 +1,35 @@ +// +// UIKit+ActivityIndicating.h +// Roxas +// +// Created by Riley Testut on 4/8/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "RSTActivityIndicating.h" + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIButton (ActivityIndicating) +@property (nonatomic, readonly) UIActivityIndicatorView *rst_activityIndicatorView NS_SWIFT_NAME(activityIndicatorView); +@end + +@interface UIBarButtonItem (ActivityIndicating) +@property (nonatomic, readonly) UIActivityIndicatorView *rst_activityIndicatorView NS_SWIFT_NAME(activityIndicatorView); +@end + +@interface UIImageView (ActivityIndicating) +@property (nonatomic, readonly) UIActivityIndicatorView *rst_activityIndicatorView NS_SWIFT_NAME(activityIndicatorView); +@end + +@interface UITextField (ActivityIndicating) +@property (nonatomic, readonly) UIActivityIndicatorView *rst_activityIndicatorView NS_SWIFT_NAME(activityIndicatorView); +@end + +@interface UIApplication (ActivityIndicating) +@end + +NS_ASSUME_NONNULL_END + diff --git a/Pods/Roxas/Roxas/UIKit+ActivityIndicating.m b/Pods/Roxas/Roxas/UIKit+ActivityIndicating.m new file mode 100644 index 000000000..7676435ab --- /dev/null +++ b/Pods/Roxas/Roxas/UIKit+ActivityIndicating.m @@ -0,0 +1,577 @@ +// +// UIKit+ActivityIndicating.m +// Roxas +// +// Created by Riley Testut on 4/2/18. +// Copyright © 2018 Riley Testut. All rights reserved. +// + +#import "UIKit+ActivityIndicating.h" + +typedef NSString *RSTActivityIndicatingHelperUserInfoKey NS_TYPED_EXTENSIBLE_ENUM; +RSTActivityIndicatingHelperUserInfoKey const RSTActivityIndicatingHelperUserInfoKeyTitle = @"RSTActivityIndicatingHelperUserInfoKeyTitle"; +RSTActivityIndicatingHelperUserInfoKey const RSTActivityIndicatingHelperUserInfoKeyImage = @"RSTActivityIndicatingHelperUserInfoKeyImage"; +RSTActivityIndicatingHelperUserInfoKey const RSTActivityIndicatingHelperUserInfoKeyEnabled = @"RSTActivityIndicatingHelperUserInfoKeyEnabled"; +RSTActivityIndicatingHelperUserInfoKey const RSTActivityIndicatingHelperUserInfoKeyCustomView = @"RSTActivityIndicatingHelperUserInfoKeyCustomView"; +RSTActivityIndicatingHelperUserInfoKey const RSTActivityIndicatingHelperUserInfoKeyWidthConstraint = @"RSTActivityIndicatingHelperUserInfoKeyWidthConstraint"; +RSTActivityIndicatingHelperUserInfoKey const RSTActivityIndicatingHelperUserInfoKeyViewMode = @"RSTActivityIndicatingHelperUserInfoKeyViewMode"; + +@import ObjectiveC; + +@protocol _RSTActivityIndicating + +- (void)startIndicatingActivity; +- (void)stopIndicatingActivity; + +@end + + +NS_ASSUME_NONNULL_BEGIN + +@interface RSTActivityIndicatingHelper : NSObject + +@property (nonatomic, readwrite) NSUInteger activityCount; + +@property (nonatomic, readonly) id<_RSTActivityIndicating> indicatingObject; + +@property (nonatomic, readonly) dispatch_queue_t activityCountQueue; + +@property (nonatomic, readonly) NSMutableDictionary *userInfo; + +@property (nonatomic, readonly) UIActivityIndicatorView *activityIndicatorView; + +- (instancetype)initWithIndicatingObject:(id<_RSTActivityIndicating>)indicatingObject NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + + +@implementation RSTActivityIndicatingHelper +@synthesize activityCount = _activityCount; +@synthesize indicatingActivity = _indicatingActivity; +@synthesize activityIndicatorView = _activityIndicatorView; + ++ (instancetype)activityIndicatingHelperForIndicatingObject:(id<_RSTActivityIndicating>)object +{ + @synchronized(object) + { + RSTActivityIndicatingHelper *helper = objc_getAssociatedObject(object, @selector(activityIndicatingHelperForIndicatingObject:)); + if (helper == nil) + { + helper = [[RSTActivityIndicatingHelper alloc] initWithIndicatingObject:object]; + + objc_setAssociatedObject(object, @selector(activityIndicatingHelperForIndicatingObject:), helper, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + + return helper; + } +} + +- (instancetype)initWithIndicatingObject:(id<_RSTActivityIndicating>)indicatingObject +{ + self = [super init]; + if (self) + { + _indicatingObject = indicatingObject; + + _activityCountQueue = dispatch_queue_create("com.rileytestut.Roxas.activityCountQueue", DISPATCH_QUEUE_SERIAL); + + _userInfo = [NSMutableDictionary dictionary]; + } + + return self; +} + +- (void)incrementActivityCount +{ + dispatch_sync(self.activityCountQueue, ^{ + self.activityCount++; + + if (self.activityCount == 1) + { + dispatch_async(dispatch_get_main_queue(), ^{ + self.indicatingActivity = YES; + }); + } + }); +} + +- (void)decrementActivityCount +{ + dispatch_sync(self.activityCountQueue, ^{ + if (self.activityCount == 0) + { + return; + } + + self.activityCount--; + + if (self.activityCount == 0) + { + dispatch_async(dispatch_get_main_queue(), ^{ + self.indicatingActivity = NO; + }); + } + }); +} + +#pragma mark - Getters/Setters - + +- (UIActivityIndicatorView *)activityIndicatorView +{ + @synchronized(self) + { + if (_activityIndicatorView == nil) + { + if (@available(iOS 13, *)) + { + _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleMedium]; + } + else + { + _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + } + + _activityIndicatorView.translatesAutoresizingMaskIntoConstraints = NO; + } + + return _activityIndicatorView; + } +} + +- (void)setIndicatingActivity:(BOOL)indicatingActivity +{ + // Always start/stop animation regardless of whether indicatingActivity is a new value. + // This is in case the animation has been started/stopped externally (such as when reusing table/collection view cells). + if (indicatingActivity) + { + [self.activityIndicatorView startAnimating]; + } + else + { + [self.activityIndicatorView stopAnimating]; + } + + if (indicatingActivity == _indicatingActivity) + { + return; + } + + _indicatingActivity = indicatingActivity; + + if (indicatingActivity) + { + [self.indicatingObject startIndicatingActivity]; + } + else + { + [self.indicatingObject stopIndicatingActivity]; + } +} + +@end + + +NS_ASSUME_NONNULL_BEGIN + +@interface UIButton (_ActivityIndicating) <_RSTActivityIndicating> +@property (nonatomic, readonly) RSTActivityIndicatingHelper *activityIndicatingHelper; +@end + +NS_ASSUME_NONNULL_END + + +@implementation UIButton (_ActivityIndicating) + +- (void)startIndicatingActivity +{ + NSString *title = [self titleForState:UIControlStateNormal]; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyTitle] = title; + + UIImage *image = [self imageForState:UIControlStateNormal]; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyImage] = image; + + BOOL enabled = [self isUserInteractionEnabled]; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] = @(enabled); + + if (!self.translatesAutoresizingMaskIntoConstraints) + { + NSLayoutConstraint *widthConstraint = [self.widthAnchor constraintEqualToConstant:CGRectGetWidth(self.bounds)]; + widthConstraint.active = YES; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyWidthConstraint] = widthConstraint; + } + + [self setTitle:nil forState:UIControlStateNormal]; + [self setImage:nil forState:UIControlStateNormal]; + [self setUserInteractionEnabled:NO]; + + [self addSubview:self.activityIndicatingHelper.activityIndicatorView]; + + [NSLayoutConstraint activateConstraints:@[[self.activityIndicatingHelper.activityIndicatorView.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], + [self.activityIndicatingHelper.activityIndicatorView.centerYAnchor constraintEqualToAnchor:self.centerYAnchor]]]; +} + +- (void)stopIndicatingActivity +{ + [self.activityIndicatingHelper.activityIndicatorView removeFromSuperview]; + + NSString *title = self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyTitle]; + [self setTitle:title forState:UIControlStateNormal]; + + UIImage *image = self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyImage]; + [self setImage:image forState:UIControlStateNormal]; + + BOOL enabled = [self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] boolValue]; + [self setUserInteractionEnabled:enabled]; + + NSLayoutConstraint *widthConstraint = self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyWidthConstraint]; + widthConstraint.active = NO; + + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyTitle] = nil; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyImage] = nil; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] = nil; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyWidthConstraint] = nil; +} + +#pragma mark - - + +- (void)incrementActivityCount +{ + [self.activityIndicatingHelper incrementActivityCount]; +} + +- (void)decrementActivityCount +{ + [self.activityIndicatingHelper decrementActivityCount]; +} + +#pragma mark - Getters/Setters - + +- (void)setIndicatingActivity:(BOOL)indicatingActivity +{ + self.activityIndicatingHelper.indicatingActivity = indicatingActivity; +} + +- (BOOL)isIndicatingActivity +{ + return [self.activityIndicatingHelper isIndicatingActivity]; +} + +- (NSUInteger)activityCount +{ + return self.activityIndicatingHelper.activityCount; +} + +- (RSTActivityIndicatingHelper *)activityIndicatingHelper +{ + return [RSTActivityIndicatingHelper activityIndicatingHelperForIndicatingObject:self]; +} + +- (UIActivityIndicatorView *)rst_activityIndicatorView +{ + return self.activityIndicatingHelper.activityIndicatorView; +} + +@end + + +NS_ASSUME_NONNULL_BEGIN + +@interface UIBarButtonItem (_ActivityIndicating) <_RSTActivityIndicating> +@property (nonatomic, readonly) RSTActivityIndicatingHelper *activityIndicatingHelper; +@end + +NS_ASSUME_NONNULL_END + + +@implementation UIBarButtonItem (_ActivityIndicating) + +- (void)startIndicatingActivity +{ + UIView *customView = [[UIView alloc] init]; + customView.translatesAutoresizingMaskIntoConstraints = NO; + [customView addSubview:self.activityIndicatingHelper.activityIndicatorView]; + + [NSLayoutConstraint activateConstraints:@[[self.rst_activityIndicatorView.leadingAnchor constraintEqualToAnchor:customView.leadingAnchor constant:8], + [self.rst_activityIndicatorView.trailingAnchor constraintEqualToAnchor:customView.trailingAnchor constant:-8], + [self.rst_activityIndicatorView.topAnchor constraintEqualToAnchor:customView.topAnchor], + [self.rst_activityIndicatorView.bottomAnchor constraintEqualToAnchor:customView.bottomAnchor]]]; + + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] = @(self.enabled); + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyCustomView] = self.customView; + + self.enabled = NO; + self.customView = customView; +} + +- (void)stopIndicatingActivity +{ + BOOL enabled = [self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] boolValue]; + self.enabled = enabled; + + UIView *customView = self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyCustomView]; + self.customView = customView; + + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] = nil; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyCustomView] = nil; +} + +#pragma mark - - + +- (void)incrementActivityCount +{ + [self.activityIndicatingHelper incrementActivityCount]; +} + +- (void)decrementActivityCount +{ + [self.activityIndicatingHelper decrementActivityCount]; +} + +#pragma mark - Getters/Setters - + +- (void)setIndicatingActivity:(BOOL)indicatingActivity +{ + self.activityIndicatingHelper.indicatingActivity = indicatingActivity; +} + +- (BOOL)isIndicatingActivity +{ + return [self.activityIndicatingHelper isIndicatingActivity]; +} + +- (NSUInteger)activityCount +{ + return self.activityIndicatingHelper.activityCount; +} + +- (RSTActivityIndicatingHelper *)activityIndicatingHelper +{ + return [RSTActivityIndicatingHelper activityIndicatingHelperForIndicatingObject:self]; +} + +- (UIActivityIndicatorView *)rst_activityIndicatorView +{ + return self.activityIndicatingHelper.activityIndicatorView; +} + +@end + + +NS_ASSUME_NONNULL_BEGIN + +@interface UIImageView (_ActivityIndicating) <_RSTActivityIndicating> +@property (nonatomic, readonly) RSTActivityIndicatingHelper *activityIndicatingHelper; +@end + +NS_ASSUME_NONNULL_END + + +@implementation UIImageView (_ActivityIndicating) + +- (void)startIndicatingActivity +{ + [self addSubview:self.activityIndicatingHelper.activityIndicatorView]; + + [NSLayoutConstraint activateConstraints:@[[self.activityIndicatingHelper.activityIndicatorView.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], + [self.activityIndicatingHelper.activityIndicatorView.centerYAnchor constraintEqualToAnchor:self.centerYAnchor]]]; +} + +- (void)stopIndicatingActivity +{ + [self.activityIndicatingHelper.activityIndicatorView removeFromSuperview]; +} + +#pragma mark - - + +- (void)incrementActivityCount +{ + [self.activityIndicatingHelper incrementActivityCount]; +} + +- (void)decrementActivityCount +{ + [self.activityIndicatingHelper decrementActivityCount]; +} + +#pragma mark - Getters/Setters - + +- (void)setIndicatingActivity:(BOOL)indicatingActivity +{ + self.activityIndicatingHelper.indicatingActivity = indicatingActivity; +} + +- (BOOL)isIndicatingActivity +{ + return [self.activityIndicatingHelper isIndicatingActivity]; +} + +- (NSUInteger)activityCount +{ + return self.activityIndicatingHelper.activityCount; +} + +- (RSTActivityIndicatingHelper *)activityIndicatingHelper +{ + return [RSTActivityIndicatingHelper activityIndicatingHelperForIndicatingObject:self]; +} + +- (UIActivityIndicatorView *)rst_activityIndicatorView +{ + return self.activityIndicatingHelper.activityIndicatorView; +} + +@end + + +NS_ASSUME_NONNULL_BEGIN + +@interface UITextField (_ActivityIndicating) <_RSTActivityIndicating> +@property (nonatomic, readonly) RSTActivityIndicatingHelper *activityIndicatingHelper; +@end + +NS_ASSUME_NONNULL_END + + +@implementation UITextField (_ActivityIndicating) + +- (void)startIndicatingActivity +{ + UIView *customView = self.rightView; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyCustomView] = customView; + + UITextFieldViewMode viewMode = self.rightViewMode; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyViewMode] = @(viewMode); + + BOOL enabled = [self isUserInteractionEnabled]; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] = @(enabled); + + self.rightView = self.activityIndicatingHelper.activityIndicatorView; + self.rightViewMode = UITextFieldViewModeAlways; + self.userInteractionEnabled = NO; + + // Layout twice to fix bug where setting self.rightView to the same UIActivityIndicatorView instance multiple times results in incorrect placement. + [self layoutIfNeeded]; + + [self setNeedsLayout]; + [self layoutIfNeeded]; +} + +- (void)stopIndicatingActivity +{ + UIView *customView = self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyCustomView]; + self.rightView = customView; + + UITextFieldViewMode viewMode = [self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyViewMode] integerValue]; + self.rightViewMode = viewMode; + + BOOL enabled = [self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] boolValue]; + self.userInteractionEnabled = enabled; + + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyCustomView] = nil; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyViewMode] = nil; + self.activityIndicatingHelper.userInfo[RSTActivityIndicatingHelperUserInfoKeyEnabled] = nil; +} + +#pragma mark - - + +- (void)incrementActivityCount +{ + [self.activityIndicatingHelper incrementActivityCount]; +} + +- (void)decrementActivityCount +{ + [self.activityIndicatingHelper decrementActivityCount]; +} + +#pragma mark - Getters/Setters - + +- (void)setIndicatingActivity:(BOOL)indicatingActivity +{ + self.activityIndicatingHelper.indicatingActivity = indicatingActivity; +} + +- (BOOL)isIndicatingActivity +{ + return [self.activityIndicatingHelper isIndicatingActivity]; +} + +- (NSUInteger)activityCount +{ + return self.activityIndicatingHelper.activityCount; +} + +- (RSTActivityIndicatingHelper *)activityIndicatingHelper +{ + return [RSTActivityIndicatingHelper activityIndicatingHelperForIndicatingObject:self]; +} + +- (UIActivityIndicatorView *)rst_activityIndicatorView +{ + return self.activityIndicatingHelper.activityIndicatorView; +} + +@end + + +NS_ASSUME_NONNULL_BEGIN + +@interface UIApplication (_ActivityIndicating) <_RSTActivityIndicating> +@property (nonatomic, readonly) RSTActivityIndicatingHelper *activityIndicatingHelper; +@end + +NS_ASSUME_NONNULL_END + + +@implementation UIApplication (_ActivityIndicating) + +- (void)startIndicatingActivity +{ + self.networkActivityIndicatorVisible = YES; +} + +- (void)stopIndicatingActivity +{ + self.networkActivityIndicatorVisible = NO; +} + +#pragma mark - - + +- (void)incrementActivityCount +{ + [self.activityIndicatingHelper incrementActivityCount]; +} + +- (void)decrementActivityCount +{ + [self.activityIndicatingHelper decrementActivityCount]; +} + +#pragma mark - Getters/Setters - + +- (void)setIndicatingActivity:(BOOL)indicatingActivity +{ + self.activityIndicatingHelper.indicatingActivity = indicatingActivity; +} + +- (BOOL)isIndicatingActivity +{ + return [self.activityIndicatingHelper isIndicatingActivity]; +} + +- (NSUInteger)activityCount +{ + return self.activityIndicatingHelper.activityCount; +} + +- (RSTActivityIndicatingHelper *)activityIndicatingHelper +{ + return [RSTActivityIndicatingHelper activityIndicatingHelperForIndicatingObject:self]; +} + +@end + diff --git a/Pods/Roxas/Roxas/UISpringTimingParameters+Conveniences.h b/Pods/Roxas/Roxas/UISpringTimingParameters+Conveniences.h new file mode 100644 index 000000000..02f398081 --- /dev/null +++ b/Pods/Roxas/Roxas/UISpringTimingParameters+Conveniences.h @@ -0,0 +1,39 @@ +// +// UISpringTimingParameters+Conveniences.h +// Roxas +// +// Created by Riley Testut on 5/2/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +typedef CGFloat RSTSpringStiffness NS_TYPED_EXTENSIBLE_ENUM; + +RST_EXTERN const RSTSpringStiffness RSTSpringStiffnessDefault NS_SWIFT_NAME(RSTSpringStiffness.default); +RST_EXTERN const RSTSpringStiffness RSTSpringStiffnessSystem NS_SWIFT_NAME(RSTSpringStiffness.system); + +@interface UISpringTimingParameters (Conveniences) + +- (instancetype)initWithMass:(CGFloat)mass stiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio; +- (instancetype)initWithMass:(CGFloat)mass stiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio initialVelocity:(CGVector)initialVelocity; + +- (instancetype)initWithStiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio; +- (instancetype)initWithStiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio initialVelocity:(CGVector)initialVelocity; + +@end + +NS_ASSUME_NONNULL_END + + +NS_ASSUME_NONNULL_BEGIN + +@interface UIViewPropertyAnimator (SpringConveniences) + +- (instancetype)initWithSpringTimingParameters:(UISpringTimingParameters *)timingParameters animations:(void (^ __nullable)(void))animations; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UISpringTimingParameters+Conveniences.m b/Pods/Roxas/Roxas/UISpringTimingParameters+Conveniences.m new file mode 100644 index 000000000..d6fcdfabf --- /dev/null +++ b/Pods/Roxas/Roxas/UISpringTimingParameters+Conveniences.m @@ -0,0 +1,67 @@ +// +// UISpringTimingParameters+Conveniences.m +// Roxas +// +// Created by Riley Testut on 5/2/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "UISpringTimingParameters+Conveniences.h" + +const RSTSpringStiffness RSTSpringStiffnessDefault = 750.0; + +// Retrieved via private APIs. https://twitter.com/rileytestut/statuses/754924747046080512 +const RSTSpringStiffness RSTSpringStiffnessSystem = 1000.0; + +@implementation UISpringTimingParameters (Conveniences) + +- (instancetype)initWithMass:(CGFloat)mass stiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio +{ + return [self initWithMass:mass stiffness:stiffness dampingRatio:dampingRatio initialVelocity:CGVectorMake(0, 0)]; +} + +- (instancetype)initWithMass:(CGFloat)mass stiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio initialVelocity:(CGVector)initialVelocity +{ + // The damping coefficient necessary to prevent oscillations and return to equilibrium in the minimum amount of time. + CGFloat criticalDamping = 2 * sqrt((double)mass * (double)stiffness); + + // The damping coefficient necessary to achieve the requested dampingRatio. + // The damping ratio is simply the ratio between the system's damping and its critical damping. + CGFloat damping = dampingRatio * criticalDamping; + + self = [self initWithMass:mass stiffness:stiffness damping:damping initialVelocity:CGVectorMake(0, 0)]; + return self; +} + +- (instancetype)initWithStiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio +{ + return [self initWithStiffness:stiffness dampingRatio:dampingRatio initialVelocity:CGVectorMake(0, 0)]; +} + +- (instancetype)initWithStiffness:(RSTSpringStiffness)stiffness dampingRatio:(CGFloat)dampingRatio initialVelocity:(CGVector)initialVelocity +{ + CGFloat mass = 3.0; + + return [self initWithMass:mass stiffness:stiffness dampingRatio:dampingRatio initialVelocity:initialVelocity]; +} + +@end + + +@implementation UIViewPropertyAnimator (SpringConveniences) + +- (instancetype)initWithSpringTimingParameters:(UISpringTimingParameters *)timingParameters animations:(void (^)(void))animations +{ + self = [self initWithDuration:0 timingParameters:timingParameters]; + if (self) + { + if (animations) + { + [self addAnimations:animations]; + } + } + + return self; +} + +@end diff --git a/Pods/Roxas/Roxas/UITableView+CellContent.h b/Pods/Roxas/Roxas/UITableView+CellContent.h new file mode 100644 index 000000000..8bdc71147 --- /dev/null +++ b/Pods/Roxas/Roxas/UITableView+CellContent.h @@ -0,0 +1,18 @@ +// +// UITableView+CellContent.h +// Roxas +// +// Created by Riley Testut on 10/21/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "RSTCellContentView.h" + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UITableView (CellContent) +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UITableView+CellContent.m b/Pods/Roxas/Roxas/UITableView+CellContent.m new file mode 100644 index 000000000..ad8da18da --- /dev/null +++ b/Pods/Roxas/Roxas/UITableView+CellContent.m @@ -0,0 +1,86 @@ +// +// UITableView+CellContent.m +// Roxas +// +// Created by Riley Testut on 10/21/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "UITableView+CellContent.h" +#import "RSTCellContentChange.h" + +@implementation UITableView (CellContent) + +- (void)addChange:(RSTCellContentChange *)change +{ + switch (change.type) + { + case NSFetchedResultsChangeInsert: + { + if (change.sectionIndex != RSTUnknownSectionIndex) + { + [self insertSections:[NSIndexSet indexSetWithIndex:change.sectionIndex] withRowAnimation:change.rowAnimation]; + } + else + { + [self insertRowsAtIndexPaths:@[change.destinationIndexPath] withRowAnimation:change.rowAnimation]; + } + + break; + } + + case NSFetchedResultsChangeDelete: + { + if (change.sectionIndex != RSTUnknownSectionIndex) + { + [self deleteSections:[NSIndexSet indexSetWithIndex:change.sectionIndex] withRowAnimation:change.rowAnimation]; + } + else + { + [self deleteRowsAtIndexPaths:@[change.currentIndexPath] withRowAnimation:change.rowAnimation]; + } + + break; + } + + case NSFetchedResultsChangeMove: + { + // According to documentation: + // Move is reported when an object changes in a manner that affects its position in the results. An update of the object is assumed in this case, no separate update message is sent to the delegate. + + // Therefore, we need to manually send another update message to items that moved after move is complete on the next run loop. + // (because it may crash if you try to update an item that is moving in the same batch updates...) + dispatch_async(dispatch_get_main_queue(), ^{ + [self reloadRowsAtIndexPaths:@[change.destinationIndexPath] withRowAnimation:change.rowAnimation]; + }); + + [self moveRowAtIndexPath:change.currentIndexPath toIndexPath:change.destinationIndexPath]; + break; + } + + case NSFetchedResultsChangeUpdate: + { + [self reloadRowsAtIndexPaths:@[change.currentIndexPath] withRowAnimation:change.rowAnimation]; + break; + } + } +} + +- (id)cellForItemAtIndexPath:(NSIndexPath *)indexPath +{ + return [self cellForRowAtIndexPath:indexPath]; +} + +- (id)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath +{ + return [self dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath]; +} + +#pragma mark - Getters/Setters - + +- (Protocol *)dataSourceProtocol +{ + return @protocol(UITableViewDataSource); +} + +@end diff --git a/Pods/Roxas/Roxas/UITableViewCell+CellContent.h b/Pods/Roxas/Roxas/UITableViewCell+CellContent.h new file mode 100644 index 000000000..e5a0dc69d --- /dev/null +++ b/Pods/Roxas/Roxas/UITableViewCell+CellContent.h @@ -0,0 +1,18 @@ +// +// UITableViewCell+CellContent.h +// Roxas +// +// Created by Riley Testut on 2/20/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "RSTCellContentCell.h" + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UITableViewCell (CellContent) +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Roxas/Roxas/UITableViewCell+CellContent.m b/Pods/Roxas/Roxas/UITableViewCell+CellContent.m new file mode 100644 index 000000000..acd1bf41a --- /dev/null +++ b/Pods/Roxas/Roxas/UITableViewCell+CellContent.m @@ -0,0 +1,32 @@ +// +// UITableViewCell+CellContent.m +// Roxas +// +// Created by Riley Testut on 2/20/17. +// Copyright © 2017 Riley Testut. All rights reserved. +// + +#import "UITableViewCell+CellContent.h" + +@implementation UITableViewCell (CellContent) + ++ (nullable instancetype)instantiateWithNib:(UINib *)nib +{ + NSArray *contents = [nib instantiateWithOwner:nil options:nil]; + + UITableViewCell *cell = [contents firstObject]; + return cell; +} + ++ (UINib *)nib +{ + NSString *className = NSStringFromClass(self); + + // Handle Swift names that are prefixed with module name + NSArray *components = [className componentsSeparatedByString:@"."]; + + UINib *nib = [UINib nibWithNibName:components.lastObject bundle:[NSBundle bundleForClass:self]]; + return nib; +} + +@end diff --git a/Pods/Roxas/Roxas/UIView+AnimatedHide.h b/Pods/Roxas/Roxas/UIView+AnimatedHide.h new file mode 100644 index 000000000..c91e98b4e --- /dev/null +++ b/Pods/Roxas/Roxas/UIView+AnimatedHide.h @@ -0,0 +1,15 @@ +// +// UIView+AnimatedHide.h +// Roxas +// +// Created by Riley Testut on 8/27/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +@import UIKit; + +@interface UIView (AnimatedHide) + +- (void)setHidden:(BOOL)hidden animated:(BOOL)animated; + +@end diff --git a/Pods/Roxas/Roxas/UIView+AnimatedHide.m b/Pods/Roxas/Roxas/UIView+AnimatedHide.m new file mode 100644 index 000000000..0826db6da --- /dev/null +++ b/Pods/Roxas/Roxas/UIView+AnimatedHide.m @@ -0,0 +1,48 @@ +// +// UIView+AnimatedHide.m +// Roxas +// +// Created by Riley Testut on 8/27/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "UIView+AnimatedHide.h" + +@implementation UIView (AnimatedHide) + +- (void)setHidden:(BOOL)hidden animated:(BOOL)animated +{ + if (!animated) + { + [self setHidden:hidden]; + return; + } + + if (self.hidden == hidden) + { + return; + } + + CGFloat alpha = self.alpha; + + if (hidden) + { + [UIView animateWithDuration:0.4 animations:^{ + self.alpha = 0.0; + } completion:^(BOOL finished) { + self.alpha = alpha; + self.hidden = YES; + }]; + } + else + { + self.alpha = 0.0; + self.hidden = NO; + + [UIView animateWithDuration:0.4 animations:^{ + self.alpha = alpha; + }]; + } +} + +@end diff --git a/Pods/Roxas/Roxas/UIViewController+TransitionState.h b/Pods/Roxas/Roxas/UIViewController+TransitionState.h new file mode 100644 index 000000000..bf166c24e --- /dev/null +++ b/Pods/Roxas/Roxas/UIViewController+TransitionState.h @@ -0,0 +1,17 @@ +// +// UIViewController+TransitionState.h +// Roxas +// +// Created by Riley Testut on 3/14/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +@import UIKit; + +@interface UIViewController (TransitionState) + +// Unlike isBeingPresented and isBeingDismissed, these actually work ಠ_ಠ +@property (nonatomic, readonly, getter=isAppearing) BOOL appearing; +@property (nonatomic, readonly, getter=isDisappearing) BOOL disappearing; + +@end diff --git a/Pods/Roxas/Roxas/UIViewController+TransitionState.m b/Pods/Roxas/Roxas/UIViewController+TransitionState.m new file mode 100644 index 000000000..25ff23160 --- /dev/null +++ b/Pods/Roxas/Roxas/UIViewController+TransitionState.m @@ -0,0 +1,51 @@ +// +// UIViewController+TransitionState.m +// Roxas +// +// Created by Riley Testut on 3/14/16. +// Copyright © 2016 Riley Testut. All rights reserved. +// + +#import "UIViewController+TransitionState.h" + +@implementation UIViewController (TransitionState) + +- (BOOL)isAppearing +{ + id transitionCoordinator = self.transitionCoordinator; + UIViewController *toViewController = [transitionCoordinator viewControllerForKey:UITransitionContextToViewControllerKey]; + UIViewController *fromViewController = [transitionCoordinator viewControllerForKey:UITransitionContextFromViewControllerKey]; + + BOOL isAppearing = [toViewController isEqualToViewControllerOrAncestor:self]; + return isAppearing && ![fromViewController isKindOfClass:[UIAlertController class]]; +} + +- (BOOL)isDisappearing +{ + id transitionCoordinator = self.transitionCoordinator; + UIViewController *fromViewController = [transitionCoordinator viewControllerForKey:UITransitionContextFromViewControllerKey]; + UIViewController *toViewController = [transitionCoordinator viewControllerForKey:UITransitionContextToViewControllerKey]; + + BOOL isDisappearing = [fromViewController isEqualToViewControllerOrAncestor:self]; + return isDisappearing && ![toViewController isKindOfClass:[UIAlertController class]]; +} + +- (BOOL)isEqualToViewControllerOrAncestor:(UIViewController *)viewController +{ + BOOL isEqual = NO; + + while (viewController != nil) + { + if (self == viewController) + { + isEqual = YES; + break; + } + + viewController = viewController.parentViewController; + } + + return isEqual; +} + +@end diff --git a/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks-output-files.xcfilelist b/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks-output-files.xcfilelist index d9c3b22e1..38c4522c7 100644 --- a/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks-output-files.xcfilelist +++ b/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks-output-files.xcfilelist @@ -1,3 +1,3 @@ -${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterAnalytics -${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter -${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterCrashes \ No newline at end of file +${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics/AppCenterAnalytics.framework +${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core/AppCenter.framework +${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes/AppCenterCrashes.framework \ No newline at end of file diff --git a/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks.sh b/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks.sh index 5eea5f8c8..0ae5153a3 100755 --- a/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks.sh +++ b/Pods/Target Support Files/AppCenter/AppCenter-xcframeworks.sh @@ -20,8 +20,8 @@ copy_dir() local destination="$2" # Use filter instead of exclude so missing patterns don't throw errors. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}" "${destination}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" } SELECT_SLICE_RETVAL="" @@ -80,54 +80,11 @@ select_slice() { done } -install_library() { - local source="$1" - local name="$2" - local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" - - # Libraries can contain headers, module maps, and a binary, so we'll copy everything in the folder over - - local source="$binary" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}/*\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}/*" "${destination}" -} - -# Copies a framework to derived data for use in later build phases -install_framework() -{ - local source="$1" - local name="$2" - local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" - - if [ ! -d "$destination" ]; then - mkdir -p "$destination" - fi - - copy_dir "$source" "$destination" - echo "Copied $source to $destination" -} - -install_xcframework_library() { - local basepath="$1" - local name="$2" - local paths=("$@") - - # Locate the correct slice of the .xcframework for the current architectures - select_slice "${paths[@]}" - local target_path="$SELECT_SLICE_RETVAL" - if [[ -z "$target_path" ]]; then - echo "warning: [CP] Unable to find matching .xcframework slice in '${paths[@]}' for the current build architectures ($ARCHS)." - return - fi - - install_framework "$basepath/$target_path" "$name" -} - install_xcframework() { local basepath="$1" local name="$2" local package_type="$3" - local paths=("$@") + local paths=("${@:4}") # Locate the correct slice of the .xcframework for the current architectures select_slice "${paths[@]}" @@ -145,11 +102,10 @@ install_xcframework() { fi copy_dir "$source/" "$destination" - echo "Copied $source to $destination" } -install_xcframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/AppCenterAnalytics.xcframework" "AppCenterAnalytics" "framework" "ios-arm64_x86_64-maccatalyst" "ios-arm64_i386_x86_64-simulator" "ios-arm64_arm64e_armv7_armv7s" -install_xcframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/AppCenter.xcframework" "AppCenter" "framework" "ios-arm64_i386_x86_64-simulator" "ios-arm64_x86_64-maccatalyst" "ios-arm64_arm64e_armv7_armv7s" -install_xcframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/AppCenterCrashes.xcframework" "AppCenterCrashes" "framework" "ios-arm64_arm64e_armv7_armv7s" "ios-arm64_x86_64-maccatalyst" "ios-arm64_i386_x86_64-simulator" +install_xcframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/AppCenterAnalytics.xcframework" "AppCenter/Analytics" "framework" "ios-arm64_x86_64-maccatalyst" "ios-arm64_i386_x86_64-simulator" "ios-arm64_arm64e_armv7_armv7s" +install_xcframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/AppCenter.xcframework" "AppCenter/Core" "framework" "ios-arm64_i386_x86_64-simulator" "ios-arm64_x86_64-maccatalyst" "ios-arm64_arm64e_armv7_armv7s" +install_xcframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/AppCenterCrashes.xcframework" "AppCenter/Crashes" "framework" "ios-arm64_arm64e_armv7_armv7s" "ios-arm64_x86_64-maccatalyst" "ios-arm64_i386_x86_64-simulator" diff --git a/Pods/Target Support Files/AppCenter/AppCenter.debug.xcconfig b/Pods/Target Support Files/AppCenter/AppCenter.debug.xcconfig index 9084ab1e9..9f533d227 100644 --- a/Pods/Target Support Files/AppCenter/AppCenter.debug.xcconfig +++ b/Pods/Target Support Files/AppCenter/AppCenter.debug.xcconfig @@ -1,6 +1,6 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AppCenter -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterCrashes" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "CoreTelephony" -framework "Foundation" -framework "SystemConfiguration" -framework "UIKit" PODS_BUILD_DIR = ${BUILD_DIR} diff --git a/Pods/Target Support Files/AppCenter/AppCenter.release.xcconfig b/Pods/Target Support Files/AppCenter/AppCenter.release.xcconfig index 9084ab1e9..9f533d227 100644 --- a/Pods/Target Support Files/AppCenter/AppCenter.release.xcconfig +++ b/Pods/Target Support Files/AppCenter/AppCenter.release.xcconfig @@ -1,6 +1,6 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AppCenter -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterCrashes" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "CoreTelephony" -framework "Foundation" -framework "SystemConfiguration" -framework "UIKit" PODS_BUILD_DIR = ${BUILD_DIR} diff --git a/Pods/Target Support Files/KeychainAccess/KeychainAccess.debug.xcconfig b/Pods/Target Support Files/KeychainAccess/KeychainAccess.debug.xcconfig index b6b57675f..6417035b2 100644 --- a/Pods/Target Support Files/KeychainAccess/KeychainAccess.debug.xcconfig +++ b/Pods/Target Support Files/KeychainAccess/KeychainAccess.debug.xcconfig @@ -2,6 +2,7 @@ APPLICATION_EXTENSION_API_ONLY = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/KeychainAccess/KeychainAccess.release.xcconfig b/Pods/Target Support Files/KeychainAccess/KeychainAccess.release.xcconfig index b6b57675f..6417035b2 100644 --- a/Pods/Target Support Files/KeychainAccess/KeychainAccess.release.xcconfig +++ b/Pods/Target Support Files/KeychainAccess/KeychainAccess.release.xcconfig @@ -2,6 +2,7 @@ APPLICATION_EXTENSION_API_ONLY = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Nuke/Nuke.debug.xcconfig b/Pods/Target Support Files/Nuke/Nuke.debug.xcconfig index 74bf452f0..9f2fbd975 100644 --- a/Pods/Target Support Files/Nuke/Nuke.debug.xcconfig +++ b/Pods/Target Support Files/Nuke/Nuke.debug.xcconfig @@ -1,6 +1,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Nuke GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Nuke/Nuke.release.xcconfig b/Pods/Target Support Files/Nuke/Nuke.release.xcconfig index 74bf452f0..9f2fbd975 100644 --- a/Pods/Target Support Files/Nuke/Nuke.release.xcconfig +++ b/Pods/Target Support Files/Nuke/Nuke.release.xcconfig @@ -1,6 +1,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Nuke GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-AltServer/Pods-AltServer-frameworks.sh b/Pods/Target Support Files/Pods-AltServer/Pods-AltServer-frameworks.sh index d61fc089a..58a4b771e 100755 --- a/Pods/Target Support Files/Pods-AltServer/Pods-AltServer-frameworks.sh +++ b/Pods/Target Support Files/Pods-AltServer/Pods-AltServer-frameworks.sh @@ -113,6 +113,7 @@ install_dsym() { rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" else # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" fi fi diff --git a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-input-files.xcfilelist index c59bd2351..57c3ebce6 100644 --- a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-input-files.xcfilelist @@ -1,3 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh ${BUILT_PRODUCTS_DIR}/Nuke/Nuke.framework +${BUILT_PRODUCTS_DIR}/Roxas/Roxas.framework ${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-output-files.xcfilelist index faba5e33b..c4bcb8a13 100644 --- a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Debug-output-files.xcfilelist @@ -1,2 +1,3 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nuke.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Roxas.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KeychainAccess.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-input-files.xcfilelist index c59bd2351..57c3ebce6 100644 --- a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-input-files.xcfilelist @@ -1,3 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh ${BUILT_PRODUCTS_DIR}/Nuke/Nuke.framework +${BUILT_PRODUCTS_DIR}/Roxas/Roxas.framework ${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-output-files.xcfilelist index faba5e33b..c4bcb8a13 100644 --- a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks-Release-output-files.xcfilelist @@ -1,2 +1,3 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nuke.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Roxas.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KeychainAccess.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh index da1b0aeac..147044b74 100755 --- a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh +++ b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh @@ -113,6 +113,7 @@ install_dsym() { rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" else # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" fi fi @@ -176,10 +177,12 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Nuke/Nuke.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Roxas/Roxas.framework" install_framework "${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Nuke/Nuke.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Roxas/Roxas.framework" install_framework "${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig index 989d3319f..d64baad7a 100644 --- a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig +++ b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig @@ -1,11 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterCrashes" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterAnalytics" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterCrashes" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" -OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "AppCenter" -framework "AppCenterAnalytics" -framework "AppCenterCrashes" -framework "CoreTelephony" -framework "Foundation" -framework "KeychainAccess" -framework "Nuke" -framework "SystemConfiguration" -framework "UIKit" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "AppCenter" -framework "AppCenterAnalytics" -framework "AppCenterCrashes" -framework "CoreTelephony" -framework "Foundation" -framework "KeychainAccess" -framework "Nuke" -framework "Roxas" -framework "SystemConfiguration" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig index 989d3319f..d64baad7a 100644 --- a/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig +++ b/Pods/Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig @@ -1,11 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterCrashes" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterAnalytics" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenterCrashes" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" -OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"z" -framework "AppCenter" -framework "AppCenterAnalytics" -framework "AppCenterCrashes" -framework "CoreTelephony" -framework "Foundation" -framework "KeychainAccess" -framework "Nuke" -framework "SystemConfiguration" -framework "UIKit" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nuke/Nuke.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Analytics" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Core" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppCenter/Crashes" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nuke" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "AppCenter" -framework "AppCenterAnalytics" -framework "AppCenterCrashes" -framework "CoreTelephony" -framework "Foundation" -framework "KeychainAccess" -framework "Nuke" -framework "Roxas" -framework "SystemConfiguration" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.debug.xcconfig b/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.debug.xcconfig index 69b76671b..71b29018f 100644 --- a/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.debug.xcconfig +++ b/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.debug.xcconfig @@ -1,10 +1,11 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" -OTHER_LDFLAGS = $(inherited) -framework "KeychainAccess" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" +OTHER_LDFLAGS = $(inherited) -framework "KeychainAccess" -framework "Roxas" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.release.xcconfig b/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.release.xcconfig index 69b76671b..71b29018f 100644 --- a/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.release.xcconfig +++ b/Pods/Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.release.xcconfig @@ -1,10 +1,11 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" -OTHER_LDFLAGS = $(inherited) -framework "KeychainAccess" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Roxas/Roxas.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess" +OTHER_LDFLAGS = $(inherited) -framework "KeychainAccess" -framework "Roxas" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Roxas/Roxas-Info.plist b/Pods/Target Support Files/Roxas/Roxas-Info.plist new file mode 100644 index 000000000..161a9d30a --- /dev/null +++ b/Pods/Target Support Files/Roxas/Roxas-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Roxas/Roxas-dummy.m b/Pods/Target Support Files/Roxas/Roxas-dummy.m new file mode 100644 index 000000000..bc6fd88be --- /dev/null +++ b/Pods/Target Support Files/Roxas/Roxas-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Roxas : NSObject +@end +@implementation PodsDummy_Roxas +@end diff --git a/Pods/Target Support Files/Roxas/Roxas-prefix.pch b/Pods/Target Support Files/Roxas/Roxas-prefix.pch new file mode 100644 index 000000000..3be18f8cf --- /dev/null +++ b/Pods/Target Support Files/Roxas/Roxas-prefix.pch @@ -0,0 +1,36 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +// +// Roxas-Prefix.pch +// Roxas +// +// Created by Riley Testut on 12/6/14. +// Copyright (c) 2014 Riley Testut. All rights reserved. +// + +#ifndef Roxas_Roxas_Prefix_pch +#define Roxas_Roxas_Prefix_pch + +#import + +#ifndef __IPHONE_8_0 +#warning "This project uses features only available in iOS SDK 8.0 and later." +#endif + +#ifdef __OBJC__ + +#import "RSTDefines.h" + +#endif + +#endif diff --git a/Pods/Target Support Files/Roxas/Roxas-umbrella.h b/Pods/Target Support Files/Roxas/Roxas-umbrella.h new file mode 100644 index 000000000..5c944bec8 --- /dev/null +++ b/Pods/Target Support Files/Roxas/Roxas-umbrella.h @@ -0,0 +1,68 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "NSBundle+Extensions.h" +#import "NSConstraintConflict+Conveniences.h" +#import "NSFileManager+URLs.h" +#import "NSLayoutConstraint+Edges.h" +#import "NSPredicate+Search.h" +#import "NSString+Localization.h" +#import "NSUserDefaults+DynamicProperties.h" +#import "Roxas.h" +#import "RSTActivityIndicating.h" +#import "RSTArrayDataSource.h" +#import "RSTBlockOperation.h" +#import "RSTCellContentCell.h" +#import "RSTCellContentChange.h" +#import "RSTCellContentChangeOperation.h" +#import "RSTCellContentDataSource.h" +#import "RSTCellContentPrefetchingDataSource.h" +#import "RSTCellContentView.h" +#import "RSTCollectionViewCell.h" +#import "RSTCollectionViewGridLayout.h" +#import "RSTCompositeDataSource.h" +#import "RSTConstants.h" +#import "RSTDefines.h" +#import "RSTDynamicDataSource.h" +#import "RSTError.h" +#import "RSTFetchedResultsDataSource.h" +#import "RSTHasher.h" +#import "RSTHelperFile.h" +#import "RSTLaunchViewController.h" +#import "RSTLoadOperation.h" +#import "RSTNavigationController.h" +#import "RSTNibView.h" +#import "RSTOperation.h" +#import "RSTOperationQueue.h" +#import "RSTOperation_Subclasses.h" +#import "RSTPersistentContainer.h" +#import "RSTPlaceholderView.h" +#import "RSTRelationshipPreservingMergePolicy.h" +#import "RSTSearchController.h" +#import "RSTSeparatorView.h" +#import "RSTTintedImageView.h" +#import "RSTToastView.h" +#import "UIAlertAction+Actions.h" +#import "UICollectionView+CellContent.h" +#import "UICollectionViewCell+CellContent.h" +#import "UICollectionViewCell+Nibs.h" +#import "UIImage+Manipulation.h" +#import "UIKit+ActivityIndicating.h" +#import "UISpringTimingParameters+Conveniences.h" +#import "UITableView+CellContent.h" +#import "UITableViewCell+CellContent.h" +#import "UIView+AnimatedHide.h" +#import "UIViewController+TransitionState.h" + +FOUNDATION_EXPORT double RoxasVersionNumber; +FOUNDATION_EXPORT const unsigned char RoxasVersionString[]; + diff --git a/Pods/Target Support Files/Roxas/Roxas.debug.xcconfig b/Pods/Target Support Files/Roxas/Roxas.debug.xcconfig new file mode 100644 index 000000000..b0ac93f97 --- /dev/null +++ b/Pods/Target Support Files/Roxas/Roxas.debug.xcconfig @@ -0,0 +1,12 @@ +APPLICATION_EXTENSION_API_ONLY = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Roxas +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Roxas +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Roxas/Roxas.modulemap b/Pods/Target Support Files/Roxas/Roxas.modulemap new file mode 100644 index 000000000..691298beb --- /dev/null +++ b/Pods/Target Support Files/Roxas/Roxas.modulemap @@ -0,0 +1,6 @@ +framework module Roxas { + umbrella header "Roxas-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Roxas/Roxas.release.xcconfig b/Pods/Target Support Files/Roxas/Roxas.release.xcconfig new file mode 100644 index 000000000..b0ac93f97 --- /dev/null +++ b/Pods/Target Support Files/Roxas/Roxas.release.xcconfig @@ -0,0 +1,12 @@ +APPLICATION_EXTENSION_API_ONLY = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Roxas +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Roxas +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Sparkle/Sparkle-copy-dsyms.sh b/Pods/Target Support Files/Sparkle/Sparkle-copy-dsyms.sh index bb6c44e7e..7d9a0913c 100755 --- a/Pods/Target Support Files/Sparkle/Sparkle-copy-dsyms.sh +++ b/Pods/Target Support Files/Sparkle/Sparkle-copy-dsyms.sh @@ -69,6 +69,7 @@ install_dsym() { rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" else # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" fi fi diff --git a/README.md b/README.md index 4db9612fc..262f61c29 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ AltStore is an iOS application that allows you to sideload other apps (.ipa file For the initial release, I focused on building a solid foundation for distributing my own apps — primarily Delta, [my all-in-one emulator for iOS](https://github.com/rileytestut/Delta). Now that Delta has been released, however, I'm beginning work on adding support for *anyone* to list and distribute their apps through AltStore (contributions welcome! 🙂). ## Features -- Resigns and installs any app with your Apple ID - Installs apps over WiFi using AltServer +- Resigns and installs any app with your Apple ID - Refreshes apps periodically in the background to prevent them from expiring (when on same WiFi as AltServer) - Handles app updates directly through AltStore