diff --git a/GrandCentralBoard.xcodeproj/project.pbxproj b/GrandCentralBoard.xcodeproj/project.pbxproj index df761d6..40dba36 100644 --- a/GrandCentralBoard.xcodeproj/project.pbxproj +++ b/GrandCentralBoard.xcodeproj/project.pbxproj @@ -147,6 +147,18 @@ 5435EFF31CEBDD67002A9869 /* WatchWidgetViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5435EFF21CEBDD67002A9869 /* WatchWidgetViewModelTests.swift */; }; 547A45831D018E07004E6504 /* BillableDatesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 547A45821D018E07004E6504 /* BillableDatesTests.swift */; }; 548AB84A1CEF39170086A1EC /* WebsiteAnalyticsWidgetSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548AB8491CEF39170086A1EC /* WebsiteAnalyticsWidgetSnapshotTests.swift */; }; + 5D5221BA1D08675F00ED123A /* WeatherWidgetBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF366B91D05B8A20092BE86 /* WeatherWidgetBuilder.swift */; }; + 5D5221BB1D08677900ED123A /* Climacons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5D600DE41D05D2B2004C2852 /* Climacons.ttf */; }; + 5D600DE81D05E8E9004C2852 /* WeatherWidgetViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D600DE71D05E8E9004C2852 /* WeatherWidgetViewModelTests.swift */; }; + 5D600DEA1D05EDB6004C2852 /* WeatherWidgetForecastViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D600DE91D05EDB6004C2852 /* WeatherWidgetForecastViewModelTests.swift */; }; + 5DA22CC21D08538B00245F5F /* configuration.json in Resources */ = {isa = PBXBuildFile; fileRef = 5DA22CC11D08538B00245F5F /* configuration.json */; }; + 5DF366BA1D05B8A20092BE86 /* WeatherForecastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF366B21D05B8A20092BE86 /* WeatherForecastView.swift */; }; + 5DF366BB1D05B8A20092BE86 /* WeatherForecastView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DF366B31D05B8A20092BE86 /* WeatherForecastView.xib */; }; + 5DF366BC1D05B8A20092BE86 /* WeatherWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF366B41D05B8A20092BE86 /* WeatherWidgetView.swift */; }; + 5DF366BD1D05B8A20092BE86 /* WeatherWidgetView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DF366B51D05B8A20092BE86 /* WeatherWidgetView.xib */; }; + 5DF366BE1D05B8A20092BE86 /* WeatherModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF366B61D05B8A20092BE86 /* WeatherModels.swift */; }; + 5DF366BF1D05B8A20092BE86 /* WeatherSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF366B71D05B8A20092BE86 /* WeatherSource.swift */; }; + 5DF366C01D05B8A20092BE86 /* WeatherWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF366B81D05B8A20092BE86 /* WeatherWidget.swift */; }; 73446E280D300467806A41C0 /* Pods_GrandCentralBoardTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BE02EF1A91C166A60B79697 /* Pods_GrandCentralBoardTests.framework */; }; 89EA2514DC4CC9CE2261B3D9 /* Pods_GrandCentralBoard.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54A9A8A20231B63CE5AC43BA /* Pods_GrandCentralBoard.framework */; }; C110E0D31CD778CB00B19DC6 /* pull_requests.json in Resources */ = {isa = PBXBuildFile; fileRef = C110E0D21CD778CB00B19DC6 /* pull_requests.json */; }; @@ -338,6 +350,18 @@ 547A45821D018E07004E6504 /* BillableDatesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BillableDatesTests.swift; sourceTree = ""; }; 548AB8491CEF39170086A1EC /* WebsiteAnalyticsWidgetSnapshotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebsiteAnalyticsWidgetSnapshotTests.swift; sourceTree = ""; }; 54A9A8A20231B63CE5AC43BA /* Pods_GrandCentralBoard.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GrandCentralBoard.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5D600DE41D05D2B2004C2852 /* Climacons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Climacons.ttf; sourceTree = ""; }; + 5D600DE71D05E8E9004C2852 /* WeatherWidgetViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WeatherWidgetViewModelTests.swift; path = Widgets/Weather/WeatherWidgetViewModelTests.swift; sourceTree = ""; }; + 5D600DE91D05EDB6004C2852 /* WeatherWidgetForecastViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WeatherWidgetForecastViewModelTests.swift; path = Widgets/Weather/WeatherWidgetForecastViewModelTests.swift; sourceTree = ""; }; + 5DA22CC11D08538B00245F5F /* configuration.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = configuration.json; sourceTree = ""; }; + 5DF366B21D05B8A20092BE86 /* WeatherForecastView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherForecastView.swift; sourceTree = ""; }; + 5DF366B31D05B8A20092BE86 /* WeatherForecastView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WeatherForecastView.xib; sourceTree = ""; }; + 5DF366B41D05B8A20092BE86 /* WeatherWidgetView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherWidgetView.swift; sourceTree = ""; }; + 5DF366B51D05B8A20092BE86 /* WeatherWidgetView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WeatherWidgetView.xib; sourceTree = ""; }; + 5DF366B61D05B8A20092BE86 /* WeatherModels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherModels.swift; sourceTree = ""; }; + 5DF366B71D05B8A20092BE86 /* WeatherSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherSource.swift; sourceTree = ""; }; + 5DF366B81D05B8A20092BE86 /* WeatherWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherWidget.swift; sourceTree = ""; }; + 5DF366B91D05B8A20092BE86 /* WeatherWidgetBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherWidgetBuilder.swift; sourceTree = ""; }; 7D608D9A9B4291AEBF9C7FD7 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 909F842DBEAB5F13BDC41BB8 /* Pods-GrandCentralBoardTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GrandCentralBoardTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.release.xcconfig"; sourceTree = ""; }; BF37772EDE6EC78426FE7E75 /* Pods-GrandCentralBoard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GrandCentralBoard.debug.xcconfig"; path = "Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.debug.xcconfig"; sourceTree = ""; }; @@ -453,6 +477,7 @@ 0D2863071CB515B000C62700 /* Widgets */ = { isa = PBXGroup; children = ( + 5D600DE61D05E8A7004C2852 /* Weather */, 52B9C3D31CEF38C300EE6BD0 /* Image */, 520B7A6A1CE4A969005F53EC /* Slack */, 526FC24B1CD0E74700D7843A /* GitHub */, @@ -533,6 +558,7 @@ 1A242D561C357DFD00D5BEE5 /* Widgets */ = { isa = PBXGroup; children = ( + 5DF366B01D05B8A20092BE86 /* Weather */, 520B7A591CE36ACC005F53EC /* Slack */, 526FC2411CD0ADCC00D7843A /* GitHub */, 067DA5411CBE5CE400048E6A /* WebsiteAnalytics */, @@ -568,6 +594,14 @@ path = Files; sourceTree = ""; }; + 1A60365F1C7F161D0034EFE9 /* Fonts */ = { + isa = PBXGroup; + children = ( + 5D600DE41D05D2B2004C2852 /* Climacons.ttf */, + ); + path = Fonts; + sourceTree = ""; + }; 1A9A3D7E1C87197A0070DB17 /* App */ = { isa = PBXGroup; children = ( @@ -585,6 +619,7 @@ isa = PBXGroup; children = ( 1AA97DE41CA2DE720058DBCE /* configuration.json */, + 1A60365F1C7F161D0034EFE9 /* Fonts */, 1AD5EA9C1C7B8FED00210BB9 /* Assets.xcassets */, ); path = Assets; @@ -938,6 +973,39 @@ name = WebsiteAnalytics; sourceTree = ""; }; + 5D600DE61D05E8A7004C2852 /* Weather */ = { + isa = PBXGroup; + children = ( + 5D600DE71D05E8E9004C2852 /* WeatherWidgetViewModelTests.swift */, + 5D600DE91D05EDB6004C2852 /* WeatherWidgetForecastViewModelTests.swift */, + ); + name = Weather; + sourceTree = ""; + }; + 5DF366B01D05B8A20092BE86 /* Weather */ = { + isa = PBXGroup; + children = ( + 5DF366B11D05B8A20092BE86 /* View */, + 5DF366B61D05B8A20092BE86 /* WeatherModels.swift */, + 5DF366B71D05B8A20092BE86 /* WeatherSource.swift */, + 5DF366B81D05B8A20092BE86 /* WeatherWidget.swift */, + 5DF366B91D05B8A20092BE86 /* WeatherWidgetBuilder.swift */, + 5DA22CC11D08538B00245F5F /* configuration.json */, + ); + path = Weather; + sourceTree = ""; + }; + 5DF366B11D05B8A20092BE86 /* View */ = { + isa = PBXGroup; + children = ( + 5DF366B21D05B8A20092BE86 /* WeatherForecastView.swift */, + 5DF366B31D05B8A20092BE86 /* WeatherForecastView.xib */, + 5DF366B41D05B8A20092BE86 /* WeatherWidgetView.swift */, + 5DF366B51D05B8A20092BE86 /* WeatherWidgetView.xib */, + ); + path = View; + sourceTree = ""; + }; C14EA2EA1CF061E500961DF6 /* View */ = { isa = PBXGroup; children = ( @@ -1130,11 +1198,15 @@ 529CEF0A1CEC6A2200636A4A /* HarvestWidgetView.xib in Resources */, 521B68541CF5BC5D00E112CC /* Assets.xcassets in Resources */, 067DA55F1CBFA98F00048E6A /* TableViewCell.xib in Resources */, + 5DF366BD1D05B8A20092BE86 /* WeatherWidgetView.xib in Resources */, + 5DF366BB1D05B8A20092BE86 /* WeatherForecastView.xib in Resources */, C14EA2EC1CF0728000961DF6 /* GitHubCell.xib in Resources */, + 5DA22CC21D08538B00245F5F /* configuration.json in Resources */, 1A4616A61C9048F700361B2E /* Assets.xcassets in Resources */, 1AD5EA9D1C7B8FED00210BB9 /* Assets.xcassets in Resources */, 1A242D261C357C2700D5BEE5 /* Main.storyboard in Resources */, 1AA97DE51CA2DE720058DBCE /* configuration.json in Resources */, + 5D5221BB1D08677900ED123A /* Climacons.ttf in Resources */, 1AA97DE91CA2E0C80058DBCE /* calendar.json in Resources */, 1AD5EA961C7B819D00210BB9 /* ImageWidgetView.xib in Resources */, 1AD5EA9B1C7B828200210BB9 /* WatchWidgetView.xib in Resources */, @@ -1309,6 +1381,7 @@ F91F006E1CBBD08500DAAA77 /* HarvestWidgetBuilder.swift in Sources */, 1AE1981E1CBE8323003B6AB3 /* UIColor.swift in Sources */, 52FB50581CBD350E0053DE8B /* GoogleCalendarWatchWidgetBuilder.swift in Sources */, + 5DF366BA1D05B8A20092BE86 /* WeatherForecastView.swift in Sources */, C14EA2EE1CF072A500961DF6 /* GitHubCell.swift in Sources */, 1AEE4C0A1CC52E41000CC88D /* NSProcessInfo.swift in Sources */, 494B68D01C92E89A00D460B0 /* BonusScene.swift in Sources */, @@ -1334,6 +1407,7 @@ 494B68CC1C92E89A00D460B0 /* BonusWidgetView.swift in Sources */, 521B68681CFC316300E112CC /* GitHubWidgetSettings.swift in Sources */, 06684F2F1CB788FB00B93D90 /* RequestTemplate.swift in Sources */, + 5DF366BC1D05B8A20092BE86 /* WeatherWidgetView.swift in Sources */, 494B68CA1C92E89A00D460B0 /* BonusWidget.swift in Sources */, 067DA5561CBF829A00048E6A /* TableWidgetView.swift in Sources */, 494B68E21C92E97900D460B0 /* Range.swift in Sources */, @@ -1352,15 +1426,18 @@ 1AD6E8031C7DDC000003121C /* WatchWidgetBuilder.swift in Sources */, 067DA55D1CBFA8F900048E6A /* TableViewCell.swift in Sources */, 1AD5EAA41C7D125A00210BB9 /* WatchWidget.swift in Sources */, + 5DF366BF1D05B8A20092BE86 /* WeatherSource.swift in Sources */, 526D1C671CE4BA2000604174 /* String+SlackTimestampParsing.swift in Sources */, F9E920891CC5421200BC7994 /* BillingProjectListFetcher.swift in Sources */, 06684F231CB69EB100B93D90 /* PeopleWithBonusesFetchController.swift in Sources */, 529CEF191CECC35600636A4A /* UIColor+BillingColor.swift in Sources */, 529CEF041CEC580800636A4A /* CircleChartViewModel.swift in Sources */, + 5DF366C01D05B8A20092BE86 /* WeatherWidget.swift in Sources */, 0692DB911CBD39DC006F46C9 /* Array.swift in Sources */, 1A242D211C357C2700D5BEE5 /* AppDelegate.swift in Sources */, 494B68DA1C92E89A00D460B0 /* BonusSource.swift in Sources */, 1A87495E1C385264006E58C6 /* RemoteImageSource.swift in Sources */, + 5D5221BA1D08675F00ED123A /* WeatherWidgetBuilder.swift in Sources */, F9C88F3E1CBFC72100E81A14 /* AccessTokenFetcher.swift in Sources */, 52FB50621CBE862D0053DE8B /* EventsSource.swift in Sources */, F928B82E1CC52F77006D0332 /* String+Localized.swift in Sources */, @@ -1369,6 +1446,7 @@ F91F006C1CBBD02600DAAA77 /* HarvestWidget.swift in Sources */, F9E9208F1CC54A9400BC7994 /* DailyUserBillingStatsFetcher.swift in Sources */, 1AD5EA951C7B819D00210BB9 /* ImageWidgetView.swift in Sources */, + 5DF366BE1D05B8A20092BE86 /* WeatherModels.swift in Sources */, 52FB50501CBC051B0053DE8B /* JSONCalendarDataProvider.swift in Sources */, 543596961CF47501000592FE /* NSThread.swift in Sources */, C1719D5B1CF099E8009B52BA /* GitHubTableDataSource.swift in Sources */, @@ -1409,6 +1487,7 @@ 521B68581CF5D6D700E112CC /* MessageBubbleViewSnapshotTests.swift in Sources */, 52B9C3CE1CEE057E00EE6BD0 /* WatchWidgetSnapshotTests.swift in Sources */, 526FC25F1CD365E300D7843A /* PeopleWithBonusesFetchControllerTests.swift in Sources */, + 5D600DE81D05E8E9004C2852 /* WeatherWidgetViewModelTests.swift in Sources */, C1719D611CF187C8009B52BA /* GitHubWidgetSnapshotTests.swift in Sources */, 1A4616A21C8DF99D00361B2E /* SchedulerTests.swift in Sources */, 5250277D1CDCE92E00DFE32A /* HarvestWidgetViewModelTests.swift in Sources */, @@ -1420,6 +1499,7 @@ 526D1C681CE4BA2000604174 /* String+SlackTimestampParsing.swift in Sources */, 49175CD41CEC5AFC004A9D19 /* WidgetTemplateViewTests.swift in Sources */, 526FC25C1CD365C700D7843A /* BonusSceneTests.swift in Sources */, + 5D600DEA1D05EDB6004C2852 /* WeatherWidgetForecastViewModelTests.swift in Sources */, 528AFBC51CEB773E001263C8 /* CircleChartViewTests.swift in Sources */, 521B68641CFC25E200E112CC /* TestError.swift in Sources */, ); diff --git a/GrandCentralBoard/App/Assets/Fonts/Climacons.ttf b/GrandCentralBoard/App/Assets/Fonts/Climacons.ttf new file mode 100644 index 0000000..8840ba6 Binary files /dev/null and b/GrandCentralBoard/App/Assets/Fonts/Climacons.ttf differ diff --git a/GrandCentralBoard/App/Info.plist b/GrandCentralBoard/App/Info.plist index 08a1712..4b9f2ef 100644 --- a/GrandCentralBoard/App/Info.plist +++ b/GrandCentralBoard/App/Info.plist @@ -35,6 +35,10 @@ UIMainStoryboardFile Main + UIAppFonts + + Climacons.ttf + UIRequiredDeviceCapabilities arm64 diff --git a/GrandCentralBoard/App/ViewControllers/MainViewController.swift b/GrandCentralBoard/App/ViewControllers/MainViewController.swift index 7f06861..c8ceeb9 100644 --- a/GrandCentralBoard/App/ViewControllers/MainViewController.swift +++ b/GrandCentralBoard/App/ViewControllers/MainViewController.swift @@ -29,7 +29,8 @@ final class MainViewController: UIViewController { ImageWidgetBuilder(dataDownloader: dataDownloader), BlogPostsPopularityWidgetBuilder(), SlackWidgetBuilder(), - GitHubWidgetBuilder() + GitHubWidgetBuilder(), + WeatherWidgetBuilder() ] if shouldLoadBundledConfig { diff --git a/GrandCentralBoard/Widgets/Weather/View/WeatherForecastView.swift b/GrandCentralBoard/Widgets/Weather/View/WeatherForecastView.swift new file mode 100644 index 0000000..31304ff --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/View/WeatherForecastView.swift @@ -0,0 +1,74 @@ +// +// WeatherForecastView.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 4/26/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import UIKit +import GCBCore +import CZWeatherKit + +struct WeatherForecastViewModel { + let date: String + let highTemperature: Int + let lowTemperature: Int + let icon: Climacon + + init(model: WeatherForecastModel) { + let date = WeatherForecastModel.forceMidnightDate(model.date) + + let dateFormatter = NSDateFormatter() + dateFormatter.timeZone = NSTimeZone.localTimeZone() + dateFormatter.dateFormat = "EE" + + self.date = dateFormatter.stringFromDate(date) + self.highTemperature = model.highTemperature + self.lowTemperature = model.lowTemperature + self.icon = model.icon + } + + init(date: String = "Mon", highTemperature: Int = 74, lowTemperature: Int = 57, icon: Climacon = .Cloud) { + self.date = date + self.highTemperature = highTemperature + self.lowTemperature = lowTemperature + self.icon = icon + } +} + +extension WeatherForecastModel { + private static func forceMidnightDate(date: NSDate) -> NSDate { + // HAX: There's a bug here where the api will return the previous day as the date, at 11:58 p.m., we need to work around it + let fixedDate: NSDate + let dateComponents = NSCalendar.currentCalendar().components([.Minute], fromDate: date) + if dateComponents.minute == 58 { + let oneDayComponent = NSDateComponents() + oneDayComponent.day = 1 + fixedDate = NSCalendar.currentCalendar().dateByAddingComponents(oneDayComponent, toDate: date, options: [])! + } else { + fixedDate = date + } + + return fixedDate + } +} + +final class WeatherForecastView: UIView { + @IBOutlet private weak var dayLabel: UILabel! + @IBOutlet private weak var highTempLabel: UILabel! + @IBOutlet private weak var lowTempLabel: UILabel! + @IBOutlet private weak var iconLabel: UILabel! + + func updateWithViewModel(viewModel: WeatherForecastViewModel) { + dayLabel.text = viewModel.date + highTempLabel.text = "\(viewModel.highTemperature)°" + lowTempLabel.text = "\(viewModel.lowTemperature)°" + iconLabel.text = String(Character(UnicodeScalar(Int(viewModel.icon.rawValue)))) + } + + class func fromNib() -> WeatherForecastView { + return NSBundle.mainBundle().loadNibNamed("WeatherForecastView", owner: nil, options: nil)[0] as! WeatherForecastView + } + +} diff --git a/GrandCentralBoard/Widgets/Weather/View/WeatherForecastView.xib b/GrandCentralBoard/Widgets/Weather/View/WeatherForecastView.xib new file mode 100644 index 0000000..09d16e4 --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/View/WeatherForecastView.xib @@ -0,0 +1,54 @@ + + + + + + + + Climacons-Font + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GrandCentralBoard/Widgets/Weather/View/WeatherWidgetView.swift b/GrandCentralBoard/Widgets/Weather/View/WeatherWidgetView.swift new file mode 100644 index 0000000..cc2308e --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/View/WeatherWidgetView.swift @@ -0,0 +1,63 @@ +// +// WeatherWidgetView.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 4/25/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import UIKit +import GCBCore +import CZWeatherKit + +struct WeatherViewModel { + let temperature: Int + let windSpeed: String // ex. 17 mph + let icon: Climacon + let forecast: [WeatherForecastViewModel] + + init(model: WeatherModel) { + self.temperature = model.currentWeather.currentTemperature + self.icon = model.currentWeather.icon + self.forecast = model.forecast.prefix(4).map { WeatherForecastViewModel(model: $0) } + + let windUnits = (model.units == .Imperial) ? "mph" : "kph" + self.windSpeed = "\(model.currentWeather.windSpeed) \(windUnits)" + } + + init(temperature: Int = 0, windSpeed: String = "0 mph", icon: Climacon = .Cloud, forecast: [WeatherForecastViewModel] = []) { + self.temperature = temperature + self.icon = icon + self.forecast = forecast + self.windSpeed = windSpeed + } +} + +final class WeatherWidgetView: UIView { + @IBOutlet private weak var temperatureLabel: UILabel! + @IBOutlet private weak var iconLabel: UILabel! + @IBOutlet private weak var forecastViews: UIView! + @IBOutlet private weak var windSpeedLabel: UILabel! + + func updateWithViewModel(viewModel: WeatherViewModel) { + self.temperatureLabel.text = "\(viewModel.temperature)°" + self.iconLabel.text = String(Character(UnicodeScalar(Int(viewModel.icon.rawValue)))) + self.windSpeedLabel.text = "\(viewModel.windSpeed)" + + self.forecastViews.subviews.forEach { $0.removeFromSuperview() } + + var forecastViewXPosition: CGFloat = 0 + viewModel.forecast.forEach { + let forecastView = WeatherForecastView.fromNib() + forecastView.updateWithViewModel($0) + forecastView.frame = CGRect(x: forecastViewXPosition, y: 0, width: 120, height: 200) + self.forecastViews.addSubview(forecastView) + + forecastViewXPosition += 120 + 16 + } + } + + class func fromNib() -> WeatherWidgetView { + return NSBundle.mainBundle().loadNibNamed("WeatherWidgetView", owner: nil, options: nil)[0] as! WeatherWidgetView + } +} diff --git a/GrandCentralBoard/Widgets/Weather/View/WeatherWidgetView.xib b/GrandCentralBoard/Widgets/Weather/View/WeatherWidgetView.xib new file mode 100644 index 0000000..7a2c892 --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/View/WeatherWidgetView.xib @@ -0,0 +1,65 @@ + + + + + + + + Climacons-Font + Climacons-Font + + + SFUIDisplay-Light + + + SFUIText-Light + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GrandCentralBoard/Widgets/Weather/WeatherModels.swift b/GrandCentralBoard/Widgets/Weather/WeatherModels.swift new file mode 100644 index 0000000..af9382e --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/WeatherModels.swift @@ -0,0 +1,54 @@ +// +// WeatherModels.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 4/25/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import UIKit +import CZWeatherKit + +enum UnitType { + case Imperial, Metric + + static func typeFromString(string: String) -> UnitType { + if string.lowercaseString == "i" || string.lowercaseString == "imperial" { + return .Imperial + } else { + return .Metric + } + } +} + +struct WeatherModel { + let currentWeather: CurrentWeatherModel + let forecast: [WeatherForecastModel] + let units: UnitType +} + +struct CurrentWeatherModel { + let currentTemperature: Int + let windSpeed: Int + let icon: Climacon + + init(czData: CZWeatherCurrentCondition, units: UnitType) { + self.currentTemperature = (units == .Imperial) ? Int(czData.temperature.f) : Int(czData.temperature.c) + self.windSpeed = (units == .Imperial) ? Int(czData.windSpeed.mph) : Int(czData.windSpeed.kph) + self.icon = czData.climacon + } +} + +struct WeatherForecastModel { + let highTemperature: Int + let lowTemperature: Int + let icon: Climacon + let date: NSDate + + init(czForecastModel: CZWeatherForecastCondition, units: UnitType) { + self.highTemperature = (units == .Imperial) ? Int(czForecastModel.highTemperature.f) : Int(czForecastModel.highTemperature.c) + self.lowTemperature = (units == .Imperial) ? Int(czForecastModel.lowTemperature.f) : Int(czForecastModel.lowTemperature.c) + self.icon = czForecastModel.climacon + self.date = czForecastModel.date + } +} diff --git a/GrandCentralBoard/Widgets/Weather/WeatherSource.swift b/GrandCentralBoard/Widgets/Weather/WeatherSource.swift new file mode 100644 index 0000000..9fdb1c1 --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/WeatherSource.swift @@ -0,0 +1,73 @@ +// +// WeatherSource.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 4/25/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import UIKit +import GCBCore +import CZWeatherKit + +enum WeatherSourceError: ErrorType, HavingMessage { + case CZWeatherKitError(NSError) + case NoDataError + + var message: String { + switch self { + case .CZWeatherKitError(let error): + return NSLocalizedString("Weather API returned an error: \(error)", comment: "") + case .NoDataError(): + return NSLocalizedString("Weather API returned no data, unknown error", comment: "") + } + } +} + +final class WeatherSource: Asynchronous { + typealias ResultType = Result + + let interval: NSTimeInterval + let sourceType: SourceType = .Momentary + + private let settings: WeatherSettings + private var model: WeatherModel? + private var location: CLLocation? = nil + + init(settings: WeatherSettings, interval: NSTimeInterval = 900) { + self.settings = settings + self.interval = interval + + self.location = CLLocation(latitude: Double(settings.latLon[0])!, longitude: Double(settings.latLon[1])!) + } + + func read(closure: (ResultType) -> Void) { + let request = CZForecastioRequest.newForecastRequest() + request.location = CZWeatherLocation(fromLocation: self.location) + request.key = settings.apiKey + request.sendWithCompletion { (data, error) in + + let units = UnitType.typeFromString(self.settings.units) + + guard let weatherData = data else { + closure(.Failure(WeatherSourceError.NoDataError)) + return + } + + // Capture the current weather model + let currentWeather = CurrentWeatherModel(czData: weatherData.current, units: units) + + // Capture the forecast model + var dailyForecasts: [WeatherForecastModel] = [] + for forecast in weatherData.dailyForecasts { + guard let forecast = forecast as? CZWeatherForecastCondition else { + continue + } + + dailyForecasts.append(WeatherForecastModel(czForecastModel: forecast, units: units)) + } + + closure(.Success(WeatherModel(currentWeather: currentWeather, forecast: dailyForecasts, units: units))) + } + } +} diff --git a/GrandCentralBoard/Widgets/Weather/WeatherWidget.swift b/GrandCentralBoard/Widgets/Weather/WeatherWidget.swift new file mode 100644 index 0000000..c3817e4 --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/WeatherWidget.swift @@ -0,0 +1,82 @@ +// +// WeatherWidget.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 4/25/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import UIKit +import GCBCore +import GCBUtilities + +final class WeatherWidget: WidgetControlling { + let sources: [UpdatingSource] + + private let widgetView: WeatherWidgetView + private let mainView: UIView + + private lazy var errorView: UIView = { + let errorViewModel = WidgetErrorTemplateViewModel(title: "Weather".localized.uppercaseString, + subtitle: "Error".localized.uppercaseString) + return WidgetTemplateView.viewWithErrorViewModel(errorViewModel) + }() + + var view: UIView { + return mainView + } + + init(view: WeatherWidgetView, sources: [UpdatingSource]) { + self.sources = sources + widgetView = view + + mainView = UIView(frame: widgetView.frame) + mainView.fillViewWithView(widgetView, animated: false) + } + + private var hasWeatherFetchFailed = false + + func update(source: UpdatingSource) { + switch source { + case let source as WeatherSource: + updateFromSource(source) + default: + assertionFailure("Expected `source` as instance of `TrelloSource`.") + } + } + + private func updateFromSource(source: WeatherSource) { + source.read { [weak self] result in + switch result { + case .Success(let weather): + self?.hasWeatherFetchFailed = false + dispatch_async(dispatch_get_main_queue()) { + self?.renderWeather(weather) + } + case .Failure: + self?.hasWeatherFetchFailed = true + } + } + } + + private func renderErrorView() { + guard !mainView.subviews.contains(errorView) else { return } + mainView.fillViewWithView(errorView, animated: false) + } + + private func removeErrorView() { + errorView.removeFromSuperview() + } + + private func renderWeather(weather: WeatherModel) { + guard !hasWeatherFetchFailed else { + renderErrorView() + return + } + + removeErrorView() + + let weatherViewModel = WeatherViewModel(model: weather) + widgetView.updateWithViewModel(weatherViewModel) + } +} diff --git a/GrandCentralBoard/Widgets/Weather/WeatherWidgetBuilder.swift b/GrandCentralBoard/Widgets/Weather/WeatherWidgetBuilder.swift new file mode 100644 index 0000000..c857339 --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/WeatherWidgetBuilder.swift @@ -0,0 +1,44 @@ +// +// WeatherWidgetBuilder.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 4/25/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import UIKit +import Decodable +import GCBCore + +final class WeatherWidgetBuilder: WidgetBuilding { + let name = "weather" + + func build(settings: AnyObject) throws -> WidgetControlling { + let weatherSettings = try WeatherSettings.decode(settings) + let weatherSource = WeatherSource(settings: weatherSettings) + + let view = WeatherWidgetView.fromNib() + + return WeatherWidget(view: view, sources: [weatherSource]) + } +} + +/** + * The pattern for weather settings is generally: + * { "name": "weather", + * "settings": { + * "apiKey": "Forecast.io api key", + * "units": "i" = imperial, "m" = metric (default) + * "latlon": ["latitude", "longitude"] + */ +struct WeatherSettings: Decodable { + let apiKey: String + let units: String // "i", "imperial", "m", "metric", defaults to metric + let latLon: [String] + + static func decode(json: AnyObject) throws -> WeatherSettings { + return try WeatherSettings(apiKey: json => "apiKey", + units: json => "units", + latLon: json => "latlon") + } +} diff --git a/GrandCentralBoard/Widgets/Weather/configuration.json b/GrandCentralBoard/Widgets/Weather/configuration.json new file mode 100644 index 0000000..990ab65 --- /dev/null +++ b/GrandCentralBoard/Widgets/Weather/configuration.json @@ -0,0 +1,10 @@ +{ + "widgets": [ + {"name":"watch", "settings": {"timeZone":"Europe/Warsaw", "calendar": "http://localhost:8000/calendar.json"} }, + {"name":"weather", "settings": {"apiKey": "Your actual Forecast.io API key", "units": "i", "latlon": ["42.4724464", "-83.1253623"]} }, + {"name":"weather", "settings": {"apiKey": "Your actual Forecast.io API key", "units": "m", "latlon": ["42.4724464", "-83.1253623"]} }, + {"name":"watch", "settings": {"timeZone":"Europe/Warsaw", "calendar": "http://localhost:8000/calendar.json"} }, + {"name":"watch", "settings": {"timeZone":"Europe/Warsaw", "calendar": "http://localhost:8000/calendar.json"} }, + {"name":"watch", "settings": {"timeZone":"Europe/Warsaw", "calendar": "http://localhost:8000/calendar.json"} }, + ] +} \ No newline at end of file diff --git a/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastView.png b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastView.png new file mode 100644 index 0000000..ec63104 Binary files /dev/null and b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastView.png differ diff --git a/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastViewWith3DigitNums.png b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastViewWith3DigitNums.png new file mode 100644 index 0000000..2f8cb14 Binary files /dev/null and b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastViewWith3DigitNums.png differ diff --git a/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastViewWithNegativeNums.png b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastViewWithNegativeNums.png new file mode 100644 index 0000000..d942702 Binary files /dev/null and b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetForecastViewModelTests/testWeatherForecastViewWithNegativeNums.png differ diff --git a/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetViewModelTests/testCurrentWeatherNoForecast.png b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetViewModelTests/testCurrentWeatherNoForecast.png new file mode 100644 index 0000000..e80f945 Binary files /dev/null and b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetViewModelTests/testCurrentWeatherNoForecast.png differ diff --git a/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetViewModelTests/testWeatherWithForecast.png b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetViewModelTests/testWeatherWithForecast.png new file mode 100644 index 0000000..476c470 Binary files /dev/null and b/GrandCentralBoardTests/ReferenceImages_64/GrandCentralBoardTests.WeatherWidgetViewModelTests/testWeatherWithForecast.png differ diff --git a/GrandCentralBoardTests/Widgets/Weather/WeatherWidgetForecastViewModelTests.swift b/GrandCentralBoardTests/Widgets/Weather/WeatherWidgetForecastViewModelTests.swift new file mode 100644 index 0000000..6c4a1b5 --- /dev/null +++ b/GrandCentralBoardTests/Widgets/Weather/WeatherWidgetForecastViewModelTests.swift @@ -0,0 +1,44 @@ +// +// WeatherWidgetForecastViewModelTests.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 6/6/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import XCTest +import FBSnapshotTestCase +@testable import GrandCentralBoard + +class WeatherWidgetForecastViewModelTests: FBSnapshotTestCase { + + static func widgetRenderingViewModel(viewModel: WeatherForecastViewModel) -> UIView { + let view = WeatherForecastView.fromNib() + view.updateWithViewModel(viewModel) + return view + } + + override func setUp() { + super.setUp() +// recordMode = true + } + + func testWeatherForecastView() { + let viewModel = WeatherForecastViewModel(date: "Mon", highTemperature: 56, lowTemperature: 55, icon: .Tornado) + + FBSnapshotVerifyView(WeatherWidgetForecastViewModelTests.widgetRenderingViewModel(viewModel)) + } + + func testWeatherForecastViewWithNegativeNums() { + let viewModel = WeatherForecastViewModel(date: "Mon", highTemperature: -1, lowTemperature: -12, icon: .Snowflake) + + FBSnapshotVerifyView(WeatherWidgetForecastViewModelTests.widgetRenderingViewModel(viewModel)) + } + + func testWeatherForecastViewWith3DigitNums() { + let viewModel = WeatherForecastViewModel(date: "Mon", highTemperature: 105, lowTemperature: 102, icon: .Sleet) + + FBSnapshotVerifyView(WeatherWidgetForecastViewModelTests.widgetRenderingViewModel(viewModel)) + } + +} diff --git a/GrandCentralBoardTests/Widgets/Weather/WeatherWidgetViewModelTests.swift b/GrandCentralBoardTests/Widgets/Weather/WeatherWidgetViewModelTests.swift new file mode 100644 index 0000000..43d88e4 --- /dev/null +++ b/GrandCentralBoardTests/Widgets/Weather/WeatherWidgetViewModelTests.swift @@ -0,0 +1,48 @@ +// +// WeatherWidgetViewModelTests.swift +// GrandCentralBoard +// +// Created by Joel Fischer on 6/6/16. +// Copyright © 2016 Oktawian Chojnacki. All rights reserved. +// + +import XCTest +import FBSnapshotTestCase +@testable import GrandCentralBoard + +class WeatherWidgetViewModelTests: FBSnapshotTestCase { + + func widgetRenderingViewModel(viewModel: WeatherViewModel) -> UIView { + let view = WeatherWidgetView.fromNib() + view.updateWithViewModel(viewModel) + return view + } + + override func setUp() { + super.setUp() +// recordMode = true + } + + func testCurrentWeatherNoForecast() { + let viewModel = WeatherViewModel(temperature: 27, windSpeed: "14 mph", icon: .CloudSun, forecast: []) + + FBSnapshotVerifyView(widgetRenderingViewModel(viewModel)) + } + + func testWeatherWithForecast() { + let weatherForecast1 = WeatherForecastViewModel(date: "Mon", highTemperature: 32, lowTemperature: 17, icon: .Sun) + let weatherForecast2 = WeatherForecastViewModel(date: "Tue", highTemperature: 42, lowTemperature: 12, icon: .Cloud) + let weatherForecast3 = WeatherForecastViewModel(date: "Wed", highTemperature: 26, lowTemperature: 0, icon: .Snow) + let weatherForecast4 = WeatherForecastViewModel(date: "Thu", highTemperature: 104, lowTemperature: -16, icon: .Downpour) + + let viewModel = WeatherViewModel(temperature: 27, + windSpeed: "14 mph", + icon: .CloudSun, + forecast: [weatherForecast1, + weatherForecast2, + weatherForecast3, + weatherForecast4]) + FBSnapshotVerifyView(widgetRenderingViewModel(viewModel)) + } + +} diff --git a/Podfile b/Podfile index 539a7cf..001619b 100644 --- a/Podfile +++ b/Podfile @@ -3,6 +3,7 @@ use_frameworks! target "GrandCentralBoard" do pod 'Alamofire', '~> 3.0' + pod 'CZWeatherKit', '~> 2.2' pod 'Decodable', '~> 0.4' pod 'MD5', '~> 0.1' pod 'GCBCore', '~> 1.0' diff --git a/Podfile.lock b/Podfile.lock index ea6313d..0e24eb5 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,5 +1,7 @@ PODS: - Alamofire (3.4.0) + - CZWeatherKit (2.2.7): + - PINCache (~> 2.1) - Decodable (0.4.2) - FBSnapshotTestCase (2.1.1): - FBSnapshotTestCase/SwiftSupport (= 2.1.1) @@ -40,6 +42,7 @@ PODS: - Operations (2.10.1): - Operations/Standard (= 2.10.1) - Operations/Standard (2.10.1) + - PINCache (2.2.2) - Result (2.0.0) - RxSwift (2.5.0) - SlackKit (1.0.2): @@ -48,6 +51,7 @@ PODS: DEPENDENCIES: - Alamofire (~> 3.0) + - CZWeatherKit (~> 2.2) - Decodable (~> 0.4) - FBSnapshotTestCase (from `https://github.com/facebook/ios-snapshot-test-case`) - GCBCore (~> 1.0) @@ -79,6 +83,7 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee + CZWeatherKit: e15848c63ac021a83ec92e8fc0011a4ada6bf2ed Decodable: b1cd96ad9f722721bc98b0310952214a47f71d6a FBSnapshotTestCase: 432afd8d059ccef7f207225894840a03fbcf7474 GCBCore: ae1b62bf7576994c88579f2140c2b7d5e5bcb268 @@ -88,11 +93,12 @@ SPEC CHECKSUMS: Nimble: 0f3c8b8b084cda391209c3c5efbb48bedeeb920a OHHTTPStubs: 592f74439d2d72615115cf99a954237a3fbe26e5 Operations: b787ef012ec50752f6247b7f0efb7746fb8934ae + PINCache: 078426d356ab95ef875e9e62e5c35a2ea3333c28 Result: 9e75e1111c774c6ac594e14907b15057053a7959 RxSwift: 402b41a50e922a0368fc14cb3bc9f4427920e8ae SlackKit: 10dfee029d482bf35eff8799a799acf70ee2f05a Starscream: d662732354b40dd19ed1ece3e3c44c80b536b83c -PODFILE CHECKSUM: 95c60ade6bcca2563c9ce3a8989b920d11185618 +PODFILE CHECKSUM: eabeeb779be84436ee0577b83466725a0d5419a0 COCOAPODS: 1.0.1 diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZClimacons.h b/Pods/CZWeatherKit/CZWeatherKit/CZClimacons.h new file mode 100644 index 0000000..e3c25be --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZClimacons.h @@ -0,0 +1,146 @@ +// +// Climacons.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - Type Definitions + +/** + Contains the mappings from icon to character for the Climacons font, bundled by + Christian Naths. + http://adamwhitcroft.com/climacons/font/ + https://github.com/christiannaths/Climacons-Font + + Climacons first created in icon form by Adam Whitcroft. + http://adamwhitcroft.com/climacons/ + */ +typedef NS_ENUM(char, Climacon) { + ClimaconUnknown = '~', + + ClimaconCloud = '!', + ClimaconCloudSun = '"', + ClimaconCloudMoon = '#', + + ClimaconRain = '$', + ClimaconRainSun = '%', + ClimaconRainMoon = '&', + + ClimaconShowers = '\'', + ClimaconShowersSun = '(', + ClimaconShowersMoon = ')', + + ClimaconDownpour = '*', + ClimaconDownpourSun = '+', + ClimaconDownpourMoon = ',', + + ClimaconDrizzle = '-', + ClimaconDrizzleSun = '.', + ClimaconDrizzleMoon = '/', + + ClimaconSleet = '0', + ClimaconSleetSun = '1', + ClimaconSleetMoon = '2', + + ClimaconHail = '3', + ClimaconHailSun = '4', + ClimaconHailMoon = '5', + + ClimaconFlurries = '6', + ClimaconFlurriesSun = '7', + ClimaconFlurriesMoon = '8', + + ClimaconSnow = '9', + ClimaconSnowSun = ':', + ClimaconSnowMoon = ';', + + ClimaconFog = '<', + ClimaconFogSun = '=', + ClimaconFogMoon = '>', + + ClimaconHaze = '?', + ClimaconHazeSun = '@', + ClimaconHazeMoon = 'A', + + ClimaconWind = 'B', + ClimaconWindCloud = 'C', + ClimaconWindCloudSun = 'D', + ClimaconWindCloudMoon = 'E', + + ClimaconLightning = 'F', + ClimaconLightningSun = 'G', + ClimaconLightningMoon = 'H', + + ClimaconSun = 'I', + ClimaconSunset = 'J', + ClimaconSunrise = 'K', + ClimaconSunLow = 'L', + ClimaconSunLower = 'M', + + ClimaconMoon = 'N', + ClimaconMoonNew = 'O', + ClimaconMoonWaxingCrescent = 'P', + ClimaconMoonWaxingQuarter = 'Q', + ClimaconMoonWaxingGibbous = 'R', + ClimaconMoonFull = 'S', + ClimaconMoonWaningGibbous = 'T', + ClimaconMoonWaningQuarter = 'U', + ClimaconMoonWaningCrescent = 'V', + + ClimaconSnowflake = 'W', + ClimaconTornado = 'X', + + ClimaconThermometer = 'Y', + ClimaconThermometerLow = 'Z', + ClimaconThermometerMediumLow = '[', + ClimaconThermometerMediumHigh = '\\', + ClimaconThermometerHigh = ']', + ClimaconThermometerFull = '^', + ClimaconCelsius = '_', + ClimaconFahrenheit = '`', + ClimaconCompass = 'a', + ClimaconCompassNorth = 'b', + ClimaconCompassEast = 'c', + ClimaconCompassSouth = 'd', + ClimaconCompassWest = 'e', + + ClimaconUmbrella = 'f', + ClimaconSunglasses = 'g', + + ClimaconCloudRefresh = 'h', + ClimaconCloudUp = 'i', + ClimaconCloudDown = 'j' +}; + + +#pragma mark - Constants + +/** + The name of the Climacons font. + */ +static NSString * const CZClimaconsFontName = @"Climacons-Font"; diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZForecastioAPI.h b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioAPI.h new file mode 100644 index 0000000..bc1a039 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioAPI.h @@ -0,0 +1,49 @@ +// +// CZForecastIOAPI.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#if TARGET_OS_IOS || TARGET_OS_OSX +@import MapKit; +#endif + +@import CoreLocation; + +#import "CZWeatherAPI.h" + + +#pragma mark - CZForecastioAPI Interface + +/** + CZForecastioAPI conforms to the CZWeatherAPI protocol and implements + functionality for supporting the Forecast.io API. + + For more information, see + https://developer.forecast.io/docs/v2 + */ +@interface CZForecastioAPI : NSObject + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZForecastioAPI.m b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioAPI.m new file mode 100644 index 0000000..2a83096 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioAPI.m @@ -0,0 +1,276 @@ +// +// CZForecastIOAPI.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZForecastioAPI.h" +#import "CZForecastioRequest.h" +#import "CZWeatherKitInternal.h" + + +#pragma mark - CZForecastioAPI Implementation + +@implementation CZForecastioAPI + ++ (NSString *)cacheKeyForRequest:(CZWeatherRequest *)request +{ + return [CZForecastioAPI transformRequest:request].URL.absoluteString; +} + ++ (NSURLRequest *)transformRequest:(CZWeatherRequest *)request +{ + if ([request isKindOfClass:[CZForecastioRequest class]]) { + CZForecastioRequest *forecastioRequest = (CZForecastioRequest *)request; + + NSString *location = [CZForecastioAPI componentForLocation:forecastioRequest.location]; + NSString *language = forecastioRequest.language ? forecastioRequest.language : @"en"; + + NSURLComponents *components = [NSURLComponents new]; + components.scheme = @"https"; + components.host = @"api.forecast.io"; + components.path = [NSString stringWithFormat:@"/forecast/%@/%@", + forecastioRequest.key, location]; + if (forecastioRequest.date) { + NSString *date = [NSString stringWithFormat:@"%ld", + (long)[forecastioRequest.date timeIntervalSince1970]]; + components.path = [components.path stringByAppendingFormat:@",%@", date]; + } + + components.query = [NSString stringWithFormat:@"lang=%@", language]; + + return [NSURLRequest requestWithURL:components.URL]; + } + + return nil; +} + ++ (CZWeatherData *)transformResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *)error + forRequest:(CZWeatherRequest *)request +{ + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; + if (httpResponse.statusCode != 200) { + return nil; + } + } + + if (data) { + NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingAllowFragments + error:nil]; + if (JSON) { + CZWeatherData *weatherData = [[CZWeatherData alloc]_init]; + + weatherData.placemark = [CZForecastioAPI placemarkForJSON:JSON]; + + NSDictionary *currently = [JSON objectForKey:@"currently" class:[NSDictionary class]]; + if (currently) { + weatherData.current = [CZForecastioAPI conditionForCurrently:currently]; + } + + NSDictionary *hourly = [JSON objectForKey:@"hourly" class:[NSDictionary class]]; + if (hourly) { + weatherData.hourlyForecasts = [CZForecastioAPI conditionsForHourly:hourly]; + } + + NSDictionary *daily = [JSON objectForKey:@"daily" class:[NSDictionary class]]; + if (daily) { + weatherData.dailyForecasts = [CZForecastioAPI conditionsForDaily:daily]; + } + + return weatherData; + } + } + + return nil; +} + ++ (NSArray *)conditionsForDaily:(NSDictionary *)daily +{ + NSMutableArray *conditions = [NSMutableArray new]; + NSArray *data = [daily objectForKey:@"data" class:[NSArray class]]; + if (data) { + for (NSDictionary *day in data) { + CZWeatherForecastCondition *condition = [[CZWeatherForecastCondition alloc]_init]; + + condition.summary = day[@"summary"]; + condition.climacon = [CZForecastioAPI climaconForIconName:day[@"icon"]]; + condition.lowTemperature = [CZForecastioAPI temperatureForDataPoint:day name:@"temperatureMin"]; + condition.highTemperature = [CZForecastioAPI temperatureForDataPoint:day name:@"temperatureMax"]; + condition.humidity = [CZForecastioAPI humidityForDataPoint:day]; + condition.date = [CZForecastioAPI dateForDataPoint:day]; + + [conditions addObject:condition]; + } + } + return conditions; +} + ++ (NSArray *)conditionsForHourly:(NSDictionary *)hourly +{ + NSMutableArray *conditions = [NSMutableArray new]; + NSArray *data = [hourly objectForKey:@"data" class:[NSArray class]]; + if (data) { + for (NSDictionary *hour in data) { + CZWeatherHourlyCondition *condition = [[CZWeatherHourlyCondition alloc]_init]; + + condition.summary = hour[@"summary"]; + condition.climacon = [CZForecastioAPI climaconForIconName:hour[@"icon"]]; + condition.temperature = [CZForecastioAPI temperatureForDataPoint:hour name:@"temperature"]; + condition.windSpeed = [CZForecastioAPI windSpeedForDataPoint:hour]; + condition.windDirection = [CZForecastioAPI windDirectionForDataPoint:hour]; + condition.humidity = [CZForecastioAPI humidityForDataPoint:hour]; + condition.date = [CZForecastioAPI dateForDataPoint:hour]; + + [conditions addObject:condition]; + } + } + return conditions; +} + ++ (CZWeatherCurrentCondition *)conditionForCurrently:(NSDictionary *)currently +{ + CZWeatherCurrentCondition *condition = [[CZWeatherCurrentCondition alloc]_init]; + + condition.summary = currently[@"summary"]; + condition.climacon = [CZForecastioAPI climaconForIconName:currently[@"icon"]]; + condition.temperature = [CZForecastioAPI temperatureForDataPoint:currently name:@"temperature"]; + condition.windSpeed = [CZForecastioAPI windSpeedForDataPoint:currently]; + condition.pressure = [CZForecastioAPI pressureForDataPoint:currently]; + condition.windDirection = [CZForecastioAPI windDirectionForDataPoint:currently]; + condition.humidity = [CZForecastioAPI humidityForDataPoint:currently]; + condition.date = [CZForecastioAPI dateForDataPoint:currently]; + + return condition; +} + ++ (CZTemperature)temperatureForDataPoint:(NSDictionary *)dataPoint name:(NSString *)name +{ + return (CZTemperature) { + .f = dataPoint[name] ? [dataPoint[name]floatValue] : CZValueUnavailable, + .c = dataPoint[name] ? cz_ftoc([dataPoint[name]floatValue]) : CZValueUnavailable + }; +} + ++ (CZWindSpeed)windSpeedForDataPoint:(NSDictionary *)dataPoint +{ + return (CZWindSpeed) { + .mph = dataPoint[@"windSpeed"] ? [dataPoint[@"windSpeed"]floatValue] : CZValueUnavailable, + .kph = dataPoint[@"windSpeed"] ? cz_mtokph([dataPoint[@"windSpeed"]floatValue]) : CZValueUnavailable + }; +} + ++ (CZPressure)pressureForDataPoint:(NSDictionary *)dataPoint +{ + return (CZPressure) { + .mb = dataPoint[@"pressure"] ? [dataPoint[@"pressure"]floatValue] : CZValueUnavailable, + .inch = dataPoint[@"pressure"] ? cz_mbtoin([dataPoint[@"pressure"]floatValue]) : CZValueUnavailable + }; +} + ++ (CZWindDirection)windDirectionForDataPoint:(NSDictionary *)dataPoint +{ + return dataPoint[@"windBearing"] ? [dataPoint[@"windBearing"]floatValue] : CZValueUnavailable; +} + ++ (CZHumidity)humidityForDataPoint:(NSDictionary *)dataPoint +{ + return dataPoint[@"humidity"] ? 100.0 * [dataPoint[@"humidity"]floatValue] : CZValueUnavailable; +} + ++ (NSDate *)dateForDataPoint:(NSDictionary *)dataPoint +{ + return dataPoint[@"time"] ? [NSDate dateWithTimeIntervalSince1970:[dataPoint[@"time"]floatValue]] : nil; +} + ++ (Climacon)climaconForIconName:(NSString *)iconName +{ + if ([@[@"clear-day"] containsObject:iconName]) { + return ClimaconSun; + } + + if ([@[@"clear-night"] containsObject:iconName]) { + return ClimaconMoon; + } + + if ([@[@"rain"] containsObject:iconName]) { + return ClimaconRain; + } + + if ([@[@"snow"] containsObject:iconName]) { + return ClimaconSnow; + } + + if ([@[@"sleet"] containsObject:iconName]) { + return ClimaconSleet; + } + + if ([@[@"wind"] containsObject:iconName]) { + return ClimaconWind; + } + + if ([@[@"fog"] containsObject:iconName]) { + return ClimaconFog; + } + + if ([@[@"cloudy"] containsObject:iconName]) { + return ClimaconCloud; + } + + if ([@[@"partly-cloudy-day"] containsObject:iconName]) { + return ClimaconCloudSun; + } + + if ([@[@"partly-cloudy-night"] containsObject:iconName]) { + return ClimaconCloudMoon; + } + + return ClimaconUnknown; +} + ++ (CLPlacemark *)placemarkForJSON:(NSDictionary *)JSON +{ +#if TARGET_OS_IOS || TARGET_OS_OSX + if (JSON) { + CLLocationDegrees latitude = [JSON[@"latitude"]floatValue]; + CLLocationDegrees longitude = [JSON[@"longitude"]floatValue]; + return [[MKPlacemark alloc]initWithCoordinate:CLLocationCoordinate2DMake(latitude, longitude) + addressDictionary:nil]; + } +#endif + return nil; +} + ++ (NSString *)componentForLocation:(CZWeatherLocation *)location +{ + return [NSString stringWithFormat:@"%.4f,%.4f", + location.coordinate.latitude, + location.coordinate.longitude]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest+Internal.h new file mode 100644 index 0000000..06df8b2 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest+Internal.h @@ -0,0 +1,51 @@ +// +// CZForecastioRequest+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZForecastioRequest.h" + + +#pragma mark - CZForecastioRequest Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZForecastioRequest (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSDate *date; + +@end + diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest.h b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest.h new file mode 100644 index 0000000..be271c5 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest.h @@ -0,0 +1,91 @@ +// +// CZForecastioRequest.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherRequest.h" + + +#pragma mark - CZForecastioRequest Interface + +/** + CZForecastioRequest is a subclass of CZWeatherRequest used to make requests + to the Forecast.io API. + + https://developer.forecast.io/docs/v2 + */ +@interface CZForecastioRequest : CZWeatherRequest + +// ----- +// @name Creating a Forecast.io Request +// ----- + +#pragma mark Creating a Forecast.io Request + +/** + Creates and initializes a new request for the forecasted weather conditions for + the next week. + + For more information, see + https://developer.forecast.io/docs/v2#forecast_call + + @return Newly created request. + */ ++ (instancetype)newForecastRequest; + +/** + Creates and initializes a new request for the forecasted weather conditions for + the given date. + + For more information, see + https://developer.forecast.io/docs/v2#time_call + + @param date + The date to request the forecast for, may be in the past or future. + @return Newly created request. + */ ++ (instancetype)newForecastRequestWithDate:(NSDate *)date; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The language of the requested data. + + For more information regarding supported languages, see + https://developer.forecast.io/docs/v2#options + */ +@property (NS_NONATOMIC_IOSONLY) NSString *language; + +/** + The date to retrieve the forecast for, may be nil. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSDate *date; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest.m b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest.m new file mode 100644 index 0000000..e82ed46 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZForecastioRequest.m @@ -0,0 +1,110 @@ +// +// CZForecastioRequest.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZForecastioRequest.h" +#import "CZWeatherKitInternal.h" +#import "CZForecastioAPI.h" + + +#pragma mark - CZForecastioRequest Class Extension + +@interface CZForecastioRequest () + +@property (NS_NONATOMIC_IOSONLY) NSDate *date; + +@end + + +#pragma mark - CZForecastioRequest Implementation + +@implementation CZForecastioRequest + ++ (instancetype)newForecastRequest +{ + return [CZForecastioRequest newForecastRequestWithDate:nil]; +} + ++ (instancetype)newForecastRequestWithDate:(NSDate *)date +{ + return [[CZForecastioRequest alloc]initWithDate:date]; +} + +- (void)sendWithCompletion:(CZWeatherRequestCompletion)completion +{ + [self dispatchWithAPI:self.API + completion:completion]; +} + +- (instancetype)initWithDate:(NSDate *)date +{ + if (self = [super _init]) { + self.date = date; + } + return self; +} + +- (Class)API +{ + return [CZForecastioAPI class]; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZForecastioRequest *copy = [[CZForecastioRequest alloc]_init]; + copy.key = [self.key copy]; + copy.date = [self.date copy]; + copy.language = [self.language copy]; + copy.location = [self.location copy]; + return copy; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super _init]) { + self.location = [aDecoder decodeObjectOfClass:[CZWeatherLocation class] + forKey:@"location"]; + self.language = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"language"]; + self.date = [aDecoder decodeObjectOfClass:[NSDate class] + forKey:@"date"]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.location forKey:@"location"]; + [aCoder encodeObject:self.language forKey:@"language"]; + [aCoder encodeObject:self.date forKey:@"date"]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapAPI.h b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapAPI.h new file mode 100644 index 0000000..b73328a --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapAPI.h @@ -0,0 +1,50 @@ +// +// CZOpenWeatherMapAPI.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#if TARGET_OS_IOS || TARGET_OS_OSX +@import MapKit; +@import AddressBook; +#endif + +@import CoreLocation; + +#import "CZWeatherAPI.h" + + +#pragma mark - CZOpenWeatherMapAPI Interface + +/** + CZOpenWeatherMapAPI conforms to the CZWeatherAPI protocol and implements + functionality for supporting the OpenWeatherMap API. + + For more information, see + http://openweathermap.org/api + */ +@interface CZOpenWeatherMapAPI : NSObject + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapAPI.m b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapAPI.m new file mode 100644 index 0000000..9f486d2 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapAPI.m @@ -0,0 +1,365 @@ +// +// CZOpenWeatherMapAPI.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZOpenWeatherMapAPI.h" +#import "CZOpenWeatherMapRequest.h" +#import "CZWeatherKitInternal.h" + + +#pragma mark - CZOpenWeatherMapAPI Implementation + +@implementation CZOpenWeatherMapAPI + ++ (NSString *)cacheKeyForRequest:(CZWeatherRequest *)request +{ + return [CZOpenWeatherMapAPI transformRequest:request].URL.absoluteString; +} + ++ (NSURLRequest *)transformRequest:(CZWeatherRequest *)request +{ + if ([request isKindOfClass:[CZOpenWeatherMapRequest class]]) { + CZOpenWeatherMapRequest *openWeatherMapRequest = (CZOpenWeatherMapRequest *)request; + + NSURLComponents *components = [NSURLComponents new]; + components.scheme = @"http"; + components.host = [openWeatherMapRequest.feature isEqualToString:@"history/city"] ? @"openweathermap.org" : @"api.openweathermap.org"; + components.path = [NSString stringWithFormat:@"/data/2.5/%@", openWeatherMapRequest.feature]; + components.query = [CZOpenWeatherMapAPI queryForRequest:openWeatherMapRequest]; + + return [NSURLRequest requestWithURL:components.URL]; + } + + return nil; +} + ++ (CZWeatherData *)transformResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *)error + forRequest:(CZWeatherRequest *)request +{ + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; + if (httpResponse.statusCode != 200) { + return nil; + } + } + + if (data) { + NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingAllowFragments + error:nil]; + if (JSON) { + CZOpenWeatherMapRequest *openWeatherMapRequest = (CZOpenWeatherMapRequest *)request; + CZWeatherData *weatherData = [[CZWeatherData alloc]_init]; + +#if TARGET_OS_IOS || TARGET_OS_OSX + weatherData.placemark = [CZOpenWeatherMapAPI placemarkForJSON:JSON]; +#endif + + if ([openWeatherMapRequest.feature isEqualToString:@"weather"]) { + weatherData.current = [CZOpenWeatherMapAPI conditionForCurrentJSON:JSON]; + } + + if ([openWeatherMapRequest.feature isEqualToString:@"forecast/daily"]) { + weatherData.dailyForecasts = [CZOpenWeatherMapAPI conditionsForDailyForecastJSON:JSON]; + } + + if ([openWeatherMapRequest.feature isEqualToString:@"forecast/hourly"]) { + weatherData.hourlyForecasts = [CZOpenWeatherMapAPI conditionsForHourlyForecastJSON:JSON]; + } + + if ([openWeatherMapRequest.feature isEqualToString:@"history/city"]) { + weatherData.hourlyForecasts = [CZOpenWeatherMapAPI conditionsForHourlyForecastJSON:JSON]; + } + + return weatherData; + } + } + + return nil; +} + ++ (NSArray *)conditionsForHourlyForecastJSON:(NSDictionary *)JSON +{ + NSMutableArray *conditions = [NSMutableArray new]; + NSArray *list = [JSON objectForKey:@"list" class:[NSArray class]]; + for (NSDictionary *hour in list) { + CZWeatherHourlyCondition *condition = [[CZWeatherHourlyCondition alloc]_init]; + + NSDictionary *main = [hour objectForKey:@"main" class:[NSDictionary class]]; + NSArray *weather = [hour objectForKey:@"weather" class:[NSArray class]]; + NSDictionary *wind = [hour objectForKey:@"wind" class:[NSDictionary class]]; + + if ([weather count] > 0) { + NSDictionary *inner = [weather[0] isKindOfClass:[NSDictionary class]] ? weather[0] : nil; + if (inner) { + condition.summary = inner[@"main"]; + condition.climacon =[CZOpenWeatherMapAPI climaconForIcon:inner[@"icon"]]; + } + } + + condition.date = [CZOpenWeatherMapAPI dateForDataPoint:hour]; + condition.humidity = [CZOpenWeatherMapAPI humidityForDataPoint:hour]; + condition.windSpeed = [CZOpenWeatherMapAPI windSpeedForDataPoint:wind]; + condition.windDirection = [CZOpenWeatherMapAPI windDirectionForDataPoint:wind]; + condition.humidity = [CZOpenWeatherMapAPI humidityForDataPoint:main]; + condition.temperature = [CZOpenWeatherMapAPI temperatureForDataPoint:main name:@"temp"]; + + [conditions addObject:condition]; + } + return conditions; +} + ++ (NSArray *)conditionsForDailyForecastJSON:(NSDictionary *)JSON +{ + NSMutableArray *conditions = [NSMutableArray new]; + NSArray *list = [JSON objectForKey:@"list" class:[NSArray class]]; + for (NSDictionary *day in list) { + CZWeatherForecastCondition *condition = [[CZWeatherForecastCondition alloc]_init]; + + NSArray *weather = [day objectForKey:@"weather" class:[NSArray class]]; + if ([weather count] > 0) { + + NSDictionary *inner = [weather[0] isKindOfClass:[NSDictionary class]] ? weather[0] : nil; + if (inner) { + condition.summary = inner[@"main"]; + condition.climacon =[CZOpenWeatherMapAPI climaconForIcon:inner[@"icon"]]; + } + } + + condition.date = [CZOpenWeatherMapAPI dateForDataPoint:day]; + condition.humidity = [CZOpenWeatherMapAPI humidityForDataPoint:day]; + if ([day objectForKey:@"temp" class:[NSDictionary class]]) { + condition.lowTemperature = [CZOpenWeatherMapAPI temperatureForDataPoint:day[@"temp"] name:@"min"]; + condition.highTemperature = [CZOpenWeatherMapAPI temperatureForDataPoint:day[@"temp"] name:@"max"]; + } + + [conditions addObject:condition]; + } + return conditions; +} + ++ (CZWeatherCurrentCondition *)conditionForCurrentJSON:(NSDictionary *)JSON +{ + CZWeatherCurrentCondition *condition = [[CZWeatherCurrentCondition alloc]_init]; + NSDictionary *main = [JSON objectForKey:@"main" class:[NSDictionary class]]; + NSDictionary *wind = [JSON objectForKey:@"wind" class:[NSDictionary class]]; + NSArray *weather = [JSON objectForKey:@"weather" class:[NSArray class]]; + + if ([weather count] > 0) { + NSDictionary *day = [weather[0] isKindOfClass:[NSDictionary class]] ? weather[0] : nil; + if (day) { + condition.summary = day[@"main"]; + condition.climacon =[CZOpenWeatherMapAPI climaconForIcon:day[@"icon"]]; + } + } + + condition.date = [CZOpenWeatherMapAPI dateForDataPoint:JSON]; + condition.temperature = [CZOpenWeatherMapAPI temperatureForDataPoint:main name:@"temp"]; + condition.lowTemperature = [CZOpenWeatherMapAPI temperatureForDataPoint:main name:@"temp_min"]; + condition.highTemperature = [CZOpenWeatherMapAPI temperatureForDataPoint:main name:@"temp_max"]; + condition.windSpeed = [CZOpenWeatherMapAPI windSpeedForDataPoint:wind]; + condition.windDirection = [CZOpenWeatherMapAPI windDirectionForDataPoint:wind]; + condition.pressure = [CZOpenWeatherMapAPI pressureForDataPoint:main]; + condition.humidity = [CZOpenWeatherMapAPI humidityForDataPoint:main]; + + return condition; +} + + ++ (CZTemperature)temperatureForDataPoint:(NSDictionary *)dataPoint name:(NSString *)name +{ + return (CZTemperature) { + .f = dataPoint[name] ? cz_ktof([dataPoint[name]floatValue]) : CZValueUnavailable, + .c = dataPoint[name] ? cz_ktoc([dataPoint[name]floatValue]) : CZValueUnavailable + }; +} + ++ (CZWindSpeed)windSpeedForDataPoint:(NSDictionary *)dataPoint +{ + return (CZWindSpeed) { + .mph = dataPoint[@"speed"] ? cz_mpstomph([dataPoint[@"speed"]floatValue]) : CZValueUnavailable, + .kph = dataPoint[@"speed"] ? cz_mpstokph([dataPoint[@"speed"]floatValue]) : CZValueUnavailable + }; +} + ++ (CZPressure)pressureForDataPoint:(NSDictionary *)dataPoint +{ + return (CZPressure) { + .mb = dataPoint[@"pressure"] ? [dataPoint[@"pressure"]floatValue] : CZValueUnavailable, + .inch = dataPoint[@"pressure"] ? cz_mbtoin([dataPoint[@"pressure"]floatValue]) : CZValueUnavailable, + }; +} + ++ (CZWindDirection)windDirectionForDataPoint:(NSDictionary *)dataPoint +{ + return dataPoint[@"deg"] ? [dataPoint[@"deg"]floatValue] : CZValueUnavailable; +} + ++ (CZHumidity)humidityForDataPoint:(NSDictionary *)dataPoint +{ + return dataPoint[@"humidity"] ? [dataPoint[@"humidity"]floatValue] : CZValueUnavailable; +} + ++ (NSDate *)dateForDataPoint:(NSDictionary *)dataPoint +{ + return dataPoint[@"dt"] ? [NSDate dateWithTimeIntervalSince1970:[dataPoint[@"dt"]floatValue]] : nil; +} + ++ (Climacon)climaconForIcon:(NSString *)icon +{ + if ([@[@"01d"] containsObject:icon]) { + return ClimaconSun; + } + + if ([@[@"01n"] containsObject:icon]) { + return ClimaconMoon; + } + + if ([@[@"02d"] containsObject:icon]) { + return ClimaconCloudSun; + } + + if ([@[@"02n"] containsObject:icon]) { + return ClimaconCloudMoon; + } + + if ([@[@"03d", @"03n", @"04d", @"04n"] containsObject:icon]) { + return ClimaconCloud; + } + + if ([@[@"09d", @"09n"] containsObject:icon]) { + return ClimaconShowers; + } + + if ([@[@"10d"] containsObject:icon]) { + return ClimaconRainSun; + } + + if ([@[@"10n"] containsObject:icon]) { + return ClimaconRainMoon; + } + + if ([@[@"11d", @"11n"] containsObject:icon]) { + return ClimaconLightning; + } + + if ([@[@"13d", @"13n"] containsObject:icon]) { + return ClimaconSnow; + } + + if ([@[@"50d", @"50n"] containsObject:icon]) { + return ClimaconHaze; + } + + return ClimaconUnknown; +} + +#if TARGET_OS_IOS || TARGET_OS_OSX ++ (CLPlacemark *)placemarkForJSON:(NSDictionary *)JSON +{ + if (JSON) { + NSDictionary *city = [JSON objectForKey:@"city" class:[NSDictionary class]]; + NSDictionary *sys = [JSON objectForKey:@"sys" class:[NSDictionary class]]; + NSDictionary *coord = [JSON objectForKey:@"coord" class:[NSDictionary class]]; + + NSMutableDictionary *addressDictionary = [NSMutableDictionary new]; + if (sys[@"country"]) { + addressDictionary[kABCountryKey] = sys[@"country"]; + addressDictionary[kABCountryCodeKey] = sys[@"country"]; + } else if (city[@"country"]) { + addressDictionary[kABCountryKey] = city[@"country"]; + addressDictionary[kABCountryCodeKey] = city[@"country"]; + } + + if (JSON[@"name"]) { + addressDictionary[kABCityKey] = JSON[@"name"]; + } else if (city[@"name"]) { + addressDictionary[kABCityKey] = city[@"name"]; + } + + CLLocationDegrees latitude = CZValueUnavailable; + CLLocationDegrees longitude = CZValueUnavailable; + + if (coord) { + latitude = [coord[@"lat"]floatValue]; + longitude = [coord[@"lon"]floatValue]; + } else if ([city objectForKey:@"coord" class:[NSDictionary class]]) { + latitude = [city[@"coord"][@"lat"]floatValue]; + longitude = [city[@"coord"][@"lon"]floatValue]; + } + + if (![addressDictionary count] && latitude == CZValueUnavailable && longitude == CZValueUnavailable) { + return nil; + } + + return [[MKPlacemark alloc]initWithCoordinate:CLLocationCoordinate2DMake(latitude, longitude) + addressDictionary:addressDictionary]; + } + return nil; +} +#endif + ++ (NSString *)queryForRequest:(CZOpenWeatherMapRequest *)request +{ + NSString *location = [CZOpenWeatherMapAPI componentForLocation:request.location]; + NSString *language = request.language ? request.language : @"en"; + + NSString *query = [NSString stringWithFormat:@"%@&lang=%@&mode=json", location, language]; + if ([request.feature isEqualToString:@"forecast/daily"]) { + query = [query stringByAppendingFormat:@"&cnt=%ld", (long)request.days]; + } else if ([request.feature isEqualToString:@"history/city"]) { + query = [query stringByAppendingFormat:@"&type=hourly&start=%ld&end=%ld", + (long)[request.start timeIntervalSince1970], (long)[request.end timeIntervalSince1970]]; + } + + if ([request.key length]) { + query = [query stringByAppendingFormat:@"&APPID=%@", request.key]; + } + + return query; +} + ++ (NSString *)componentForLocation:(CZWeatherLocation *)location +{ + if (location.state) { + return [NSString stringWithFormat:@"q=%@,US", location.city]; + } else if (location.country) { + return [NSString stringWithFormat:@"q=%@,%@", + [self urlEncode:location.city], + [self urlEncode:location.country]]; + } + return [NSString stringWithFormat:@"lat=%.4f&lon=%.4f", + location.coordinate.latitude, location.coordinate.longitude]; +} + ++ (NSString *)urlEncode:(NSString *)string { + return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest+Internal.h new file mode 100644 index 0000000..7b5be08 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest+Internal.h @@ -0,0 +1,65 @@ +// +// CZOpenWeatherMapRequest+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZOpenWeatherMapRequest.h" + + +#pragma mark - CZOpenWeatherMapRequest Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZOpenWeatherMapRequest (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSDate *end; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSDate *start; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSInteger days; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSString *feature; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest.h b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest.h new file mode 100644 index 0000000..7a334da --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest.h @@ -0,0 +1,123 @@ +// +// CZOpenWeatherMapRequest.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherRequest.h" + + +#pragma mark - CZOpenWeatherMapRequest Interface + +/** + CZOpenWeatherMapRequest is a subclass of CZWeatherRequest used to make requests + to the OpenWeatherMap API. + + http://openweathermap.org/api + */ +@interface CZOpenWeatherMapRequest : CZWeatherRequest + +// ----- +// @name Creating an Open Weather Map Request +// ----- + +#pragma mark Creating an Open Weather Map Request + +/** + Creates and initializes a new request for the current weather conditions. + + For more information, see + http://openweathermap.org/current + + @returns Newly created request. + */ ++ (instancetype)newCurrentRequest; + +/** + Creates and initializes a new request for daily forecasted weather conditions. + + For more information, see + http://openweathermap.org/forecast + + @param days + The number of days of forecasted conditions to request. + @returns Newly created request. + */ ++ (instancetype)newDailyForecastRequestForDays:(NSInteger)days; + +/** + Creates and initializes a new request for hourly forecasted weather conditions. + + For more information, see + http://openweathermap.org/forecast + @returns Newly created request. + */ ++ (instancetype)newHourlyForecastRequest; + +/** + Creates and initializes a new request for historical weather conditions. + + For more information, see + http://openweathermap.org/history + + @param from + The start date to get historical conditions for. + @param to + The end date to get historical conditions for. + @returns Newly created request. + */ ++ (instancetype)newHistoryRequestFrom:(NSDate *)from to:(NSDate *)to; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The language of the requested data. + + For more information regarding supported languages, see + http://openweathermap.org/current#multi + */ +@property (NS_NONATOMIC_IOSONLY) NSString *language; + +/** + The start date to retrieve the historical conditions for, may be nil. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSDate *start; + +/** + The end date to retrieve the historical conditions for, may be nil. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSDate *end; + +/** + The number of days to retrieve forecasted weather conditions for; this value + will be equal + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSInteger days; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest.m b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest.m new file mode 100644 index 0000000..15f239b --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZOpenWeatherMapRequest.m @@ -0,0 +1,141 @@ +// +// CZOpenWeatherMapRequest.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZOpenWeatherMapRequest.h" +#import "CZWeatherKitInternal.h" +#import "CZOpenWeatherMapAPI.h" + + +#pragma mark - CZOpenWeatherMapRequest Class Extension + +@interface CZOpenWeatherMapRequest () + +@property (NS_NONATOMIC_IOSONLY) NSDate *end; +@property (NS_NONATOMIC_IOSONLY) NSDate *start; +@property (NS_NONATOMIC_IOSONLY) NSInteger days; +@property (NS_NONATOMIC_IOSONLY) NSString *feature; + +@end + + +#pragma mark - CZOpenWeatherMapRequest Implementation + +@implementation CZOpenWeatherMapRequest + +#pragma mark Creating an Open Weather Map Request + ++ (instancetype)newCurrentRequest +{ + return [[CZOpenWeatherMapRequest alloc]initWithFeature:@"weather"]; +} + ++ (instancetype)newDailyForecastRequestForDays:(NSInteger)days +{ + CZOpenWeatherMapRequest *request = [[CZOpenWeatherMapRequest alloc]initWithFeature:@"forecast/daily"]; + request.days = days; + return request; +} + ++ (instancetype)newHourlyForecastRequest +{ + CZOpenWeatherMapRequest *request = [[CZOpenWeatherMapRequest alloc]initWithFeature:@"forecast/hourly"]; + return request; +} + ++ (instancetype)newHistoryRequestFrom:(NSDate *)from to:(NSDate *)to +{ + CZOpenWeatherMapRequest *request = [[CZOpenWeatherMapRequest alloc]initWithFeature:@"history/city"]; + request.start = from; + request.end = to; + return request; +} + +- (instancetype)initWithFeature:(NSString *)feature +{ + if (self = [super _init]) { + self.feature = feature; + } + return self; +} + +#pragma mark CZWeatherRequest + +- (void)sendWithCompletion:(CZWeatherRequestCompletion)completion +{ + [self dispatchWithAPI:self.API + completion:completion]; +} + +- (Class)API +{ + return [CZOpenWeatherMapAPI class]; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZOpenWeatherMapRequest *copy = [[CZOpenWeatherMapRequest alloc]_init]; + copy.feature = [self.feature copy]; + copy.language = [self.language copy]; + copy.location = [self.location copy]; + copy.start = [self.start copy]; + copy.end = [self.end copy]; + copy.key = [self.key copy]; + copy.days = self.days; + return copy; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super _init]) { + self.location = [aDecoder decodeObjectOfClass:[CZWeatherLocation class] forKey:@"location"]; + self.language = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"language"]; + self.feature = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"feature"]; + self.days = [aDecoder decodeIntegerForKey:@"days"]; + self.start = [aDecoder decodeObjectOfClass:[NSDate class] forKey:@"start"]; + self.end = [aDecoder decodeObjectOfClass:[NSDate class] forKey:@"end"]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.location forKey:@"location"]; + [aCoder encodeObject:self.language forKey:@"language"]; + [aCoder encodeObject:self.feature forKey:@"feature"]; + [aCoder encodeObject:self.start forKey:@"start"]; + [aCoder encodeObject:self.end forKey:@"end"]; + [aCoder encodeInteger:self.days forKey:@"days"]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZPINWeatherDataCache.h b/Pods/CZWeatherKit/CZWeatherKit/CZPINWeatherDataCache.h new file mode 100644 index 0000000..a4e830d --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZPINWeatherDataCache.h @@ -0,0 +1,45 @@ +// +// CZPINWeatherDataCache.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + +#import "CZWeatherDataCache.h" + + +#pragma mark - CZPINWeatherDataCache Interface + +/** + CZPINWeatherDataCache is an implementation of the CZWeatherDataCache that uses + PINCache to cache weather data. + + For more information regarding PINCache, see + https://github.com/pinterest/PINCache + */ +@interface CZPINWeatherDataCache : NSObject + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZPINWeatherDataCache.m b/Pods/CZWeatherKit/CZWeatherKit/CZPINWeatherDataCache.m new file mode 100644 index 0000000..5f01d64 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZPINWeatherDataCache.m @@ -0,0 +1,76 @@ +// +// CZPINWeatherDataCache.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +#pragma mark - Imports + +#import "CZPINWeatherDataCache.h" +#import "CZWeatherKitInternal.h" +#import "CZWeatherAPI.h" + +#import + + +#pragma mark - CZPINWeatherDataCache Class Extension + +@interface CZPINWeatherDataCache () + +@property (NS_NONATOMIC_IOSONLY) PINCache *cache; + +@end + + +#pragma mark - CZPINWeatherDataCache Implementation + +@implementation CZPINWeatherDataCache + +- (instancetype)init +{ + if (self = [super init]) { + self.cache = [[PINCache alloc]initWithName:@"com.czweatherkit.pincache"]; + self.cache.diskCache.ageLimit = 3600; // one hour + self.cache.memoryCache.ageLimit = 3600; + } + return self; +} + +- (void)dataForRequest:(CZWeatherRequest *)request completion:(CZWeatherDataCacheCompletion)completion +{ + NSString *key = [request.API cacheKeyForRequest:request]; + [self.cache objectForKey:key block:^(PINCache *cache, NSString *key, id __nullable object) { + if ([object isKindOfClass:[CZWeatherData class]]) { + completion(object); + } else { + completion(nil); + } + }]; +} + +- (void)storeData:(CZWeatherData *)data forRequest:(CZWeatherRequest *)request +{ + NSString *key = [request.API cacheKeyForRequest:request]; + [self.cache setObject:data forKey:key block:nil]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherAPI.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherAPI.h new file mode 100644 index 0000000..67061ba --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherAPI.h @@ -0,0 +1,95 @@ +// +// CZWeatherAPI.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - Forward Declarations + +@class CZWeatherData; +@class CZWeatherRequest; + + +#pragma mark - CZWeatherAPI Protocol + +/** + The CZWeatherAPI protocol declares two methods that weather API classes must + implement to transform requests and responses. This capability allows API + classes to act as middlemen between CZWeatherKit and the URL Loading System. + */ +@protocol CZWeatherAPI + +@required + +// ----- +// @name Using a Weather API +// ----- + +#pragma mark Using a Weather API + +/** + Returns a cache key for the given request. + + Calls to this method with the same or an equivalent request object must return + the same cache key. + + @param request + The request to create a cache key for. + @return The cache key for the given request. + */ ++ (NSString *)cacheKeyForRequest:(CZWeatherRequest *)request; + +/** + Transforms a CZWeatherRequest into an NSURLRequest. + + @param request + The request to transform. + @return An NSURLRequest that represents the CZWeatherRequest. + */ ++ (NSURLRequest *)transformRequest:(CZWeatherRequest *)request; + +/** + Transforms an API response into a CZWeatherData object. + + @param response + The URL response. + @param data + The data included in the response. + @param error + The error, if one occurred. + @param request + The request that resulted in the response. + @return A CZWeatherData object that represents the data included in the + response. + */ ++ (CZWeatherData *)transformResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *)error + forRequest:(CZWeatherRequest *)request; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition+Internal.h new file mode 100644 index 0000000..5d7931e --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition+Internal.h @@ -0,0 +1,100 @@ +// +// CZWeatherCondition+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherCurrentCondition.h" + + +#pragma mark - CZWeatherCondition Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWeatherCurrentCondition (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +- (instancetype)_init; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSDate *date; + +/** + @warning Not for external use. + */ +@property (copy, NS_NONATOMIC_IOSONLY) NSString *summary; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) Climacon climacon; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZHumidity humidity; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZPressure pressure; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZWindSpeed windSpeed; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZWindDirection windDirection; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature temperature; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature lowTemperature; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature highTemperature; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition.h new file mode 100644 index 0000000..65eb4d6 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition.h @@ -0,0 +1,101 @@ +// +// CZWeatherCondition.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + +#import "CZClimacons.h" +#import "CZWeatherKitTypes.h" + + +#pragma mark - CZWeatherCurrentCondition Interface + +/** + A CZWeatherCurrentCondition object represents the weather conditions at the + current time. + */ +@interface CZWeatherCurrentCondition : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The observation date for the weather conditions. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSDate *date; + +/** + A short description of the weather conditions, e.g. "Partly Cloudy". + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSString *summary; + +/** + The Climacon character that represents the weather conditions. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) Climacon climacon; + +/** + The current humidity. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZHumidity humidity; + +/** + The current temperature. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZTemperature temperature; + +/** + The current wind direction. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZWindDirection windDirection; + +/** + The current air pressure. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZPressure pressure; + +/** + The current wind speed. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZWindSpeed windSpeed; + +/** + * The min temperature + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZTemperature lowTemperature; + +/** + * The max temperature + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZTemperature highTemperature; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition.m b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition.m new file mode 100644 index 0000000..7f9b456 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherCurrentCondition.m @@ -0,0 +1,146 @@ +// +// CZWeatherCondition.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherCurrentCondition.h" +#import "CZWeatherCurrentCondition+Internal.h" + + +#pragma mark - CZWeatherCurrentCondition Class Extension + +@interface CZWeatherCurrentCondition () + +@property (NS_NONATOMIC_IOSONLY) NSDate *date; +@property (NS_NONATOMIC_IOSONLY) NSString *summary; +@property (assign, NS_NONATOMIC_IOSONLY) Climacon climacon; +@property (assign, NS_NONATOMIC_IOSONLY) CZHumidity humidity; +@property (assign, NS_NONATOMIC_IOSONLY) CZPressure pressure; +@property (assign, NS_NONATOMIC_IOSONLY) CZWindSpeed windSpeed; +@property (assign, NS_NONATOMIC_IOSONLY) CZWindDirection windDirection; +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature temperature; +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature lowTemperature; +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature highTemperature; + +@end + + +#pragma mark - CZWeatherCurrentCondition Implementation + +@implementation CZWeatherCurrentCondition + +- (instancetype)_init +{ + if (self = [super init]) { + // nothing to do + } + return self; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super init]) { + self.date = [aDecoder decodeObjectOfClass:[NSDate class] forKey:@"date"]; + self.summary = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"summary"]; + self.climacon = [aDecoder decodeIntegerForKey:@"climacon"]; + self.humidity = [aDecoder decodeFloatForKey:@"humidity"]; + self.windDirection = [aDecoder decodeFloatForKey:@"windDirection"]; + + float mb = [aDecoder decodeFloatForKey:@"pressure.mb"]; + float inch = [aDecoder decodeFloatForKey:@"pressure.inch"]; + _pressure = (CZPressure) { mb, inch }; + + float mph = [aDecoder decodeFloatForKey:@"windSpeed.mph"]; + float kph = [aDecoder decodeFloatForKey:@"windSpeed.kph"]; + _windSpeed = (CZWindSpeed) { mph, kph }; + + float f = [aDecoder decodeFloatForKey:@"temperature.f"]; + float c = [aDecoder decodeFloatForKey:@"temperature.c"]; + _temperature = (CZTemperature) { f, c }; + + float minf = [aDecoder decodeFloatForKey:@"lowTemperature.f"]; + float minc = [aDecoder decodeFloatForKey:@"lowTemperature.c"]; + _lowTemperature = (CZTemperature) { minf, minc }; + + float maxf = [aDecoder decodeFloatForKey:@"highTemperature.f"]; + float maxc = [aDecoder decodeFloatForKey:@"highTemperature.c"]; + _highTemperature = (CZTemperature) { maxf, maxc }; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.date forKey:@"date"]; + [aCoder encodeObject:self.summary forKey:@"summary"]; + [aCoder encodeInteger:self.climacon forKey:@"climacon"]; + [aCoder encodeFloat:self.humidity forKey:@"humidity"]; + [aCoder encodeFloat:self.windDirection forKey:@"windDirection"]; + + [aCoder encodeFloat:self.pressure.mb forKey:@"pressure.mb"]; + [aCoder encodeFloat:self.pressure.inch forKey:@"pressure.inch"]; + + [aCoder encodeFloat:self.windSpeed.mph forKey:@"windSpeed.mph"]; + [aCoder encodeFloat:self.windSpeed.kph forKey:@"windSpeed.kph"]; + + [aCoder encodeFloat:self.temperature.f forKey:@"temperature.f"]; + [aCoder encodeFloat:self.temperature.c forKey:@"temperature.c"]; + + [aCoder encodeFloat:self.lowTemperature.f forKey:@"lowTemperature.f"]; + [aCoder encodeFloat:self.highTemperature.c forKey:@"lowTemperature.c"]; + + [aCoder encodeFloat:self.lowTemperature.f forKey:@"highTemperature.f"]; + [aCoder encodeFloat:self.highTemperature.c forKey:@"highTemperature.c"]; +} + +#pragma mark NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZWeatherCurrentCondition *copy = [[CZWeatherCurrentCondition alloc]_init]; + copy.date = [self.date copy]; + copy.summary = [self.summary copy]; + copy.climacon = self.climacon; + copy.humidity = self.humidity; + copy.pressure = self.pressure; + copy.windDirection = self.windDirection; + copy.windSpeed = self.windSpeed; + copy.temperature = self.temperature; + copy.lowTemperature = self.lowTemperature; + copy.highTemperature = self.highTemperature; + return copy; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData+Internal.h new file mode 100644 index 0000000..6f748f9 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData+Internal.h @@ -0,0 +1,70 @@ +// +// CZWeatherData+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherData.h" + + +#pragma mark - CZWeatherData Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWeatherData (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +- (instancetype)_init; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) CLPlacemark *placemark; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSArray *dailyForecasts; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSArray *hourlyForecasts; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) CZWeatherCurrentCondition *current; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData.h new file mode 100644 index 0000000..a378271 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData.h @@ -0,0 +1,70 @@ +// +// CZWeatherData.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; +@import CoreLocation; + +@class CZWeatherCurrentCondition; + + +#pragma mark - CZWeatherData Interface + +/** + A CZWeatherData object contains data returned for a weather request. + */ +@interface CZWeatherData : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The placemark representing the location the data was retrieved for. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CLPlacemark *placemark; + +/** + An array of CZWeatherForecastCondition objects. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSArray *dailyForecasts; + +/** + An array of CZWeatherHourlyCondition objects. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSArray *hourlyForecasts; + +/** + The current weather conditions. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZWeatherCurrentCondition *current; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData.m b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData.m new file mode 100644 index 0000000..ba869a7 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherData.m @@ -0,0 +1,104 @@ +// +// CZWeatherData.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherData.h" +#import "CZWeatherKitInternal.h" +#import "CZWeatherCurrentCondition.h" + + +#pragma mark - CZWeatherData Class Extension + +@interface CZWeatherData () + +@property (NS_NONATOMIC_IOSONLY) CLPlacemark *placemark; +@property (NS_NONATOMIC_IOSONLY) NSArray *dailyForecasts; +@property (NS_NONATOMIC_IOSONLY) NSArray *hourlyForecasts; +@property (NS_NONATOMIC_IOSONLY) CZWeatherCurrentCondition *current; + +@end + + +#pragma mark - CZWeatherData Implementation + +@implementation CZWeatherData + +- (instancetype)_init +{ + if (self = [super init]) { + // nothing to do + } + return self; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super init]) { + self.placemark = [aDecoder decodeObjectOfClass:[CLPlacemark class] + forKey:@"placemark"]; + self.current = [aDecoder decodeObjectOfClass:[CZWeatherCurrentCondition class] + forKey:@"current"]; + self.dailyForecasts = [NSKeyedUnarchiver unarchiveObjectWithData:[aDecoder decodeObjectOfClass:[NSData class] + forKey:@"dailyForecasts"]]; + self.hourlyForecasts = [NSKeyedUnarchiver unarchiveObjectWithData:[aDecoder decodeObjectOfClass:[NSData class] + forKey:@"hourlyForecasts"]]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.placemark forKey:@"placemark"]; + [aCoder encodeObject:self.current forKey:@"current"]; + [aCoder encodeObject:[NSKeyedArchiver archivedDataWithRootObject:self.dailyForecasts] + forKey:@"dailyForecasts"]; + [aCoder encodeObject:[NSKeyedArchiver archivedDataWithRootObject:self.hourlyForecasts] + forKey:@"hourlyForecasts"]; +} + +#pragma mark NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZWeatherData *copy = [[CZWeatherData alloc]_init]; + copy.placemark = [self.placemark copy]; + copy.current = [self.current copy]; + copy.dailyForecasts = [self.dailyForecasts copy]; + copy.hourlyForecasts = [self.hourlyForecasts copy]; + return copy; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherDataCache.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherDataCache.h new file mode 100644 index 0000000..2b5a09c --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherDataCache.h @@ -0,0 +1,88 @@ +// +// CZWeatherDataCache.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - Forward Declaratiosn + +@class CZWeatherData; +@class CZWeatherRequest; + + +#pragma mark - Type Definitions + +/** + The completion handler for dataForRequest:completion: + + @param data + The data that was retrieved, or nil if no relevant data was found. + */ +typedef void (^CZWeatherDataCacheCompletion)(CZWeatherData *data); + + +#pragma mark - CZWeatherDataCache Protocol + +/** + The CZWeatherDataCache protocol declares two methods classes must implement + to cache weather data retrieved by a weather service. Both methods of the + protocol are expected to by asynchronous and non-blocking. + */ +@protocol CZWeatherDataCache + +@required + +// ----- +// @name Using a Weather Data Cache +// ----- + +#pragma mark Using a Weather Data Cache + +/** + Asynchronously retrieves cached data that is relevant to the provided request. + + @param request + The request for weather data. + @param completion + The completion handler to use. + */ +- (void)dataForRequest:(CZWeatherRequest *)request + completion:(CZWeatherDataCacheCompletion)completion; + +/** + Asynchronously stores the provided weather data. + + @param data + The weather data to store. + @param request + The request for the data. + */ +- (void)storeData:(CZWeatherData *)data + forRequest:(CZWeatherRequest *)request; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition+Internal.h new file mode 100644 index 0000000..5be44ff --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition+Internal.h @@ -0,0 +1,80 @@ +// +// CZWeatherForecastCondition+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherForecastCondition.h" + + +#pragma mark - CZWeatherForecastCondition Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWeatherForecastCondition (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +- (instancetype)_init; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSDate *date; + +/** + @warning Not for external use. + */ +@property (copy, NS_NONATOMIC_IOSONLY) NSString *summary; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) Climacon climacon; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZHumidity humidity; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature lowTemperature; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature highTemperature; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition.h new file mode 100644 index 0000000..f141a77 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition.h @@ -0,0 +1,81 @@ +// +// CZWeatherForecastCondition.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + +#import "CZClimacons.h" +#import "CZWeatherKitTypes.h" + + +#pragma mark - CZWeatherForecastCondition Interface + +/** + A CZWeatherForecastCondition object represents the forecasted weather + conditions for a day. + */ +@interface CZWeatherForecastCondition : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The date of the forecast. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSDate *date; + +/** + A short description of the weather conditions, e.g. "Partly Cloudy". + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSString *summary; + +/** + The Climacon character that represents the weather conditions. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) Climacon climacon; + +/** + The humidity. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZHumidity humidity; + +/** + The low temperature. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZTemperature lowTemperature; + +/** + The high temperature. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZTemperature highTemperature; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition.m b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition.m new file mode 100644 index 0000000..5629521 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherForecastCondition.m @@ -0,0 +1,115 @@ +// +// CZWeatherForecastCondition.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherForecastCondition.h" +#import "CZWeatherForecastCondition+Internal.h" + + +#pragma mark - CZWeatherForecastCondition Class Extension + +@interface CZWeatherForecastCondition () + +@property (NS_NONATOMIC_IOSONLY) NSDate *date; +@property (NS_NONATOMIC_IOSONLY) NSString *summary; +@property (assign, NS_NONATOMIC_IOSONLY) Climacon climacon; +@property (assign, NS_NONATOMIC_IOSONLY) CZHumidity humidity; +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature lowTemperature; +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature highTemperature; + +@end + + +#pragma mark - CZWeatherForecastCondition Implementation + +@implementation CZWeatherForecastCondition + +- (instancetype)_init +{ + if (self = [super init]) { + // nothing to do + } + return self; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super init]) { + self.date = [aDecoder decodeObjectOfClass:[NSDate class] forKey:@"date"]; + self.summary = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"summary"]; + self.climacon = [aDecoder decodeIntegerForKey:@"climacon"]; + self.humidity = [aDecoder decodeFloatForKey:@"humidity"]; + + float lowTemperatureF = [aDecoder decodeFloatForKey:@"lowTemperature.f"]; + float lowTemperatureC = [aDecoder decodeFloatForKey:@"lowTemperature.c"]; + _lowTemperature = (CZTemperature) { lowTemperatureF, lowTemperatureC }; + + float highTemperatureF = [aDecoder decodeFloatForKey:@"highTemperature.f"]; + float highTemperatureC = [aDecoder decodeFloatForKey:@"highTemperature.c"]; + _highTemperature = (CZTemperature) { highTemperatureF, highTemperatureC }; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.date forKey:@"date"]; + [aCoder encodeObject:self.summary forKey:@"summary"]; + [aCoder encodeInteger:self.climacon forKey:@"climacon"]; + [aCoder encodeFloat:self.humidity forKey:@"humidity"]; + + [aCoder encodeFloat:self.lowTemperature.f forKey:@"lowTemperature.f"]; + [aCoder encodeFloat:self.lowTemperature.c forKey:@"lowTemperature.c"]; + + [aCoder encodeFloat:self.highTemperature.f forKey:@"highTemperature.f"]; + [aCoder encodeFloat:self.highTemperature.c forKey:@"highTemperature.c"]; +} + +#pragma mark NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZWeatherForecastCondition *copy = [[CZWeatherForecastCondition alloc]_init]; + copy.date = [self.date copy]; + copy.summary = [self.summary copy]; + copy.climacon = self.climacon; + copy.humidity = self.humidity; + copy.lowTemperature = self.lowTemperature; + copy.highTemperature = self.highTemperature; + return copy; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition+Internal.h new file mode 100644 index 0000000..dcac761 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition+Internal.h @@ -0,0 +1,85 @@ +// +// CZWeatherHourlyCondition+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherHourlyCondition.h" + + +#pragma mark - CZWeatherHourlyCondition Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWeatherHourlyCondition (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +- (instancetype)_init; + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSDate *date; + +/** + @warning Not for external use. + */ +@property (copy, NS_NONATOMIC_IOSONLY) NSString *summary; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) Climacon climacon; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZHumidity humidity; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZWindSpeed windSpeed; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZWindDirection windDirection; + +/** + @warning Not for external use. + */ +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature temperature; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition.h new file mode 100644 index 0000000..e3b6598 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition.h @@ -0,0 +1,86 @@ +// +// CZWeatherHourlyCondition.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + +#import "CZClimacons.h" +#import "CZWeatherKitTypes.h" + + +#pragma mark - CZWeatherHourlyCondition Interface + +/** + A CZWeatherForecastCondition object represents the forecasted weather + conditions for an hour. + */ +@interface CZWeatherHourlyCondition : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The date of the forecast. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSDate *date; + +/** + A short description of the weather conditions, e.g. "Partly Cloudy". + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSString *summary; + +/** + The Climacon character that represents the weather conditions. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) Climacon climacon; + +/** + The humidity. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZHumidity humidity; + +/** + The temperature. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZTemperature temperature; + +/** + The wind direction. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZWindDirection windDirection; + +/** + The wind speed. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CZWindSpeed windSpeed; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition.m b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition.m new file mode 100644 index 0000000..2c929f4 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherHourlyCondition.m @@ -0,0 +1,119 @@ +// +// CZWeatherHourlyCondition.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherHourlyCondition.h" +#import "CZWeatherHourlyCondition+Internal.h" + + +#pragma mark - CZWeatherHourlyCondition Class Extension + +@interface CZWeatherHourlyCondition () + +@property (NS_NONATOMIC_IOSONLY) NSDate *date; +@property (NS_NONATOMIC_IOSONLY) NSString *summary; +@property (assign, NS_NONATOMIC_IOSONLY) Climacon climacon; +@property (assign, NS_NONATOMIC_IOSONLY) CZHumidity humidity; +@property (assign, NS_NONATOMIC_IOSONLY) CZWindSpeed windSpeed; +@property (assign, NS_NONATOMIC_IOSONLY) CZWindDirection windDirection; +@property (assign, NS_NONATOMIC_IOSONLY) CZTemperature temperature; + +@end + + +#pragma mark - CZWeatherHourlyCondition Implementation + +@implementation CZWeatherHourlyCondition + +- (instancetype)_init +{ + if (self = [super init]) { + // nothing to do + } + return self; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super init]) { + self.date = [aDecoder decodeObjectOfClass:[NSDate class] forKey:@"date"]; + self.summary = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"summary"]; + self.climacon = [aDecoder decodeIntegerForKey:@"climacon"]; + self.humidity = [aDecoder decodeFloatForKey:@"humidity"]; + self.windDirection = [aDecoder decodeFloatForKey:@"windDirection"]; + + float mph = [aDecoder decodeFloatForKey:@"windSpeed.mph"]; + float kph = [aDecoder decodeFloatForKey:@"windSpeed.kph"]; + _windSpeed = (CZWindSpeed) { mph, kph }; + + float f = [aDecoder decodeFloatForKey:@"temperature.f"]; + float c = [aDecoder decodeFloatForKey:@"temperature.c"]; + _temperature = (CZTemperature) { f, c }; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.date forKey:@"date"]; + [aCoder encodeObject:self.summary forKey:@"summary"]; + [aCoder encodeInteger:self.climacon forKey:@"climacon"]; + [aCoder encodeFloat:self.humidity forKey:@"humidity"]; + [aCoder encodeFloat:self.windDirection forKey:@"windDirection"]; + + [aCoder encodeFloat:self.windSpeed.mph forKey:@"windSpeed.mph"]; + [aCoder encodeFloat:self.windSpeed.kph forKey:@"windSpeed.kph"]; + + [aCoder encodeFloat:self.temperature.f forKey:@"temperature.f"]; + [aCoder encodeFloat:self.temperature.c forKey:@"temperature.c"]; +} + +#pragma mark NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZWeatherHourlyCondition *copy = [[CZWeatherHourlyCondition alloc]_init]; + copy.date = [self.date copy]; + copy.summary = [self.summary copy]; + copy.climacon = self.climacon; + copy.humidity = self.humidity; + copy.windDirection = self.windDirection; + copy.windSpeed = self.windSpeed; + copy.temperature = self.temperature; + return copy; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKit.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKit.h new file mode 100644 index 0000000..81cfd04 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKit.h @@ -0,0 +1,71 @@ +// +// CZWeatherKit.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - Framework + +// Project version number for CZWeatherKit. +FOUNDATION_EXPORT double CZWeatherKitVersionNumber; + +// Project version string for CZWeatherKit. +FOUNDATION_EXPORT const unsigned char CZWeatherKitVersionString[]; + +#import "CZClimacons.h" + +// Core +#import "CZWeatherAPI.h" +#import "CZWeatherData.h" +#import "CZWeatherService.h" +#import "CZWeatherRequest.h" +#import "CZWeatherLocation.h" +#import "CZWeatherHourlyCondition.h" +#import "CZWeatherCurrentCondition.h" +#import "CZWeatherForecastCondition.h" + +// Cache +#import "CZWeatherDataCache.h" +#import "CZPINWeatherDataCache.h" + +// APIs +#import "CZForecastioAPI.h" +#import "CZForecastioRequest.h" + +#import "CZWundergroundAPI.h" +#import "CZWundergroundRequest.h" + +#import "CZOpenWeatherMapAPI.h" +#import "CZOpenWeatherMapRequest.h" + +#import "CZWorldWeatherOnlineAPI.h" +#import "CZWorldWeatherOnlineRequest.h" + + + + diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKitInternal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKitInternal.h new file mode 100644 index 0000000..7dd6112 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKitInternal.h @@ -0,0 +1,120 @@ +// +// CZWeatherKit+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +// ----- +// @warning Not for external use. +// ----- + +#pragma mark - Imports + +#if !(TARGET_OS_TV) +#import +#endif + +#import "CZWeatherKit.h" +#import "NSDictionary+Internal.h" +#import "CZWeatherData+Internal.h" +#import "CZWeatherService+Internal.h" +#import "CZWeatherRequest+Internal.h" +#import "CZWeatherLocation+Internal.h" +#import "CZForecastioRequest+Internal.h" +#import "CZWundergroundRequest+Internal.h" +#import "CZOpenWeatherMapRequest+Internal.h" +#import "CZWeatherHourlyCondition+Internal.h" +#import "CZWeatherCurrentCondition+Internal.h" +#import "CZWeatherForecastCondition+Internal.h" + +#if TARGET_OS_IPHONE + +#define kABZipKey (__bridge NSString *)kABPersonAddressZIPKey +#define kABCityKey (__bridge NSString *)kABPersonAddressCityKey +#define kABStateKey (__bridge NSString *)kABPersonAddressStateKey +#define kABCountryKey (__bridge NSString *)kABPersonAddressCountryKey +#define kABCountryCodeKey (__bridge NSString *)kABPersonAddressCountryCodeKey + +#elif TARGET_OS_MAC + +#define kABZipKey kABAddressZIPKey +#define kABCityKey kABAddressCityKey +#define kABStateKey kABAddressStateKey +#define kABCountryKey kABAddressCountryKey +#define kABCountryCodeKey kABAddressCountryCodeKey + +#endif + + +#pragma mark - Functions + +static inline float cz_ftoc(float f) { + return (f - 32.0) * (5.0 / 9.0); +} + +static inline float cz_ctof(float c) { + return c * (9.0 / 5.0) + 32.0; +} + +static inline float cz_ktoc(float k) { + return k - 273.15; +} + +static inline float cz_ktof(float k) { + return cz_ctof(cz_ktoc(k)); +} + +static inline float cz_mtokph(float mph) { + return 1.60934 * mph; +} + +static inline float cz_mpstomph(float mps) { + return 2.236936 * mps; +} + +static inline float cz_mpstokph(float mps) { + return 3.6 * mps; +} + +static inline float cz_mbtoin(float mb) { + return 0.0295301 * mb; +} + +static inline float cz_intomb(float inch) { + return 33.8637526 * inch; +} + +// must end list with long min +static inline BOOL cz_match(long match, long against, ...) { + va_list args; + va_start(args, against); + long read = LONG_MIN; + while ((read = va_arg(args, long)) != LONG_MIN) { + if (read == match) { + va_end(args); + return YES; + } + } + va_end(args); + return NO; +} + diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKitTypes.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKitTypes.h new file mode 100644 index 0000000..e73646c --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherKitTypes.h @@ -0,0 +1,105 @@ +// +// CZWeatherKitTypes.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - Type Definitions + +/** + A structure that contains a temperature in both Fahrenheit and Celsius. + */ +typedef struct { + + /** + The Fahrenheit representation of the temperature. + */ + float f; + + /** + The Celsius representation of the temperature. + */ + float c; +} CZTemperature; + +/** + A structure that contains wind speed in both miles-per-hour and + kilometers-per-hour. + */ +typedef struct { + + /** + The wind speed in miles-per-hour. + */ + float mph; + + /** + The wind speed in kilometers-per-hour. + */ + float kph; + +} CZWindSpeed; + +/** + A structure that contains air pressure in both millibars and inches. + */ +typedef struct { + + /** + The pressure in millibars. + */ + float mb; + + /** + The pressure in inches. + */ + float inch; +} CZPressure; + +/** + Represents air humidity as a percent. + */ +typedef float CZHumidity; + +/** + Represents wind direction in degrees. + */ +typedef float CZWindDirection; + + +#pragma mark - Macros + +/** + Represents an unavailable value. Use this macro to differentiate between a + missing value and zero. + */ +#ifndef CZValueUnavailable +#define CZValueUnavailable FLT_MIN +#endif + + diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation+Internal.h new file mode 100644 index 0000000..cf58714 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation+Internal.h @@ -0,0 +1,65 @@ +// +// CZWeatherLocation+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherLocation.h" + + +#pragma mark - CZWeatherLocation Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWeatherLocation (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) CLLocationCoordinate2D coordinate; + +/** + @warning Not for external use. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSString *city; + +/** + @warning Not for external use. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSString *country; + +/** + @warning Not for external use. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSString *state; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation.h new file mode 100644 index 0000000..981477d --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation.h @@ -0,0 +1,122 @@ +// +// CZWeatherLocation.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; +@import CoreLocation; + + +#pragma mark - CZWeatherLocation Interface + +/** + A CZWeatherLocation object represents the location data required by a + CZWeatherDataRequest. This object incorporates the city, state, country, or + geographical coordinates for a location whose weather data you wish to request. + + This class is designed to be used as is and should not be subclassed. + */ +@interface CZWeatherLocation : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +// ----- +// @name Creating a Weather Location +// ----- + +#pragma mark Creating a Weather Location + +/** + Creates and returns a weather location initialized with the given CLLocation. + + @param location + A CLLocation. + @return A newly created CZWeatherLocation. + */ ++ (CZWeatherLocation *)locationFromLocation:(CLLocation *)location; + +/** + Creates and returns a weather location initialized with the given CLPlacemark. + + @param placemark + A CLPlacemark. + @return A newly created CZWeatherLocation. + */ ++ (CZWeatherLocation *)locationFromPlacemark:(CLPlacemark *)placemark; + +/** + Creates and returns a weather location initialized with the given coordinate. + + @param coordinate + A CLLocationCoordinate2D + @return A newly created CZWeatherLocation. + */ ++ (CZWeatherLocation *)locationFromCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + Creates and returns a weather location initialized with the given latitude + and longitude. + + @param latitude + The latitude to use. + @param longitude + The longitude to use. + @return A newly created CZWeatherLocation. + */ ++ (CZWeatherLocation *)locationFromLatitude:(CLLocationDegrees)latitude + longitude:(CLLocationDegrees)longitude; + +/** + Creates and returns a weather location initialized with the given U.S. city + and state. + + This method should only be used for creating a CZWeatherLocation that + represents a city in the United States. For other countries, use the + locationFromCity:country: selector instead. + + @param city + The city to use. + @param state + The state to use. + @return A newly created CZWeatherLocation. + */ ++ (CZWeatherLocation *)locationFromCity:(NSString *)city + state:(NSString *)state; + +/** + Creates and returns a weather location initialized with the given city + and country. + + @param city + The city to use. + @param country + The country to use. + @return A newly created CZWeatherLocation. + */ ++ (CZWeatherLocation *)locationFromCity:(NSString *)city + country:(NSString *)country; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation.m b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation.m new file mode 100644 index 0000000..2f0a1f5 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherLocation.m @@ -0,0 +1,215 @@ +// +// CZWeatherLocation.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherLocation.h" + + +#pragma mark - CZWeatherLocation Class Extension + +@interface CZWeatherLocation () + +@property (NS_NONATOMIC_IOSONLY) NSString *city; +@property (NS_NONATOMIC_IOSONLY) NSString *state; +@property (NS_NONATOMIC_IOSONLY) NSString *country; +@property (assign, NS_NONATOMIC_IOSONLY) CLLocationCoordinate2D coordinate; + +@end + + +#pragma mark - CZWeatherLocation Implementation + +@implementation CZWeatherLocation + +#pragma mark Creating a Weather Location + +- (instancetype)_init +{ + if (self = [super init]) { + // nothing to do + } + return self; +} + ++ (CZWeatherLocation *)locationFromLocation:(CLLocation *)location +{ + CZWeatherLocation *new = [[CZWeatherLocation alloc]_init]; + new.coordinate = location.coordinate; + return new; +} + ++ (CZWeatherLocation *)locationFromPlacemark:(CLPlacemark *)placemark +{ + CZWeatherLocation *new = [[CZWeatherLocation alloc]_init]; + new.coordinate = placemark.location.coordinate; + new.city = placemark.locality; + new.country = placemark.country; + return new; +} + ++ (CZWeatherLocation *)locationFromCoordinate:(CLLocationCoordinate2D)coordinate +{ + CZWeatherLocation *new = [[CZWeatherLocation alloc]_init]; + new.coordinate = coordinate; + return new; +} + ++ (CZWeatherLocation *)locationFromLatitude:(CLLocationDegrees)latitude + longitude:(CLLocationDegrees)longitude +{ + CZWeatherLocation *new = [[CZWeatherLocation alloc]_init]; + new.coordinate = CLLocationCoordinate2DMake(latitude, longitude); + return new; +} + ++ (CZWeatherLocation *)locationFromCity:(NSString *)city + state:(NSString *)state +{ + CZWeatherLocation *new = [[CZWeatherLocation alloc]_init]; + new.city = [city copy]; + new.state = [state copy]; + return new; + +} + ++ (CZWeatherLocation *)locationFromCity:(NSString *)city + country:(NSString *)country +{ + CZWeatherLocation *new = [[CZWeatherLocation alloc]_init]; + new.city = [city copy]; + new.country = [country copy]; + return new; + +} + +#pragma mark NSObject + +- (BOOL)isEqual:(id)object +{ + if ([object isKindOfClass:[CZWeatherLocation class]]) { + CZWeatherLocation *other = (CZWeatherLocation *)object; + + if (self.state && ![self.state isEqualToString:other.state]) { + return NO; + } + + if (self.country && ![self.country isEqualToString:other.country]) { + return NO; + } + + if (self.city && ![self.city isEqualToString:other.city]) { + return NO; + } + + if (self.coordinate.longitude != 0.0 && self.coordinate.latitude != 0.0) { + return (self.coordinate.latitude == other.coordinate.latitude && + self.coordinate.longitude == other.coordinate.longitude); + } + + return YES; + } + return NO; +} + +- (NSUInteger)hash +{ + NSUInteger hash = [self.state hash] ^ [self.country hash] ^ [self.city hash]; + + if (self.coordinate.latitude != 0.0){ + hash *= self.coordinate.latitude; + } + + if (self.coordinate.longitude != 0.0) { + hash *= self.coordinate.longitude; + } + + return hash; +} + +- (NSString *)description +{ + if (self.city && self.state) { + return [NSString stringWithFormat:@"%@, %@", + [self.city capitalizedString], [self.state capitalizedString]]; + } else if (self.city && self.country) { + return [NSString stringWithFormat:@"%@, %@", + [self.city capitalizedString], [self.country capitalizedString]]; + } else { + return [NSString stringWithFormat:@"%.4f, %.4f", + self.coordinate.latitude, self.coordinate.longitude]; + } +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super init]) { + self.city = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"city"]; + self.state = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"state"]; + self.country = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"country"]; + + CLLocationDegrees latitude = (CLLocationDegrees)[aDecoder decodeDoubleForKey:@"coordinate.latitude"]; + CLLocationDegrees longitude = (CLLocationDegrees)[aDecoder decodeDoubleForKey:@"coordinate.longitude"]; + _coordinate = (CLLocationCoordinate2D) { latitude, longitude }; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.city forKey:@"city"]; + [aCoder encodeObject:self.state forKey:@"state"]; + [aCoder encodeObject:self.country forKey:@"country"]; + + [aCoder encodeDouble:self.coordinate.latitude forKey:@"coordinate.latitude"]; + [aCoder encodeDouble:self.coordinate.longitude forKey:@"coordinate.longitude"]; +} + +#pragma mark NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZWeatherLocation *copy = [[CZWeatherLocation alloc]_init]; + copy.city = [self.city copy]; + copy.state = [self.state copy]; + copy.country = [self.country copy]; + copy.coordinate = self.coordinate; + return copy; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest+Internal.h new file mode 100644 index 0000000..031923d --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest+Internal.h @@ -0,0 +1,61 @@ +// +// CZWeatherDataRequest+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherRequest.h" + + +#pragma mark - CZWeatherDataRequest Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWeatherRequest (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +- (instancetype)_init; + +/** + @warning Not for external use. + */ +- (void)dispatchWithAPI:(id)API + completion:(CZWeatherRequestCompletion)completion; + +/** + @warning Not for external use. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) id API; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest.h new file mode 100644 index 0000000..3e954f0 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest.h @@ -0,0 +1,104 @@ +// +// CZWeatherDataRequest.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - Forward Declarations + +@protocol CZWeatherAPI; +@protocol CZWeatherFeature; + +@class CZWeatherData; +@class CZWeatherLocation; + + +#pragma mark - Type Definitions + +/** + The completion handler for a weather request. + + @param data + The weather data that was received, or nil. + @param error + The error, if one is available. + */ +typedef void (^CZWeatherRequestCompletion)(CZWeatherData *data, NSError *error); + + +#pragma mark - CZWeatherRequest Interface + +/** + CZWeatherRequest is an abstract class for data requests to a weather API. + + Requests can send themselves or can be dispatched by a weather service. Use a + weather service if you want to provide your own URL session configuration or a + cache to store weather data. If neither of these features is needed, simply + using sendWithAPI:completion: should be sufficient. + */ +@interface CZWeatherRequest : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +// ----- +// @name Using a Weather Request +// ----- + +#pragma mark Using a Weather Request + +/** + Sends the request. + + @param completion + The completion handler for the request. + @warning The completion handler is not guaranteed to be executed on any + specific queue. If you are updating any user interface elements in + the completion handler, you must explictly perform the updates on + the main queue. + */ +- (void)sendWithCompletion:(CZWeatherRequestCompletion)completion; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The API key to use when sending the request. This value is not required if + you are dispatching weather requests using a weather service that was + initialized using an API key or the weather API does not require an API key. + */ +@property (NS_NONATOMIC_IOSONLY) NSString *key; + +/** + Location for the requested data. + */ +@property (NS_NONATOMIC_IOSONLY) CZWeatherLocation *location; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest.m b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest.m new file mode 100644 index 0000000..fcc9fce --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherRequest.m @@ -0,0 +1,130 @@ +// +// CZWeatherDataRequest.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherRequest.h" +#import "CZWeatherLocation.h" +#import "CZWeatherKitInternal.h" +#import "CZWeatherAPI.h" + + +#pragma mark - CZWeatherDataRequest Class Extension + +@interface CZWeatherRequest () + +@property (NS_NONATOMIC_IOSONLY) NSURLSession *session; + +@end + + +#pragma mark - CZWeatherRequest Implementation + +@implementation CZWeatherRequest + +- (instancetype)_init +{ + if (self = [super init]) { + self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; + } + return self; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"Cannot use abstract class CZWeatherDataRequest." + userInfo:nil]; + +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"Cannot use abstract class CZWeatherDataRequest." + userInfo:nil]; +} + +#pragma mark NSSecureCoding + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +#pragma mark Using a Weather Data Request + +- (void)sendWithCompletion:(CZWeatherRequestCompletion)completion +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"Cannot use abstract class CZWeatherDataRequest." + userInfo:nil]; +} + +- (void)dispatchWithAPI:(id)API + completion:(CZWeatherRequestCompletion)completion +{ + if (!completion) { + return; + } else if (!API) { + completion(nil, nil); + return; + } + + CZWeatherRequest *copy = [self copy]; + NSURLRequest *request = [API transformRequest:copy]; + if (!request) { + completion(nil, nil); + return; + } + + [[self.session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { + CZWeatherData *result = [API transformResponse:response data:data error:error forRequest:copy]; + completion(result, error); + }]resume]; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"Cannot use abstract class CZWeatherDataRequest." + userInfo:nil]; +} + +#pragma mark Internal + +- (Class)API +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"Cannot use abstract class CZWeatherDataRequest." + userInfo:nil]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService+Internal.h new file mode 100644 index 0000000..9fd3687 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService+Internal.h @@ -0,0 +1,60 @@ +// +// CZWeatherService+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherService.h" + + +#pragma mark - CZWeatherService Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWeatherService (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +- (CZWeatherData *)handleRequest:(CZWeatherRequest *)request; + +/** + @warning Not for external use. + */ +- (CZWeatherData *)cachedWeatherDataForRequest:(CZWeatherRequest *)request; + +/** + @warning Not for external use. + */ +- (CZWeatherData *)remoteWeatherDataForRequest:(CZWeatherRequest *)request; + +@end \ No newline at end of file diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService.h b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService.h new file mode 100644 index 0000000..2d174a6 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService.h @@ -0,0 +1,240 @@ +// +// CZWeatherService.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - Forward Declarations + +@protocol CZWeatherDataCache; + +@class CZWeatherData; +@class CZWeatherRequest; +@class CZWeatherService; + + +#pragma mark - Type Definitions + +/** + Completion handler for dispatched requests. + + @param data + The weather data for the request. May be nil if the request was + invalid or the weather service was unable to fulfill the request. + @param error + An error if one occurred, or nil. Currently unused. + */ +typedef void (^CZWeatherServiceCompletion)(CZWeatherData *data, NSError *error); + +/** + Completion handler for dispatched batch of requests. + + @param data + An array of CZWeatherData and/or NSNull objects whose indices + in the array match the indices of their corresponding requests. The + array is never nil. + @param error + An error if one occurred, or nil. Currently unused. + */ +typedef void (^CZWeatherServiceBatchCompletion)(NSArray *data, NSError *error); + + +#pragma mark - CZWeatherService Interface + +/** + A weather service allows for the dispatching of weather data requests and + allows for finer-grain control over how requests are handled as opposed to the + interface provided by CZWeatherDataRequest. + + Use a weather service if you want to provide your own URL session + configuration or a cache to store weather data. If neither of these features + is needed, simply using CZWeatherDataRequest's sendWithAPI:completion: + should be sufficient. + */ +@interface CZWeatherService : NSObject + +// ----- +// @name Creating a Weather Service +// ----- + +#pragma mark Creating a Weather Service + +/** + Initializes a weather service. + + The default NSURLSessionConfiguration will be used. + + @return A newly initialized weather service. + */ +- (instancetype)init; + +/** + Initializes a weather service using the given configuration. + + @param configuration + The URL session configuration to use. + @return A newly initialized weather service. + */ +- (instancetype)initWithConfiguration:(NSURLSessionConfiguration *)configuration; + +/** + Initializes a weather service using the given configuration and key. + + @param configuration + The URL session configuration to use. + @param key + The API key to use. + @return A newly initialized weather service. + */ +- (instancetype)initWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key; + +/** + Initializes a weather service using the given configuration, key, and cache. + + @param configuration + The URL session configuration to use. + @param key + The API key to use. + @param cache + The weather data cache to use. + @return A newly initialized weather service. + */ +- (instancetype)initWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key + cache:(id)cache + NS_DESIGNATED_INITIALIZER; + +/** + Creates and initializes a new weather service. + + The default NSURLSessionConfiguration will be used. + + @return A newly created weather service. + */ ++ (instancetype)service; + +/** + Creates and initializes a weather service using the given configuration. + + @param configuration + The URL session configuration to use. + @return A newly created weather service. + */ ++ (instancetype)serviceWithConfiguration:(NSURLSessionConfiguration *)configuration; + +/** + Creates and initializes a weather service using the given configuration and key. + + @param configuration + The URL session configuration to use. + @param key + The API key to use. + @return A newly created weather service. + */ ++ (instancetype)serviceWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key; + +/** + Creates and initializes a weather service using the given configuration, key, and cache. + + @param configuration + The URL session configuration to use. + @param key + The API key to use. + @param cache + The weather data cache to use. + @return A newly created weather service. + */ ++ (instancetype)serviceWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key + cache:(id)cache; + +// ----- +// @name Using a Weather Service +// ----- + +#pragma mark Using a Weather Service + +/** + Asynchronously dispatches the given request. + + @param request + The request to dispatch. + @param completion + The completion handler for the request. + @warning The completion handler is not guaranteed to be executed on any + specific queue. If you are updating any user interface elements in + the completion handler, you must explictly perform the updates on + the main queue. + */ +- (void)dispatchRequest:(CZWeatherRequest *)request + completion:(CZWeatherServiceCompletion)completion; + +/** + Asynchronously dispatches the given requests. + + The completion handler is executed when all of the given requests complete. Use + this method if your app requires multiple requests to retrieve data. For + example, one use case would be if you require both current weather data and + forecasted weather data before updating your user interface. + + @param requests + The requests to dispatch. + @param completion + The completion handler for the requests. + @warning The completion handler is not guaranteed to be executed on any + specific queue. If you are updating any user interface elements in + the completion handler, you must explictly perform the updates on + the main queue. + */ +- (void)dispatchRequests:(NSArray *)requests + completion:(CZWeatherServiceBatchCompletion)completion; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The default API key to use for requests. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSString *key; + +/** + The cache used by the weather service. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) id cache; + +/** + The URL session configuration used by the weather service. + */ +@property (readonly, NS_NONATOMIC_IOSONLY) NSURLSessionConfiguration *configuration; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService.m b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService.m new file mode 100644 index 0000000..4ab4fd5 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWeatherService.m @@ -0,0 +1,245 @@ +// +// CZWeatherService.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherService.h" + +#import "CZWeatherAPI.h" +#import "CZWeatherRequest.h" +#import "CZWeatherDataCache.h" +#import "CZWeatherKitInternal.h" + + +#pragma mark - CZWeatherService Class Extension + +@interface CZWeatherService () + +@property (NS_NONATOMIC_IOSONLY) NSString *key; +@property (NS_NONATOMIC_IOSONLY) NSURLSession *session; +@property (NS_NONATOMIC_IOSONLY) dispatch_queue_t queue; +@property (NS_NONATOMIC_IOSONLY) id cache; +@property (NS_NONATOMIC_IOSONLY) NSURLSessionConfiguration *configuration; + +@end + + +#pragma mark - CZWeatherService Implementation + +@implementation CZWeatherService + +#pragma mark Creating a Weather Service + +- (instancetype)init +{ + return [self initWithConfiguration:nil]; +} + +- (instancetype)initWithConfiguration:(NSURLSessionConfiguration *)configuration +{ + return [self initWithConfiguration:configuration + key:nil]; +} + +- (instancetype)initWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key +{ + return [self initWithConfiguration:configuration + key:key + cache:nil]; +} + +- (instancetype)initWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key + cache:(id)cache +{ + if (self = [super init]) { + self.key = key; + self.cache = cache; + self.configuration = configuration ? configuration : [NSURLSessionConfiguration defaultSessionConfiguration]; + self.session = [NSURLSession sessionWithConfiguration:self.configuration]; + NSString *queue = [NSString stringWithFormat:@"com.czweatherkit.CZWeatherService.%p", self]; + self.queue = dispatch_queue_create([queue UTF8String], DISPATCH_QUEUE_CONCURRENT); + } + return self; +} + ++ (instancetype)service +{ + return [self new]; +} + ++ (instancetype)serviceWithConfiguration:(NSURLSessionConfiguration *)configuration +{ + return [[self alloc]initWithConfiguration:configuration]; +} + ++ (instancetype)serviceWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key +{ + return [[self alloc]initWithConfiguration:configuration + key:key]; +} + ++ (instancetype)serviceWithConfiguration:(NSURLSessionConfiguration *)configuration + key:(NSString *)key + cache:(id)cache +{ + return [[self alloc]initWithConfiguration:configuration + key:key + cache:cache]; +} + +#pragma mark Using a Weather Service + +- (void)dispatchRequest:(CZWeatherRequest *)request + completion:(CZWeatherServiceCompletion)completion +{ + if (!completion) { + return; + } else if(!request) { + completion(nil, nil); // invalid request + return; + } + + // copy the request in case the user mutates the original request + request = [request copy]; + + __weak CZWeatherService *weak = self; + dispatch_async(self.queue, ^{ + CZWeatherService *strong = weak; + if (strong) { + CZWeatherData *data = [strong handleRequest:request]; + completion(data, nil); + } else { + completion(nil, nil); + } + }); +} + +- (void)dispatchRequests:(NSArray *)requests + completion:(CZWeatherServiceBatchCompletion)completion +{ + NSMutableArray *data = [NSMutableArray new]; + + if (!completion) { + return; + } else if (!requests) { + completion(data, nil); + return; + } + + NSMutableArray *copies = [NSMutableArray new]; + for (NSObject *object in requests) { + if ([object isKindOfClass:[CZWeatherRequest class]]) { + [copies addObject:[object copy]]; + } + } + + __weak CZWeatherService *weak = self; + dispatch_group_t group = dispatch_group_create(); + dispatch_async(self.queue, ^{ + for (CZWeatherRequest *request in copies) { + dispatch_group_enter(group); + dispatch_async(self.queue, ^{ + CZWeatherService *strong = weak; + if (strong) { + CZWeatherData *weatherData = [strong handleRequest:request]; + if (weatherData) { + [data addObject:weatherData]; + } else { + [data addObject:[NSNull null]]; + } + } else { + [data addObject:[NSNull null]]; + } + dispatch_group_leave(group); + }); + } + dispatch_group_wait(group, DISPATCH_TIME_FOREVER); + completion(data, nil); + }); +} + +- (CZWeatherData *)handleRequest:(CZWeatherRequest *)request +{ + if (!request.key) { + request.key = self.key; + } + + CZWeatherData *result = [self cachedWeatherDataForRequest:request]; + if (result) { + return result; + } + + result = [self remoteWeatherDataForRequest:request]; + if (result) { + [self.cache storeData:result + forRequest:request]; + } + + return result; +} + +- (CZWeatherData *)cachedWeatherDataForRequest:(CZWeatherRequest *)request +{ + if (self.cache) { + __block CZWeatherData *cached = nil; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [self.cache dataForRequest:request completion:^(CZWeatherData *data) { + cached = data; + dispatch_semaphore_signal(semaphore); + }]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + return cached; + } + return nil; +} + +- (CZWeatherData *)remoteWeatherDataForRequest:(CZWeatherRequest *)request +{ + NSURLRequest *URLRequest = [request.API transformRequest:request]; + if (!URLRequest) { + return nil; + } + + __block CZWeatherData *result = nil; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [[self.session dataTaskWithRequest:URLRequest + completionHandler:^(NSData *data, + NSURLResponse *response, + NSError *error) { + result = [request.API transformResponse:response + data:data + error:error + forRequest:request]; + dispatch_semaphore_signal(semaphore); + }]resume]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + return result; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineAPI.h b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineAPI.h new file mode 100644 index 0000000..266ab66 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineAPI.h @@ -0,0 +1,40 @@ +// +// CZWorldWeatherOnlineAPI.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + +#import "CZWeatherAPI.h" + + +#pragma mark - CZWorldWeatherOnlineAPI Interface + +/** + */ +@interface CZWorldWeatherOnlineAPI : NSObject + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineAPI.m b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineAPI.m new file mode 100644 index 0000000..6ed68fe --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineAPI.m @@ -0,0 +1,61 @@ +// +// CZWorldWeatherOnlineAPI.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWorldWeatherOnlineAPI.h" + + +#pragma mark - CZWorldWeatherOnlineAPI Class Extension + +@interface CZWorldWeatherOnlineAPI () + +@end + + +#pragma mark - CZWorldWeatherOnlineAPI Implementation + +@implementation CZWorldWeatherOnlineAPI + ++ (NSString *)cacheKeyForRequest:(CZWeatherRequest *)request +{ + return nil; +} + ++ (NSURLRequest *)transformRequest:(CZWeatherRequest *)request +{ + return nil; +} + ++ (CZWeatherData *)transformResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *)error + forRequest:(CZWeatherRequest *)request +{ + return nil; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineRequest.h b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineRequest.h new file mode 100644 index 0000000..7d3feda --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineRequest.h @@ -0,0 +1,38 @@ +// +// CZWorldWeatherOnlineRequest.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherRequest.h" + + +#pragma mark - CZWorldWeatherOnlineRequest Interface + +/** + */ +@interface CZWorldWeatherOnlineRequest : CZWeatherRequest + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineRequest.m b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineRequest.m new file mode 100644 index 0000000..af7269e --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWorldWeatherOnlineRequest.m @@ -0,0 +1,56 @@ +// +// CZWorldWeatherOnlineRequest.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWorldWeatherOnlineRequest.h" +#import "CZWeatherRequest+Internal.h" +#import "CZWorldWeatherOnlineAPI.h" + + +#pragma mark - CZWorldWeatherOnlineRequest Class Extension + +@interface CZWorldWeatherOnlineRequest () + +@end + + +#pragma mark - CZWorldWeatherOnlineRequest Implementation + +@implementation CZWorldWeatherOnlineRequest + +- (void)sendWithCompletion:(CZWeatherRequestCompletion)completion +{ + [self dispatchWithAPI:self.API + completion:completion]; +} + +- (Class)API +{ + return [CZWorldWeatherOnlineAPI class]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundAPI.h b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundAPI.h new file mode 100644 index 0000000..b6b1afc --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundAPI.h @@ -0,0 +1,50 @@ +// +// CZWundergroundAPI.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#if TARGET_OS_IOS || TARGET_OS_OSX +@import MapKit; +@import AddressBook; +#endif + +@import CoreLocation; + +#import "CZWeatherAPI.h" + + +#pragma mark - CZWundergroundAPI Interface + +/** + CZWundergroundAPI conforms to the CZWeatherAPI protocol and implements + functionality for supporting the Wunderground API. + + For more information, see + http://www.wunderground.com/weather/api/d/docs + */ +@interface CZWundergroundAPI : NSObject + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundAPI.m b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundAPI.m new file mode 100644 index 0000000..fa82230 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundAPI.m @@ -0,0 +1,325 @@ +// +// CZWundergroundAPI.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWundergroundAPI.h" +#import "CZWeatherKitInternal.h" + + +#pragma mark - CZWundergroundAPI Implementation + +@implementation CZWundergroundAPI + ++ (NSString *)cacheKeyForRequest:(CZWeatherRequest *)request +{ + return [CZWundergroundAPI transformRequest:request].URL.absoluteString; +} + ++ (NSURLRequest *)transformRequest:(CZWeatherRequest *)request +{ + if ([request isKindOfClass:[CZWundergroundRequest class]]) { + CZWundergroundRequest *wundergroundRequest = (CZWundergroundRequest *)request; + NSString *language = wundergroundRequest.language ? wundergroundRequest.language : @"EN"; + NSString *location = [CZWundergroundAPI componentForLocation:request.location]; + + NSURLComponents *components = [NSURLComponents new]; + components.scheme = @"http"; + components.host = @"api.wunderground.com"; + components.path = [NSString stringWithFormat:@"/api/%@/geolookup/%@/lang:%@/q/%@.json", + request.key, wundergroundRequest.feature, language, location]; + + return [NSURLRequest requestWithURL:components.URL]; + } + return nil; +} + ++ (CZWeatherData *)transformResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *)error + forRequest:(CZWeatherRequest *)request +{ + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; + if (httpResponse.statusCode != 200) { + return nil; + } + } + + if (data) { + NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingAllowFragments + error:nil]; + if (JSON) { + NSDictionary *resp = [JSON objectForKey:@"response" + class:[NSDictionary class]]; + if (resp[@"error"]) { + return nil; + } + + CZWeatherData *weatherData = [[CZWeatherData alloc]_init]; + + NSDictionary *features = [resp objectForKey:@"features" + class:[NSDictionary class]]; + +#if TARGET_OS_IOS || TARGET_OS_OSX + if (features[@"geolookup"]) { + NSDictionary *location = [JSON objectForKey:@"location" class:[NSDictionary class]]; + weatherData.placemark = [CZWundergroundAPI placemarkForLocation:location]; + } +#endif + + if (features[@"conditions"]) { + NSDictionary *currentObservation = [JSON objectForKey:@"current_observation" class:[NSDictionary class]]; + weatherData.current = [CZWundergroundAPI conditionForCurrentObservation:currentObservation]; + } + + if (features[@"forecast"] || features[@"forecast10day"]) { + NSDictionary *forecast = [JSON objectForKey:@"forecast" class:[NSDictionary class]]; + weatherData.dailyForecasts = [CZWundergroundAPI conditionsForForecast:forecast]; + } + + if (features[@"hourly"] || features[@"hourly10day"]) { + NSArray *hourlyForecast = [JSON objectForKey:@"hourly_forecast" class:[NSArray class]]; + weatherData.hourlyForecasts = [CZWundergroundAPI conditionsForHourlyForecast:hourlyForecast]; + } + + if (features[@"history"]) { + NSDictionary *history = [JSON objectForKey:@"history" class:[NSDictionary class]]; + weatherData.hourlyForecasts = [CZWundergroundAPI conditionsForHistory:history]; + } + + return weatherData; + } + } + + return nil; +} + ++ (Climacon)climaconForIconName:(NSString *)iconName +{ + if ([@[@"chanceflurries", @"flurries"] containsObject:iconName]) { + return ClimaconFlurries; + } + + if ([@[@"chancerain", @"rain"] containsObject:iconName]) { + return ClimaconRain; + } + + if ([@[@"chancesleet", @"sleet"] containsObject:iconName]) { + return ClimaconSleet; + } + + if ([@[@"chancesnow", @"snow"] containsObject:iconName]) { + return ClimaconSnow; + } + + if ([@[@"chancetstorms", @"tstorms"] containsObject:iconName]) { + return ClimaconLightning; + } + + if ([@[@"clear", @"sunny"] containsObject:iconName]) { + return ClimaconSun; + } + + if ([@[@"cloudy"] containsObject:iconName]) { + return ClimaconCloud; + } + + if ([@[@"fog"] containsObject:iconName]) { + return ClimaconFog; + } + + if ([@[@"hazy"] containsObject:iconName]) { + return ClimaconHaze; + } + + if ([@[@"mostlycloudy"] containsObject:iconName]) { + return ClimaconCloud; + } + + if ([@[@"partlycloudy", @"partlysunny"] containsObject:iconName]) { + return ClimaconCloudSun; + } + + return ClimaconUnknown; +} + +static NSDateFormatter *historyDateFormatter = nil; ++ (NSArray *)conditionsForHistory:(NSDictionary *)history +{ + NSMutableArray *conditions = [NSMutableArray new]; + NSDictionary *observations = history[@"observations"]; + if (!historyDateFormatter) { + historyDateFormatter = [NSDateFormatter new]; + historyDateFormatter.dateFormat = @"h:mm a z 'on' MMMM dd, yyyy"; + historyDateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; + } + + for (NSDictionary *hour in observations) { + CZWeatherHourlyCondition *condition = [[CZWeatherHourlyCondition alloc]_init]; + NSDictionary *date = [hour objectForKey:@"date" class:[NSDictionary class]]; + + condition.summary = hour[@"conds"]; + condition.climacon = [CZWundergroundAPI climaconForIconName:hour[@"icon"]]; + condition.date = date[@"pretty"] ? [historyDateFormatter dateFromString:date[@"pretty"]] : nil; + condition.temperature = (CZTemperature) { + .f = [CZWundergroundAPI value:hour name:@"tempi"], + .c = [CZWundergroundAPI value:hour name:@"tempm"] + }; + condition.humidity = [CZWundergroundAPI value:hour name:@"hum"]; + condition.windDirection = [CZWundergroundAPI value:hour name:@"wdird"]; + condition.windSpeed = (CZWindSpeed) { + .mph = [CZWundergroundAPI value:hour name:@"wspdi"], + .kph = [CZWundergroundAPI value:hour name:@"wspdm"] + }; + + [conditions addObject:condition]; + } + + return conditions; +} + ++ (NSArray *)conditionsForHourlyForecast:(NSArray *)hourlyForecast +{ + NSMutableArray *conditions = [NSMutableArray new]; + for (NSDictionary *hour in hourlyForecast) { + CZWeatherHourlyCondition *condition = [[CZWeatherHourlyCondition alloc]_init]; + NSDictionary *fcttime = [hour objectForKey:@"FCTTIME" class:[NSDictionary class]]; + + condition.climacon = [CZWundergroundAPI climaconForIconName:hour[@"icon"]]; + condition.summary = hour[@"condition"]; + condition.date = fcttime[@"epoch"] ? [NSDate dateWithTimeIntervalSince1970:[fcttime[@"epoch"]floatValue]] : nil; + condition.temperature = (CZTemperature){ + .f = hour[@"temp"] ? [hour[@"temp"][@"english"]floatValue] : CZValueUnavailable, + .c = hour[@"temp"] ? [hour[@"temp"][@"metric"]floatValue] : CZValueUnavailable + }; + condition.windDirection = hour[@"wdir"] ? [hour[@"wdir"][@"degrees"]floatValue] : CZValueUnavailable; + condition.humidity = [CZWundergroundAPI value:hour name:@"humidity"]; + condition.windSpeed = (CZWindSpeed){ + .mph = hour[@"wspd"] ? [hour[@"wspd"][@"english"]floatValue] : CZValueUnavailable, + .kph = hour[@"wspd"] ? [hour[@"wspd"][@"metric"]floatValue] : CZValueUnavailable + }; + + [conditions addObject:condition]; + } + return conditions; +} + ++ (NSArray *)conditionsForForecast:(NSDictionary *)forecast +{ + NSMutableArray *conditions = [NSMutableArray new]; + NSDictionary *simpleForecast = [forecast objectForKey:@"simpleforecast" class:[NSDictionary class]]; + NSArray *forecastDay = [simpleForecast objectForKey:@"forecastday" class:[NSArray class]]; + for (NSDictionary *day in forecastDay) { + CZWeatherForecastCondition *condition = [[CZWeatherForecastCondition alloc]_init]; + + NSDictionary *date = [day objectForKey:@"date" class:[NSDictionary class]]; + + condition.climacon = [CZWundergroundAPI climaconForIconName:day[@"icon"]]; + condition.summary = day[@"conditions"]; + condition.date = date[@"epoch"] ? [NSDate dateWithTimeIntervalSince1970:[date[@"epoch"]floatValue]] : nil; + condition.lowTemperature = (CZTemperature){ + .f = day[@"low"] ? [day[@"low"][@"fahrenheit"]floatValue] : CZValueUnavailable, + .c = day[@"low"] ? [day[@"low"][@"celsius"]floatValue] : CZValueUnavailable + }; + condition.highTemperature = (CZTemperature){ + .f = day[@"high"] ? [day[@"high"][@"fahrenheit"]floatValue] : CZValueUnavailable, + .c = day[@"high"] ? [day[@"high"][@"celsius"]floatValue] : CZValueUnavailable + }; + condition.humidity = [CZWundergroundAPI value:day name:@"avehumidity"]; + + [conditions addObject:condition]; + } + return conditions; +} + ++ (CZWeatherCurrentCondition *)conditionForCurrentObservation:(NSDictionary *)currentObservation +{ + CZWeatherCurrentCondition *condition = [[CZWeatherCurrentCondition alloc]_init]; + + condition.climacon = [CZWundergroundAPI climaconForIconName:currentObservation[@"icon"]]; + condition.summary = currentObservation[@"weather"]; + condition.temperature = (CZTemperature){ + .f = [CZWundergroundAPI value:currentObservation name:@"temp_f"], + .c = [CZWundergroundAPI value:currentObservation name:@"temp_c"] + }; + condition.windSpeed = (CZWindSpeed){ + .mph = [CZWundergroundAPI value:currentObservation name:@"wind_mph"], + .kph = [CZWundergroundAPI value:currentObservation name:@"wind_kph"] + }; + condition.pressure = (CZPressure){ + .mb = [CZWundergroundAPI value:currentObservation name:@"pressure_mb"], + .inch = [CZWundergroundAPI value:currentObservation name:@"pressure_in"] + }; + condition.windDirection = [CZWundergroundAPI value:currentObservation name:@"wind_degrees"]; + condition.humidity = currentObservation[@"relative_humidity"] ? + [[currentObservation[@"relative_humidity"] stringByReplacingOccurrencesOfString:@"%" withString:@""]floatValue] : CZValueUnavailable; + + condition.date = currentObservation[@"observation_epoch"] ? + [NSDate dateWithTimeIntervalSince1970:[currentObservation[@"observation_epoch"]floatValue]] : nil; + + return condition; +} + ++ (float)value:(NSDictionary *)dictionary name:(NSString *)name +{ + return dictionary[name] ? [dictionary[name]floatValue] : CZValueUnavailable; +} + +#if TARGET_OS_IOS || TARGET_OS_OSX ++ (CLPlacemark *)placemarkForLocation:(NSDictionary *)location +{ + if (location) { + NSDictionary *addressDictionary = @{ kABZipKey : location[@"zip"], + kABCityKey : location[@"city"], + kABStateKey : location[@"state"], + kABCountryKey : location[@"country"], + kABCountryCodeKey : location[@"country_iso3166"]}; + CLLocationDegrees latitude = [location[@"lat"]floatValue]; + CLLocationDegrees longitude = [location[@"lon"]floatValue]; + return [[MKPlacemark alloc]initWithCoordinate:CLLocationCoordinate2DMake(latitude, longitude) + addressDictionary:addressDictionary]; + } + return nil; +} +#endif + ++ (NSString *)componentForLocation:(CZWeatherLocation *)location +{ + NSString *city = [location.city stringByReplacingOccurrencesOfString:@" " + withString:@"_"]; + if (location.state) { + return [NSString stringWithFormat:@"%@/%@", location.state, city]; + } else if (location.country) { + return [NSString stringWithFormat:@"%@/%@", location.country, city]; + } + + return [NSString stringWithFormat:@"%.4f,%.4f", location.coordinate.latitude, + location.coordinate.longitude]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest+Internal.h new file mode 100644 index 0000000..afa22b4 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest+Internal.h @@ -0,0 +1,50 @@ +// +// CZWundergroundRequest+Internal.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWundergroundRequest.h" + + +#pragma mark - CZWeatherDataRequest Internal Category Interface + +/** + @warning Not for external use. + */ +@interface CZWundergroundRequest (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +@property (NS_NONATOMIC_IOSONLY) NSString *feature; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest.h b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest.h new file mode 100644 index 0000000..b137046 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest.h @@ -0,0 +1,128 @@ +// +// CZWundergroundRequest.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWeatherRequest.h" + + +#pragma mark - CZWundergroundRequest Interface + +/** + CZWundergroundRequest is a subclass of CZWeatherRequest used to make requests + to the Wunderground API. + + http://www.wunderground.com/weather/api/d/docs + */ +@interface CZWundergroundRequest : CZWeatherRequest + +// ----- +// @name Creating a Wunderground Request +// ----- + +#pragma mark Creating a Wunderground Request + +/** + Creates and initializes a new request for the current weather conditions. + + For more information, see + http://www.wunderground.com/weather/api/d/docs?d=data/conditions + + @returns Newly created request. + */ ++ (instancetype)newConditionsRequest; + +/** + Creates and initializes a new request for the forecasted weather conditions for + the next 3 days. + + For more information, see + http://www.wunderground.com/weather/api/d/docs?d=data/forecast + + @returns Newly created request. + */ ++ (instancetype)newForecastRequest; + +/** + Creates and initializes a new request for the forecasted weather conditions for + the next 10 days. + + For more information, see + http://www.wunderground.com/weather/api/d/docs?d=data/forecast10day + + @returns Newly created request. + */ ++ (instancetype)newForecast10DayRequest; + +/** + Creates and initializes a new request for the forecasted weather conditions for + the next 36 hours. + + For more information, see + http://www.wunderground.com/weather/api/d/docs?d=data/hourly + + @returns Newly created request. + */ ++ (instancetype)newHourlyRequest; + +/** + Creates and initializes a new request for the forecasted weather conditions for + the next 10 days, by hour. + + For more information, see + http://www.wunderground.com/weather/api/d/docs?d=data/hourly10day + + @returns Newly created request. + */ ++ (instancetype)newHourly10DayRequest; + +/** + Creates and initializes a new request for historical data. + + For more information, see + http://www.wunderground.com/weather/api/d/docs?d=data/history + + @param data + The date in the past to get historical data for. + @returns Newly created request. + */ ++ (instancetype)newHistoryRequestForDate:(NSDate *)date; + +// ----- +// @name Properties +// ----- + +#pragma mark Properties + +/** + The language of the requested data. + + For more information regarding supported languages, see + http://www.wunderground.com/weather/api/d/docs?d=language-support + */ +@property (NS_NONATOMIC_IOSONLY) NSString *language; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest.m b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest.m new file mode 100644 index 0000000..e0f1bd3 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/CZWundergroundRequest.m @@ -0,0 +1,140 @@ +// +// CZWundergroundRequest.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "CZWundergroundRequest.h" +#import "CZWeatherKitInternal.h" +#import "CZWundergroundAPI.h" + + +#pragma mark - CZWundergroundRequest Class Extension + +@interface CZWundergroundRequest () + +@property (NS_NONATOMIC_IOSONLY) NSString *feature; + +@end + + +static NSDateFormatter *dateFormatter; + +#pragma mark - CZWundergroundRequest Implementation + +@implementation CZWundergroundRequest + ++ (instancetype)newConditionsRequest +{ + return [[CZWundergroundRequest alloc]initWithFeature:@"conditions"]; +} + ++ (instancetype)newForecastRequest +{ + return [[CZWundergroundRequest alloc]initWithFeature:@"forecast"]; +} + ++ (instancetype)newForecast10DayRequest +{ + return [[CZWundergroundRequest alloc]initWithFeature:@"forecast10day"]; +} + ++ (instancetype)newHourlyRequest +{ + return [[CZWundergroundRequest alloc]initWithFeature:@"hourly"]; +} + ++ (instancetype)newHourly10DayRequest +{ + return [[CZWundergroundRequest alloc]initWithFeature:@"hourly10day"]; +} + ++ (instancetype)newHistoryRequestForDate:(NSDate *)date +{ + if (!dateFormatter) { + dateFormatter = [NSDateFormatter new]; + dateFormatter.dateFormat = @"yyyyMMdd"; + dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; + } + + NSString *feature = [NSString stringWithFormat:@"history_%@", + [dateFormatter stringFromDate:date]]; + return [[CZWundergroundRequest alloc]initWithFeature:feature]; +} + +- (instancetype)initWithFeature:(NSString *)feature +{ + if (self = [super _init]) { + self.feature = feature; + } + return self; +} + +- (void)sendWithCompletion:(CZWeatherRequestCompletion)completion +{ + [self dispatchWithAPI:self.API + completion:completion]; +} + +- (Class)API +{ + return [CZWundergroundAPI class]; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone +{ + CZWundergroundRequest *copy = [[CZWundergroundRequest alloc]_init]; + copy.feature = [self.feature copy]; + copy.language = [self.language copy]; + copy.location = [self.location copy]; + copy.key = [self.key copy]; + return copy; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super _init]) { + self.location = [aDecoder decodeObjectOfClass:[CZWeatherLocation class] + forKey:@"location"]; + self.language = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"language"]; + self.feature = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"feature"]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.location forKey:@"location"]; + [aCoder encodeObject:self.language forKey:@"language"]; + [aCoder encodeObject:self.feature forKey:@"feature"]; +} + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/NSDictionary+Internal.h b/Pods/CZWeatherKit/CZWeatherKit/NSDictionary+Internal.h new file mode 100644 index 0000000..dfbe545 --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/NSDictionary+Internal.h @@ -0,0 +1,51 @@ +// +// NSDictionary+JSON.h +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +@import Foundation; + + +#pragma mark - NSDictionary Internal Category Interface + +/** + @warning Not for external use. + */ +@interface NSDictionary (Internal) + +// ----- +// @name Internal +// ----- + +#pragma mark Internal + +/** + @warning Not for external use. + */ +- (id)objectForKey:(id)aKey + class:(Class)clazz; + +@end diff --git a/Pods/CZWeatherKit/CZWeatherKit/NSDictionary+Internal.m b/Pods/CZWeatherKit/CZWeatherKit/NSDictionary+Internal.m new file mode 100644 index 0000000..063f20d --- /dev/null +++ b/Pods/CZWeatherKit/CZWeatherKit/NSDictionary+Internal.m @@ -0,0 +1,45 @@ +// +// NSDictionary+JSON.m +// CZWeatherKit +// +// Copyright (c) 2015 Comyar Zaheri. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + + +#pragma mark - Imports + +#import "NSDictionary+Internal.h" + + +#pragma mark - NSDictionary Internal Category Implementation + +@implementation NSDictionary (Internal) + +- (id)objectForKey:(id)aKey class:(Class)clazz +{ + id object = [self objectForKey:aKey]; + if ([object isKindOfClass:clazz]) { + return object; + } + return nil; +} + +@end diff --git a/Pods/CZWeatherKit/LICENSE b/Pods/CZWeatherKit/LICENSE new file mode 100644 index 0000000..413b6a0 --- /dev/null +++ b/Pods/CZWeatherKit/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2015, Comyar Zaheri +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Pods/CZWeatherKit/README.md b/Pods/CZWeatherKit/README.md new file mode 100644 index 0000000..351a112 --- /dev/null +++ b/Pods/CZWeatherKit/README.md @@ -0,0 +1,183 @@ +![](header.png) + +[![Build Status](https://travis-ci.org/comyarzaheri/CZWeatherKit.svg?branch=master)](https://travis-ci.org/comyarzaheri/CZWeatherKit) +[![Version](http://img.shields.io/cocoapods/v/CZWeatherKit.svg)](http://cocoapods.org/?q=CZWeatherKit) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/comyarzaheri/CZWeatherKit) +[![Platform](http://img.shields.io/cocoapods/p/CZWeatherKit.svg)]() +![License](http://img.shields.io/badge/license-MIT-33e0ff.svg) + +CZWeatherKit is a simple, extensible weather library for iOS, tvOS, and OS X that allows for easy fetching of weather data from various weather services. + +#### What's New in v2.2.5 + +###### Features + +* tvOS Support*. +* Caching Support. +* Support for historical and hourly data. +* Request batching when using a weather service. +* Improved request management when sending frequent requests. +* Addition of more data, including humidity, wind speed, and more. + +**\*Note:** Features requiring MapKit are unsupported with tvOS. + +# Getting Started + +### CocoaPods + +Add the following to your Podfile: + +```ruby + pod "CZWeatherKit" +``` + +# Usage + +Included in this project is a Swift playground, `CZWeatherKit.playground`, that will let you play around with `CZOpenWeatherMapRequest`. However if you're as lazy as I am, here are some code snippets to get you started: + +### Wunderground + +###### Getting Current Conditions, Obj-C + +```objc +#import + +CZWundergroundRequest *request = [CZWundergroundRequest newConditionsRequest]; +request.location = [CZWeatherLocation locationFromCity:@"Seattle" state:@"WA"]; +request.key = @"wundergroundApiKey"; +[request sendWithCompletion:^(CZWeatherData *data, NSError *error) { + CZWeatherCurrentCondition *condition = data.current; + // dreams come true here +}]; +``` +###### Getting Forecast Conditions, Swift + +```swift +import CZWeatherKit + +let request = CZWundergroundRequest.newForecastRequest() +request.location = CZWeatherLocation(fromCity: "Seattle", state: "WA") +request.key = "wundergroundApiKey" +request.sendWithCompletion { (data, error) -> Void in + if let weather = data { + for forecast in weather.dailyForecasts { + // dreams come true here + } + } +} +``` + +## OpenWeatherMap + +###### Getting Current Conditions, Obj-C + +```objc +#import + +CZOpenWeatherMap *request = [CZOpenWeatherMapRequest newCurrentRequest]; +request.location = [CZWeatherLocation locationFromCity:@"Seattle" state:@"WA"]; +[request sendWithCompletion:^(CZWeatherData *data, NSError *error) { + CZWeatherCurrentCondition *condition = data.current; + // dreams come true here +}]; +``` + +###### Getting Forecast Conditions, Swift + +```swift +import CZWeatherKit + +let request = CZOpenWeatherMapRequest.newDailyForecastRequestForDays(3) +request.location = CZWeatherLocation(fromCity: "Seattle", state: "WA") +request.sendWithCompletion { (data, error) -> Void in + if let weather = data { + for forecast in weather.dailyForecasts { + // dreams come true here + } + } +} +``` + +## Using a Weather Service + +A weather service allows for the dispatching of weather data requests and allows for more fine-grained control over how requests are handled as opposed to the interface provided by `CZWeatherDataRequest`. An ideal use case for a weather service is powering a weather app. + +```swift +import CZWeatherKit + +let service = CZWeatherService() +request = CZOpenWeatherMapRequest.newCurrentRequest() +request.location = CZWeatherLocation(fromCity: "Seattle", state: "WA") +service.dispatchRequest(request, completion: { (data, error) -> Void in + if let weather = data { + // dreams come true here + } +}) + +``` + +## Supported Weather APIs + +CZWeatherKit currently supports the following weather services: + +* [Weather Underground](http://www.wunderground.com/weather/api/) +* [Open Weather Map](http://openweathermap.org/API) +* [Forecast.io](https://developer.forecast.io) +* [World Weather Online](https://developer.worldweatheronline.com) : World Weather Online support hasn't made its way into 2.0 yet; there is an outstanding [issue](https://github.com/comyarzaheri/CZWeatherKit/issues/17) for adding support. To give me a sense of how important this is to users, please leave a `+1` in the comments of the issue if you need this feature. + +## Climacons + +CZWeatherKit supports Climacons out of the box. The [Climacons Font](http://adamwhitcroft.com/climacons/font/) is a font set created by [Adam Whitcroft](http://adamwhitcroft.com/) featuring weather icons. + +# Architecture + +| Core | Description | +|:--------|:------------| +| `CZWeatherService` | Asyncronously dispatches requests, caches responses, and simplifies key management when making frequent API calls. | +| `CZPINWeatherDataCache` | An implementation of the `CZWeatherDataCache` protocol that uses [PINCache](https://github.com/pinterest/PINCache) for caching weather data. + +| Model Type | Description | +|:--------|:------------| +| `CZWeatherLocation` | Represents a location to retrieve weather data for. | +| `CZWeatherData` | Top-level container for all other weather data. | +| `CZWeatherCurrentCondition` | Contains data for current conditions. | +| `CZWeatherForecastCondition` | Contains data for a day's forecasted conditions. | +| `CZWeatherHourlyCondition` | Contains data for an hour's conditions. | +| `CZWeatherRequest` | The abstract base class for all request classes. | +| `CZWundergroundRequest` | Used for calling the Wunderground API. | +| `CZOpenWeatherMapRequest` | Used for calling the OpenWeatherMap API. | +| `CZForecastioRequest` | Used for calling the Forecast.io API. | +| `CZWorldWeatherOnlineRequest` | Used for calling the World Weather Online API. + +| API Type | Description | +|:---|:-------------| +| `CZWundergroundAPI` | Wunderground API class. | +| `CZOpenWeatherMapAPI ` | OpenWeatherMap API class. | +| `CZForecastioAPI` | Forecastio API class. | +| `CZWorldWeatherOnlineAPI` | WorldWeatherOnline API class. | + +| Protocols | Description | +|:---|:-------------| +| `CZWeatherAPI` | The protocol for weather API classes. | +| `CZWeatherDataCache` | The protocol for a cache used by a `CZWeatherService`. | + +| Headers | Description | +|:---|:-------------| +| `CZClimacons` | Contains mappings for Climacons to chars. | +| `CZWeatherKitTypes` | Contains varions type definitions. | + +# Contributing + +If you would like to contribute to the development of CZWeatherKit, please take care to follow the style conventions and please include unit tests in your pull request. + +For feature requests or general questions, feel free to post an issue. + +### Contributers + +* Comyar Zaheri, [@comyarzaheri](https://github.com/comyarzaheri) +* Eli Perkins, [@eliperkins](https://github.com/eliperkins) +* Seb Jachec, [@sebj](https://github.com/sebj) +* Seth Sandler [@cerupcat](https://github.com/cerupcat) +* Alexandre Perez [@awph](https://github.com/awph) +* [@ferhoodle](https://github.com/ferhoodle) +* [@tobiaghiraldini](https://github.com/tobiaghiraldini) diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index ea6313d..0e24eb5 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,5 +1,7 @@ PODS: - Alamofire (3.4.0) + - CZWeatherKit (2.2.7): + - PINCache (~> 2.1) - Decodable (0.4.2) - FBSnapshotTestCase (2.1.1): - FBSnapshotTestCase/SwiftSupport (= 2.1.1) @@ -40,6 +42,7 @@ PODS: - Operations (2.10.1): - Operations/Standard (= 2.10.1) - Operations/Standard (2.10.1) + - PINCache (2.2.2) - Result (2.0.0) - RxSwift (2.5.0) - SlackKit (1.0.2): @@ -48,6 +51,7 @@ PODS: DEPENDENCIES: - Alamofire (~> 3.0) + - CZWeatherKit (~> 2.2) - Decodable (~> 0.4) - FBSnapshotTestCase (from `https://github.com/facebook/ios-snapshot-test-case`) - GCBCore (~> 1.0) @@ -79,6 +83,7 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Alamofire: c19a627cefd6a95f840401c49ab1f124e07f54ee + CZWeatherKit: e15848c63ac021a83ec92e8fc0011a4ada6bf2ed Decodable: b1cd96ad9f722721bc98b0310952214a47f71d6a FBSnapshotTestCase: 432afd8d059ccef7f207225894840a03fbcf7474 GCBCore: ae1b62bf7576994c88579f2140c2b7d5e5bcb268 @@ -88,11 +93,12 @@ SPEC CHECKSUMS: Nimble: 0f3c8b8b084cda391209c3c5efbb48bedeeb920a OHHTTPStubs: 592f74439d2d72615115cf99a954237a3fbe26e5 Operations: b787ef012ec50752f6247b7f0efb7746fb8934ae + PINCache: 078426d356ab95ef875e9e62e5c35a2ea3333c28 Result: 9e75e1111c774c6ac594e14907b15057053a7959 RxSwift: 402b41a50e922a0368fc14cb3bc9f4427920e8ae SlackKit: 10dfee029d482bf35eff8799a799acf70ee2f05a Starscream: d662732354b40dd19ed1ece3e3c44c80b536b83c -PODFILE CHECKSUM: 95c60ade6bcca2563c9ce3a8989b920d11185618 +PODFILE CHECKSUM: eabeeb779be84436ee0577b83466725a0d5419a0 COCOAPODS: 1.0.1 diff --git a/Pods/PINCache/LICENSE.txt b/Pods/PINCache/LICENSE.txt new file mode 100644 index 0000000..3af296e --- /dev/null +++ b/Pods/PINCache/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [2013] [Tumblr, Inc.] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/Pods/PINCache/PINCache/Nullability.h b/Pods/PINCache/PINCache/Nullability.h new file mode 100644 index 0000000..437a16f --- /dev/null +++ b/Pods/PINCache/PINCache/Nullability.h @@ -0,0 +1,20 @@ +// PINCache is a modified version of TMCache +// Modifications by Garrett Moon +// Copyright (c) 2015 Pinterest. All rights reserved. + +#ifndef PINCache_nullability_h +#define PINCache_nullability_h + +#if !__has_feature(nullability) +#define NS_ASSUME_NONNULL_BEGIN +#define NS_ASSUME_NONNULL_END +#define nullable +#define nonnull +#define null_unspecified +#define null_resettable +#define __nullable +#define __nonnull +#define __null_unspecified +#endif + +#endif diff --git a/Pods/PINCache/PINCache/PINCache.h b/Pods/PINCache/PINCache/PINCache.h new file mode 100644 index 0000000..9af2d18 --- /dev/null +++ b/Pods/PINCache/PINCache/PINCache.h @@ -0,0 +1,203 @@ +// PINCache is a modified version of TMCache +// Modifications by Garrett Moon +// Copyright (c) 2015 Pinterest. All rights reserved. + +#import + +#import "PINDiskCache.h" +#import "PINMemoryCache.h" + +NS_ASSUME_NONNULL_BEGIN + +@class PINCache; + +/** + A callback block which provides only the cache as an argument + */ + +typedef void (^PINCacheBlock)(PINCache *cache); + +/** + A callback block which provides the cache, key and object as arguments + */ + +typedef void (^PINCacheObjectBlock)(PINCache *cache, NSString *key, id __nullable object); + +/** + `PINCache` is a thread safe key/value store designed for persisting temporary objects that are expensive to + reproduce, such as downloaded data or the results of slow processing. It is comprised of two self-similar + stores, one in memory () and one on disk (). + + `PINCache` itself actually does very little; its main function is providing a front end for a common use case: + a small, fast memory cache that asynchronously persists itself to a large, slow disk cache. When objects are + removed from the memory cache in response to an "apocalyptic" event they remain in the disk cache and are + repopulated in memory the next time they are accessed. `PINCache` also does the tedious work of creating a + dispatch group to wait for both caches to finish their operations without blocking each other. + + The parallel caches are accessible as public properties ( and ) and can be manipulated + separately if necessary. See the docs for and for more details. + + @warning when using in extension or watch extension, define PIN_APP_EXTENSIONS=1 + */ + +@interface PINCache : NSObject + +#pragma mark - +/// @name Core + +/** + The name of this cache, used to create the and also appearing in stack traces. + */ +@property (readonly) NSString *name; + +/** + A concurrent queue on which blocks passed to the asynchronous access methods are run. + */ +@property (readonly) dispatch_queue_t concurrentQueue; + +/** + Synchronously retrieves the total byte count of the on the shared disk queue. + */ +@property (readonly) NSUInteger diskByteCount; + +/** + The underlying disk cache, see for additional configuration and trimming options. + */ +@property (readonly) PINDiskCache *diskCache; + +/** + The underlying memory cache, see for additional configuration and trimming options. + */ +@property (readonly) PINMemoryCache *memoryCache; + +#pragma mark - +/// @name Initialization + +/** + A shared cache. + + @result The shared singleton cache instance. + */ ++ (instancetype)sharedCache; + +- (instancetype)init NS_UNAVAILABLE; + +/** + Multiple instances with the same name are allowed and can safely access + the same data on disk thanks to the magic of seriality. Also used to create the . + + @see name + @param name The name of the cache. + @result A new cache with the specified name. + */ +- (instancetype)initWithName:(NSString *)name; + +/** + Multiple instances with the same name are allowed and can safely access + the same data on disk thanks to the magic of seriality. Also used to create the . + + @see name + @param name The name of the cache. + @param rootPath The path of the cache on disk. + @result A new cache with the specified name. + */ +- (instancetype)initWithName:(NSString *)name rootPath:(NSString *)rootPath NS_DESIGNATED_INITIALIZER; + +#pragma mark - +/// @name Asynchronous Methods + +/** + Retrieves the object for the specified key. This method returns immediately and executes the passed + block after the object is available, potentially in parallel with other blocks on the . + + @param key The key associated with the requested object. + @param block A block to be executed concurrently when the object is available. + */ +- (void)objectForKey:(NSString *)key block:(PINCacheObjectBlock)block; + +/** + Stores an object in the cache for the specified key. This method returns immediately and executes the + passed block after the object has been stored, potentially in parallel with other blocks on the . + + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + @param block A block to be executed concurrently after the object has been stored, or nil. + */ +- (void)setObject:(id )object forKey:(NSString *)key block:(nullable PINCacheObjectBlock)block; + +/** + Removes the object for the specified key. This method returns immediately and executes the passed + block after the object has been removed, potentially in parallel with other blocks on the . + + @param key The key associated with the object to be removed. + @param block A block to be executed concurrently after the object has been removed, or nil. + */ +- (void)removeObjectForKey:(NSString *)key block:(nullable PINCacheObjectBlock)block; + +/** + Removes all objects from the cache that have not been used since the specified date. This method returns immediately and + executes the passed block after the cache has been trimmed, potentially in parallel with other blocks on the . + + @param date Objects that haven't been accessed since this date are removed from the cache. + @param block A block to be executed concurrently after the cache has been trimmed, or nil. + */ +- (void)trimToDate:(NSDate *)date block:(nullable PINCacheBlock)block; + +/** + Removes all objects from the cache.This method returns immediately and executes the passed block after the + cache has been cleared, potentially in parallel with other blocks on the . + + @param block A block to be executed concurrently after the cache has been cleared, or nil. + */ +- (void)removeAllObjects:(nullable PINCacheBlock)block; + +#pragma mark - +/// @name Synchronous Methods + +/** + Retrieves the object for the specified key. This method blocks the calling thread until the object is available. + Uses a semaphore to achieve synchronicity on the disk cache. + + @see objectForKey:block: + @param key The key associated with the object. + @result The object for the specified key. + */ +- (__nullable id)objectForKey:(NSString *)key; + +/** + Stores an object in the cache for the specified key. This method blocks the calling thread until the object has been set. + Uses a semaphore to achieve synchronicity on the disk cache. + + @see setObject:forKey:block: + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + */ +- (void)setObject:(id )object forKey:(NSString *)key; + +/** + Removes the object for the specified key. This method blocks the calling thread until the object + has been removed. + Uses a semaphore to achieve synchronicity on the disk cache. + + @param key The key associated with the object to be removed. + */ +- (void)removeObjectForKey:(NSString *)key; + +/** + Removes all objects from the cache that have not been used since the specified date. + This method blocks the calling thread until the cache has been trimmed. + Uses a semaphore to achieve synchronicity on the disk cache. + + @param date Objects that haven't been accessed since this date are removed from the cache. + */ +- (void)trimToDate:(NSDate *)date; + +/** + Removes all objects from the cache. This method blocks the calling thread until the cache has been cleared. + Uses a semaphore to achieve synchronicity on the disk cache. + */ +- (void)removeAllObjects; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PINCache/PINCache/PINCache.m b/Pods/PINCache/PINCache/PINCache.m new file mode 100644 index 0000000..53cdcd6 --- /dev/null +++ b/Pods/PINCache/PINCache/PINCache.m @@ -0,0 +1,359 @@ +// PINCache is a modified version of PINCache +// Modifications by Garrett Moon +// Copyright (c) 2015 Pinterest. All rights reserved. + +#import "PINCache.h" + +static NSString * const PINCachePrefix = @"com.pinterest.PINCache"; +static NSString * const PINCacheSharedName = @"PINCacheShared"; + +@interface PINCache () +#if OS_OBJECT_USE_OBJC +@property (strong, nonatomic) dispatch_queue_t concurrentQueue; +#else +@property (assign, nonatomic) dispatch_queue_t concurrentQueue; +#endif +@end + +@implementation PINCache + +#pragma mark - Initialization - + +#if !OS_OBJECT_USE_OBJC +- (void)dealloc +{ + dispatch_release(_concurrentQueue); + _concurrentQueue = nil; +} +#endif + +- (instancetype)init +{ + @throw [NSException exceptionWithName:@"Must initialize with a name" reason:@"PINCache must be initialized with a name. Call initWithName: instead." userInfo:nil]; + return [self initWithName:@""]; +} + +- (instancetype)initWithName:(NSString *)name +{ + return [self initWithName:name rootPath:[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]]; +} + +- (instancetype)initWithName:(NSString *)name rootPath:(NSString *)rootPath +{ + if (!name) + return nil; + + if (self = [super init]) { + _name = [name copy]; + + NSString *queueName = [[NSString alloc] initWithFormat:@"%@.%p", PINCachePrefix, self]; + _concurrentQueue = dispatch_queue_create([[NSString stringWithFormat:@"%@ Asynchronous Queue", queueName] UTF8String], DISPATCH_QUEUE_CONCURRENT); + + _diskCache = [[PINDiskCache alloc] initWithName:_name rootPath:rootPath]; + _memoryCache = [[PINMemoryCache alloc] init]; + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"%@.%@.%p", PINCachePrefix, _name, self]; +} + ++ (instancetype)sharedCache +{ + static id cache; + static dispatch_once_t predicate; + + dispatch_once(&predicate, ^{ + cache = [[self alloc] initWithName:PINCacheSharedName]; + }); + + return cache; +} + +#pragma mark - Public Asynchronous Methods - + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wshadow" + +- (void)objectForKey:(NSString *)key block:(PINCacheObjectBlock)block +{ + if (!key || !block) + return; + + __weak PINCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + __weak PINCache *weakSelf = strongSelf; + + [strongSelf->_memoryCache objectForKey:key block:^(PINMemoryCache *memoryCache, NSString *memoryCacheKey, id memoryCacheObject) { + PINCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + if (memoryCacheObject) { + [strongSelf->_diskCache fileURLForKey:memoryCacheKey block:^(PINDiskCache *diskCache, NSString *diskCacheKey, id diskCacheObject, NSURL *fileURL) { + // update the access time on disk + }]; + + __weak PINCache *weakSelf = strongSelf; + + dispatch_async(strongSelf->_concurrentQueue, ^{ + PINCache *strongSelf = weakSelf; + if (strongSelf) + block(strongSelf, memoryCacheKey, memoryCacheObject); + }); + } else { + __weak PINCache *weakSelf = strongSelf; + + [strongSelf->_diskCache objectForKey:memoryCacheKey block:^(PINDiskCache *diskCache, NSString *diskCacheKey, id diskCacheObject, NSURL *fileURL) { + PINCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf->_memoryCache setObject:diskCacheObject forKey:diskCacheKey block:nil]; + + __weak PINCache *weakSelf = strongSelf; + + dispatch_async(strongSelf->_concurrentQueue, ^{ + PINCache *strongSelf = weakSelf; + if (strongSelf) + block(strongSelf, diskCacheKey, diskCacheObject); + }); + }]; + } + }]; + }); +} + +#pragma clang diagnostic pop + +- (void)setObject:(id )object forKey:(NSString *)key block:(PINCacheObjectBlock)block +{ + if (!key || !object) + return; + + dispatch_group_t group = nil; + PINMemoryCacheObjectBlock memBlock = nil; + PINDiskCacheObjectBlock diskBlock = nil; + + if (block) { + group = dispatch_group_create(); + dispatch_group_enter(group); + dispatch_group_enter(group); + + memBlock = ^(PINMemoryCache *memoryCache, NSString *memoryCacheKey, id memoryCacheObject) { + dispatch_group_leave(group); + }; + + diskBlock = ^(PINDiskCache *diskCache, NSString *diskCacheKey, id memoryCacheObject, NSURL *memoryCacheFileURL) { + dispatch_group_leave(group); + }; + } + + [_memoryCache setObject:object forKey:key block:memBlock]; + [_diskCache setObject:object forKey:key block:diskBlock]; + + if (group) { + __weak PINCache *weakSelf = self; + dispatch_group_notify(group, _concurrentQueue, ^{ + PINCache *strongSelf = weakSelf; + if (strongSelf) + block(strongSelf, key, object); + }); + +#if !OS_OBJECT_USE_OBJC + dispatch_release(group); +#endif + } +} + +- (void)removeObjectForKey:(NSString *)key block:(PINCacheObjectBlock)block +{ + if (!key) + return; + + dispatch_group_t group = nil; + PINMemoryCacheObjectBlock memBlock = nil; + PINDiskCacheObjectBlock diskBlock = nil; + + if (block) { + group = dispatch_group_create(); + dispatch_group_enter(group); + dispatch_group_enter(group); + + memBlock = ^(PINMemoryCache *memoryCache, NSString *memoryCacheKey, id memoryCacheObject) { + dispatch_group_leave(group); + }; + + diskBlock = ^(PINDiskCache *diskCache, NSString *diskCacheKey, id memoryCacheObject, NSURL *memoryCacheFileURL) { + dispatch_group_leave(group); + }; + } + + [_memoryCache removeObjectForKey:key block:memBlock]; + [_diskCache removeObjectForKey:key block:diskBlock]; + + if (group) { + __weak PINCache *weakSelf = self; + dispatch_group_notify(group, _concurrentQueue, ^{ + PINCache *strongSelf = weakSelf; + if (strongSelf) + block(strongSelf, key, nil); + }); + +#if !OS_OBJECT_USE_OBJC + dispatch_release(group); +#endif + } +} + +- (void)removeAllObjects:(PINCacheBlock)block +{ + dispatch_group_t group = nil; + PINMemoryCacheBlock memBlock = nil; + PINDiskCacheBlock diskBlock = nil; + + if (block) { + group = dispatch_group_create(); + dispatch_group_enter(group); + dispatch_group_enter(group); + + memBlock = ^(PINMemoryCache *cache) { + dispatch_group_leave(group); + }; + + diskBlock = ^(PINDiskCache *cache) { + dispatch_group_leave(group); + }; + } + + [_memoryCache removeAllObjects:memBlock]; + [_diskCache removeAllObjects:diskBlock]; + + if (group) { + __weak PINCache *weakSelf = self; + dispatch_group_notify(group, _concurrentQueue, ^{ + PINCache *strongSelf = weakSelf; + if (strongSelf) + block(strongSelf); + }); + +#if !OS_OBJECT_USE_OBJC + dispatch_release(group); +#endif + } +} + +- (void)trimToDate:(NSDate *)date block:(PINCacheBlock)block +{ + if (!date) + return; + + dispatch_group_t group = nil; + PINMemoryCacheBlock memBlock = nil; + PINDiskCacheBlock diskBlock = nil; + + if (block) { + group = dispatch_group_create(); + dispatch_group_enter(group); + dispatch_group_enter(group); + + memBlock = ^(PINMemoryCache *cache) { + dispatch_group_leave(group); + }; + + diskBlock = ^(PINDiskCache *cache) { + dispatch_group_leave(group); + }; + } + + [_memoryCache trimToDate:date block:memBlock]; + [_diskCache trimToDate:date block:diskBlock]; + + if (group) { + __weak PINCache *weakSelf = self; + dispatch_group_notify(group, _concurrentQueue, ^{ + PINCache *strongSelf = weakSelf; + if (strongSelf) + block(strongSelf); + }); + +#if !OS_OBJECT_USE_OBJC + dispatch_release(group); +#endif + } +} + +#pragma mark - Public Synchronous Accessors - + +- (NSUInteger)diskByteCount +{ + __block NSUInteger byteCount = 0; + + [_diskCache synchronouslyLockFileAccessWhileExecutingBlock:^(PINDiskCache *diskCache) { + byteCount = diskCache.byteCount; + }]; + + return byteCount; +} + +- (__nullable id)objectForKey:(NSString *)key +{ + if (!key) + return nil; + + __block id object = nil; + + object = [_memoryCache objectForKey:key]; + + if (object) { + // update the access time on disk + [_diskCache fileURLForKey:key block:NULL]; + } else { + object = [_diskCache objectForKey:key]; + [_memoryCache setObject:object forKey:key]; + } + + return object; +} + +- (void)setObject:(id )object forKey:(NSString *)key +{ + if (!key || !object) + return; + + [_memoryCache setObject:object forKey:key]; + [_diskCache setObject:object forKey:key]; +} + +- (void)removeObjectForKey:(NSString *)key +{ + if (!key) + return; + + [_memoryCache removeObjectForKey:key]; + [_diskCache removeObjectForKey:key]; +} + +- (void)trimToDate:(NSDate *)date +{ + if (!date) + return; + + [_memoryCache trimToDate:date]; + [_diskCache trimToDate:date]; +} + +- (void)removeAllObjects +{ + [_memoryCache removeAllObjects]; + [_diskCache removeAllObjects]; +} + +@end diff --git a/Pods/PINCache/PINCache/PINDiskCache.h b/Pods/PINCache/PINCache/PINDiskCache.h new file mode 100644 index 0000000..8f2da08 --- /dev/null +++ b/Pods/PINCache/PINCache/PINDiskCache.h @@ -0,0 +1,373 @@ +// PINCache is a modified version of TMCache +// Modifications by Garrett Moon +// Copyright (c) 2015 Pinterest. All rights reserved. + +#import +#import "Nullability.h" + +NS_ASSUME_NONNULL_BEGIN + +@class PINDiskCache; + +/** + A callback block which provides only the cache as an argument + */ + +typedef void (^PINDiskCacheBlock)(PINDiskCache *cache); + +/** + A callback block which provides the cache, key and object as arguments + */ + +typedef void (^PINDiskCacheObjectBlock)(PINDiskCache *cache, NSString *key, id __nullable object, NSURL * __nullable fileURL); + +/** + `PINDiskCache` is a thread safe key/value store backed by the file system. It accepts any object conforming + to the `NSCoding` protocol, which includes the basic Foundation data types and collection classes and also + many UIKit classes, notably `UIImage`. All work is performed on a serial queue shared by all instances in + the app, and archiving is handled by `NSKeyedArchiver`. This is a particular advantage for `UIImage` because + it skips `UIImagePNGRepresentation()` and retains information like scale and orientation. + + The designated initializer for `PINDiskCache` is . The string is used to create a directory + under Library/Caches that scopes disk access for this instance. Multiple instances with the same name are *not* + allowed as they would conflict with each other. + + Unless otherwise noted, all properties and methods are safe to access from any thread at any time. All blocks + will cause the queue to wait, making it safe to access and manipulate the actual cache files on disk for the + duration of the block. + + Because this cache is bound by disk I/O it can be much slower than , although values stored in + `PINDiskCache` persist after application relaunch. Using is recommended over using `PINDiskCache` + by itself, as it adds a fast layer of additional memory caching while still writing to disk. + + All access to the cache is dated so the that the least-used objects can be trimmed first. Setting an optional + will trigger a GCD timer to periodically to trim the cache with . + */ + +@interface PINDiskCache : NSObject + + + +#pragma mark - +/// @name Core + +/** + The name of this cache, used to create a directory under Library/Caches and also appearing in stack traces. + */ +@property (readonly) NSString *name; + +/** + The URL of the directory used by this cache, usually `Library/Caches/com.pinterest.PINDiskCache.(name)` + + @warning Do not interact with files under this URL except in or + . + */ +@property (readonly) NSURL *cacheURL; + +/** + The total number of bytes used on disk, as reported by `NSURLTotalFileAllocatedSizeKey`. + + @warning This property should only be read from a call to or + its asynchronous equivolent + + For example: + + // some background thread + + __block NSUInteger byteCount = 0; + + [_diskCache synchronouslyLockFileAccessWhileExecutingBlock:^(PINDiskCache *diskCache) { + byteCount = diskCache.byteCount; + }]; + */ +@property (readonly) NSUInteger byteCount; + +/** + The maximum number of bytes allowed on disk. This value is checked every time an object is set, if the written + size exceeds the limit a trim call is queued. Defaults to `0.0`, meaning no practical limit. + + */ +@property (assign) NSUInteger byteLimit; + +/** + The maximum number of seconds an object is allowed to exist in the cache. Setting this to a value + greater than `0.0` will start a recurring GCD timer with the same period that calls . + Setting it back to `0.0` will stop the timer. Defaults to `0.0`, meaning no limit. + + */ +@property (assign) NSTimeInterval ageLimit; + +/** + If ttlCache is YES, the cache behaves like a ttlCache. This means that once an object enters the + cache, it only lives as long as self.ageLimit. This has the following implications: + - Accessing an object in the cache does not extend that object's lifetime in the cache + - When attempting to access an object in the cache that has lived longer than self.ageLimit, + the cache will behave as if the object does not exist + + */ +@property (nonatomic, assign, getter=isTTLCache) BOOL ttlCache; + +#pragma mark - +/// @name Event Blocks + +/** + A block to be executed just before an object is added to the cache. The queue waits during execution. + */ +@property (copy) PINDiskCacheObjectBlock __nullable willAddObjectBlock; + +/** + A block to be executed just before an object is removed from the cache. The queue waits during execution. + */ +@property (copy) PINDiskCacheObjectBlock __nullable willRemoveObjectBlock; + +/** + A block to be executed just before all objects are removed from the cache as a result of . + The queue waits during execution. + */ +@property (copy) PINDiskCacheBlock __nullable willRemoveAllObjectsBlock; + +/** + A block to be executed just after an object is added to the cache. The queue waits during execution. + */ +@property (copy) PINDiskCacheObjectBlock __nullable didAddObjectBlock; + +/** + A block to be executed just after an object is removed from the cache. The queue waits during execution. + */ +@property (copy) PINDiskCacheObjectBlock __nullable didRemoveObjectBlock; + +/** + A block to be executed just after all objects are removed from the cache as a result of . + The queue waits during execution. + */ +@property (copy) PINDiskCacheBlock __nullable didRemoveAllObjectsBlock; + +#pragma mark - +/// @name Initialization + +/** + A shared cache. + + @result The shared singleton cache instance. + */ ++ (instancetype)sharedCache; + +/** + Empties the trash with `DISPATCH_QUEUE_PRIORITY_BACKGROUND`. Does not use lock. + */ ++ (void)emptyTrash; + +- (instancetype)init NS_UNAVAILABLE; + +/** + Multiple instances with the same name are allowed and can safely access + the same data on disk thanks to the magic of seriality. + + @see name + @param name The name of the cache. + @result A new cache with the specified name. + */ +- (instancetype)initWithName:(NSString *)name; + +/** + The designated initializer. Multiple instances with the same name are allowed and can safely access + the same data on disk thanks to the magic of seriality. + + @see name + @param name The name of the cache. + @param rootPath The path of the cache. + @result A new cache with the specified name. + */ +- (instancetype)initWithName:(NSString *)name rootPath:(NSString *)rootPath NS_DESIGNATED_INITIALIZER; + +#pragma mark - +/// @name Asynchronous Methods +/** + Locks access to ivars and allows safe interaction with files on disk. This method returns immediately. + + @warning Calling synchronous methods on the diskCache inside this block will likely cause a deadlock. + + @param block A block to be executed when a lock is available. + */ +- (void)lockFileAccessWhileExecutingBlock:(nullable PINDiskCacheBlock)block; + +/** + Retrieves the object for the specified key. This method returns immediately and executes the passed + block as soon as the object is available. + + @warning The fileURL is only valid for the duration of this block, do not use it after the block ends. + + @param key The key associated with the requested object. + @param block A block to be executed serially when the object is available. + */ +- (void)objectForKey:(NSString *)key block:(nullable PINDiskCacheObjectBlock)block; + +/** + Retrieves the fileURL for the specified key without actually reading the data from disk. This method + returns immediately and executes the passed block as soon as the object is available. + + @warning Access is protected for the duration of the block, but to maintain safe disk access do not + access this fileURL after the block has ended. + + @param key The key associated with the requested object. + @param block A block to be executed serially when the file URL is available. + */ +- (void)fileURLForKey:(nullable NSString *)key block:(nullable PINDiskCacheObjectBlock)block; + +/** + Stores an object in the cache for the specified key. This method returns immediately and executes the + passed block as soon as the object has been stored. + + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + @param block A block to be executed serially after the object has been stored, or nil. + */ +- (void)setObject:(id )object forKey:(NSString *)key block:(nullable PINDiskCacheObjectBlock)block; + +/** + Removes the object for the specified key. This method returns immediately and executes the passed block + as soon as the object has been removed. + + @param key The key associated with the object to be removed. + @param block A block to be executed serially after the object has been removed, or nil. + */ +- (void)removeObjectForKey:(NSString *)key block:(nullable PINDiskCacheObjectBlock)block; + +/** + Removes all objects from the cache that have not been used since the specified date. + This method returns immediately and executes the passed block as soon as the cache has been trimmed. + + @param date Objects that haven't been accessed since this date are removed from the cache. + @param block A block to be executed serially after the cache has been trimmed, or nil. + */ +- (void)trimToDate:(NSDate *)date block:(nullable PINDiskCacheBlock)block; + +/** + Removes objects from the cache, largest first, until the cache is equal to or smaller than the specified byteCount. + This method returns immediately and executes the passed block as soon as the cache has been trimmed. + + @param byteCount The cache will be trimmed equal to or smaller than this size. + @param block A block to be executed serially after the cache has been trimmed, or nil. + */ +- (void)trimToSize:(NSUInteger)byteCount block:(nullable PINDiskCacheBlock)block; + +/** + Removes objects from the cache, ordered by date (least recently used first), until the cache is equal to or smaller + than the specified byteCount. This method returns immediately and executes the passed block as soon as the cache has + been trimmed. + + @param byteCount The cache will be trimmed equal to or smaller than this size. + @param block A block to be executed serially after the cache has been trimmed, or nil. + */ +- (void)trimToSizeByDate:(NSUInteger)byteCount block:(nullable PINDiskCacheBlock)block; + +/** + Removes all objects from the cache. This method returns immediately and executes the passed block as soon as the + cache has been cleared. + + @param block A block to be executed serially after the cache has been cleared, or nil. + */ +- (void)removeAllObjects:(nullable PINDiskCacheBlock)block; + +/** + Loops through all objects in the cache (reads and writes are suspended during the enumeration). Data is not actually + read from disk, the `object` parameter of the block will be `nil` but the `fileURL` will be available. + This method returns immediately. + + @param block A block to be executed for every object in the cache. + @param completionBlock An optional block to be executed after the enumeration is complete. + */ +- (void)enumerateObjectsWithBlock:(PINDiskCacheObjectBlock)block completionBlock:(nullable PINDiskCacheBlock)completionBlock; + +#pragma mark - +/// @name Synchronous Methods + +/** + Locks access to ivars and allows safe interaction with files on disk. This method only returns once the block + has been run. + + @warning Calling synchronous methods on the diskCache inside this block will likely cause a deadlock. + + @param block A block to be executed when a lock is available. + */ +- (void)synchronouslyLockFileAccessWhileExecutingBlock:(nullable PINDiskCacheBlock)block; + +/** + Retrieves the object for the specified key. This method blocks the calling thread until the + object is available. + + @see objectForKey:block: + @param key The key associated with the object. + @result The object for the specified key. + */ +- (__nullable id )objectForKey:(NSString *)key; + +/** + Retrieves the file URL for the specified key. This method blocks the calling thread until the + url is available. Do not use this URL anywhere except with . This method probably + shouldn't even exist, just use the asynchronous one. + + @see fileURLForKey:block: + @param key The key associated with the object. + @result The file URL for the specified key. + */ +- (NSURL *)fileURLForKey:(nullable NSString *)key; + +/** + Stores an object in the cache for the specified key. This method blocks the calling thread until + the object has been stored. + + @see setObject:forKey:block: + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + */ +- (void)setObject:(id )object forKey:(NSString *)key; + +/** + Removes the object for the specified key. This method blocks the calling thread until the object + has been removed. + + @param key The key associated with the object to be removed. + */ +- (void)removeObjectForKey:(NSString *)key; + +/** + Removes all objects from the cache that have not been used since the specified date. + This method blocks the calling thread until the cache has been trimmed. + @param date Objects that haven't been accessed since this date are removed from the cache. + */ +- (void)trimToDate:(nullable NSDate *)date; + +/** + Removes objects from the cache, largest first, until the cache is equal to or smaller than the + specified byteCount. This method blocks the calling thread until the cache has been trimmed. + + @param byteCount The cache will be trimmed equal to or smaller than this size. + */ +- (void)trimToSize:(NSUInteger)byteCount; + +/** + Removes objects from the cache, ordered by date (least recently used first), until the cache is equal to or + smaller than the specified byteCount. This method blocks the calling thread until the cache has been trimmed. + @param byteCount The cache will be trimmed equal to or smaller than this size. + */ +- (void)trimToSizeByDate:(NSUInteger)byteCount; + +/** + Removes all objects from the cache. This method blocks the calling thread until the cache has been cleared. + */ +- (void)removeAllObjects; + +/** + Loops through all objects in the cache (reads and writes are suspended during the enumeration). Data is not actually + read from disk, the `object` parameter of the block will be `nil` but the `fileURL` will be available. + This method blocks the calling thread until all objects have been enumerated. + @param block A block to be executed for every object in the cache. + @warning Do not call this method within the event blocks (, etc.) + Instead use the asynchronous version, . + */ +- (void)enumerateObjectsWithBlock:(nullable PINDiskCacheObjectBlock)block; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PINCache/PINCache/PINDiskCache.m b/Pods/PINCache/PINCache/PINDiskCache.m new file mode 100644 index 0000000..3755abb --- /dev/null +++ b/Pods/PINCache/PINCache/PINDiskCache.m @@ -0,0 +1,1171 @@ +// PINCache is a modified version of TMCache +// Modifications by Garrett Moon +// Copyright (c) 2015 Pinterest. All rights reserved. + +#import "PINDiskCache.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 +#import +#endif + +#define PINDiskCacheError(error) if (error) { NSLog(@"%@ (%d) ERROR: %@", \ +[[NSString stringWithUTF8String:__FILE__] lastPathComponent], \ +__LINE__, [error localizedDescription]); } + +static NSString * const PINDiskCachePrefix = @"com.pinterest.PINDiskCache"; +static NSString * const PINDiskCacheSharedName = @"PINDiskCacheShared"; + +@interface PINBackgroundTask : NSObject +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 && !TARGET_OS_WATCH +@property (atomic, assign) UIBackgroundTaskIdentifier taskID; +#endif ++ (instancetype)start; +- (void)end; +@end + +@interface PINDiskCache () + +@property (assign) NSUInteger byteCount; +@property (strong, nonatomic) NSURL *cacheURL; +#if OS_OBJECT_USE_OBJC +@property (strong, nonatomic) dispatch_queue_t asyncQueue; +@property (strong, nonatomic) dispatch_semaphore_t lockSemaphore; +#else +@property (assign, nonatomic) dispatch_queue_t asyncQueue; +@property (assign, nonatomic) dispatch_semaphore_t lockSemaphore; +#endif +@property (strong, nonatomic) NSMutableDictionary *dates; +@property (strong, nonatomic) NSMutableDictionary *sizes; +@end + +@implementation PINDiskCache + +@synthesize willAddObjectBlock = _willAddObjectBlock; +@synthesize willRemoveObjectBlock = _willRemoveObjectBlock; +@synthesize willRemoveAllObjectsBlock = _willRemoveAllObjectsBlock; +@synthesize didAddObjectBlock = _didAddObjectBlock; +@synthesize didRemoveObjectBlock = _didRemoveObjectBlock; +@synthesize didRemoveAllObjectsBlock = _didRemoveAllObjectsBlock; +@synthesize byteLimit = _byteLimit; +@synthesize ageLimit = _ageLimit; +@synthesize ttlCache = _ttlCache; + +#pragma mark - Initialization - + +- (void)dealloc +{ +#if !OS_OBJECT_USE_OBJC + dispatch_release(_lockSemaphore); + dispatch_release(_asyncQueue); + _asyncQueue = nil; +#endif +} + +- (instancetype)init +{ + @throw [NSException exceptionWithName:@"Must initialize with a name" reason:@"PINDiskCache must be initialized with a name. Call initWithName: instead." userInfo:nil]; + return [self initWithName:@""]; +} + +- (instancetype)initWithName:(NSString *)name +{ + return [self initWithName:name rootPath:[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]]; +} + +- (instancetype)initWithName:(NSString *)name rootPath:(NSString *)rootPath +{ + if (!name) + return nil; + + if (self = [super init]) { + _name = [name copy]; + _asyncQueue = dispatch_queue_create([[NSString stringWithFormat:@"%@ Asynchronous Queue", PINDiskCachePrefix] UTF8String], DISPATCH_QUEUE_CONCURRENT); + _lockSemaphore = dispatch_semaphore_create(1); + _willAddObjectBlock = nil; + _willRemoveObjectBlock = nil; + _willRemoveAllObjectsBlock = nil; + _didAddObjectBlock = nil; + _didRemoveObjectBlock = nil; + _didRemoveAllObjectsBlock = nil; + + _byteCount = 0; + _byteLimit = 0; + _ageLimit = 0.0; + + _dates = [[NSMutableDictionary alloc] init]; + _sizes = [[NSMutableDictionary alloc] init]; + + NSString *pathComponent = [[NSString alloc] initWithFormat:@"%@.%@", PINDiskCachePrefix, _name]; + _cacheURL = [NSURL fileURLWithPathComponents:@[ rootPath, pathComponent ]]; + + //we don't want to do anything without setting up the disk cache, but we also don't want to block init, it can take a while to initialize + //this is only safe because we use a dispatch_semaphore as a lock. If we switch to an NSLock or posix locks, this will *no longer be safe*. + [self lock]; + dispatch_async(_asyncQueue, ^{ + [self createCacheDirectory]; + [self initializeDiskProperties]; + + [self unlock]; + }); + } + return self; +} + +- (NSString *)description +{ + return [[NSString alloc] initWithFormat:@"%@.%@.%p", PINDiskCachePrefix, _name, self]; +} + ++ (instancetype)sharedCache +{ + static id cache; + static dispatch_once_t predicate; + + dispatch_once(&predicate, ^{ + cache = [[self alloc] initWithName:PINDiskCacheSharedName]; + }); + + return cache; +} + +#pragma mark - Private Methods - + +- (NSURL *)encodedFileURLForKey:(NSString *)key +{ + if (![key length]) + return nil; + + return [_cacheURL URLByAppendingPathComponent:[self encodedString:key]]; +} + +- (NSString *)keyForEncodedFileURL:(NSURL *)url +{ + NSString *fileName = [url lastPathComponent]; + if (!fileName) + return nil; + + return [self decodedString:fileName]; +} + +- (NSString *)encodedString:(NSString *)string +{ + if (![string length]) { + return @""; + } + + if ([string respondsToSelector:@selector(stringByAddingPercentEncodingWithAllowedCharacters:)]) { + return [string stringByAddingPercentEncodingWithAllowedCharacters:[[NSCharacterSet characterSetWithCharactersInString:@".:/%"] invertedSet]]; + } + else { + CFStringRef static const charsToEscape = CFSTR(".:/%"); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + CFStringRef escapedString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, + (__bridge CFStringRef)string, + NULL, + charsToEscape, + kCFStringEncodingUTF8); +#pragma clang diagnostic pop + return (__bridge_transfer NSString *)escapedString; + } +} + +- (NSString *)decodedString:(NSString *)string +{ + if (![string length]) { + return @""; + } + + if ([string respondsToSelector:@selector(stringByRemovingPercentEncoding)]) { + return [string stringByRemovingPercentEncoding]; + } + else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + CFStringRef unescapedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, + (__bridge CFStringRef)string, + CFSTR(""), + kCFStringEncodingUTF8); +#pragma clang diagnostic pop + return (__bridge_transfer NSString *)unescapedString; + } +} + +#pragma mark - Private Trash Methods - + ++ (dispatch_queue_t)sharedTrashQueue +{ + static dispatch_queue_t trashQueue; + static dispatch_once_t predicate; + + dispatch_once(&predicate, ^{ + NSString *queueName = [[NSString alloc] initWithFormat:@"%@.trash", PINDiskCachePrefix]; + trashQueue = dispatch_queue_create([queueName UTF8String], DISPATCH_QUEUE_SERIAL); + dispatch_set_target_queue(trashQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); + }); + + return trashQueue; +} + ++ (NSURL *)sharedTrashURL +{ + static NSURL *sharedTrashURL; + static dispatch_once_t predicate; + + dispatch_once(&predicate, ^{ + sharedTrashURL = [[[NSURL alloc] initFileURLWithPath:NSTemporaryDirectory()] URLByAppendingPathComponent:PINDiskCachePrefix isDirectory:YES]; + + if (![[NSFileManager defaultManager] fileExistsAtPath:[sharedTrashURL path]]) { + NSError *error = nil; + [[NSFileManager defaultManager] createDirectoryAtURL:sharedTrashURL + withIntermediateDirectories:YES + attributes:nil + error:&error]; + PINDiskCacheError(error); + } + }); + + return sharedTrashURL; +} + ++(BOOL)moveItemAtURLToTrash:(NSURL *)itemURL +{ + if (![[NSFileManager defaultManager] fileExistsAtPath:[itemURL path]]) + return NO; + + NSError *error = nil; + NSString *uniqueString = [[NSProcessInfo processInfo] globallyUniqueString]; + NSURL *uniqueTrashURL = [[PINDiskCache sharedTrashURL] URLByAppendingPathComponent:uniqueString]; + BOOL moved = [[NSFileManager defaultManager] moveItemAtURL:itemURL toURL:uniqueTrashURL error:&error]; + PINDiskCacheError(error); + return moved; +} + ++ (void)emptyTrash +{ + PINBackgroundTask *task = [PINBackgroundTask start]; + + dispatch_async([self sharedTrashQueue], ^{ + NSError *searchTrashedItemsError = nil; + NSArray *trashedItems = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:[self sharedTrashURL] + includingPropertiesForKeys:nil + options:0 + error:&searchTrashedItemsError]; + PINDiskCacheError(searchTrashedItemsError); + + for (NSURL *trashedItemURL in trashedItems) { + NSError *removeTrashedItemError = nil; + [[NSFileManager defaultManager] removeItemAtURL:trashedItemURL error:&removeTrashedItemError]; + PINDiskCacheError(removeTrashedItemError); + } + + [task end]; + }); +} + +#pragma mark - Private Queue Methods - + +- (BOOL)createCacheDirectory +{ + if ([[NSFileManager defaultManager] fileExistsAtPath:[_cacheURL path]]) + return NO; + + NSError *error = nil; + BOOL success = [[NSFileManager defaultManager] createDirectoryAtURL:_cacheURL + withIntermediateDirectories:YES + attributes:nil + error:&error]; + PINDiskCacheError(error); + + return success; +} + +- (void)initializeDiskProperties +{ + NSUInteger byteCount = 0; + NSArray *keys = @[ NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey ]; + + NSError *error = nil; + NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:_cacheURL + includingPropertiesForKeys:keys + options:NSDirectoryEnumerationSkipsHiddenFiles + error:&error]; + PINDiskCacheError(error); + + for (NSURL *fileURL in files) { + NSString *key = [self keyForEncodedFileURL:fileURL]; + + error = nil; + NSDictionary *dictionary = [fileURL resourceValuesForKeys:keys error:&error]; + PINDiskCacheError(error); + + NSDate *date = [dictionary objectForKey:NSURLContentModificationDateKey]; + if (date && key) + [_dates setObject:date forKey:key]; + + NSNumber *fileSize = [dictionary objectForKey:NSURLTotalFileAllocatedSizeKey]; + if (fileSize) { + [_sizes setObject:fileSize forKey:key]; + byteCount += [fileSize unsignedIntegerValue]; + } + } + + if (byteCount > 0) + self.byteCount = byteCount; // atomic +} + +- (BOOL)setFileModificationDate:(NSDate *)date forURL:(NSURL *)fileURL +{ + if (!date || !fileURL) { + return NO; + } + + NSError *error = nil; + BOOL success = [[NSFileManager defaultManager] setAttributes:@{ NSFileModificationDate: date } + ofItemAtPath:[fileURL path] + error:&error]; + PINDiskCacheError(error); + + if (success) { + NSString *key = [self keyForEncodedFileURL:fileURL]; + if (key) { + [_dates setObject:date forKey:key]; + } + } + + return success; +} + +- (BOOL)removeFileAndExecuteBlocksForKey:(NSString *)key +{ + NSURL *fileURL = [self encodedFileURLForKey:key]; + if (!fileURL || ![[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]]) + return NO; + + if (_willRemoveObjectBlock) + _willRemoveObjectBlock(self, key, nil, fileURL); + + BOOL trashed = [PINDiskCache moveItemAtURLToTrash:fileURL]; + if (!trashed) + return NO; + + [PINDiskCache emptyTrash]; + + NSNumber *byteSize = [_sizes objectForKey:key]; + if (byteSize) + self.byteCount = _byteCount - [byteSize unsignedIntegerValue]; // atomic + + [_sizes removeObjectForKey:key]; + [_dates removeObjectForKey:key]; + + if (_didRemoveObjectBlock) + _didRemoveObjectBlock(self, key, nil, fileURL); + + return YES; +} + +- (void)trimDiskToSize:(NSUInteger)trimByteCount +{ + if (_byteCount <= trimByteCount) + return; + + NSArray *keysSortedBySize = [_sizes keysSortedByValueUsingSelector:@selector(compare:)]; + + for (NSString *key in [keysSortedBySize reverseObjectEnumerator]) { // largest objects first + [self removeFileAndExecuteBlocksForKey:key]; + + if (_byteCount <= trimByteCount) + break; + } +} + +- (void)trimDiskToSizeByDate:(NSUInteger)trimByteCount +{ + if (_byteCount <= trimByteCount) + return; + + NSArray *keysSortedByDate = [_dates keysSortedByValueUsingSelector:@selector(compare:)]; + + for (NSString *key in keysSortedByDate) { // oldest objects first + [self removeFileAndExecuteBlocksForKey:key]; + + if (_byteCount <= trimByteCount) + break; + } +} + +- (void)trimDiskToDate:(NSDate *)trimDate +{ + NSArray *keysSortedByDate = [_dates keysSortedByValueUsingSelector:@selector(compare:)]; + + for (NSString *key in keysSortedByDate) { // oldest files first + NSDate *accessDate = [_dates objectForKey:key]; + if (!accessDate) + continue; + + if ([accessDate compare:trimDate] == NSOrderedAscending) { // older than trim date + [self removeFileAndExecuteBlocksForKey:key]; + } else { + break; + } + } +} + +- (void)trimToAgeLimitRecursively +{ + [self lock]; + NSTimeInterval ageLimit = _ageLimit; + [self unlock]; + if (ageLimit == 0.0) + return; + + [self lock]; + NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:-ageLimit]; + [self trimDiskToDate:date]; + [self unlock]; + + __weak PINDiskCache *weakSelf = self; + + dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_ageLimit * NSEC_PER_SEC)); + dispatch_after(time, _asyncQueue, ^(void) { + PINDiskCache *strongSelf = weakSelf; + [strongSelf trimToAgeLimitRecursively]; + }); +} + +#pragma mark - Public Asynchronous Methods - + +- (void)lockFileAccessWhileExecutingBlock:(void(^)(PINDiskCache *diskCache))block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (block) { + [strongSelf lock]; + block(strongSelf); + [strongSelf unlock]; + } + }); +} + +- (void)objectForKey:(NSString *)key block:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + NSURL *fileURL = nil; + id object = [strongSelf objectForKey:key fileURL:&fileURL]; + + if (block) { + [strongSelf lock]; + block(strongSelf, key, object, fileURL); + [strongSelf unlock]; + } + }); +} + +- (void)fileURLForKey:(NSString *)key block:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + NSURL *fileURL = [strongSelf fileURLForKey:key]; + + if (block) { + [strongSelf lock]; + block(strongSelf, key, nil, fileURL); + [strongSelf unlock]; + } + }); +} + +- (void)setObject:(id )object forKey:(NSString *)key block:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + NSURL *fileURL = nil; + [strongSelf setObject:object forKey:key fileURL:&fileURL]; + + if (block) { + [strongSelf lock]; + block(strongSelf, key, object, fileURL); + [strongSelf unlock]; + } + }); +} + +- (void)removeObjectForKey:(NSString *)key block:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + NSURL *fileURL = nil; + [strongSelf removeObjectForKey:key fileURL:&fileURL]; + + if (block) { + [strongSelf lock]; + block(strongSelf, key, nil, fileURL); + [strongSelf unlock]; + } + }); +} + +- (void)trimToSize:(NSUInteger)trimByteCount block:(PINDiskCacheBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + [strongSelf trimToSize:trimByteCount]; + + if (block) { + [strongSelf lock]; + block(strongSelf); + [strongSelf unlock]; + } + }); +} + +- (void)trimToDate:(NSDate *)trimDate block:(PINDiskCacheBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + [strongSelf trimToDate:trimDate]; + + if (block) { + [strongSelf lock]; + block(strongSelf); + [strongSelf unlock]; + } + }); +} + +- (void)trimToSizeByDate:(NSUInteger)trimByteCount block:(PINDiskCacheBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + [strongSelf trimToSizeByDate:trimByteCount]; + + if (block) { + [strongSelf lock]; + block(strongSelf); + [strongSelf unlock]; + } + }); +} + +- (void)removeAllObjects:(PINDiskCacheBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + [strongSelf removeAllObjects]; + + if (block) { + [strongSelf lock]; + block(strongSelf); + [strongSelf unlock]; + } + }); +} + +- (void)enumerateObjectsWithBlock:(PINDiskCacheObjectBlock)block completionBlock:(PINDiskCacheBlock)completionBlock +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + [strongSelf enumerateObjectsWithBlock:block]; + + if (completionBlock) { + [self lock]; + completionBlock(strongSelf); + [self unlock]; + } + }); +} + +#pragma mark - Public Synchronous Methods - + +- (void)synchronouslyLockFileAccessWhileExecutingBlock:(void(^)(PINDiskCache *diskCache))block +{ + if (block) { + [self lock]; + block(self); + [self unlock]; + } +} + +- (__nullable id)objectForKey:(NSString *)key +{ + return [self objectForKey:key fileURL:nil]; +} + +- (__nullable id )objectForKey:(NSString *)key fileURL:(NSURL **)outFileURL +{ + NSDate *now = [[NSDate alloc] init]; + + if (!key) + return nil; + + id object = nil; + NSURL *fileURL = nil; + + [self lock]; + fileURL = [self encodedFileURLForKey:key]; + object = nil; + + if ([[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]] && + // If the cache should behave like a TTL cache, then only fetch the object if there's a valid ageLimit and the object is still alive + (!self->_ttlCache || self->_ageLimit <= 0 || fabs([[_dates objectForKey:key] timeIntervalSinceDate:now]) < self->_ageLimit)) { + @try { + object = [NSKeyedUnarchiver unarchiveObjectWithFile:[fileURL path]]; + } + @catch (NSException *exception) { + NSError *error = nil; + [[NSFileManager defaultManager] removeItemAtPath:[fileURL path] error:&error]; + PINDiskCacheError(error); + } + if (!self->_ttlCache) { + [self setFileModificationDate:now forURL:fileURL]; + } + } + [self unlock]; + + if (outFileURL) { + *outFileURL = fileURL; + } + + return object; +} + +- (NSURL *)fileURLForKey:(NSString *)key +{ + NSDate *now = [[NSDate alloc] init]; + + if (!key) + return nil; + + NSURL *fileURL = nil; + + [self lock]; + fileURL = [self encodedFileURLForKey:key]; + + if ([[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]]) { + // Don't update the file modification time, if self is a ttlCache + if (!self->_ttlCache) { + [self setFileModificationDate:now forURL:fileURL]; + } + } else { + fileURL = nil; + } + [self unlock]; + return fileURL; +} + +- (void)setObject:(id )object forKey:(NSString *)key +{ + [self setObject:object forKey:key fileURL:nil]; +} + +- (void)setObject:(id )object forKey:(NSString *)key fileURL:(NSURL **)outFileURL +{ + NSDate *now = [[NSDate alloc] init]; + + if (!key || !object) + return; + + PINBackgroundTask *task = [PINBackgroundTask start]; + + NSURL *fileURL = nil; + + [self lock]; + fileURL = [self encodedFileURLForKey:key]; + + if (self->_willAddObjectBlock) + self->_willAddObjectBlock(self, key, object, fileURL); + + BOOL written = [NSKeyedArchiver archiveRootObject:object toFile:[fileURL path]]; + + if (written) { + [self setFileModificationDate:now forURL:fileURL]; + + NSError *error = nil; + NSDictionary *values = [fileURL resourceValuesForKeys:@[ NSURLTotalFileAllocatedSizeKey ] error:&error]; + PINDiskCacheError(error); + + NSNumber *diskFileSize = [values objectForKey:NSURLTotalFileAllocatedSizeKey]; + if (diskFileSize) { + NSNumber *prevDiskFileSize = [self->_sizes objectForKey:key]; + if (prevDiskFileSize) { + self.byteCount = self->_byteCount - [prevDiskFileSize unsignedIntegerValue]; + } + [self->_sizes setObject:diskFileSize forKey:key]; + self.byteCount = self->_byteCount + [diskFileSize unsignedIntegerValue]; // atomic + } + + if (self->_byteLimit > 0 && self->_byteCount > self->_byteLimit) + [self trimToSizeByDate:self->_byteLimit block:nil]; + } else { + fileURL = nil; + } + + if (self->_didAddObjectBlock) + self->_didAddObjectBlock(self, key, object, written ? fileURL : nil); + [self unlock]; + + if (outFileURL) { + *outFileURL = fileURL; + } + + [task end]; +} + +- (void)removeObjectForKey:(NSString *)key +{ + [self removeObjectForKey:key fileURL:nil]; +} + +- (void)removeObjectForKey:(NSString *)key fileURL:(NSURL **)outFileURL +{ + if (!key) + return; + + PINBackgroundTask *task = [PINBackgroundTask start]; + + NSURL *fileURL = nil; + + [self lock]; + fileURL = [self encodedFileURLForKey:key]; + [self removeFileAndExecuteBlocksForKey:key]; + [self unlock]; + + [task end]; + + if (outFileURL) { + *outFileURL = fileURL; + } +} + +- (void)trimToSize:(NSUInteger)trimByteCount +{ + if (trimByteCount == 0) { + [self removeAllObjects]; + return; + } + + PINBackgroundTask *task = [PINBackgroundTask start]; + + [self lock]; + [self trimDiskToSize:trimByteCount]; + [self unlock]; + + [task end]; +} + +- (void)trimToDate:(NSDate *)trimDate +{ + if (!trimDate) + return; + + if ([trimDate isEqualToDate:[NSDate distantPast]]) { + [self removeAllObjects]; + return; + } + + PINBackgroundTask *task = [PINBackgroundTask start]; + + [self lock]; + [self trimDiskToDate:trimDate]; + [self unlock]; + + [task end]; +} + +- (void)trimToSizeByDate:(NSUInteger)trimByteCount +{ + if (trimByteCount == 0) { + [self removeAllObjects]; + return; + } + + PINBackgroundTask *task = [PINBackgroundTask start]; + + [self lock]; + [self trimDiskToSizeByDate:trimByteCount]; + [self unlock]; + + [task end]; +} + +- (void)removeAllObjects +{ + PINBackgroundTask *task = [PINBackgroundTask start]; + + [self lock]; + if (self->_willRemoveAllObjectsBlock) + self->_willRemoveAllObjectsBlock(self); + + [PINDiskCache moveItemAtURLToTrash:self->_cacheURL]; + [PINDiskCache emptyTrash]; + + [self createCacheDirectory]; + + [self->_dates removeAllObjects]; + [self->_sizes removeAllObjects]; + self.byteCount = 0; // atomic + + if (self->_didRemoveAllObjectsBlock) + self->_didRemoveAllObjectsBlock(self); + [self unlock]; + + [task end]; +} + +- (void)enumerateObjectsWithBlock:(PINDiskCacheObjectBlock)block +{ + if (!block) + return; + + PINBackgroundTask *task = [PINBackgroundTask start]; + + [self lock]; + NSDate *now = [NSDate date]; + NSArray *keysSortedByDate = [self->_dates keysSortedByValueUsingSelector:@selector(compare:)]; + + for (NSString *key in keysSortedByDate) { + NSURL *fileURL = [self encodedFileURLForKey:key]; + // If the cache should behave like a TTL cache, then only fetch the object if there's a valid ageLimit and the object is still alive + if (!self->_ttlCache || self->_ageLimit <= 0 || fabs([[_dates objectForKey:key] timeIntervalSinceDate:now]) < self->_ageLimit) { + block(self, key, nil, fileURL); + } + } + [self unlock]; + + [task end]; +} + +#pragma mark - Public Thread Safe Accessors - + +- (PINDiskCacheObjectBlock)willAddObjectBlock +{ + PINDiskCacheObjectBlock block = nil; + + [self lock]; + block = _willAddObjectBlock; + [self unlock]; + + return block; +} + +- (void)setWillAddObjectBlock:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + [strongSelf lock]; + strongSelf->_willAddObjectBlock = [block copy]; + [strongSelf unlock]; + }); +} + +- (PINDiskCacheObjectBlock)willRemoveObjectBlock +{ + PINDiskCacheObjectBlock block = nil; + + [self lock]; + block = _willRemoveObjectBlock; + [self unlock]; + + return block; +} + +- (void)setWillRemoveObjectBlock:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_willRemoveObjectBlock = [block copy]; + [strongSelf unlock]; + }); +} + +- (PINDiskCacheBlock)willRemoveAllObjectsBlock +{ + PINDiskCacheBlock block = nil; + + [self lock]; + block = _willRemoveAllObjectsBlock; + [self unlock]; + + return block; +} + +- (void)setWillRemoveAllObjectsBlock:(PINDiskCacheBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_willRemoveAllObjectsBlock = [block copy]; + [strongSelf unlock]; + }); +} + +- (PINDiskCacheObjectBlock)didAddObjectBlock +{ + PINDiskCacheObjectBlock block = nil; + + [self lock]; + block = _didAddObjectBlock; + [self unlock]; + + return block; +} + +- (void)setDidAddObjectBlock:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_didAddObjectBlock = [block copy]; + [strongSelf unlock]; + }); +} + +- (PINDiskCacheObjectBlock)didRemoveObjectBlock +{ + PINDiskCacheObjectBlock block = nil; + + [self lock]; + block = _didRemoveObjectBlock; + [self unlock]; + + return block; +} + +- (void)setDidRemoveObjectBlock:(PINDiskCacheObjectBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_didRemoveObjectBlock = [block copy]; + [strongSelf unlock]; + }); +} + +- (PINDiskCacheBlock)didRemoveAllObjectsBlock +{ + PINDiskCacheBlock block = nil; + + [self lock]; + block = _didRemoveAllObjectsBlock; + [self unlock]; + + return block; +} + +- (void)setDidRemoveAllObjectsBlock:(PINDiskCacheBlock)block +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_didRemoveAllObjectsBlock = [block copy]; + [strongSelf unlock]; + }); +} + +- (NSUInteger)byteLimit +{ + NSUInteger byteLimit; + + [self lock]; + byteLimit = _byteLimit; + [self unlock]; + + return byteLimit; +} + +- (void)setByteLimit:(NSUInteger)byteLimit +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_byteLimit = byteLimit; + + if (byteLimit > 0) + [strongSelf trimDiskToSizeByDate:byteLimit]; + [strongSelf unlock]; + }); +} + +- (NSTimeInterval)ageLimit +{ + NSTimeInterval ageLimit; + + [self lock]; + ageLimit = _ageLimit; + [self unlock]; + + return ageLimit; +} + +- (void)setAgeLimit:(NSTimeInterval)ageLimit +{ + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_ageLimit = ageLimit; + [strongSelf unlock]; + + [strongSelf trimToAgeLimitRecursively]; + }); +} + +- (BOOL)isTTLCache { + BOOL isTTLCache; + + [self lock]; + isTTLCache = _ttlCache; + [self unlock]; + + return isTTLCache; +} + +- (void)setTtlCache:(BOOL)ttlCache { + __weak PINDiskCache *weakSelf = self; + + dispatch_async(_asyncQueue, ^{ + PINDiskCache *strongSelf = weakSelf; + if (!strongSelf) + return; + + [strongSelf lock]; + strongSelf->_ttlCache = ttlCache; + [strongSelf unlock]; + }); +} + +- (void)lock +{ + dispatch_semaphore_wait(_lockSemaphore, DISPATCH_TIME_FOREVER); +} + +- (void)unlock +{ + dispatch_semaphore_signal(_lockSemaphore); +} + +@end + +@implementation PINBackgroundTask + ++ (BOOL)isAppExtension { + + static BOOL isExtension; + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, ^{ + NSDictionary *extensionDictionary = [[NSBundle mainBundle] infoDictionary][@"NSExtension"]; + isExtension = [extensionDictionary isKindOfClass:[NSDictionary class]]; + }); + + return isExtension; +} + +- (instancetype)init +{ + if (self = [super init]) { +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 && !TARGET_OS_WATCH + _taskID = UIBackgroundTaskInvalid; +#endif + } + return self; +} + ++ (instancetype)start +{ + PINBackgroundTask *task = nil; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 && !TARGET_OS_WATCH + if ([self.class isAppExtension]) { + return task; + } + + task = [[self alloc] init]; + + UIApplication *sharedApplication = [UIApplication performSelector:@selector(sharedApplication)]; + task.taskID = [sharedApplication beginBackgroundTaskWithExpirationHandler:^{ + UIBackgroundTaskIdentifier taskID = task.taskID; + task.taskID = UIBackgroundTaskInvalid; + [sharedApplication endBackgroundTask:taskID]; + }]; +#endif + + return task; +} + +- (void)end +{ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 && !TARGET_OS_WATCH + if ([self.class isAppExtension]) { + return; + } + + UIBackgroundTaskIdentifier taskID = self.taskID; + self.taskID = UIBackgroundTaskInvalid; + + UIApplication *sharedApplication = [UIApplication performSelector:@selector(sharedApplication)]; + [sharedApplication endBackgroundTask:taskID]; +#endif +} + +@end diff --git a/Pods/PINCache/PINCache/PINMemoryCache.h b/Pods/PINCache/PINCache/PINMemoryCache.h new file mode 100644 index 0000000..f0b244c --- /dev/null +++ b/Pods/PINCache/PINCache/PINMemoryCache.h @@ -0,0 +1,334 @@ +// PINCache is a modified version of TMCache +// Modifications by Garrett Moon +// Copyright (c) 2015 Pinterest. All rights reserved. + +#import +#import "Nullability.h" + +NS_ASSUME_NONNULL_BEGIN + +@class PINMemoryCache; + +/** + A callback block which provides only the cache as an argument + */ + +typedef void (^PINMemoryCacheBlock)(PINMemoryCache *cache); + +/** + A callback block which provides the cache, key and object as arguments + */ +typedef void (^PINMemoryCacheObjectBlock)(PINMemoryCache *cache, NSString *key, id __nullable object); + +/** + `PINMemoryCache` is a fast, thread safe key/value store similar to `NSCache`. On iOS it will clear itself + automatically to reduce memory usage when the app receives a memory warning or goes into the background. + + Access is natively synchronous. Asynchronous variations are provided. Every asynchronous method accepts a + callback block that runs on a concurrent , with cache reads and writes protected by an semaphore. + + All access to the cache is dated so the that the least-used objects can be trimmed first. Setting an + optional will trigger a GCD timer to periodically to trim the cache to that age. + + Objects can optionally be set with a "cost", which could be a byte count or any other meaningful integer. + Setting a will automatically keep the cache below that value with . + + Values will not persist after application relaunch or returning from the background. See for + a memory cache backed by a disk cache. + */ + +@interface PINMemoryCache : NSObject + +#pragma mark - +/// @name Core + +/** + A concurrent queue on which all callbacks are called. It is exposed here so that it can be set to + target some other queue, such as a global concurrent queue with a priority other than the default. + */ +@property (readonly) dispatch_queue_t concurrentQueue; + +/** + The total accumulated cost. + */ +@property (readonly) NSUInteger totalCost; + +/** + The maximum cost allowed to accumulate before objects begin to be removed with . + */ +@property (assign) NSUInteger costLimit; + +/** + The maximum number of seconds an object is allowed to exist in the cache. Setting this to a value + greater than `0.0` will start a recurring GCD timer with the same period that calls . + Setting it back to `0.0` will stop the timer. Defaults to `0.0`. + */ +@property (assign) NSTimeInterval ageLimit; + +/** + If ttlCache is YES, the cache behaves like a ttlCache. This means that once an object enters the + cache, it only lives as long as self.ageLimit. This has the following implications: + - Accessing an object in the cache does not extend that object's lifetime in the cache + - When attempting to access an object in the cache that has lived longer than self.ageLimit, + the cache will behave as if the object does not exist + + */ +@property (nonatomic, assign, getter=isTTLCache) BOOL ttlCache; + +/** + When `YES` on iOS the cache will remove all objects when the app receives a memory warning. + Defaults to `YES`. + */ +@property (assign) BOOL removeAllObjectsOnMemoryWarning; + +/** + When `YES` on iOS the cache will remove all objects when the app enters the background. + Defaults to `YES`. + */ +@property (assign) BOOL removeAllObjectsOnEnteringBackground; + +#pragma mark - +/// @name Event Blocks + +/** + A block to be executed just before an object is added to the cache. This block will be excuted within + a lock, i.e. all reads and writes are suspended for the duration of the block. + Calling synchronous methods on the cache within this callback will likely cause a deadlock. + */ +@property (copy) PINMemoryCacheObjectBlock __nullable willAddObjectBlock; + +/** + A block to be executed just before an object is removed from the cache. This block will be excuted + within a lock, i.e. all reads and writes are suspended for the duration of the block. + Calling synchronous methods on the cache within this callback will likely cause a deadlock. + */ +@property (copy) PINMemoryCacheObjectBlock __nullable willRemoveObjectBlock; + +/** + A block to be executed just before all objects are removed from the cache as a result of . + This block will be excuted within a lock, i.e. all reads and writes are suspended for the duration of the block. + Calling synchronous methods on the cache within this callback will likely cause a deadlock. + */ +@property (copy) PINMemoryCacheBlock __nullable willRemoveAllObjectsBlock; + +/** + A block to be executed just after an object is added to the cache. This block will be excuted within + a lock, i.e. all reads and writes are suspended for the duration of the block. + Calling synchronous methods on the cache within this callback will likely cause a deadlock. + */ +@property (copy) PINMemoryCacheObjectBlock __nullable didAddObjectBlock; + +/** + A block to be executed just after an object is removed from the cache. This block will be excuted + within a lock, i.e. all reads and writes are suspended for the duration of the block. + Calling synchronous methods on the cache within this callback will likely cause a deadlock. + */ +@property (copy) PINMemoryCacheObjectBlock __nullable didRemoveObjectBlock; + +/** + A block to be executed just after all objects are removed from the cache as a result of . + This block will be excuted within a lock, i.e. all reads and writes are suspended for the duration of the block. + Calling synchronous methods on the cache within this callback will likely cause a deadlock. + */ +@property (copy) PINMemoryCacheBlock __nullable didRemoveAllObjectsBlock; + +/** + A block to be executed upon receiving a memory warning (iOS only) potentially in parallel with other blocks on the . + This block will be executed regardless of the value of . Defaults to `nil`. + */ +@property (copy) PINMemoryCacheBlock __nullable didReceiveMemoryWarningBlock; + +/** + A block to be executed when the app enters the background (iOS only) potentially in parallel with other blocks on the . + This block will be executed regardless of the value of . Defaults to `nil`. + */ +@property (copy) PINMemoryCacheBlock __nullable didEnterBackgroundBlock; + +#pragma mark - +/// @name Shared Cache + +/** + A shared cache. + + @result The shared singleton cache instance. + */ ++ (instancetype)sharedCache; + +#pragma mark - +/// @name Asynchronous Methods + +/** + Retrieves the object for the specified key. This method returns immediately and executes the passed + block after the object is available, potentially in parallel with other blocks on the . + + @param key The key associated with the requested object. + @param block A block to be executed concurrently when the object is available. + */ +- (void)objectForKey:(NSString *)key block:(nullable PINMemoryCacheObjectBlock)block; + +/** + Stores an object in the cache for the specified key. This method returns immediately and executes the + passed block after the object has been stored, potentially in parallel with other blocks on the . + + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + @param block A block to be executed concurrently after the object has been stored, or nil. + */ +- (void)setObject:(id)object forKey:(NSString *)key block:(nullable PINMemoryCacheObjectBlock)block; + +/** + Stores an object in the cache for the specified key and the specified cost. If the cost causes the total + to go over the the cache is trimmed (oldest objects first). This method returns immediately + and executes the passed block after the object has been stored, potentially in parallel with other blocks + on the . + + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + @param cost An amount to add to the . + @param block A block to be executed concurrently after the object has been stored, or nil. + */ +- (void)setObject:(id)object forKey:(NSString *)key withCost:(NSUInteger)cost block:(nullable PINMemoryCacheObjectBlock)block; + +/** + Removes the object for the specified key. This method returns immediately and executes the passed + block after the object has been removed, potentially in parallel with other blocks on the . + + @param key The key associated with the object to be removed. + @param block A block to be executed concurrently after the object has been removed, or nil. + */ +- (void)removeObjectForKey:(NSString *)key block:(nullable PINMemoryCacheObjectBlock)block; + +/** + Removes all objects from the cache that have not been used since the specified date. + This method returns immediately and executes the passed block after the cache has been trimmed, + potentially in parallel with other blocks on the . + + @param date Objects that haven't been accessed since this date are removed from the cache. + @param block A block to be executed concurrently after the cache has been trimmed, or nil. + */ +- (void)trimToDate:(NSDate *)date block:(nullable PINMemoryCacheBlock)block; + +/** + Removes objects from the cache, costliest objects first, until the is below the specified + value. This method returns immediately and executes the passed block after the cache has been trimmed, + potentially in parallel with other blocks on the . + + @param cost The total accumulation allowed to remain after the cache has been trimmed. + @param block A block to be executed concurrently after the cache has been trimmed, or nil. + */ +- (void)trimToCost:(NSUInteger)cost block:(nullable PINMemoryCacheBlock)block; + +/** + Removes objects from the cache, ordered by date (least recently used first), until the is below + the specified value. This method returns immediately and executes the passed block after the cache has been + trimmed, potentially in parallel with other blocks on the . + + @param cost The total accumulation allowed to remain after the cache has been trimmed. + @param block A block to be executed concurrently after the cache has been trimmed, or nil. + */ +- (void)trimToCostByDate:(NSUInteger)cost block:(nullable PINMemoryCacheBlock)block; + +/** + Removes all objects from the cache. This method returns immediately and executes the passed block after + the cache has been cleared, potentially in parallel with other blocks on the . + + @param block A block to be executed concurrently after the cache has been cleared, or nil. + */ +- (void)removeAllObjects:(nullable PINMemoryCacheBlock)block; + +/** + Loops through all objects in the cache with reads and writes suspended. Calling serial methods which + write to the cache inside block may be unsafe and may result in a deadlock. This method returns immediately. + + @param block A block to be executed for every object in the cache. + @param completionBlock An optional block to be executed concurrently when the enumeration is complete. + */ +- (void)enumerateObjectsWithBlock:(PINMemoryCacheObjectBlock)block completionBlock:(nullable PINMemoryCacheBlock)completionBlock; + +#pragma mark - +/// @name Synchronous Methods + +/** + Retrieves the object for the specified key. This method blocks the calling thread until the + object is available. + + @see objectForKey:block: + @param key The key associated with the object. + @result The object for the specified key. + */ +- (__nullable id)objectForKey:(nullable NSString *)key; + +/** + Stores an object in the cache for the specified key. This method blocks the calling thread until the object + has been set. + + @see setObject:forKey:block: + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + */ +- (void)setObject:(id)object forKey:(NSString *)key; + +/** + Stores an object in the cache for the specified key and the specified cost. If the cost causes the total + to go over the the cache is trimmed (oldest objects first). This method blocks the calling thread + until the object has been stored. + + @param object An object to store in the cache. + @param key A key to associate with the object. This string will be copied. + @param cost An amount to add to the . + */ +- (void)setObject:(nullable id)object forKey:(nullable NSString *)key withCost:(NSUInteger)cost; + +/** + Removes the object for the specified key. This method blocks the calling thread until the object + has been removed. + + @param key The key associated with the object to be removed. + */ +- (void)removeObjectForKey:(nullable NSString *)key; + +/** + Removes all objects from the cache that have not been used since the specified date. + This method blocks the calling thread until the cache has been trimmed. + + @param date Objects that haven't been accessed since this date are removed from the cache. + */ +- (void)trimToDate:(nullable NSDate *)date; + +/** + Removes objects from the cache, costliest objects first, until the is below the specified + value. This method blocks the calling thread until the cache has been trimmed. + + @param cost The total accumulation allowed to remain after the cache has been trimmed. + */ +- (void)trimToCost:(NSUInteger)cost; + +/** + Removes objects from the cache, ordered by date (least recently used first), until the is below + the specified value. This method blocks the calling thread until the cache has been trimmed. + + @param cost The total accumulation allowed to remain after the cache has been trimmed. + */ +- (void)trimToCostByDate:(NSUInteger)cost; + +/** + Removes all objects from the cache. This method blocks the calling thread until the cache has been cleared. + */ +- (void)removeAllObjects; + +/** + Loops through all objects in the cache within a memory lock (reads and writes are suspended during the enumeration). + This method blocks the calling thread until all objects have been enumerated. + Calling synchronous methods on the cache within this callback will likely cause a deadlock. + + @param block A block to be executed for every object in the cache. + + @warning Do not call this method within the event blocks (, etc.) + Instead use the asynchronous version, . + + */ +- (void)enumerateObjectsWithBlock:(nullable PINMemoryCacheObjectBlock)block; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/PINCache/PINCache/PINMemoryCache.m b/Pods/PINCache/PINCache/PINMemoryCache.m new file mode 100644 index 0000000..63ea2ac --- /dev/null +++ b/Pods/PINCache/PINCache/PINMemoryCache.m @@ -0,0 +1,716 @@ +// PINCache is a modified version of TMCache +// Modifications by Garrett Moon +// Copyright (c) 2015 Pinterest. All rights reserved. + +#import "PINMemoryCache.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 +#import +#endif + +static NSString * const PINMemoryCachePrefix = @"com.pinterest.PINMemoryCache"; + +@interface PINMemoryCache () +#if OS_OBJECT_USE_OBJC +@property (strong, nonatomic) dispatch_queue_t concurrentQueue; +@property (strong, nonatomic) dispatch_semaphore_t lockSemaphore; +#else +@property (assign, nonatomic) dispatch_queue_t concurrentQueue; +@property (assign, nonatomic) dispatch_semaphore_t lockSemaphore; +#endif +@property (strong, nonatomic) NSMutableDictionary *dictionary; +@property (strong, nonatomic) NSMutableDictionary *dates; +@property (strong, nonatomic) NSMutableDictionary *costs; +@end + +@implementation PINMemoryCache + +@synthesize ageLimit = _ageLimit; +@synthesize costLimit = _costLimit; +@synthesize totalCost = _totalCost; +@synthesize ttlCache = _ttlCache; +@synthesize willAddObjectBlock = _willAddObjectBlock; +@synthesize willRemoveObjectBlock = _willRemoveObjectBlock; +@synthesize willRemoveAllObjectsBlock = _willRemoveAllObjectsBlock; +@synthesize didAddObjectBlock = _didAddObjectBlock; +@synthesize didRemoveObjectBlock = _didRemoveObjectBlock; +@synthesize didRemoveAllObjectsBlock = _didRemoveAllObjectsBlock; +@synthesize didReceiveMemoryWarningBlock = _didReceiveMemoryWarningBlock; +@synthesize didEnterBackgroundBlock = _didEnterBackgroundBlock; + +#pragma mark - Initialization - + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + #if !OS_OBJECT_USE_OBJC + dispatch_release(_concurrentQueue); + dispatch_release(_lockSemaphore); + _concurrentQueue = nil; + #endif +} + +- (instancetype)init +{ + if (self = [super init]) { + _lockSemaphore = dispatch_semaphore_create(1); + NSString *queueName = [[NSString alloc] initWithFormat:@"%@.%p", PINMemoryCachePrefix, self]; + _concurrentQueue = dispatch_queue_create([queueName UTF8String], DISPATCH_QUEUE_CONCURRENT); + + _dictionary = [[NSMutableDictionary alloc] init]; + _dates = [[NSMutableDictionary alloc] init]; + _costs = [[NSMutableDictionary alloc] init]; + + _willAddObjectBlock = nil; + _willRemoveObjectBlock = nil; + _willRemoveAllObjectsBlock = nil; + + _didAddObjectBlock = nil; + _didRemoveObjectBlock = nil; + _didRemoveAllObjectsBlock = nil; + + _didReceiveMemoryWarningBlock = nil; + _didEnterBackgroundBlock = nil; + + _ageLimit = 0.0; + _costLimit = 0; + _totalCost = 0; + + _removeAllObjectsOnMemoryWarning = YES; + _removeAllObjectsOnEnteringBackground = YES; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 && !TARGET_OS_WATCH + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didReceiveEnterBackgroundNotification:) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didReceiveMemoryWarningNotification:) + name:UIApplicationDidReceiveMemoryWarningNotification + object:nil]; + +#endif + } + return self; +} + ++ (instancetype)sharedCache +{ + static id cache; + static dispatch_once_t predicate; + + dispatch_once(&predicate, ^{ + cache = [[self alloc] init]; + }); + + return cache; +} + +#pragma mark - Private Methods - + +- (void)didReceiveMemoryWarningNotification:(NSNotification *)notification { + if (self.removeAllObjectsOnMemoryWarning) + [self removeAllObjects:nil]; + + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + + [strongSelf lock]; + PINMemoryCacheBlock didReceiveMemoryWarningBlock = strongSelf->_didReceiveMemoryWarningBlock; + [strongSelf unlock]; + + if (didReceiveMemoryWarningBlock) + didReceiveMemoryWarningBlock(strongSelf); + }); +} + +- (void)didReceiveEnterBackgroundNotification:(NSNotification *)notification +{ + if (self.removeAllObjectsOnEnteringBackground) + [self removeAllObjects:nil]; + + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + + [strongSelf lock]; + PINMemoryCacheBlock didEnterBackgroundBlock = strongSelf->_didEnterBackgroundBlock; + [strongSelf unlock]; + + if (didEnterBackgroundBlock) + didEnterBackgroundBlock(strongSelf); + }); +} + +- (void)removeObjectAndExecuteBlocksForKey:(NSString *)key +{ + [self lock]; + id object = _dictionary[key]; + NSNumber *cost = _costs[key]; + PINMemoryCacheObjectBlock willRemoveObjectBlock = _willRemoveObjectBlock; + PINMemoryCacheObjectBlock didRemoveObjectBlock = _didRemoveObjectBlock; + [self unlock]; + + if (willRemoveObjectBlock) + willRemoveObjectBlock(self, key, object); + + [self lock]; + if (cost) + _totalCost -= [cost unsignedIntegerValue]; + + [_dictionary removeObjectForKey:key]; + [_dates removeObjectForKey:key]; + [_costs removeObjectForKey:key]; + [self unlock]; + + if (didRemoveObjectBlock) + didRemoveObjectBlock(self, key, nil); +} + +- (void)trimMemoryToDate:(NSDate *)trimDate +{ + [self lock]; + NSArray *keysSortedByDate = [_dates keysSortedByValueUsingSelector:@selector(compare:)]; + NSDictionary *dates = [_dates copy]; + [self unlock]; + + for (NSString *key in keysSortedByDate) { // oldest objects first + NSDate *accessDate = dates[key]; + if (!accessDate) + continue; + + if ([accessDate compare:trimDate] == NSOrderedAscending) { // older than trim date + [self removeObjectAndExecuteBlocksForKey:key]; + } else { + break; + } + } +} + +- (void)trimToCostLimit:(NSUInteger)limit +{ + NSUInteger totalCost = 0; + + [self lock]; + totalCost = _totalCost; + NSArray *keysSortedByCost = [_costs keysSortedByValueUsingSelector:@selector(compare:)]; + [self unlock]; + + if (totalCost <= limit) { + return; + } + + for (NSString *key in [keysSortedByCost reverseObjectEnumerator]) { // costliest objects first + [self removeObjectAndExecuteBlocksForKey:key]; + + [self lock]; + totalCost = _totalCost; + [self unlock]; + + if (totalCost <= limit) + break; + } +} + +- (void)trimToCostLimitByDate:(NSUInteger)limit +{ + NSUInteger totalCost = 0; + + [self lock]; + totalCost = _totalCost; + NSArray *keysSortedByDate = [_dates keysSortedByValueUsingSelector:@selector(compare:)]; + [self unlock]; + + if (totalCost <= limit) + return; + + for (NSString *key in keysSortedByDate) { // oldest objects first + [self removeObjectAndExecuteBlocksForKey:key]; + + [self lock]; + totalCost = _totalCost; + [self unlock]; + if (totalCost <= limit) + break; + } +} + +- (void)trimToAgeLimitRecursively +{ + [self lock]; + NSTimeInterval ageLimit = _ageLimit; + [self unlock]; + + if (ageLimit == 0.0) + return; + + NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:-ageLimit]; + + [self trimMemoryToDate:date]; + + __weak PINMemoryCache *weakSelf = self; + + dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ageLimit * NSEC_PER_SEC)); + dispatch_after(time, _concurrentQueue, ^(void){ + PINMemoryCache *strongSelf = weakSelf; + + [strongSelf trimToAgeLimitRecursively]; + }); +} + +#pragma mark - Public Asynchronous Methods - + +- (void)objectForKey:(NSString *)key block:(PINMemoryCacheObjectBlock)block +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + id object = [strongSelf objectForKey:key]; + + if (block) + block(strongSelf, key, object); + }); +} + +- (void)setObject:(id)object forKey:(NSString *)key block:(PINMemoryCacheObjectBlock)block +{ + [self setObject:object forKey:key withCost:0 block:block]; +} + +- (void)setObject:(id)object forKey:(NSString *)key withCost:(NSUInteger)cost block:(PINMemoryCacheObjectBlock)block +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + [strongSelf setObject:object forKey:key withCost:cost]; + + if (block) + block(strongSelf, key, object); + }); +} + +- (void)removeObjectForKey:(NSString *)key block:(PINMemoryCacheObjectBlock)block +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + [strongSelf removeObjectForKey:key]; + + if (block) + block(strongSelf, key, nil); + }); +} + +- (void)trimToDate:(NSDate *)trimDate block:(PINMemoryCacheBlock)block +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + [strongSelf trimToDate:trimDate]; + + if (block) + block(strongSelf); + }); +} + +- (void)trimToCost:(NSUInteger)cost block:(PINMemoryCacheBlock)block +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + [strongSelf trimToCost:cost]; + + if (block) + block(strongSelf); + }); +} + +- (void)trimToCostByDate:(NSUInteger)cost block:(PINMemoryCacheBlock)block +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + [strongSelf trimToCostByDate:cost]; + + if (block) + block(strongSelf); + }); +} + +- (void)removeAllObjects:(PINMemoryCacheBlock)block +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + [strongSelf removeAllObjects]; + + if (block) + block(strongSelf); + }); +} + +- (void)enumerateObjectsWithBlock:(PINMemoryCacheObjectBlock)block completionBlock:(PINMemoryCacheBlock)completionBlock +{ + __weak PINMemoryCache *weakSelf = self; + + dispatch_async(_concurrentQueue, ^{ + PINMemoryCache *strongSelf = weakSelf; + [strongSelf enumerateObjectsWithBlock:block]; + + if (completionBlock) + completionBlock(strongSelf); + }); +} + +#pragma mark - Public Synchronous Methods - + +- (__nullable id)objectForKey:(NSString *)key +{ + if (!key) + return nil; + + NSDate *now = [[NSDate alloc] init]; + [self lock]; + id object = nil; + // If the cache should behave like a TTL cache, then only fetch the object if there's a valid ageLimit and the object is still alive + if (!self->_ttlCache || self->_ageLimit <= 0 || fabs([[_dates objectForKey:key] timeIntervalSinceDate:now]) < self->_ageLimit) { + object = _dictionary[key]; + } + [self unlock]; + + if (object) { + [self lock]; + _dates[key] = now; + [self unlock]; + } + + return object; +} + +- (void)setObject:(id)object forKey:(NSString *)key +{ + [self setObject:object forKey:key withCost:0]; +} + +- (void)setObject:(id)object forKey:(NSString *)key withCost:(NSUInteger)cost +{ + if (!key || !object) + return; + + [self lock]; + PINMemoryCacheObjectBlock willAddObjectBlock = _willAddObjectBlock; + PINMemoryCacheObjectBlock didAddObjectBlock = _didAddObjectBlock; + NSUInteger costLimit = _costLimit; + [self unlock]; + + if (willAddObjectBlock) + willAddObjectBlock(self, key, object); + + [self lock]; + _dictionary[key] = object; + _dates[key] = [[NSDate alloc] init]; + _costs[key] = @(cost); + + _totalCost += cost; + [self unlock]; + + if (didAddObjectBlock) + didAddObjectBlock(self, key, object); + + if (costLimit > 0) + [self trimToCostByDate:costLimit]; +} + +- (void)removeObjectForKey:(NSString *)key +{ + if (!key) + return; + + [self removeObjectAndExecuteBlocksForKey:key]; +} + +- (void)trimToDate:(NSDate *)trimDate +{ + if (!trimDate) + return; + + if ([trimDate isEqualToDate:[NSDate distantPast]]) { + [self removeAllObjects]; + return; + } + + [self trimMemoryToDate:trimDate]; +} + +- (void)trimToCost:(NSUInteger)cost +{ + [self trimToCostLimit:cost]; +} + +- (void)trimToCostByDate:(NSUInteger)cost +{ + [self trimToCostLimitByDate:cost]; +} + +- (void)removeAllObjects +{ + [self lock]; + PINMemoryCacheBlock willRemoveAllObjectsBlock = _willRemoveAllObjectsBlock; + PINMemoryCacheBlock didRemoveAllObjectsBlock = _didRemoveAllObjectsBlock; + [self unlock]; + + if (willRemoveAllObjectsBlock) + willRemoveAllObjectsBlock(self); + + [self lock]; + [_dictionary removeAllObjects]; + [_dates removeAllObjects]; + [_costs removeAllObjects]; + + _totalCost = 0; + [self unlock]; + + if (didRemoveAllObjectsBlock) + didRemoveAllObjectsBlock(self); + +} + +- (void)enumerateObjectsWithBlock:(PINMemoryCacheObjectBlock)block +{ + if (!block) + return; + + [self lock]; + NSDate *now = [[NSDate alloc] init]; + NSArray *keysSortedByDate = [_dates keysSortedByValueUsingSelector:@selector(compare:)]; + + for (NSString *key in keysSortedByDate) { + // If the cache should behave like a TTL cache, then only fetch the object if there's a valid ageLimit and the object is still alive + if (!self->_ttlCache || self->_ageLimit <= 0 || fabs([[_dates objectForKey:key] timeIntervalSinceDate:now]) < self->_ageLimit) { + block(self, key, _dictionary[key]); + } + } + [self unlock]; +} + +#pragma mark - Public Thread Safe Accessors - + +- (PINMemoryCacheObjectBlock)willAddObjectBlock +{ + [self lock]; + PINMemoryCacheObjectBlock block = _willAddObjectBlock; + [self unlock]; + + return block; +} + +- (void)setWillAddObjectBlock:(PINMemoryCacheObjectBlock)block +{ + [self lock]; + _willAddObjectBlock = [block copy]; + [self unlock]; +} + +- (PINMemoryCacheObjectBlock)willRemoveObjectBlock +{ + [self lock]; + PINMemoryCacheObjectBlock block = _willRemoveObjectBlock; + [self unlock]; + + return block; +} + +- (void)setWillRemoveObjectBlock:(PINMemoryCacheObjectBlock)block +{ + [self lock]; + _willRemoveObjectBlock = [block copy]; + [self unlock]; +} + +- (PINMemoryCacheBlock)willRemoveAllObjectsBlock +{ + [self lock]; + PINMemoryCacheBlock block = _willRemoveAllObjectsBlock; + [self unlock]; + + return block; +} + +- (void)setWillRemoveAllObjectsBlock:(PINMemoryCacheBlock)block +{ + [self lock]; + _willRemoveAllObjectsBlock = [block copy]; + [self unlock]; +} + +- (PINMemoryCacheObjectBlock)didAddObjectBlock +{ + [self lock]; + PINMemoryCacheObjectBlock block = _didAddObjectBlock; + [self unlock]; + + return block; +} + +- (void)setDidAddObjectBlock:(PINMemoryCacheObjectBlock)block +{ + [self lock]; + _didAddObjectBlock = [block copy]; + [self unlock]; +} + +- (PINMemoryCacheObjectBlock)didRemoveObjectBlock +{ + [self lock]; + PINMemoryCacheObjectBlock block = _didRemoveObjectBlock; + [self unlock]; + + return block; +} + +- (void)setDidRemoveObjectBlock:(PINMemoryCacheObjectBlock)block +{ + [self lock]; + _didRemoveObjectBlock = [block copy]; + [self unlock]; +} + +- (PINMemoryCacheBlock)didRemoveAllObjectsBlock +{ + [self lock]; + PINMemoryCacheBlock block = _didRemoveAllObjectsBlock; + [self unlock]; + + return block; +} + +- (void)setDidRemoveAllObjectsBlock:(PINMemoryCacheBlock)block +{ + [self lock]; + _didRemoveAllObjectsBlock = [block copy]; + [self unlock]; +} + +- (PINMemoryCacheBlock)didReceiveMemoryWarningBlock +{ + [self lock]; + PINMemoryCacheBlock block = _didReceiveMemoryWarningBlock; + [self unlock]; + + return block; +} + +- (void)setDidReceiveMemoryWarningBlock:(PINMemoryCacheBlock)block +{ + [self lock]; + _didReceiveMemoryWarningBlock = [block copy]; + [self unlock]; +} + +- (PINMemoryCacheBlock)didEnterBackgroundBlock +{ + [self lock]; + PINMemoryCacheBlock block = _didEnterBackgroundBlock; + [self unlock]; + + return block; +} + +- (void)setDidEnterBackgroundBlock:(PINMemoryCacheBlock)block +{ + [self lock]; + _didEnterBackgroundBlock = [block copy]; + [self unlock]; +} + +- (NSTimeInterval)ageLimit +{ + [self lock]; + NSTimeInterval ageLimit = _ageLimit; + [self unlock]; + + return ageLimit; +} + +- (void)setAgeLimit:(NSTimeInterval)ageLimit +{ + [self lock]; + _ageLimit = ageLimit; + [self unlock]; + + [self trimToAgeLimitRecursively]; +} + +- (NSUInteger)costLimit +{ + [self lock]; + NSUInteger costLimit = _costLimit; + [self unlock]; + + return costLimit; +} + +- (void)setCostLimit:(NSUInteger)costLimit +{ + [self lock]; + _costLimit = costLimit; + [self unlock]; + + if (costLimit > 0) + [self trimToCostLimitByDate:costLimit]; +} + +- (NSUInteger)totalCost +{ + [self lock]; + NSUInteger cost = _totalCost; + [self unlock]; + + return cost; +} + +- (BOOL)isTTLCache { + BOOL isTTLCache; + + [self lock]; + isTTLCache = _ttlCache; + [self unlock]; + + return isTTLCache; +} + +- (void)setTtlCache:(BOOL)ttlCache { + [self lock]; + _ttlCache = ttlCache; + [self unlock]; +} + + +- (void)lock +{ + dispatch_semaphore_wait(_lockSemaphore, DISPATCH_TIME_FOREVER); +} + +- (void)unlock +{ + dispatch_semaphore_signal(_lockSemaphore); +} + +@end diff --git a/Pods/PINCache/README.md b/Pods/PINCache/README.md new file mode 100644 index 0000000..071f1ea --- /dev/null +++ b/Pods/PINCache/README.md @@ -0,0 +1,75 @@ +# PINCache + +[![CocoaPods](https://img.shields.io/cocoapods/v/PINCache.svg)](http://cocoadocs.org/docsets/PINCache/) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + +## Fast, non-deadlocking parallel object cache for iOS and OS X. + +[PINCache](PINCache/PINCache.h) is a fork of [TMCache](https://github.com/tumblr/TMCache) re-architected to fix issues with deadlocking caused by heavy use. It is a key/value store designed for persisting temporary objects that are expensive to reproduce, such as downloaded data or the results of slow processing. It is comprised of two self-similar stores, one in memory ([PINMemoryCache](PINCache/PINMemoryCache.h)) and one on disk ([PINDiskCache](PINCache/PINDiskCache.h)), all backed by GCD and safe to access from multiple threads simultaneously. On iOS, `PINMemoryCache` will clear itself when the app receives a memory warning or goes into the background. Objects stored in `PINDiskCache` remain until you trim the cache yourself, either manually or by setting a byte or age limit. + +`PINCache` and `PINDiskCache` accept any object conforming to [NSCoding](https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html). Put things in like this: + +```objective-c +UIImage *img = [[UIImage alloc] initWithData:data scale:[[UIScreen mainScreen] scale]]; +[[PINCache sharedCache] setObject:img forKey:@"image" block:nil]; // returns immediately +``` + +Get them back out like this: + +```objective-c +[[PINCache sharedCache] objectForKey:@"image" + block:^(PINCache *cache, NSString *key, id object) { + UIImage *image = (UIImage *)object; + NSLog(@"image scale: %f", image.scale); + }]; +``` + +Both `PINMemoryCache` and PINDiskCache use locks to protect reads and writes. `PINCache` coordinates them so that objects added to memory are available immediately to other threads while being written to disk safely in the background. Both caches are public properties of `PINCache`, so it's easy to manipulate one or the other separately if necessary. + +Collections work too. Thanks to the magic of `NSKeyedArchiver`, objects repeated in a collection only occupy the space of one on disk: + +```objective-c +NSArray *images = @[ image, image, image ]; +[[PINCache sharedCache] setObject:images forKey:@"images"]; +NSLog(@"3 for the price of 1: %d", [[[PINCache sharedCache] diskCache] byteCount]); +``` + +## Installation + +### Manually + +[Download the latest tag](https://github.com/pinterest/PINCache/tags) and drag the `PINCache` folder into your Xcode project. + +Install the docs by double clicking the `.docset` file under `docs/`, or view them online at [cocoadocs.org](http://cocoadocs.org/docsets/PINCache/) + +### Git Submodule + + git submodule add https://github.com/pinterest/PINCache.git + git submodule update --init + +### CocoaPods + +Add [PINCache](http://cocoapods.org/?q=name%3APINCache) to your `Podfile` and run `pod install`. + +### Carthage + +Add the following line to your `Cartfile` and run `carthage update --platform ios`. Then follow [this instruction of Carthage](https://github.com/carthage/carthage#adding-frameworks-to-unit-tests-or-a-framework) to embed the framework. + +```github "pinterest/PINCache"``` + +## Requirements + +__PINCache__ requires iOS 5.0 or OS X 10.7 and greater. + +## Contact + +[Garrett Moon](mailto:garrett@pinterest.com) + +## License + +Copyright 2013 Tumblr, Inc. +Copyright 2015 Pinterest, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. [See the License](LICENSE.txt) for the specific language governing permissions and limitations under the License. diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index e21226a..7a7b6cd 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,441 +7,505 @@ objects = { /* Begin PBXBuildFile section */ - 002035F09642FFA6A0067278CA90E921 /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6631A5868834D5EAD9B4C06769D85BBF /* CurrentThreadScheduler.swift */; }; - 0194A3C6BA7E3849AF54F050FA44958C /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A1E9C5A5BB0F5E0F446B23075582D9 /* DelaySubscription.swift */; }; - 01D2DD1C92EB87452CAF30B9367833C8 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C81BAAF645203FA593B6ECFAE22DCE9 /* NMBObjCMatcher.swift */; }; - 02A3ABCD3D778263BBD9A4F8A07FD393 /* NSData+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A43E2A5D12762BB2DDCFA5FB6611C3F /* NSData+Extension.swift */; }; - 02E592B98FDA7AE244E719F42232F606 /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8354235A4D4FCE6C995FA98D553DCB2 /* ConcurrentDispatchQueueScheduler.swift */; }; - 050D7D15A61FE261EA1F8D8B52E090B0 /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C881F73539227FEB265497F95D90A4 /* Variable.swift */; }; - 0559F125B9B86C93E30CB6CD26D7601E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7474AA7F1B7C0B1E0C42FC5DC0B6B44 /* WebSocket.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 05A22450B6F55F33FDF872ED36B085B9 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62F82CC65D29391C34411995CC23DD88 /* Repeat.swift */; }; - 05C50516770A99D954D4DDED925E56CD /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10967286AC85DF60283B1FF8F6AD9818 /* String+Rx.swift */; }; - 05E4E08451EF3DE6D3AF1E76776AD607 /* Operations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 740D1078C4A9F2BAE5CDEFD3F369BB88 /* Operations.framework */; }; - 06DF9B44AA2854F36809BC8202809D1F /* Generators.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8505763032347405391E8EE0BFE84C5 /* Generators.swift */; }; - 0827735D297EEABFD811FE333206FD8D /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08343499F164DF0A6B9782FD77924A09 /* NMBExpectation.swift */; }; - 095406039B4D371E48D08B38A2975AC8 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C17B8DE2BAEDAF16D5C537AF88EAE51 /* Error.swift */; }; - 099C64CF560DC424DB43BBBEC6370D8F /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82EA5EB0A9CA77D8E959BFE4C58DD252 /* ThrowError.swift */; }; - 0A9A1B8CB1963791ADDF67361E687CAA /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = B32C6D311DD3EA40771854D6946470B0 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0C3A646C79FAEBC0C8EC2ECB090BEC95 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0795710D4F49637F27BAAC941DCDA749 /* Result.swift */; }; - 0CB56D164AB2748CA5EE4028E32F9D3A /* NoFailedDependenciesCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0044C795BFFE925935D64D715F859BDD /* NoFailedDependenciesCondition.swift */; }; - 0CE889B36FA871FB84536D6E36C9326D /* Operations-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 49A4620B1C93BE5AB187FA83837E465A /* Operations-dummy.m */; }; - 0E96D81EBDF776D481B86D65929AE667 /* Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74667AE9BF6BC1D2D143D2B550AD5D12 /* Widget.swift */; }; - 103E7FC6DB7D7BBEA993E210F14368BE /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D6BEEC76D7B89CA22433364A9C5C669 /* CombineLatest.swift */; }; - 10502CC5C8E4109FA4ACC753097FBE6C /* Operations-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F2BF56C1CF85834E2789A6785AB6097A /* Operations-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1050649A9AE9BE682457F0939736F24F /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA24992E5E49BECD9EA4EA8717E6A78 /* TailRecursiveSink.swift */; }; + 002035F09642FFA6A0067278CA90E921 /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB9F49D0E3366F8B631D16A4A7A020C /* CurrentThreadScheduler.swift */; }; + 0194A3C6BA7E3849AF54F050FA44958C /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C12091C0DE031607BA77C2A1847C25D /* DelaySubscription.swift */; }; + 01D2DD1C92EB87452CAF30B9367833C8 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88B0EC9DCEEDD6AB85903AD714FBBBCC /* NMBObjCMatcher.swift */; }; + 02A3ABCD3D778263BBD9A4F8A07FD393 /* NSData+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79503ACB2B7C18C8103244782DFF548C /* NSData+Extension.swift */; }; + 02E592B98FDA7AE244E719F42232F606 /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A29F449111F9929D52AD12B321D300E /* ConcurrentDispatchQueueScheduler.swift */; }; + 042ABDD937EFB0948FEDBEBD71AFEA1D /* CZOpenWeatherMapAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 683602810D0BFF8D342CF09E7AA69549 /* CZOpenWeatherMapAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04ADD7FB9A14AEE0ED605F82FFB67EAA /* CZWeatherCurrentCondition.m in Sources */ = {isa = PBXBuildFile; fileRef = 84CB26F2CC144247A50096290DDFB48F /* CZWeatherCurrentCondition.m */; }; + 050D7D15A61FE261EA1F8D8B52E090B0 /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2F4C3F46947519FFBCAF57E65D8B171 /* Variable.swift */; }; + 05A22450B6F55F33FDF872ED36B085B9 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39372F4E10E829D80311BE706E66E05F /* Repeat.swift */; }; + 05C50516770A99D954D4DDED925E56CD /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2A7F287B5B7D4E8975424FCD96F5E25 /* String+Rx.swift */; }; + 05E4E08451EF3DE6D3AF1E76776AD607 /* Operations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50C0EA87FCCDB68DEB0DD3D60257ADFD /* Operations.framework */; }; + 0621518898325A8AC21A4978B74E3A88 /* Pods-GrandCentralBoard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 02BA90EC296C98B0B22C2C1E48F338BD /* Pods-GrandCentralBoard-dummy.m */; }; + 06790EC112F6D2CF69798025878CC187 /* CZWeatherData.h in Headers */ = {isa = PBXBuildFile; fileRef = B03A8D57B9DE1D49AC095BE31D5587E1 /* CZWeatherData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06DF9B44AA2854F36809BC8202809D1F /* Generators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67BF28D7B8BAF9DBEE1274BD3AE6271B /* Generators.swift */; }; + 0805CB8726C7D1937B13B59A5EAC67F4 /* CZWeatherLocation+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F7705ED2C309032E92ECA6B1DADF589 /* CZWeatherLocation+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0827735D297EEABFD811FE333206FD8D /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEB3EF5950D33103E7CA26DBD8121A2 /* NMBExpectation.swift */; }; + 095406039B4D371E48D08B38A2975AC8 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = D232E2FE323C1CC6F02058F90A2FA195 /* Error.swift */; }; + 099C64CF560DC424DB43BBBEC6370D8F /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F622871CA4C41A0E99CD415739D345 /* ThrowError.swift */; }; + 09B288D5ED1C243EB11A853ECE77BA68 /* CZWeatherRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF6709A08D2BD6663F2965D466574E3 /* CZWeatherRequest.m */; }; + 09E9062F6E40EB168AC11B75855CEAF7 /* CZWeatherHourlyCondition.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E465E856B21EB0B8FC7995295EF6C5C /* CZWeatherHourlyCondition.m */; }; + 0A9A1B8CB1963791ADDF67361E687CAA /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6A3017853CBF546D77D54DEF14E129 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B011BE0E9CC13471125CA0CEECBFC35 /* Nullability.h in Headers */ = {isa = PBXBuildFile; fileRef = C1C7A0118A85D5155A4DD1A9195C7A23 /* Nullability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C3A646C79FAEBC0C8EC2ECB090BEC95 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F6437701A5AF68CC47C4EC49192973 /* Result.swift */; }; + 0CB56D164AB2748CA5EE4028E32F9D3A /* NoFailedDependenciesCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAF87E50E33F63F5B76204E33EFCA86C /* NoFailedDependenciesCondition.swift */; }; + 0CE889B36FA871FB84536D6E36C9326D /* Operations-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EA96CA7DAA8AACFFD3242E2D9DB09A3 /* Operations-dummy.m */; }; + 0E6F0812A86CADC22AE469234636E997 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72AEA30C63E64B9CA2C83D344B6D0938 /* Event.swift */; }; + 0E96D81EBDF776D481B86D65929AE667 /* Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1D380AEDFFBC1928CDBAB3900CF222 /* Widget.swift */; }; + 100634E8E71BECD0614E7491E0A92B6C /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F94833733165341FD539521EC8DE6118 /* Bot.swift */; }; + 103E7FC6DB7D7BBEA993E210F14368BE /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33E90278E6F4D1AE30EFF5E344865430 /* CombineLatest.swift */; }; + 10502CC5C8E4109FA4ACC753097FBE6C /* Operations-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EA3938366EE68736562D0E2E13B4D3C8 /* Operations-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1050649A9AE9BE682457F0939736F24F /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = D578065D7D3956A6A63B8765D9709FC3 /* TailRecursiveSink.swift */; }; 107FEB4342EFF7094E02DDA9CCECDC49 /* NetworkRequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B1946F2D882133DCF2F11ADB23A80C3 /* NetworkRequestManager.swift */; }; - 10FCB523DF20316C66E5001A67E48AD8 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379189330FF43C9E763923EDFDFE9D12 /* Event.swift */; }; - 11B2C3F2FB2F8C98FFFBB6BFD2DAC79D /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6F5A47B4E653728A6E65E0B2D80911A /* AnyObserver.swift */; }; - 11C22C7B844DF31A5EBDC9AC132C5E94 /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 58D7DCE768F0667C29C71C4C75097D86 /* UIImage+Compare.m */; }; - 128EEF39B88B1DFDC74F743424D17350 /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1329CE692820DBC82618ECB7DB4BF6 /* CompositeDisposable.swift */; }; - 12C99B9AA38226E677C6DC8F8FDF2714 /* Repeatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 994785D1704FCA1AC4E3B8B25257CF44 /* Repeatable.swift */; }; - 12DBDCAA0525341B264786108F5751BB /* Result-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B5EC04B1F46E2EDD30A6878174A4D19 /* Result-dummy.m */; }; - 13008DDE535CDDEC86E88D51221BCB00 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCAC91C4E8944BD3B77CD755BDE93010 /* Starscream.framework */; }; - 130F048002A62769FAFCC66F2C79391A /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = A28A8ECD3356DBC4004B238913411FF2 /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 139D7E46F5A1D78B26F7B6A090419629 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99965341C449E73C80156A05682B1A0B /* Alamofire.framework */; }; - 14ACB130F727A9BDB98F4AA74D6254DA /* NSURLRequest+HTTPBodyTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 630F44CBE9AB50D0D7DD2A6577D02C60 /* NSURLRequest+HTTPBodyTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 11B2C3F2FB2F8C98FFFBB6BFD2DAC79D /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21EC9C4F2E15DAA22D8B9272899A7961 /* AnyObserver.swift */; }; + 11C22C7B844DF31A5EBDC9AC132C5E94 /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 452D51542007324AD99FAB50095C580C /* UIImage+Compare.m */; }; + 128EEF39B88B1DFDC74F743424D17350 /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DF89F2C182D6E329A20375DDA321C77 /* CompositeDisposable.swift */; }; + 12C99B9AA38226E677C6DC8F8FDF2714 /* Repeatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98E4E8625F5595C092B27DC33B7FABD2 /* Repeatable.swift */; }; + 12DBDCAA0525341B264786108F5751BB /* Result-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AD0A8CDCF821D0581703F52B1364ABC /* Result-dummy.m */; }; + 130F048002A62769FAFCC66F2C79391A /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = 10C77B30E9094B581285427B6F98074A /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 139D7E46F5A1D78B26F7B6A090419629 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB88BB0CC73BB2714CFDD8E1B6C67A42 /* Alamofire.framework */; }; + 13A504CED0A759862615BC25B718EA74 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC0B75B747B34575671D901D3574EAB /* NetworkInterface.swift */; }; + 146B835DE97CCD70A8CDFD4D9286B00E /* CZWeatherRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = BE92319A90076FB670702AC53D8B1936 /* CZWeatherRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14ACB130F727A9BDB98F4AA74D6254DA /* NSURLRequest+HTTPBodyTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A33B2BD6DF89F9C424989E952E01883 /* NSURLRequest+HTTPBodyTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; 153267DDE9F3D8100C54756650FFCEFF /* WidgetTemplateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF103821431B110AAF0249FFCEE04605 /* WidgetTemplateView.swift */; }; - 15D58D88F02BFA12E514AB9B95AE1089 /* SlackKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E8D3DF50F4E55F27765EF0FEFB560B7 /* SlackKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 16102E4E35FAA0FC4161282FECE56469 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CFDB345105A082F37F41E1D7014E38B /* Timeline.swift */; }; - 161A6DBED252A9091779093F6FAE3F1F /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14707705B018B8390629CD7665D446B1 /* Observable.swift */; }; - 166A62EEB09D00400BFF9632F8780864 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AC07BA8148BA2E48CE4896B358690C /* CombineLatest+arity.swift */; }; - 17FDEE85A8AF0AFC76EA3766C3937728 /* Observable+Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = 699CCCB7C1CA24AD04493F18CDC9F062 /* Observable+Single.swift */; }; - 187A7B42873AB0169C23034D83630C8F /* Observable+Creation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C655631835C5BC83CF9FFED58FB24D9 /* Observable+Creation.swift */; }; - 18E26D0721E1F88FB5494196F971B8DE /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6D1E341D943A7B479D39D47A4E741B /* TakeUntil.swift */; }; - 18FBA3DF895AAA2DCF202A299BD0F7D0 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F2A27B2BA2F6778DB33990D771C6F9 /* TakeLast.swift */; }; - 192C4EF47D90895E51E5597323364A3C /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A0F6357BC37F4E87953873630A11AEE /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1941A05B182F349823C059DD24ABF79A /* OHPathHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 72F4129424A3C0CE2400EAD1C0BB3437 /* OHPathHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 19B4BA581CD7B76472E8C71FBBD2723A /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = F24FFC6DA9A683F20A49C2FC8186FCC5 /* Message.swift */; }; - 19BBF5CD528F1289A0F5C63493BEC2F7 /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0505683612733DE00917C7398CCA3899 /* BinaryDisposable.swift */; }; - 1B8C49A86554F63443DD47F72B5CDA03 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02028919FFCD8B080F5ACCBA1E53BB06 /* Image.swift */; }; - 1C467D704DDF92608ABD2E0EF0D39BAE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 1C9A12761204BD7DD754D2E92460249C /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC57432F624E4DAFC08988E0BC19190C /* MD5.swift */; }; - 1D02348E9F89C93711E28843B34F5472 /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF7A7B081E14D4CDA40309F42C5597F4 /* HistoricalScheduler.swift */; }; - 1DAB7855B145DDEE3BA84D3E799EC50E /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A11C7A571B36FBB0D5A54A8113922D /* SerialDispatchQueueScheduler.swift */; }; - 1DC459482A686F81E2E8D5D035CA34D4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 1ED1EB92C8C42AA370DE943AC8BCD104 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 20A347CE4629C330F25267F822D9206B /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90938ED83405035D1F70E6DBEC61ED52 /* Error.swift */; }; - 21BFF14FCA34A1E7C8DA6B4EC40F3A6F /* Observable+Moya.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D88D19D4888FBBFFA587AE972F95143 /* Observable+Moya.swift */; }; - 21FCC4B725EAF5F42EDFDA386FF3EC4C /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7392247101398C4A7CA1DF6F6BB1B2 /* BeNil.swift */; }; - 221C18B5C9364C0514CA6BEEFBB819B0 /* GatedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE383CCE12388DDEC9BD49B1A52303CF /* GatedOperation.swift */; }; - 229428E3F76D3CF6F84355F40D5527C0 /* NegatedCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4E70AB3885B2FF6B50EA0E6930939EA /* NegatedCondition.swift */; }; - 22F3B45791CCC80762296E40CA03BC9E /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6CFB25333DDA01625BC083D46422610 /* Event.swift */; }; - 236E397C0E190BC2D409BBEF93A09302 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2F7CBADE93427AA24638911829C80B /* DSL.m */; }; - 238FED166E9FE1C2701E4810247D81D9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 24AE47A6560D6EBB0AFF78BAAAB15E0F /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF6DC3373AADB5CE157ACF7115F4F6A /* AsyncMatcherWrapper.swift */; }; - 252CC1FD5C88052A6A55152F1B4AC8C0 /* RefCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A20C9F8C5A7D02C65E08F326850363 /* RefCount.swift */; }; - 263465A57520B440C99D428CE2E51AE9 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A4A7CF5B0F7FC7AE39B9B1FF550786E /* NimbleEnvironment.swift */; }; - 275D33605C59E4469D81C4A2368A363C /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653A3F1ED5E466B3BCCED1D2395C57EB /* Configuration.swift */; }; - 2833805F5C5349E47DE9F70060B56BE0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 290570AE7220D66E1A65B0033FB0DCD4 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 444A5358B278DA045CC632B5437D63AD /* EventDelegate.swift */; }; - 291241E5896A174AFE8AC26F8BA4D6F0 /* Pods-GrandCentralBoard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E92FA46DD9469B5C614F2DE1698B8E6 /* Pods-GrandCentralBoard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2C87E1788C8FA06AE3481A2226E3AF2D /* UIApplication+StrictKeyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = BEC36BDAC8B8A60ED3D1727B77655322 /* UIApplication+StrictKeyWindow.m */; }; - 2D3405986FC586FA6C0A5E0B6BA7E64E /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 547574CE39F96ABFA4825A56054D142B /* Validation.swift */; }; - 2DA53EB83F96EC030D3C718D070E7002 /* OHHTTPStubsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B3CED4AA0F48F9C12849DE0B00E826A /* OHHTTPStubsResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2E6FD9DB80355625CC2F1AFCC13B765A /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9532E97AB69116452446FF01F58BD6 /* ReplaySubject.swift */; }; - 2EA2A65781349BAC58388A6B49403438 /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48BB3DD2F196D91D26891FDA75D2BD5A /* UIViewController.swift */; }; - 2EBBB0866AE19483F8314B7099A0FEDE /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDBEBF19368AA4D5A79D7533E17F500D /* Sink.swift */; }; - 2EFE2F1A863E76048EBD7B376A9E0C47 /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01485D785B55C1C38130F3D23C9CEE39 /* SingleAssignmentDisposable.swift */; }; - 2F2B8E4FC1B1EF2175166DDD3981FEB3 /* ConfigurationRefresher.swift in Sources */ = {isa = PBXBuildFile; fileRef = F537988229A14A9D6674AC964872F692 /* ConfigurationRefresher.swift */; }; - 2F4DBD87FF99493D022F40F1B772B911 /* ResultInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6EFB439000D0087BC0320B8F9902A37 /* ResultInjection.swift */; }; - 2F8EDCA86434B3DDCB67AE9BE0044760 /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DF997FD79EED082568D363CF46A416 /* Cancelable.swift */; }; - 3064C97CD1302187C10E020BCB6B5678 /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297995529B1E3355A2EEECA08ACDB593 /* Bot.swift */; }; - 316BB8B3DD8379A6AEAF2DE240FDAE8A /* MD5-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 338B52C968A713CDBFC6ECDC6F35D535 /* MD5-dummy.m */; }; - 31B59E20D37AE0C16398B9BA1956130B /* StableCompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2DFA4D1AB5E2524A83D96E1E78001E /* StableCompositeDisposable.swift */; }; - 31D58D43C1959425EF5102497EE6ED53 /* UIOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DBAE639BE3B9B16BBEC71E47B09CD58 /* UIOperation.swift */; }; - 31F7D4AEBCF0E08649FE5341F76E76A3 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7228EBB47363C5076B8EBF47D415B1A1 /* Reachability.swift */; }; - 32119696FBD479548CBD1A41A5C83B89 /* CloudKitOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51241CFCCD32670B416010BEB96FB314 /* CloudKitOperation.swift */; }; - 329747B4D78C4D08BA8FCCFDFA6F01E7 /* Decodable.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE5B571E13FA6E35830D1798F8F3F4DA /* Decodable.framework */; }; - 33027DB4A92CA1A5C695ECCB9679FC1D /* SynchronizedSubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47062B7CD13E89BF17A175DDB1DF7611 /* SynchronizedSubscribeType.swift */; }; - 33DC41E568663CB92FABD13FA2AC0026 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 366B28F41D087F6D3BAF2A90EAAFA9C2 /* Platform.Linux.swift */; }; - 33FE3D9E96B48BE40BDF3AC329A22A7E /* ErrorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7904C27B06117F02444D40FA515343 /* ErrorType.swift */; }; - 340778D51AAF0BB4232859C4D0D02BBC /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 272C4C52643025573021F5DF6467CDA2 /* SubscriptionDisposable.swift */; }; - 34A1C7E576C58A9D3F3101448308BF3E /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = CBA3A9F15C3C9E819BE5AF38121BCA9E /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 34CCDCA848A701466256BC2927DA8856 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197B593E7B00C93E8474FC723FC49ACD /* NetworkReachabilityManager.swift */; }; - 3506F74336DA936D9447EAD0D36F57F4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 359AB75352FF5CB474C285DC6F1374AB /* Observable+Aggregate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656A2AD8678482A3414D3183F77340D9 /* Observable+Aggregate.swift */; }; - 35E0EBA7AA92E190AB5B4ACFCF0F61C4 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D799904C9EA3619A5A17D1426432623B /* AssertionDispatcher.swift */; }; - 36B2C3F1C4F0125AA15531D07EFE45DC /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D973208A5BCC2362649DE6FB02A308 /* Rx.swift */; }; - 37980F07CBDA147DF0B5DB677275C524 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A328BD481B280A4580739FE8FCC46B1A /* VirtualTimeScheduler.swift */; }; - 385A39C350B5AA939819F8B8146E1D16 /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 555E03487B8F7AFA3C966A5D1AF497F9 /* ScheduledItemType.swift */; }; - 39007AD3711A35BCFA1D853E7AB79510 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE493C5D29E5887CDB85B7DE9A8F7358 /* BeLessThanOrEqual.swift */; }; - 3930C50FD6CBEDB63AD31BD832E4882C /* NSURLRequest+HTTPBodyTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = F384C60BD88AB186688E700792A282CE /* NSURLRequest+HTTPBodyTesting.m */; }; - 3A193123D41E3D7B54CDFB726643EF1D /* Starscream-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A780D03D9B260614AFA5CA569FD4839 /* Starscream-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3B78C4F35C369FBABE62D4622A67E7DF /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE81ADE336CB9BF0DF76A2979A8FA99 /* DSL.swift */; }; - 3B8F6E9A319EF3560D3DEA24A5E1B470 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B05C3BFC6DC296F1E8AAC1948B6D58B /* UserGroup.swift */; }; - 3C918E40C04067FAF57B447C0BC52B04 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AA54EDA1AE20F9361C74BCAF35894F0 /* BeGreaterThanOrEqualTo.swift */; }; - 3C9AB6187C1C9082BB30A1432E8EC67E /* CloudKitOperationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E801171AA37386AF690254664F780B64 /* CloudKitOperationExtensions.swift */; }; - 3D7AF86E9032C99357D2ED046461874F /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = F66D37D3EB8401B1CB857F8B570DBF2A /* BeGreaterThan.swift */; }; - 3E49D0F8B572B8FB8B6EA3C899FE8E3A /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69BB1D5761428E835DD801725E5D2E7 /* Timer.swift */; }; - 3EA8F215C9C1432D74E5CCA4834AA8C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = A802F0947899F0CA9B2DDAA17B7D1CC2 /* ResponseSerialization.swift */; }; - 3F3298E8DE492AF9E535563A092FBDC8 /* Observable+Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43FEF7F304095D2F947D092F519D7A97 /* Observable+Binding.swift */; }; - 3F7C08F8DE71E948DF84E880DB279267 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E36525FA547514CFD81168868872742A /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 400588EDABE1E681A72468440DD3F24B /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3BFAB75F8B8758E22D852231FD6CE9D /* Sequence.swift */; }; - 4055B1A1A67A270A4EEDD04A71CFBDC3 /* BlockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A16760172B10E95CC1A755501BD8BEC /* BlockObserver.swift */; }; - 4081EA628AF0B73AC51FFB9D7AB3B89E /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909626418F7D4525358ECA0CB99D8F50 /* Manager.swift */; }; - 41554FAA93E218BB3A75E577DB99F44B /* OperationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079EDBBD982006210C5A00DC75C0E5EC /* OperationQueue.swift */; }; - 41BCE7C53124EDAB0C0B27BDA0195450 /* Decodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3B2DF761343D1229BD101FE5D4281A /* Decodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41EDF10B8BD3ED9DF5331B58AB436CE2 /* OHHTTPStubs-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CF31CC12E204B1AD8C702AE6028F3301 /* OHHTTPStubs-dummy.m */; }; - 41EE5E3698CC1A17046AC74B36A279E0 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 597F5D3B60CF635EE33D82348D8589AF /* RaisesException.swift */; }; - 42D7CA630DDEE45FFF8ED15F4D71EA78 /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEA6C9B4E5D0E5A245DD6FD695F4691 /* ObserveOn.swift */; }; - 43567896E507C71EAC4C0CE3A5F3ACA2 /* Decodable.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE5B571E13FA6E35830D1798F8F3F4DA /* Decodable.framework */; }; - 4362A1FA39B9AC9257E4688E52DDF868 /* ExclusivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E029688A097299760EEEE5BADFBDB /* ExclusivityManager.swift */; }; - 43B99F06587ACD844A4D09A0ED9FB66B /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69036EEFF9C18B2D82B1596D71AC269 /* Stringers.swift */; }; - 44B9A25CE9959391536868AD602E50C1 /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618925624C3466DB58E357543374378E /* Just.swift */; }; - 4779AF106767D131CFCDD4342CDEBBBA /* Moya.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C07EB3224EA24699B98A96267124C88 /* Moya.swift */; }; - 47A8CE86605FAFC4453472D7D6DA9FC9 /* GCBCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9309619FD62944F6AF33B353B05161EB /* GCBCore.framework */; }; - 47AC9659726B7C0A164EA5802A19834B /* Observable+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21B5763652B63DADA3BEE093E53C90 /* Observable+Debug.swift */; }; - 47B27E9F8233B0C953C0CAFB12B0DD6B /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0702AA5CCE53C3AA8C77E5E7A9B38EEB /* Queue.swift */; }; - 481126745B5115DBBA683636D7B58294 /* BlockOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5C243C9EAF503B6D2322CC358143D5 /* BlockOperation.swift */; }; - 49662062F914734CEF9EA76A56F236CE /* ClientExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EADF08D96A432E81457631FF7DD98665 /* ClientExtensions.swift */; }; - 497AA8816FC08215EF4C2431E1986992 /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 721630214CB014361E7D2DC0CAF7242E /* FBSnapshotTestCase-dummy.m */; }; - 4A0EEF81B7C38E813ECE331DCF31D71D /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E0061EF9C23EBE1B0511B20EA3902 /* Deferred.swift */; }; - 4AE07686EE81F767B84F9C5B14BE4E23 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 4B05622B6E32095036EDA57139DAB5E6 /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8738E6C0FC1210F12E30887AAAB21858 /* OperationQueueScheduler.swift */; }; - 4BC2B62ABFD909868A39EAC3C208BCEB /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F34B1087835AD1C1820FFD8B2B873D4 /* SubjectType.swift */; }; - 4C2A17A1E0AB39A27EE97B94945B6E21 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 4C9D8F18434A48516ABD88E2B1519AB7 /* Observable+Multiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FCD2BF80B00EA2B659D08B7A46815B /* Observable+Multiple.swift */; }; - 4D5F55C1AF5187287D2D9EFD94580FC6 /* AnonymousObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89303583EA79D5325EB4CABDE91F7C93 /* AnonymousObservable.swift */; }; - 4F3B01DF2A74F93351B5582092AFECAC /* ThreadSafety.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAF51A9CC8DA974C053F05BC85A0154D /* ThreadSafety.swift */; }; - 4F697385F8AF6B32638DCC823A41CC45 /* OperationObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72B8B59BEAD47EB457F703D20412A9D4 /* OperationObserver.swift */; }; - 4FE813440705A52556B94C992030DEBD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - 5210A1973DE4CDFDDF16306474815A77 /* ConfigurationDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AF9922A53C0F00E01DCDF987B2C32BC /* ConfigurationDownloader.swift */; }; - 522BD8E97278F4664A5DFFF823686E0E /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C71E1DED1AD96E5913C7C1ECFB2602A3 /* Buffer.swift */; }; - 5289B487B0FFD803686FB168A22709A4 /* RepeatedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35530FF0B9A1FD7E0099A73660CD869A /* RepeatedOperation.swift */; }; - 5289D7499BA4A5ED209DD55FB819254F /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE27FC17C82093E8FD803ACBF9A1515 /* NMBExceptionCapture.m */; }; - 5328360AFA220C703E0EB49979A7038C /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E139E09ECC387B79C8B3E493E000056A /* ObservableType.swift */; }; - 5405CA8742F0A1F652306B5440C819F4 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE47631E7E66CC87A9868F9F8812A57F /* Throttle.swift */; }; - 54CE3FBBD31744EFA8B0A8EADB09F50C /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FDCB9B1A2B0C2F7DC927B2E4220B1B9 /* NMBStringify.m */; }; - 54F1992BCE8ADEBBBD2E624651FE538F /* ReachabilityCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ED7F12A4243B628F8FD801B7DA9BA90 /* ReachabilityCondition.swift */; }; - 559EC7365A6A1EC8DB5DE735148DA6AD /* ResultType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595147E7B6E61BF61F63BC8B9102BA22 /* ResultType.swift */; }; - 56CA153033917F08CCDD22E94806C873 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D333ACDABF2AD5333AE3910BC7549D /* MatchError.swift */; }; - 5730191C4E6D9B7B256764AAF9D0F4C6 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = E08EC309EACF58564BECA58803892951 /* SkipUntil.swift */; }; - 579B4E73DF30833AA8E653B34AF08774 /* GCBCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D1901C1562B9C0D583EFDEBE0E484D /* GCBCore-dummy.m */; }; - 58310E3ED3157EE7B0C28FA5FB18966C /* Observable+Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = 126086E8A60B843731A48BD92BA7C1B2 /* Observable+Time.swift */; }; - 59A4C06B57864AA9BBFAE0B762DAE871 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAFB418A9C7CF9C11CD2CC841684049 /* BeLessThan.swift */; }; - 59AFC17D744CDEED360B4DF8876295BF /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F7607F0A37A9C3D307BFF1EE61FB025 /* Errors.swift */; }; - 5A249A1ACA4E67FE5118AB0DC1CC29EF /* ComposedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59314DCBBB2102CD0C7BA4800CBA1310 /* ComposedOperation.swift */; }; - 5A4AC5619A05687E5EB0A4BBDC8AF154 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243ACC1C68D1C750FC91973EBB66A440 /* AllPass.swift */; }; - 5B21B2BBADCCEB5AC51E0A0C99BA5B93 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB6CD7D5FFE6F59C03229692518D51C /* Expression.swift */; }; - 5BA49835FC8569AF8B3A3813F5ABF727 /* ObserveOnSerialDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33499355C23055D0C81B487ECC2F4C19 /* ObserveOnSerialDispatchQueue.swift */; }; - 5BC19E6E0F199276003F0AF96838BCE5 /* Upload.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90FA6FE5E2924CC51ED4F60842BC078 /* Upload.swift */; }; - 5BE8447313A4744BA79E0175C838E7D8 /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF0D6FCA301209F5361A64B13CAA1C9E /* DisposeBase.swift */; }; - 5BFDCFC3291753CC21D7707858881100 /* UserConfirmationCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A8B1646879B16CB2231308C9EF9015 /* UserConfirmationCondition.swift */; }; - 5CB05FBCB32D21E194B5ECF680CB6AE0 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4BBA245812CB85529D0D4FDD616492 /* Download.swift */; }; - 5EA88C1ED5426092C5FD589257FE505F /* CombineLatest+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4564F0D8AD46D32CC82698AC146B3975 /* CombineLatest+CollectionType.swift */; }; - 5F3102C85115E1C5F9AE7E0C1F8D8417 /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = 157FC95DFCA09649189A3ADF97BC3B23 /* OHHTTPStubs.m */; }; - 602B5CEB21CA60AFA67B508D13282E94 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF9DA9CE305FF472D0040BFBE470D9F /* BeCloseTo.swift */; }; - 61276B64C6EF21C9D6D850B670D491A0 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC1CD92EC7F6FE038F482FD5A76521BE /* Error.swift */; }; - 6182371810AD0CC0DB65713573FAC22D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054579884E746ECB4C5FC305596531A0 /* NopDisposable.swift */; }; - 61EBC5CF0D5E065C88028B49C6B8D3B3 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = 5451C904DBE00AB51DB2A41C5365D739 /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 628B09AC02F5C0E2C271DF194FD527F5 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6237C1D8BE2A9D0597C84A2EEE23CC4 /* Switch.swift */; }; - 6297EAE813D48EC957BF1AFA5F94CBD7 /* UIAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EE534DD63BEE73F262AAA76134834AE /* UIAlertController.swift */; }; - 62E8346F03C03E7F4D631361F325689E /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752FB12DA4248428101BEE2F8B9F9ED3 /* Response.swift */; }; - 62F7C16106A7967F8D4D824468C062F2 /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05DB1EF6050467A624EFFCEF7BA91B7B /* ScheduledDisposable.swift */; }; - 6307A408B7EE75FCEA0305416FEBD4BC /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE99478EB0EB9C59C53A558F94850DC5 /* SkipWhile.swift */; }; - 6445B28465C1A7900E895709BC333C23 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C84AE0538A9EA1FEECFCCF0EE65139 /* Contain.swift */; }; - 6483C8F8150DAA41200F2558D6F7664F /* MD5-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 42CEE2FBEDD6B412ED56466D8D234E45 /* MD5-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 64E3F1DC94CFB9F0E92B0CB453F7C5D9 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0694B362772B82E346615AFACCC55C6 /* AnonymousInvocable.swift */; }; - 6502069A93636E390E611BCBC9114069 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F97EF7B31B1AB6D8660CD5126E9DB2 /* MainScheduler.swift */; }; - 657126C8F43C1002B08D666277023354 /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A6E9399F96ED325C10CC4F01AD4FD2D /* WithLatestFrom.swift */; }; - 6575814EE5A3176AECC460D0E788AC98 /* BytesSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1AB6893C3D1029850A5CB4A38CD354F /* BytesSequence.swift */; }; - 65A0C4B1CE5333AEB1C53E261ECC879F /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F70342C4931C2D9BBA9DA8FFAD98C81 /* Map.swift */; }; - 65C7CB84D47190476290630565AD1024 /* Parse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF1B25F55A3E41E099ED233421589E72 /* Parse.swift */; }; - 670A0FFB73A674D818A118CA92D93736 /* Support.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431A12D9BCED3C61FBB07E77E070AE8C /* Support.swift */; }; - 68173C12C057FEDDBA1FD167E256DDBA /* AutoStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB800284240CA31EEA0EFB746DA0C3F9 /* AutoStack.swift */; }; - 68417CD65FCC6176AC4D2018E5D6328C /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290F221233475BA26A7F415013648C18 /* Operators.swift */; }; - 684A7E4C24ADAAB1B497B5F658036FC2 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1116CFDC279C354DAC3E5E13F6C4630 /* Functional.swift */; }; - 68B245DB47CA60F8F9ADCA1E8CCDC324 /* UIApplication+StrictKeyWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = ACB4B5794215AECC2671801807A5357E /* UIApplication+StrictKeyWindow.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 68C2925B017A5B2A1DF50FD9E8A7A7A4 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278DD143D24D8A2D70FBDC773976DC9A /* Platform.Darwin.swift */; }; - 690E08358CD235CABD810A6B65B03548 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 584D004AABB698E755FCE17546F88425 /* RxSwift.framework */; }; - 6914EE43A9B8B8D30220B3B6B0D57523 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = DF902E50CFDC72C52AC9C6DA943DAF11 /* FBSnapshotTestCase.m */; }; - 6958DB2F5F880F38634AF6BD45B1D36E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72E4743B3C2758A9EE613EB64764DD2D /* UIKit.framework */; }; - 6A068B06BD3F44A66256A86C4FC44787 /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7D6051817FD398DBE5B64BC489FC32 /* AsyncLock.swift */; }; - 6A446044928F14194D4909BF306491C1 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948B99A222992D22FCCCCC54472BFD23 /* Team.swift */; }; - 6B7C72BC2E595ABBA95B9DD848E95063 /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 361095E8F6A8ED8807780F2F59E1797D /* LockOwnerType.swift */; }; - 6BEFF6CD075BE86FC0DF0D63855DAAD5 /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 397DFB0A60859D6FF57502AF819CDC10 /* Endpoint.swift */; }; - 6C0DE75B379596C049CD66F64D0C7B19 /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 609E6D219205D48AB275B8E3EB7B6E59 /* SubscribeOn.swift */; }; + 16102E4E35FAA0FC4161282FECE56469 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA8D7AB9D851D47525A49D0E7961ADF /* Timeline.swift */; }; + 161A6DBED252A9091779093F6FAE3F1F /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F8FEECF9B9E2AFA84CF85FA84139731 /* Observable.swift */; }; + 1657B36950BF0E6580ECCC9CFA6E6147 /* Starscream-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AC274016FAF7DEB7995DA607B2DCDE1A /* Starscream-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 166A62EEB09D00400BFF9632F8780864 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648147622FFDA83846EB8D1927CEE2E5 /* CombineLatest+arity.swift */; }; + 16E232C992C2AA0F6080820B6EC8C1D2 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB20501F1485542B64064338710A4F03 /* User.swift */; }; + 175AA88367C7CCBD4B4F4EE15A4CB8CE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 17FDEE85A8AF0AFC76EA3766C3937728 /* Observable+Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317212F1121A961F93384B76ABF68E48 /* Observable+Single.swift */; }; + 187A7B42873AB0169C23034D83630C8F /* Observable+Creation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C2F9432076561167003EBF55DB2C84E /* Observable+Creation.swift */; }; + 18E26D0721E1F88FB5494196F971B8DE /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DA09A47FAA9F05C8AFCDB6C0276B840 /* TakeUntil.swift */; }; + 18FBA3DF895AAA2DCF202A299BD0F7D0 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C91234BB9AF0409CE87FBAA1758F77 /* TakeLast.swift */; }; + 192C4EF47D90895E51E5597323364A3C /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 260D8C5D7389EC0AA7BB495C9EB40B7A /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1941A05B182F349823C059DD24ABF79A /* OHPathHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = AB2978FEF790D3130E1667CA6B60308E /* OHPathHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 19BBF5CD528F1289A0F5C63493BEC2F7 /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49AEDCE732764A7CD41C203205355016 /* BinaryDisposable.swift */; }; + 1B8C49A86554F63443DD47F72B5CDA03 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B43CC1D87B550DBA08E6B0FB64612AA /* Image.swift */; }; + 1C467D704DDF92608ABD2E0EF0D39BAE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 1C9A12761204BD7DD754D2E92460249C /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7981621A460D53FBF5064140DC277351 /* MD5.swift */; }; + 1D02348E9F89C93711E28843B34F5472 /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDEE3942509470D586341FC0507E4F08 /* HistoricalScheduler.swift */; }; + 1D3A110B0386158975B14A393F987BBF /* CZForecastioRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DE378872F49E41BE7F0A435C78A3484 /* CZForecastioRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1DAB7855B145DDEE3BA84D3E799EC50E /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5198C63545DB5814BCACB842F7096A51 /* SerialDispatchQueueScheduler.swift */; }; + 1DC459482A686F81E2E8D5D035CA34D4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 1E51AE3232EDC2BF8D8AA5F4098443B5 /* CZOpenWeatherMapRequest+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A1474FA93D24756FC513E213FCFD00C /* CZOpenWeatherMapRequest+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1ED1EB92C8C42AA370DE943AC8BCD104 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 20A347CE4629C330F25267F822D9206B /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6963CEF1A4780F77C987D7C4983DF80 /* Error.swift */; }; + 21BFF14FCA34A1E7C8DA6B4EC40F3A6F /* Observable+Moya.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84BD96EC5D0AFE3B211580ACF4B13195 /* Observable+Moya.swift */; }; + 21FCC4B725EAF5F42EDFDA386FF3EC4C /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7B5F837FDF5309FC1041BEB18B2B48 /* BeNil.swift */; }; + 221C18B5C9364C0514CA6BEEFBB819B0 /* GatedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E94568BF5900B47E66BA019EFDD5A543 /* GatedOperation.swift */; }; + 229428E3F76D3CF6F84355F40D5527C0 /* NegatedCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45CB54AB6F93AF4F6AA1A557E77271C /* NegatedCondition.swift */; }; + 22F3B45791CCC80762296E40CA03BC9E /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 745AB54F92DD37167927DB6762BC3C9B /* Event.swift */; }; + 236E397C0E190BC2D409BBEF93A09302 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = E6CC947C120AE98416F608343B2657B4 /* DSL.m */; }; + 238FED166E9FE1C2701E4810247D81D9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 24AE47A6560D6EBB0AFF78BAAAB15E0F /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21CC15734C457BB4C719760F31A7D30E /* AsyncMatcherWrapper.swift */; }; + 252CC1FD5C88052A6A55152F1B4AC8C0 /* RefCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D9DCFB210ED0F236A0D3AE54CEDF08F /* RefCount.swift */; }; + 263465A57520B440C99D428CE2E51AE9 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55866D6EF1BE1AE86E583E0E884379AF /* NimbleEnvironment.swift */; }; + 26B4F2CFBCEA0187CA5F9EF27470C7EF /* ClientExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B713E0FD0F9BCF814D40E7127BD94B7E /* ClientExtensions.swift */; }; + 275D33605C59E4469D81C4A2368A363C /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23E534A88041EC06C5735DC80BE4E31 /* Configuration.swift */; }; + 2833805F5C5349E47DE9F70060B56BE0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 2C87E1788C8FA06AE3481A2226E3AF2D /* UIApplication+StrictKeyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B35086EFACC9E43FEEA284105E78CE /* UIApplication+StrictKeyWindow.m */; }; + 2D3405986FC586FA6C0A5E0B6BA7E64E /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3FA257B9D9D0B99AB105833B619049 /* Validation.swift */; }; + 2DA53EB83F96EC030D3C718D070E7002 /* OHHTTPStubsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 85B231960C0F83971BA3C2ACAB282958 /* OHHTTPStubsResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2E6FD9DB80355625CC2F1AFCC13B765A /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8021C34885D23553F78929C63F763177 /* ReplaySubject.swift */; }; + 2EA2A65781349BAC58388A6B49403438 /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70A62AE472A59312A80CA5B879737843 /* UIViewController.swift */; }; + 2EBBB0866AE19483F8314B7099A0FEDE /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE1793A7D509E82AD27969A60D05551 /* Sink.swift */; }; + 2EFE2F1A863E76048EBD7B376A9E0C47 /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF846C165563CCFB0E95B34C67F3A60F /* SingleAssignmentDisposable.swift */; }; + 2F2B8E4FC1B1EF2175166DDD3981FEB3 /* ConfigurationRefresher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1247131A81E857BAE0143C19D1C0BED /* ConfigurationRefresher.swift */; }; + 2F4DBD87FF99493D022F40F1B772B911 /* ResultInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE52E76729FD012A7688AF3992171DE6 /* ResultInjection.swift */; }; + 2F8EDCA86434B3DDCB67AE9BE0044760 /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 087046354F6322F16FE4FA2F1E912DE4 /* Cancelable.swift */; }; + 316BB8B3DD8379A6AEAF2DE240FDAE8A /* MD5-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F438AE000B7D9FEDDC6371B566A3A21 /* MD5-dummy.m */; }; + 31B59E20D37AE0C16398B9BA1956130B /* StableCompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD9028C599B99188FF3AA543FDCE09AA /* StableCompositeDisposable.swift */; }; + 31D58D43C1959425EF5102497EE6ED53 /* UIOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E783BF88D79135E279E80E05A931470A /* UIOperation.swift */; }; + 31F7D4AEBCF0E08649FE5341F76E76A3 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A18EB9CFE4E30502776AACF75923C5 /* Reachability.swift */; }; + 32119696FBD479548CBD1A41A5C83B89 /* CloudKitOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EC90D4BC833FE734544F30207A46B4A /* CloudKitOperation.swift */; }; + 329747B4D78C4D08BA8FCCFDFA6F01E7 /* Decodable.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E2E6D8A96F09738922295D307BBF824 /* Decodable.framework */; }; + 33027DB4A92CA1A5C695ECCB9679FC1D /* SynchronizedSubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE465BA9C66E7DD99254FF4269847FBE /* SynchronizedSubscribeType.swift */; }; + 33DC41E568663CB92FABD13FA2AC0026 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A9EE1A68093540F9E930AD4C02B93B9 /* Platform.Linux.swift */; }; + 33FE3D9E96B48BE40BDF3AC329A22A7E /* ErrorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26338D945FE88171237E30C2712706B4 /* ErrorType.swift */; }; + 340778D51AAF0BB4232859C4D0D02BBC /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A57D5BE799CAAF2300C3EBB0CF0BCB /* SubscriptionDisposable.swift */; }; + 346A39CDC6EF0A3DA0DEAA0DB89B7C61 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 996C3EE1D040401F06A4AB6D630C3DFD /* Message.swift */; }; + 34A1C7E576C58A9D3F3101448308BF3E /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 83DC01985094885B377380616EFB00C6 /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 34CCDCA848A701466256BC2927DA8856 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19875C26FCDAED3E60832CD343DD21AD /* NetworkReachabilityManager.swift */; }; + 3506F74336DA936D9447EAD0D36F57F4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 359AB75352FF5CB474C285DC6F1374AB /* Observable+Aggregate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6631C8F602D85EE46AE5C19A3B386FF6 /* Observable+Aggregate.swift */; }; + 35E0EBA7AA92E190AB5B4ACFCF0F61C4 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E87C4F96B10FBC7D1ABC7F67408005 /* AssertionDispatcher.swift */; }; + 369FBCB8511B64930CF03C3497830E8B /* CZWeatherKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 78D2CBE3A3F6E68BC4838C14EC1FEA8E /* CZWeatherKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36B2C3F1C4F0125AA15531D07EFE45DC /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BDF87E9275016631FC39A3DD923CFD5 /* Rx.swift */; }; + 37980F07CBDA147DF0B5DB677275C524 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD494E5B511AE9DC0BFD70CFD91E494 /* VirtualTimeScheduler.swift */; }; + 385A39C350B5AA939819F8B8146E1D16 /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DFD65AD665E3A96183E93B0F40DA403 /* ScheduledItemType.swift */; }; + 38EA5177CA3EF67CADE2C24B79DEB015 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1620A4D44FB0DAA1682AE846A33375DB /* Starscream.framework */; }; + 39007AD3711A35BCFA1D853E7AB79510 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = C22C5DA9167582839B66C21B74322467 /* BeLessThanOrEqual.swift */; }; + 3930C50FD6CBEDB63AD31BD832E4882C /* NSURLRequest+HTTPBodyTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = 329C2E2ED9DFF4683827BC35BBF7CE68 /* NSURLRequest+HTTPBodyTesting.m */; }; + 3B78C4F35C369FBABE62D4622A67E7DF /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29CCC30515407C65034467737CE54F7F /* DSL.swift */; }; + 3C918E40C04067FAF57B447C0BC52B04 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30AA5DDDD96211BE6636A21B423EB558 /* BeGreaterThanOrEqualTo.swift */; }; + 3C9AB6187C1C9082BB30A1432E8EC67E /* CloudKitOperationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D19D6D66DE8326F7116CD43C5EFFC8A /* CloudKitOperationExtensions.swift */; }; + 3D0ABAFF2CD24A07C6008BCBBB76FBBA /* CZOpenWeatherMapRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 678E820315A406C37633B7D990DDD994 /* CZOpenWeatherMapRequest.m */; }; + 3D7AF86E9032C99357D2ED046461874F /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23048286EBD0EC01FB5F3CDDF894556A /* BeGreaterThan.swift */; }; + 3DAE99BA407D66AC3AF45B46F71621CF /* Pods-GrandCentralBoard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E92FA46DD9469B5C614F2DE1698B8E6 /* Pods-GrandCentralBoard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3E49D0F8B572B8FB8B6EA3C899FE8E3A /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D73708354C0C565DB1D17179F21905B /* Timer.swift */; }; + 3E906FBFD2680C5D3C22CE004C2223D3 /* PINMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A9DBE69F7B6E7E56AC86ED57033415F4 /* PINMemoryCache.m */; }; + 3EA8F215C9C1432D74E5CCA4834AA8C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BDFA2139F3D52052D7464AB6A5683FD /* ResponseSerialization.swift */; }; + 3F3298E8DE492AF9E535563A092FBDC8 /* Observable+Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DAF20830F81C8C08D32DA74ABC10CCA /* Observable+Binding.swift */; }; + 3F7C08F8DE71E948DF84E880DB279267 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A5E8F172C004C6A6BA9B960BA4E021CD /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 400588EDABE1E681A72468440DD3F24B /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0999E4C7B67895D401A6DCAD1200BBE0 /* Sequence.swift */; }; + 4055B1A1A67A270A4EEDD04A71CFBDC3 /* BlockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5B9C6A214BE8884350BEA1D46318A83 /* BlockObserver.swift */; }; + 4081EA628AF0B73AC51FFB9D7AB3B89E /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B6D4C8D6B7B74FB3F3AAAF8AFCDB212 /* Manager.swift */; }; + 41554FAA93E218BB3A75E577DB99F44B /* OperationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166EAB01A582CDDCBB0C443303E6D740 /* OperationQueue.swift */; }; + 41BCE7C53124EDAB0C0B27BDA0195450 /* Decodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CF2B8A7314E50E09D8FE8893F8E453C /* Decodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 41EDF10B8BD3ED9DF5331B58AB436CE2 /* OHHTTPStubs-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2881597E19C227D0ADCD3FFD7A718C /* OHHTTPStubs-dummy.m */; }; + 41EE5E3698CC1A17046AC74B36A279E0 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FD78CB18F047D2124592BBBC3A3BDB9 /* RaisesException.swift */; }; + 4254E471521DEC0FF06959669221B0BB /* CZForecastioRequest+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 806E4C948521C0FE8232AE34823C8491 /* CZForecastioRequest+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 42D7CA630DDEE45FFF8ED15F4D71EA78 /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE807D6448B1823E7833D7AD1C0F865 /* ObserveOn.swift */; }; + 43567896E507C71EAC4C0CE3A5F3ACA2 /* Decodable.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E2E6D8A96F09738922295D307BBF824 /* Decodable.framework */; }; + 4362A1FA39B9AC9257E4688E52DDF868 /* ExclusivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33E689D9DC0A1F6243ACB3B4F923C4CD /* ExclusivityManager.swift */; }; + 43B99F06587ACD844A4D09A0ED9FB66B /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2381A530E4127ED29ADC11C7BBB08F50 /* Stringers.swift */; }; + 44B9A25CE9959391536868AD602E50C1 /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B2B7A2387BEC8E8932B93145FCBB4B2 /* Just.swift */; }; + 4779AF106767D131CFCDD4342CDEBBBA /* Moya.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56838821C598FB290B91276D2C3F48AD /* Moya.swift */; }; + 47A8CE86605FAFC4453472D7D6DA9FC9 /* GCBCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1363E07B9A4111D5CDFA32B8A245F35E /* GCBCore.framework */; }; + 47AC9659726B7C0A164EA5802A19834B /* Observable+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924C52A68436C0367F46E1704CBB6280 /* Observable+Debug.swift */; }; + 47B27E9F8233B0C953C0CAFB12B0DD6B /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8DCDD3F73C4FCF412DFAD051987646F /* Queue.swift */; }; + 481126745B5115DBBA683636D7B58294 /* BlockOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 723A8B7D10F5B632A256CF78EBB62259 /* BlockOperation.swift */; }; + 497AA8816FC08215EF4C2431E1986992 /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F1E5BFAADB84667FA1CAD0E1191564BA /* FBSnapshotTestCase-dummy.m */; }; + 4A0EEF81B7C38E813ECE331DCF31D71D /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 352C749B5889EAFDE9ECA29DB723C156 /* Deferred.swift */; }; + 4AE07686EE81F767B84F9C5B14BE4E23 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 4B05622B6E32095036EDA57139DAB5E6 /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619EB4F447A653D72F7821015BCE760B /* OperationQueueScheduler.swift */; }; + 4BC2B62ABFD909868A39EAC3C208BCEB /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB91EDC75CA3D65336413CFAED25461B /* SubjectType.swift */; }; + 4C2A17A1E0AB39A27EE97B94945B6E21 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 4C9D8F18434A48516ABD88E2B1519AB7 /* Observable+Multiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C091C305291244D4DC0B7D957A34822 /* Observable+Multiple.swift */; }; + 4D5F55C1AF5187287D2D9EFD94580FC6 /* AnonymousObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD31B3DBBC4AA8D74C575AB7142E5D53 /* AnonymousObservable.swift */; }; + 4DE09ED206F7615C60AEAF43DFBC309E /* CZWeatherService+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 09A7A420DDD2EFAC68D33CDD0D2650FB /* CZWeatherService+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DE76C3FAE89ACA45F1A90392717047C /* CZWeatherDataCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 302D66FDACEC1E2E28D48C6FF2C42774 /* CZWeatherDataCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4EDC7BEB9DA2DF41C48E95FDC45D9719 /* PINDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4826F4C473195BFF18B92007D023C972 /* PINDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F3B01DF2A74F93351B5582092AFECAC /* ThreadSafety.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80176A889AD146D89EF9FB4D9BFB34E6 /* ThreadSafety.swift */; }; + 4F697385F8AF6B32638DCC823A41CC45 /* OperationObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BD0FC2EAA01D10FEC0767B539977DB /* OperationObserver.swift */; }; + 4FE813440705A52556B94C992030DEBD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 5210A1973DE4CDFDDF16306474815A77 /* ConfigurationDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21CBA93E427433F90EFA22F44789CF99 /* ConfigurationDownloader.swift */; }; + 522BD8E97278F4664A5DFFF823686E0E /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54EF80B8F107DDC5954A5CB68909FE40 /* Buffer.swift */; }; + 5289B487B0FFD803686FB168A22709A4 /* RepeatedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3194E9AB650E3D76844CBC23A19F8FE /* RepeatedOperation.swift */; }; + 5289D7499BA4A5ED209DD55FB819254F /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = F3CD4569E4087D04C39EEDAC76B405FA /* NMBExceptionCapture.m */; }; + 5328360AFA220C703E0EB49979A7038C /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4DBB0EE4F6ED8632F1B73BCDE2B318E /* ObservableType.swift */; }; + 5405CA8742F0A1F652306B5440C819F4 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1156237286877FCB9D9E036950AF494E /* Throttle.swift */; }; + 54CE3FBBD31744EFA8B0A8EADB09F50C /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 74275AF025CBF943739074B80DFDAD55 /* NMBStringify.m */; }; + 54F1992BCE8ADEBBBD2E624651FE538F /* ReachabilityCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FA65057AC514DF4AE3905D404FE9F67 /* ReachabilityCondition.swift */; }; + 559EC7365A6A1EC8DB5DE735148DA6AD /* ResultType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C619DD8D8E4DFD880FCA411D24990D8 /* ResultType.swift */; }; + 56CA153033917F08CCDD22E94806C873 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE5DADF80C3E9D5650D28BC2A06F367 /* MatchError.swift */; }; + 56E94C84186911FF68E52014EA35A0ED /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C886B5F4C567686AB159E11F99F4ECB /* File.swift */; }; + 5722B65CB1E5B77F099D9205A750B071 /* PINCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ACC53A09475233325564B813F4A8FAF /* PINCache.m */; }; + 5730191C4E6D9B7B256764AAF9D0F4C6 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2017D45A3B851D82D0592A1F7A464C9 /* SkipUntil.swift */; }; + 579B4E73DF30833AA8E653B34AF08774 /* GCBCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3084B40C2B17FDE6EAF5FD551F346C /* GCBCore-dummy.m */; }; + 58310E3ED3157EE7B0C28FA5FB18966C /* Observable+Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC7D22A1BC7CCFA43356B7C8F7D35E74 /* Observable+Time.swift */; }; + 59A4C06B57864AA9BBFAE0B762DAE871 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D4FC445973667C379C36EBCE6ABC8F5 /* BeLessThan.swift */; }; + 59AFC17D744CDEED360B4DF8876295BF /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B26F4B3D701AD6EA651E33D8E7F287 /* Errors.swift */; }; + 5A249A1ACA4E67FE5118AB0DC1CC29EF /* ComposedOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78000935E761EE1F5C1AE353F1D57A81 /* ComposedOperation.swift */; }; + 5A4AC5619A05687E5EB0A4BBDC8AF154 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2CCDDA0318F57C019CB21FB877783DC /* AllPass.swift */; }; + 5B21B2BBADCCEB5AC51E0A0C99BA5B93 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA16AEF3C7EE6F086EAD02E60717B194 /* Expression.swift */; }; + 5BA49835FC8569AF8B3A3813F5ABF727 /* ObserveOnSerialDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAF86C6B35E1BD1A85AE0AC7A34A556B /* ObserveOnSerialDispatchQueue.swift */; }; + 5BC19E6E0F199276003F0AF96838BCE5 /* Upload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE7E71EE02CA6598DE44A76912FE696 /* Upload.swift */; }; + 5BE8447313A4744BA79E0175C838E7D8 /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BBBA71B106E2FA5E47EB76CF35BB88 /* DisposeBase.swift */; }; + 5BFDCFC3291753CC21D7707858881100 /* UserConfirmationCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E863ADB2B44F16237A045AC4840E27A /* UserConfirmationCondition.swift */; }; + 5C40AA54FA7400F89EBE098691962EE6 /* CZWorldWeatherOnlineRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E94EA0F0FA1F8F3B1F411B05736E2E29 /* CZWorldWeatherOnlineRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5CB05FBCB32D21E194B5ECF680CB6AE0 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87CF642DD323B3009BB8E64B2ED57EB7 /* Download.swift */; }; + 5DF25FE096EF71C84D48A1F5E6DA4D25 /* CZForecastioAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = DF43EFB7F4F4789898975A8E41C67DF0 /* CZForecastioAPI.m */; }; + 5EA88C1ED5426092C5FD589257FE505F /* CombineLatest+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 003CBBCD9AEEC1121C4613EE532E6BFE /* CombineLatest+CollectionType.swift */; }; + 5F0227E6C892590D065BC5848A0F8820 /* NSDictionary+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 98614607CBD343503CDF215F6705B975 /* NSDictionary+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F3102C85115E1C5F9AE7E0C1F8D8417 /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B5DBA8F7FE666B159F819089EDA47A5 /* OHHTTPStubs.m */; }; + 602B5CEB21CA60AFA67B508D13282E94 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42B0138E9E12041042997A33F7550BE1 /* BeCloseTo.swift */; }; + 60BADE62C42A9AD4686D000644019860 /* SlackKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2032075B3A73D7CD088315B1D94A9075 /* SlackKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61276B64C6EF21C9D6D850B670D491A0 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = E700FCD6B0A674553FA8F9D5C9B72521 /* Error.swift */; }; + 6182371810AD0CC0DB65713573FAC22D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1FFD5B92D5794E6DC871DCC7486C0A /* NopDisposable.swift */; }; + 61B49EB8612799226013F77A13B4082F /* CZWeatherService.h in Headers */ = {isa = PBXBuildFile; fileRef = A0B2D488DA61F8D8583BA2777593D6E4 /* CZWeatherService.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61EBC5CF0D5E065C88028B49C6B8D3B3 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = EE01E88120957751AC432E46A974CBA5 /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 628B09AC02F5C0E2C271DF194FD527F5 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2E0D7AD2C312893393D31A332DB584D /* Switch.swift */; }; + 6297EAE813D48EC957BF1AFA5F94CBD7 /* UIAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F62EE7D6E9A5C9B2B4A149126DD909B3 /* UIAlertController.swift */; }; + 62E8346F03C03E7F4D631361F325689E /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7BED73129EE85F31757AEDB2228BA1B /* Response.swift */; }; + 62F7C16106A7967F8D4D824468C062F2 /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B82659B9946A78AB3410BAC442F44CE8 /* ScheduledDisposable.swift */; }; + 6307A408B7EE75FCEA0305416FEBD4BC /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 001A5A845D99C35B1652222641E73AB5 /* SkipWhile.swift */; }; + 6445B28465C1A7900E895709BC333C23 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EBDF55DB367F9D4B097B31206C7B0B2 /* Contain.swift */; }; + 6483C8F8150DAA41200F2558D6F7664F /* MD5-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A21E1CE87731B382D49E07980BC58A22 /* MD5-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 64B7A9F6A1C0284F15F2A2F62278C6CB /* CZWeatherForecastCondition.h in Headers */ = {isa = PBXBuildFile; fileRef = FA7827CF2CAAF5FC74BA7BBAD8F36711 /* CZWeatherForecastCondition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 64E3F1DC94CFB9F0E92B0CB453F7C5D9 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1575E2D351DDE2BE8777DD3275D1FF58 /* AnonymousInvocable.swift */; }; + 6502069A93636E390E611BCBC9114069 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DA3FE71CE9BCD380E5EDE80C3F3193 /* MainScheduler.swift */; }; + 657126C8F43C1002B08D666277023354 /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B2E64DD128C61A11C7F6E061A9BF933 /* WithLatestFrom.swift */; }; + 6575814EE5A3176AECC460D0E788AC98 /* BytesSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87061D23958D8DFA85B774892E5C242D /* BytesSequence.swift */; }; + 65A0C4B1CE5333AEB1C53E261ECC879F /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27A009DF98D02462EE0488A4982695A /* Map.swift */; }; + 65C7CB84D47190476290630565AD1024 /* Parse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658D6D77A9A575CB3A09357D0C84D2C0 /* Parse.swift */; }; + 65F131774875E513DF408DEFC00B2249 /* EventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDC4B5872E67A1F3C51C0299F724C7AD /* EventHandler.swift */; }; + 670A0FFB73A674D818A118CA92D93736 /* Support.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF90400F3F43ACD3A8E9D522A5F7A3CF /* Support.swift */; }; + 68173C12C057FEDDBA1FD167E256DDBA /* AutoStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C9D3800DBC925BB1FC5356FFF28F5F /* AutoStack.swift */; }; + 681BFBE0CAAF7ABA3F9676F54125F5F2 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65C061A82B2F970A58ACC7723754AE5 /* WebSocket.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 68417CD65FCC6176AC4D2018E5D6328C /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613A7CCA2061D9CDB49FCDB9E589F515 /* Operators.swift */; }; + 684A7E4C24ADAAB1B497B5F658036FC2 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC78157203E2CD368DD737649105666 /* Functional.swift */; }; + 68B245DB47CA60F8F9ADCA1E8CCDC324 /* UIApplication+StrictKeyWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = A37EBAF248BA81E9A25C7C8C4C29B19E /* UIApplication+StrictKeyWindow.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 68B4917E1F9928EE518E809229C8B7AE /* CZWeatherHourlyCondition.h in Headers */ = {isa = PBXBuildFile; fileRef = E40455FC13D39DF345873D8DB7B35C65 /* CZWeatherHourlyCondition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 68C2925B017A5B2A1DF50FD9E8A7A7A4 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E03AFAD740BD6F255FC346161B0D4C3 /* Platform.Darwin.swift */; }; + 690E08358CD235CABD810A6B65B03548 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A66610611AE02699CB7A30C8588034CE /* RxSwift.framework */; }; + 6914EE43A9B8B8D30220B3B6B0D57523 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F872E2DA5BDC191FB39C413E4096C6 /* FBSnapshotTestCase.m */; }; + 6958DB2F5F880F38634AF6BD45B1D36E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 044D06DA8058DE1ACDACEE2E7B8E6F58 /* UIKit.framework */; }; + 699EB21919A6552704CC326E56C96B95 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 6A068B06BD3F44A66256A86C4FC44787 /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF797697B45F5626B1046FB2A7ADA79 /* AsyncLock.swift */; }; + 6B7C72BC2E595ABBA95B9DD848E95063 /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EADD9C8A63F08C6AE7F3050F674074A /* LockOwnerType.swift */; }; + 6BEFF6CD075BE86FC0DF0D63855DAAD5 /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5804B85C707593866DCB0F9FC10DAF8E /* Endpoint.swift */; }; + 6C0DE75B379596C049CD66F64D0C7B19 /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3FE140B00E9999149393998D3615E5D /* SubscribeOn.swift */; }; 6C8C37DD34045541FBD19B2E0212A88C /* WidgetTemplateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 719FFD44B50DF8CC2F5A28533C8BF8B8 /* WidgetTemplateView.xib */; }; - 6D3982E810FB807B9670211003934E21 /* BlockCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B32CFD914449868EC9A504955F5A58 /* BlockCondition.swift */; }; - 6E4A16BF4D27C48BB1FE1E1CF5E8B90E /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AA5A6E73E26D410EA10E661DBD32CD /* FBSnapshotTestCasePlatform.m */; }; - 6EA8A4E3A31CB2498CF44D4156F1F892 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48ADC7B2AB8E3AA9401F71A80D5C218F /* StartWith.swift */; }; - 6F33CD107E63450BD8ECCDC92F3320F7 /* DecodingError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1C4A20C6491C1710A9CD4CEDE11BBF /* DecodingError.swift */; }; - 6F7D252847461FA033BA863FF045AFA8 /* WidgetSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = F09B89D360CA5972F43C9A3528F44271 /* WidgetSettings.swift */; }; - 6FA0D3094E3B86EBDDECCFB79AB8B9D4 /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3FE64F781D63931FD33805D6A19B7D7 /* AnonymousDisposable.swift */; }; - 6FC4B5CA11E75D789A69753446CC0894 /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4E2E227CA97B375F1F2A4F3AEDA6C0 /* InvocableType.swift */; }; - 700DA72C42E098CB58B7BB2177C6924D /* SlackKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 15315FEA116DDE38A2D9A2CAEB78384D /* SlackKit-dummy.m */; }; - 703AD3F3EABF5D0DC6FC4924902F8194 /* Job.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0CEC605BA166E4C729B5178FF3F6C7F /* Job.swift */; }; - 705BAF05F4823306CE780B30810244B4 /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 670D225B87645A98748B2F14B63FED62 /* Generate.swift */; }; - 715D90592C116EAEEDBB900D6E67CF8F /* MutuallyExclusive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADE2BBFA13927E96E8BF3D31D5BFF69 /* MutuallyExclusive.swift */; }; - 7164BBF578E7543B1707DBC453A6AF27 /* OHHTTPStubs-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F58E256DFC2C7E2239EACF7E3AF19FDE /* OHHTTPStubs-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 71787EA8F714529457CB48D200A02E1A /* IntExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDF915A24AC928B6CED96ABDFE445362 /* IntExtension.swift */; }; - 7259E4E87AA402D2914ADB6EB907F65D /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824104CB876FBA932A5654A42B8FF2FD /* Result.swift */; }; - 72B364E1F0105ACF4D892EF233FF73F8 /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = E054316752028477F4E2A0D7499B76E8 /* Catch.swift */; }; - 72ED5FB45D826DB4040819B50AC69B0D /* LoggingObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6CF0B94F8A0CEE9F2001679A3383A69 /* LoggingObserver.swift */; }; - 736538C78DED9D0CAED68D8E681DFB79 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088983579F518D970ADD12A573EE0215 /* ElementAt.swift */; }; - 737822D31E67D0F5CA942002AA35C68D /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = C76511FFCA133B2CAC435B0585176831 /* AddRef.swift */; }; - 73DEEEAB9ABCA95660AD7B56837F8749 /* RawRepresentableDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B4BBA3BBF6D2AB43B99E35F796A3DC5 /* RawRepresentableDecodable.swift */; }; - 74C0F5911A9F02AD3EB95CC936839267 /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2B1264CDFB8196810B752BCFF4C016A /* Never.swift */; }; - 74FF592A3FCAB58E47D0CC73BB95A6A3 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCC5E8E3D1D9967BF0D4557CABE09F0 /* Reduce.swift */; }; - 776F309B345437558D52CB1A46BD3ADA /* NetworkLoggerPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF242386D5E5DC0C03ED23C8597B2AD /* NetworkLoggerPlugin.swift */; }; + 6D3982E810FB807B9670211003934E21 /* BlockCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6EFDC4BA6B75C67298019621CDF4DB /* BlockCondition.swift */; }; + 6E4A16BF4D27C48BB1FE1E1CF5E8B90E /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A24965AF386235FE08F3C73C9FB4E91 /* FBSnapshotTestCasePlatform.m */; }; + 6EA8A4E3A31CB2498CF44D4156F1F892 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6AF0971043E9BD162252E24533BE1EC /* StartWith.swift */; }; + 6F33CD107E63450BD8ECCDC92F3320F7 /* DecodingError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A3AA4341727301E6E94ADD24D5776C2 /* DecodingError.swift */; }; + 6F7D252847461FA033BA863FF045AFA8 /* WidgetSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DBFB01C6E5249146D23036ABB3E8BE /* WidgetSettings.swift */; }; + 6FA0D3094E3B86EBDDECCFB79AB8B9D4 /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD18FDCA13C4259452343BF874E90F8 /* AnonymousDisposable.swift */; }; + 6FC4B5CA11E75D789A69753446CC0894 /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCFCB8D83FE163A9D6D29E116DC65D2D /* InvocableType.swift */; }; + 703AD3F3EABF5D0DC6FC4924902F8194 /* Job.swift in Sources */ = {isa = PBXBuildFile; fileRef = 503CD2C4FE62A99886E8ED1AC45E70A8 /* Job.swift */; }; + 705BAF05F4823306CE780B30810244B4 /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28A1E503DDAB03523C735B123228DEDD /* Generate.swift */; }; + 70919FDDAB0D5145DC31E89D4CD4F323 /* CZWeatherKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A8782DBA67E5A8C42D0054038260C92A /* CZWeatherKit-dummy.m */; }; + 715D90592C116EAEEDBB900D6E67CF8F /* MutuallyExclusive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DEBE05B9F6B3D00DFA6C9856612880 /* MutuallyExclusive.swift */; }; + 7164BBF578E7543B1707DBC453A6AF27 /* OHHTTPStubs-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E60A7851A634388A08E46DF639318B5 /* OHHTTPStubs-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 71787EA8F714529457CB48D200A02E1A /* IntExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C88363E0695421EDB039A027351F6B9 /* IntExtension.swift */; }; + 7204DFA5FC3993A50B94513709953A01 /* CZWeatherLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 485E7E75364E70635964F0ED4F3F5520 /* CZWeatherLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7259E4E87AA402D2914ADB6EB907F65D /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1374601308D3E4E20991CB28427F6B /* Result.swift */; }; + 72B364E1F0105ACF4D892EF233FF73F8 /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = A01BD6D8133F42BD3ED4BC68C1BBABD8 /* Catch.swift */; }; + 72E173DFDEDBD78FDCE7F689DA68D478 /* CZWundergroundAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 817F7DA7732EB0F365314086F0055F84 /* CZWundergroundAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72ED5FB45D826DB4040819B50AC69B0D /* LoggingObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0C464CF4A288281B24536F8D9C07DA /* LoggingObserver.swift */; }; + 736538C78DED9D0CAED68D8E681DFB79 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2353CE125C65E342D4E23AF4F71ACAD /* ElementAt.swift */; }; + 737822D31E67D0F5CA942002AA35C68D /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 903578142A78F8BFC402CC990EC3617A /* AddRef.swift */; }; + 73CF110EC0A789BFA7F55D4961EFCEBA /* CZWeatherAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = BBABE62A1C45E254CB971620847127BF /* CZWeatherAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 73DEEEAB9ABCA95660AD7B56837F8749 /* RawRepresentableDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6E8DCFB611F2A319D755B358C928B49 /* RawRepresentableDecodable.swift */; }; + 74C0F5911A9F02AD3EB95CC936839267 /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416AB18847085E478F0005A36AA2EADE /* Never.swift */; }; + 74FF592A3FCAB58E47D0CC73BB95A6A3 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051DE4F9CB980596711F318FF71BC7A4 /* Reduce.swift */; }; + 776F309B345437558D52CB1A46BD3ADA /* NetworkLoggerPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = D68CACEA9363EBD82EE187827A086AB1 /* NetworkLoggerPlugin.swift */; }; 77E0B8608843E024E3DE4703228CB22F /* GoogleAPIDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5DEF27942BEE4774CB6F85AC1904567 /* GoogleAPIDataProvider.swift */; }; - 78D5543ACC110C4A0A626CEB5F3761B0 /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B96F930221441771B05C680CB04EB5A /* Types.swift */; }; - 7A3C51EA2D7FB867BA60B51222DFEFCE /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECD8DFBD0B607CFA643F1C114AC9D816 /* Merge.swift */; }; - 7A5F830CFC58E1AA91E1FA4255DB0231 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94686B7E6FF6537A2D40EC7EE4356BB6 /* Errors.swift */; }; - 7A6FECB305692AC1327FF47B6F065FB2 /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B58283BF1679F8F3C82EBA0A13E57A0 /* Producer.swift */; }; - 7A7ABB25C60972A1330CDCB7D40CEA8B /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAA5D1B18AFEB88932EDC0F31515D8F6 /* Filter.swift */; }; - 7B254F3E51E169B413B4529FE00CDC76 /* CloudKitInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED238925D8D6DCC8A449E8C42039B7E9 /* CloudKitInterface.swift */; }; - 7B48852C4D848FA2DA416A98F6425869 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B89FD74A740C255B4152E9D803A2643 /* ServerTrustPolicy.swift */; }; - 7C7C888EAC5B99043CDFB4C523B96BCA /* DelayOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2FE2542E68DB6A105833468075DC9B4 /* DelayOperation.swift */; }; - 7C9C6A5BC9B4E0DDDF7D685E33B6CDF6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; + 78A72DA657DB85EFBDFF1F30B318E62D /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCD221348770C2177A95D3594D2B1AAA /* Attachment.swift */; }; + 79414B89929A286D62172E21E7FF2093 /* CZWeatherCurrentCondition+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 4986A7085C1D93F0CCFD5B6AAA7567A2 /* CZWeatherCurrentCondition+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7990A139A04CFA4AD2737ABD6CADA72F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 7A3C51EA2D7FB867BA60B51222DFEFCE /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262D2897D26F2DC9F978E332F43FA176 /* Merge.swift */; }; + 7A5F830CFC58E1AA91E1FA4255DB0231 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385290186EC8EBF16D223697EDD977AD /* Errors.swift */; }; + 7A6FECB305692AC1327FF47B6F065FB2 /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51DB27EB3D0B1064FCE7A1FF54AAF1AE /* Producer.swift */; }; + 7A7ABB25C60972A1330CDCB7D40CEA8B /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE1F1FD078AF8751A64C7F854E0E83 /* Filter.swift */; }; + 7B254F3E51E169B413B4529FE00CDC76 /* CloudKitInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C9C83007783BC69E2F7028A6F9EB65E /* CloudKitInterface.swift */; }; + 7B48852C4D848FA2DA416A98F6425869 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7939EA80D80C2CDFFF424667A2FE5B6 /* ServerTrustPolicy.swift */; }; + 7C772FC3912BF34398E6209EB1BC420B /* CZWeatherKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F76D589FE2B17BD1EB65789C59AACDB /* CZWeatherKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C7C888EAC5B99043CDFB4C523B96BCA /* DelayOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 138902410265822F46424F09E7E896CB /* DelayOperation.swift */; }; + 7E70DED14EE16C50080C10B5AF99DA64 /* PINCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 207EC3BB70412EDF14308BF57AC59474 /* PINCache.framework */; }; 7E8130694EA6871C8C50863CDC0306B3 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233F7F99D65CD34895EC198D4D480B49 /* UIColor.swift */; }; - 7F8AC53F92F56C3319DD733CAFB9DD58 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 004DF151CB42D6DA46EAC5677831C9CD /* BeAKindOf.swift */; }; - 81231835DF6147F34D74F5C5B3ABFB21 /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 38587901E5E1831929D293E6400D9312 /* OHHTTPStubs+NSURLSessionConfiguration.m */; }; - 812A89BB2E8D5301C5D856181F276779 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 51A5BB0934C50FA5E10B76DD47E10299 /* XCTestObservationCenter+Register.m */; }; - 82AF809ACDE94CBDEEE981FD8BB7A655 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ABE5EC463FC662460A2919A1594CE35 /* File.swift */; }; - 84D7193E083C4A905B803EBE15331A80 /* AlertOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 990AB471645915530460ED5B4296B026 /* AlertOperation.swift */; }; - 858602C89BD20ED46874B48472AB95D9 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = E77192C2ECF1B42A0E3703A82C494CE5 /* SingleAsync.swift */; }; - 85D178DFCA1BC67BBFB1188E34EC5B19 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06845F1C5205A28F6CA5A8BCB9E0A0F7 /* SwiftSupport.swift */; }; - 8654A4580B875C71875F6A8E08612BBA /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7027821F8195805CB696AB998443E551 /* InfiniteSequence.swift */; }; - 866830C585216CA87A15D078A28C410A /* CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 902FD2C17FBC2DC30E782D064596F970 /* CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 88A4169D67853F300470E21D97AA6583 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = C659372D31D8FF6B2C83453D431C9E0F /* NetworkInterface.swift */; }; - 8A4ECDFCB6C2263259B56C6293654D82 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DB476F378A374425A4A872AC041CDB8 /* BooleanDisposable.swift */; }; - 8ACF6A5515A175054E22414BF740EF14 /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C1B693C5FBBEC0F7202281D32555B2 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8BEA1B7349BF66EFD97713CFD0FCF2D4 /* SSLSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500BCE51B8A1864F6393247415A1471F /* SSLSecurity.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 8DFE23F2C7973BC8A159168AFC2FB8C3 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CA8F0B84E4EDE03926FA1C802F2C0D7 /* MatcherFunc.swift */; }; - 8EB11202167FCDDF1257AAAB1D1FB244 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A65978C9F21A6622092D46A7698972E /* Alamofire.swift */; }; - 9016F46F5A02352DFFC595A077021BF5 /* OHHTTPStubsMethodSwizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = 44313306E6719B5398ED4B11FF575098 /* OHHTTPStubsMethodSwizzling.m */; }; - 9053212A2049F59CC9D0298EF5F58F96 /* BackgroundObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA5EB374CD3B03B02BF98E4A1C5BE09C /* BackgroundObserver.swift */; }; - 91FAE3F1EECE69515B8030DBEA0B812F /* EventDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3A7734CEFD56FE51508FEAD980F373B /* EventDispatcher.swift */; }; - 920087B3F2EFE09DC2044710AE3AC18D /* GCBCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ABD8103E98463EC51324AC371AB9B8C4 /* GCBCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9267E6CD1DCAC64623E78038F2E412BA /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD6908905B7449D4B93B7B1FBAC042C /* Timeout.swift */; }; - 9296C7ABDE9E5894D47CD74E7F78F968 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E8D411F3AD640A9350A023E31F0F5A /* Match.swift */; }; - 92BC58B0158D9DFE7D59C341A85D4359 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EE29A44B3A9D9ADBCFB06B96CC77DC7 /* Async.swift */; }; - 92EC1D4696BEE22FF0BC6AEE6205BA94 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 405C0BBDBA2FCC2A4AEAE736E6F757F9 /* CFNetwork.framework */; }; - 9469DF81ECB494E84675969B5E13374C /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 680DE9381D53CDF7878C1EEBBBA4C7FB /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 946A616A9D21D29B5EDD382519F0E874 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 727AE1290FAF12BA08FD7A550E8D7D3E /* Multicast.swift */; }; - 9481EA52B7CE4AB309480B6D710E7C9C /* OHHTTPStubsSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750BAEB00D36519A68DE054FFFD241E6 /* OHHTTPStubsSwift.swift */; }; - 94ECCD892AAC4541952EEA521C811B06 /* Plugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C2E1CAE64061289717D5CF65C888F40 /* Plugin.swift */; }; - 95B296109ADBC4C4C63FA1D8D5C56874 /* OHHTTPStubsResponse+JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C67182A2965A811DBF189CFB9D77162 /* OHHTTPStubsResponse+JSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 95F54B9537875729AE90B472EA5D39BF /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4182174CFF0387C1D1308D61F3D220 /* Expectation.swift */; }; - 96151E0516F0FAA666C25A0EC52FDAA6 /* Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 63B66AE93F7EAF1D980C296DCD7BD4CC /* Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9716D2A2C6450CE94FAD7D5C99EA0FE7 /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625EE20C48945234E6D9076BF18B11E3 /* SynchronizedOnType.swift */; }; - 991E1E80BD79BB7553E5B3509BEED19A /* Operation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F9D561B60E7E6CF911A1748FFE4BD1 /* Operation.swift */; }; - 9A18A97BBE966DD435BFE9E16C100C11 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = E25343E3B0074B7945ADA2B1186CF11B /* Logging.swift */; }; - 9A65F56D71AF60771C32516EA12DA627 /* Observable+StandardSequenceOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FFD1B43174636A84FACDDAB8CF62BAF /* Observable+StandardSequenceOperators.swift */; }; - 9B3F4B514F475104D5C3362119711C65 /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 080A2D287ABAEC0E4250F062CCD0E3AF /* ObservableConvertibleType.swift */; }; - 9B9291E57B97D332896E462D34E4CF9C /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5069A62D7A27A00BD41324F081844E16 /* TakeWhile.swift */; }; - 9D904B7EAD0EC56AD12E704757CAA640 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE5EDB48F3F0DFB7CAD33A79A5508E5 /* SourceLocation.swift */; }; - 9DEBAC3C249D6C20123D303EFA6FB46E /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878664DE0B1FBFF4A4E19FD913EC2857 /* DistinctUntilChanged.swift */; }; + 7F8AC53F92F56C3319DD733CAFB9DD58 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6CE0A6E2EC4F8E1B91D99AFE1DB2C1 /* BeAKindOf.swift */; }; + 81231835DF6147F34D74F5C5B3ABFB21 /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 236874A5661A734F37C32C47477F7E48 /* OHHTTPStubs+NSURLSessionConfiguration.m */; }; + 812A89BB2E8D5301C5D856181F276779 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D50230900D66E763BBE61EA45AE6A4E /* XCTestObservationCenter+Register.m */; }; + 84D7193E083C4A905B803EBE15331A80 /* AlertOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD048D723C388D093040537FC421C18B /* AlertOperation.swift */; }; + 858602C89BD20ED46874B48472AB95D9 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA22966660CB2DAAF6AFBA0D26B8BDD4 /* SingleAsync.swift */; }; + 85A49483A4350107A564B9A39730FA72 /* PINCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 999954921F1306760303035CC229DEEC /* PINCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85D178DFCA1BC67BBFB1188E34EC5B19 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AB5B3A20465860C55AEC48196B2FB2 /* SwiftSupport.swift */; }; + 8654A4580B875C71875F6A8E08612BBA /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254DB530F74E96DF4D248EBC441C77E6 /* InfiniteSequence.swift */; }; + 866830C585216CA87A15D078A28C410A /* CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = D61291F2F3350AA7EEC042A00B653599 /* CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 8A4776EB19208E4A6AF3E2A78605712B /* CZOpenWeatherMapAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 35776B662CD81337BA97B9A2F564D78D /* CZOpenWeatherMapAPI.m */; }; + 8A4ECDFCB6C2263259B56C6293654D82 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B89A9BAB951F05BD540C7621426DDAF /* BooleanDisposable.swift */; }; + 8ACF6A5515A175054E22414BF740EF14 /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BDEACB6246243123A0406EE1FF2FE2B /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8C12FC250DDFB1877E4CB209382A8F52 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFEF81C4A92B882D19C48EFF13E8275 /* EventDelegate.swift */; }; + 8D5E5A1CD5C388BFDD3C5773514BF35F /* CZWeatherKitInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 45329FD9FB9F88CAEBCCDCE2A312E7C2 /* CZWeatherKitInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8DFE23F2C7973BC8A159168AFC2FB8C3 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78A0920B012D88A959BED3CBFB580005 /* MatcherFunc.swift */; }; + 8EB11202167FCDDF1257AAAB1D1FB244 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BD34DE6798A198FECC179DE52BC0DE /* Alamofire.swift */; }; + 901393E3095FDAC404F023ED4B3A02DC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + 9016F46F5A02352DFFC595A077021BF5 /* OHHTTPStubsMethodSwizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = E6683E84B93C3659F7136845681EEDFD /* OHHTTPStubsMethodSwizzling.m */; }; + 9053212A2049F59CC9D0298EF5F58F96 /* BackgroundObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63AFCFD3626BD1677D8DD0EC875B2AA5 /* BackgroundObserver.swift */; }; + 90A9A28DC809318792F23BBC482843CF /* PINCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 25D4519C15A99C03986C81791EA2DDE3 /* PINCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 920087B3F2EFE09DC2044710AE3AC18D /* GCBCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 980A076319EB87EC8EA4248C389173CC /* GCBCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9267E6CD1DCAC64623E78038F2E412BA /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6173A031FA951E5E89A7B22362B4EAF2 /* Timeout.swift */; }; + 9296C7ABDE9E5894D47CD74E7F78F968 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C65EE2551A368A4994FDCF162B5D6D /* Match.swift */; }; + 92BC58B0158D9DFE7D59C341A85D4359 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F42B655758D10D25BA60165E593FC17 /* Async.swift */; }; + 92EC1D4696BEE22FF0BC6AEE6205BA94 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 803EC29A41FE2384D81E3E19868BEF3B /* CFNetwork.framework */; }; + 9396CAD20BF27C850285105FC1C883B4 /* CZWorldWeatherOnlineAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = D8B58171D15B0D8F812EDEC5562C3083 /* CZWorldWeatherOnlineAPI.m */; }; + 9469DF81ECB494E84675969B5E13374C /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E803C3F4BCBD8570797C469B96C3A55 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 946A616A9D21D29B5EDD382519F0E874 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F366107629F3CA413E9CA8FD0F6ECB /* Multicast.swift */; }; + 9481EA52B7CE4AB309480B6D710E7C9C /* OHHTTPStubsSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57FDF85C9318FD5BD63CE69F6AE6FA98 /* OHHTTPStubsSwift.swift */; }; + 94ECCD892AAC4541952EEA521C811B06 /* Plugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72E107EE3B3A89D26D4F598A97AD5C5 /* Plugin.swift */; }; + 95B296109ADBC4C4C63FA1D8D5C56874 /* OHHTTPStubsResponse+JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 59131A290544F112A0FD7995748207E7 /* OHHTTPStubsResponse+JSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 95F54B9537875729AE90B472EA5D39BF /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D74E8B9F8E150B83F528079CA95AE6 /* Expectation.swift */; }; + 96151E0516F0FAA666C25A0EC52FDAA6 /* Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AA1DE78C7ED6232E613D259C6E93A24 /* Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 963AAF6D5C1D701B3DFDE511B3B826E8 /* CZWundergroundRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 644573D029641CA7952EFF093940C270 /* CZWundergroundRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9716D2A2C6450CE94FAD7D5C99EA0FE7 /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C67556D2A88B84A6632C15E1F5FDBB7 /* SynchronizedOnType.swift */; }; + 9787D556F832CD3DE69D29FBA3F096D8 /* CZWeatherCurrentCondition.h in Headers */ = {isa = PBXBuildFile; fileRef = 02817F9296DCE595B008D438D44E5122 /* CZWeatherCurrentCondition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 991E1E80BD79BB7553E5B3509BEED19A /* Operation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259D36F30D4703E0D9515BE06D4CA355 /* Operation.swift */; }; + 991E5CAF383D016EC76A0435EB622718 /* EventDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9975B1831AFFBE5993BD4114308536 /* EventDispatcher.swift */; }; + 9993D01B066727888935A0699FF4FB73 /* CZWeatherForecastCondition+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = A75D2621FD6E28A3CAFF24F9DEDD8D97 /* CZWeatherForecastCondition+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9A18A97BBE966DD435BFE9E16C100C11 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = A688C7F6111B05F13630500C10E8FC51 /* Logging.swift */; }; + 9A65F56D71AF60771C32516EA12DA627 /* Observable+StandardSequenceOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAEECE654E4CD8B27C932738B3D6A4B8 /* Observable+StandardSequenceOperators.swift */; }; + 9B3F4B514F475104D5C3362119711C65 /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1B2344DBFCA72493243FB3F673748B3 /* ObservableConvertibleType.swift */; }; + 9B9291E57B97D332896E462D34E4CF9C /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61744593F89B4D12A2CEB42BF7FE0AA6 /* TakeWhile.swift */; }; + 9D904B7EAD0EC56AD12E704757CAA640 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F24D85E34707F80D83DFC916A9D5FC79 /* SourceLocation.swift */; }; + 9DE2E0452247D591667DC8E673799776 /* SlackWebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B95C639014BF8E74EF74493AE58E3F /* SlackWebAPI.swift */; }; + 9DEBAC3C249D6C20123D303EFA6FB46E /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE76885BB68F1DDB7492AA259B36AABE /* DistinctUntilChanged.swift */; }; 9DED37D246A47475778B1F0AEA156B97 /* LabelWithSpacing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2534E75138611D5FFE2743EB84FE7D03 /* LabelWithSpacing.swift */; }; - 9EB14E7D3C6E6E7A6DB18FF4940322F3 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F5535223CB91EC32EA973602DEE2B7C /* RxSwift-dummy.m */; }; - 9EFD3EE819EB1FAA5EDE26E8DAA483CD /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7124A8B55899A0443DC62BCE0C5ADBEF /* EndWith.swift */; }; - 9FA3B93CE0ECAC3CDC30890659AACF82 /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DCC50731144D700AC8FB353AB968338 /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9FC73E2087308B82F9E3CBBFBCE091AD /* SlackWebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608F45D2BEB10003A9A96C12F7132C6B /* SlackWebAPI.swift */; }; - A0AC2247B866BC0AE1FAA0068F88EBC4 /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FD4600467B1A5E1CBB314767D50398 /* Skip.swift */; }; - A18E791645056D5563206104A3E3AD87 /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C66F697F0481E963E77BE6EAE22A90F /* PostNotification.swift */; }; - A1B57C4C42434362A6F8A8C70020AC1D /* LocalConfigurationLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095AE12AE90926F1878026E6A370F6D8 /* LocalConfigurationLoader.swift */; }; - A1F69DD3961B60955EFD28E2BDF446E8 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D67DE31CE739F3354D20181C30A844E /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A263D900F8B168D9905D0A61B41621D1 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E2606B214596E576925F344EA99452 /* ObserverBase.swift */; }; - A27241785E558123C991583C6CF010C0 /* DispatchQueueSchedulerQOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F0D18CBFD293294B88A60B41D2BC49 /* DispatchQueueSchedulerQOS.swift */; }; - A3D3D0F789774776058634CC7B9677F2 /* Moya-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 86C4319B94A7ADE4BD2F133F0F116B98 /* Moya-dummy.m */; }; - A436A868E3D3CE7A7B900309A8FCB4E7 /* NSValueCastable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4A67AB5218C594446FA1C9314129EA3 /* NSValueCastable.swift */; }; - A449E1A15C60018A50DF50A48FA22EDB /* NetworkObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079627E6114383B5C3E2F469EDCED353 /* NetworkObserver.swift */; }; - A462A054D7967A494DE561534125C133 /* Generics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67F329A43C714B2A0D7A7492BF682D35 /* Generics.swift */; }; - A4F5EA793A5FD3743885F8EDA93C1317 /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 22D31D636C4F27D80DA5D066D4CCCC24 /* OHPathHelpers.m */; }; - A5D84DB3FD86F22F0E206CE7C2C138DF /* Decodable-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7089F72423629637335BF3128795FDE8 /* Decodable-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A68F66D660111A93636B42563C54891E /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09798F8AC7BA142F482665D00051B49C /* Channel.swift */; }; - A6E88FE220118D052E4140AA10E2C057 /* URLSessionTaskOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E4A6B7EB4094BEE9B64D5AD7B3CF54 /* URLSessionTaskOperation.swift */; }; - A74464665880D867F5BEF001DE890FA6 /* Starscream-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A35A34F460B3DDEF7300274455963701 /* Starscream-dummy.m */; }; - A8B7349B45D0AFE858FDAC7AF84C622C /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43454B0B140E7602BC3C29F257F610FB /* SchedulerType.swift */; }; - A9DA3829FA747E599023EF1394CD2EB5 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F09DB2B41BEED0B4863A66D01016110 /* BeVoid.swift */; }; - AA314156AC500125F4078EE968DB14C6 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCF49F39356F77C0589547137998980 /* Result.swift */; }; - AA7D71D159AE6BB31C6F2C49D93BF791 /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 424B72FB4E1251C9E64628CF561E7502 /* ConcurrentMainScheduler.swift */; }; + 9EB14E7D3C6E6E7A6DB18FF4940322F3 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 95471B594BC00260369AA577A3C22847 /* RxSwift-dummy.m */; }; + 9EFD3EE819EB1FAA5EDE26E8DAA483CD /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74A19005820F2EEAEA82AA298EE90B6 /* EndWith.swift */; }; + 9FA3B93CE0ECAC3CDC30890659AACF82 /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CCC20C08696FCF2F7F31CD4A96643B0 /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A0AC2247B866BC0AE1FAA0068F88EBC4 /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B042580ED92652AB4B1C622698DC37C /* Skip.swift */; }; + A18E791645056D5563206104A3E3AD87 /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3864EF9D95FC380FE6DC3D55ACDF5B5 /* PostNotification.swift */; }; + A1ABF2BD945A09D6559CB0B17CCD7710 /* CZOpenWeatherMapRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 80EECA637B691A52FA3A1F9A4827B561 /* CZOpenWeatherMapRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1B57C4C42434362A6F8A8C70020AC1D /* LocalConfigurationLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D2F0BE87765E06885BCBC6297007AF /* LocalConfigurationLoader.swift */; }; + A1F69DD3961B60955EFD28E2BDF446E8 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1485A636A575830A6F4661CCDDC006E5 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A263D900F8B168D9905D0A61B41621D1 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F217B1700BB931C158333F1A765A2FC /* ObserverBase.swift */; }; + A27241785E558123C991583C6CF010C0 /* DispatchQueueSchedulerQOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8688A4A51E3AA602B1C801FB5A55F4C3 /* DispatchQueueSchedulerQOS.swift */; }; + A3D3D0F789774776058634CC7B9677F2 /* Moya-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C7CB2B2755EE88C5C7AEB169924324E /* Moya-dummy.m */; }; + A436A868E3D3CE7A7B900309A8FCB4E7 /* NSValueCastable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C04776AF55A3D9D81CEC17B3396978B /* NSValueCastable.swift */; }; + A449E1A15C60018A50DF50A48FA22EDB /* NetworkObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B806A64A4CDF085707D6128AE8B72575 /* NetworkObserver.swift */; }; + A462A054D7967A494DE561534125C133 /* Generics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F9A0551CE1960D3BD918E2886B4B72B /* Generics.swift */; }; + A4F5EA793A5FD3743885F8EDA93C1317 /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = B22DF01C84C772212D032A3F8AFA9215 /* OHPathHelpers.m */; }; + A5D84DB3FD86F22F0E206CE7C2C138DF /* Decodable-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CA20ABBBE65CB501F7FF4748DE2923DB /* Decodable-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A66AE0842F4CA9486488BE82C11E0F8E /* CZWorldWeatherOnlineAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = DE173CEC9E72882FF93759F16D4418D9 /* CZWorldWeatherOnlineAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6E88FE220118D052E4140AA10E2C057 /* URLSessionTaskOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4CCD5ECFA2F593A40462E36DD1A978A /* URLSessionTaskOperation.swift */; }; + A7AD3B0CD4AB123002B4F70D9C567F24 /* CZPINWeatherDataCache.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA99A08B84A1B309ED264F3F41F0EB0 /* CZPINWeatherDataCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A8B7349B45D0AFE858FDAC7AF84C622C /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CBB44A244B03514A2C9E8D6B16BAF6 /* SchedulerType.swift */; }; + A9DA3829FA747E599023EF1394CD2EB5 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A342B20853A1CB089B903BA8B45FC1 /* BeVoid.swift */; }; + AA314156AC500125F4078EE968DB14C6 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 147ACA3E9072F582D4467776453D9D26 /* Result.swift */; }; + AA7D71D159AE6BB31C6F2C49D93BF791 /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A256DAD3A2A14F983C65AB3737654684 /* ConcurrentMainScheduler.swift */; }; + AA9AFEF5AB3AAEBADDCDFD039C9E235C /* SlackWebAPIErrorDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12653217F63D028DFDC39549ED7D08AE /* SlackWebAPIErrorDispatcher.swift */; }; + AAA41774534387A4F753365D90FDA225 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; AC331232DF690B238FA138673A366D24 /* GCBUtilities-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B102A4C5E1AA548F9F4F3F5AB586C5C9 /* GCBUtilities-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC585E26805E03FFE4F773B3224C83E0 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C4D585C39F5968F8EB9276D93A4747 /* VirtualTimeConverterType.swift */; }; - AD266EDF7D97151B5CDDF3D6C8317F53 /* Result-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 631BB84CCDC1A4368864B39B1002EC7B /* Result-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADA95242F9639EAC4149DE1A4BCF868C /* ImmediateScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F78154CA72B7036A0C3AE660A3ACF44A /* ImmediateScheduler.swift */; }; - ADF19C953CE2A7D0B72EC93A81FCCC26 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F2B67B5C16830EC11E80AF38ACFF31C5 /* Alamofire-dummy.m */; }; - ADF66B47E93CBB6617DB0B1AAB569361 /* NetworkActivityPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD46E1CE16C17EBA81CBAB9018905C98 /* NetworkActivityPlugin.swift */; }; - AE3CF0A631F7CB7B7408475DA412C186 /* EventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FF2E9FC1A53A98022E90178CF78B5F4 /* EventHandler.swift */; }; - AE4CF87C02C042DF13ED5B21C4FDC1E0 /* Stream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520D4BBA9AAABE0AB125029F3853762D /* Stream.swift */; }; - B09B3461D9467BA8A230048F95C26E0F /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1138B4C8AC394CC7D4E0615A95B70EF4 /* NimbleXCTestHandler.swift */; }; - B171518960671D34962C1FB1FA151175 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; + AC585E26805E03FFE4F773B3224C83E0 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF2BCCEC2016C9267293D7DD715228F9 /* VirtualTimeConverterType.swift */; }; + ACE4B5C8B18C989E9278A45A167C5F24 /* SSLSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2BE67D96112EFA1A8E08E43195ADE85 /* SSLSecurity.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + AD266EDF7D97151B5CDDF3D6C8317F53 /* Result-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CBCD6CCBDE82614CA6F64EA893B33C /* Result-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD3DB8BEFA2AD3D8D74479BC9123B062 /* CZPINWeatherDataCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D2A2A50D844627860B146B1800F76D /* CZPINWeatherDataCache.m */; }; + ADA95242F9639EAC4149DE1A4BCF868C /* ImmediateScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B570D63C3187E60805E032FCF3024A0E /* ImmediateScheduler.swift */; }; + ADF19C953CE2A7D0B72EC93A81FCCC26 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DD953A23C4E4AFADBD227DE27A6B4F3 /* Alamofire-dummy.m */; }; + ADF66B47E93CBB6617DB0B1AAB569361 /* NetworkActivityPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 337ACCF8635B3B8BC0B7008E65A46D98 /* NetworkActivityPlugin.swift */; }; + AE4CF87C02C042DF13ED5B21C4FDC1E0 /* Stream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1368B4159EE1FD22492BA2DC5AE9E0D7 /* Stream.swift */; }; + AE7952D37E0DA1D99305195E317349B3 /* CZWeatherKitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = D07D28143A1FD212852820FE92BC58DA /* CZWeatherKitTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AF0501E39D93552EC77F5C7A1DF398A5 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8A570695E40CD3933C7717ADD4457E0 /* Team.swift */; }; + AF5908B01CCF82A54BC12F2122DCB502 /* PINMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9724157927B4D7CB63CF12F0E022FF92 /* PINMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B09B3461D9467BA8A230048F95C26E0F /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0C97AB677266B99F15F6B2808A7A93 /* NimbleXCTestHandler.swift */; }; + B171518960671D34962C1FB1FA151175 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; B1A02CAEC7BF9929002E9F416B5785D6 /* Pods-GrandCentralBoardTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 766B23567C247CDF63DD55357F9C8E0F /* Pods-GrandCentralBoardTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B244AF93C8730FCD30FE17853C974923 /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 156E2C2D99ADB6F18FF5CE2E77DC5C1D /* SynchronizedDisposeType.swift */; }; + B244AF93C8730FCD30FE17853C974923 /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74F2755E5D4716AC8CD20E0239D02B00 /* SynchronizedDisposeType.swift */; }; B24F35224AD37C78C556346C9CC617CE /* Pods-GrandCentralBoardTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BFDC846CD6D42E8E40C710933794920B /* Pods-GrandCentralBoardTests-dummy.m */; }; - B256D8304ED494EE16B59FEC0B33F601 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B0C2DBF17F4C7B9BDEF3C7A6A1AC68A /* Source.swift */; }; - B392376782F24F418444FC5663EAD817 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F86F574BE165FEAD4E328BC234385E7 /* Scan.swift */; }; - B4231216BCC8431518B25B9B53037FFE /* ConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB763FF006BF4CE837CE79C81B61860 /* ConnectableObservable.swift */; }; - B47F2B1F7F5FEC4CE62F09832392E842 /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B1C17190E826FCCC1350CEBAE72CF43 /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B4EF98160FA00196E00E49944E08ACE4 /* CredentialsPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C05540C600AA1971C15A2296297733 /* CredentialsPlugin.swift */; }; + B256D8304ED494EE16B59FEC0B33F601 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08EC4716D980E1721CF9062EBED8FE1A /* Source.swift */; }; + B2E0CA6E237C71687C99AFBDACD9A97E /* CZWeatherRequest+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 613E3B7F8A9996831D3040586BC7A1D3 /* CZWeatherRequest+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B392376782F24F418444FC5663EAD817 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63DFCFBFCF8173EC390341082A2CA8D9 /* Scan.swift */; }; + B4231216BCC8431518B25B9B53037FFE /* ConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AA2335BC64823C6C9B665A5D517A23 /* ConnectableObservable.swift */; }; + B47F2B1F7F5FEC4CE62F09832392E842 /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E048E02E302092F175A7DF890E1029D /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B4EF98160FA00196E00E49944E08ACE4 /* CredentialsPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CDFD5826A8A8BA335CA7D7157DE2CB /* CredentialsPlugin.swift */; }; B4FA593D461B1579A08C4DE4B60FE4A6 /* GCBUtilities-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 250D550EF48C21789BEECEC98F89A80B /* GCBUtilities-dummy.m */; }; - B5F8BDBD6907037DC85CF4B98B7095FE /* Scheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9592EFB53207F923F6437A3C62C68380 /* Scheduler.swift */; }; - B6A67A3B998747E4290BF6010EC33806 /* FBSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2155B21532D94FB92559674F74BE33D5 /* FBSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B78A3DF47B5FEF7D9BE0B7660500211B /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B93194A078C07629874A611D5E0F2131 /* Equal.swift */; }; - B88A5E8E95A9B6477513BD1E1169A264 /* HashProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B70E306FFDD8B673E65811DA6C65B374 /* HashProtocol.swift */; }; - B9A46BA4BC7B6FD0F4B1BCE745F1B642 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A4CF91E474A84D0D193A82F6F55CB07 /* BehaviorSubject.swift */; }; - B9A8D2470869B8D5594CB8514D448D1D /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99965341C449E73C80156A05682B1A0B /* Alamofire.framework */; }; - BA01F78BEA867B628B9187FF99144CBD /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70A6A16FEA4D781FF6A04DAD6EE1F6CC /* Zip.swift */; }; - BA7362188C5D17958A5080EE299A90FC /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F2146458ADFA010E48CE4248449496 /* BeginWith.swift */; }; - BAD1CF7A69FB2D5E04753A91A759EC86 /* Profiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 046B8130F6A4ABAA8C2E97B7503EDBA2 /* Profiler.swift */; }; - BB062761462993E0BABDD08456ABAA03 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B3AEE2D84137BABEFE3090EEC91AEF /* ImmediateSchedulerType.swift */; }; - BB6213FF061812BA7A720425F8D089F7 /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1FAF105DF656E679FAE955379B1C7EB /* NAryDisposable.swift */; }; - BBF88FA3F28C0906DBB78314A8E50A01 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0275A8DAEDC8E1C2ECDC89F8E6F9075D /* AssertionRecorder.swift */; }; - BC66507A31D15C6181767D9698BC2A7A /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38DA258D07BD4ACEC35B7AEED3118AFC /* PublishSubject.swift */; }; - BC7675E678097FC13E76ED89FE40CFEA /* Moya+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C53F88134B1763B9D5B017926E2A266 /* Moya+Alamofire.swift */; }; + B5F8BDBD6907037DC85CF4B98B7095FE /* Scheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B811E93430B9D7B81778B697B04CC13E /* Scheduler.swift */; }; + B6A67A3B998747E4290BF6010EC33806 /* FBSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EBEACD8FDA1AE6C60B7767F3208741DD /* FBSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B78A3DF47B5FEF7D9BE0B7660500211B /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F3D0B023F4645C1DD28D34C0C63287D /* Equal.swift */; }; + B7A3A78987EF2EEF046256A63B931250 /* CZClimacons.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AF566A3A4276FBEF31FA3D9027AE0EB /* CZClimacons.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B88A5E8E95A9B6477513BD1E1169A264 /* HashProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CFF5407387D136FBCA29313995345D /* HashProtocol.swift */; }; + B909A1689530C0EDDC2E03A5F29A2652 /* CZWeatherHourlyCondition+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 654ECC37332791E3E91CF55E6B4B1F6F /* CZWeatherHourlyCondition+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B9A46BA4BC7B6FD0F4B1BCE745F1B642 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B89940DC10F8642BE09481E5110A9544 /* BehaviorSubject.swift */; }; + B9A8D2470869B8D5594CB8514D448D1D /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB88BB0CC73BB2714CFDD8E1B6C67A42 /* Alamofire.framework */; }; + BA01F78BEA867B628B9187FF99144CBD /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CA682DFE2CF3324CE676F0A8A81F628 /* Zip.swift */; }; + BA7362188C5D17958A5080EE299A90FC /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C1EE36B884CA88E59941CBDC0A2A5D /* BeginWith.swift */; }; + BAD1CF7A69FB2D5E04753A91A759EC86 /* Profiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE8816C602F53112572342B980D49DC4 /* Profiler.swift */; }; + BB062761462993E0BABDD08456ABAA03 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D9F6C9A4529E97228E30808A5489DC /* ImmediateSchedulerType.swift */; }; + BB6213FF061812BA7A720425F8D089F7 /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A3E31CA93138718487DAD5D57625BEE /* NAryDisposable.swift */; }; + BBF88FA3F28C0906DBB78314A8E50A01 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38EBA7A087A5BF87A755A7639A1759F3 /* AssertionRecorder.swift */; }; + BC66507A31D15C6181767D9698BC2A7A /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD58018F55E6C7AA133CBDFCF9D9836 /* PublishSubject.swift */; }; + BC7675E678097FC13E76ED89FE40CFEA /* Moya+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7244B91C311E5CBE6125C6C9778A0E9 /* Moya+Alamofire.swift */; }; BC785FDB624E584D677A06284F52FB0C /* NSDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6ED868FD4EBB716287900A6D688A4CA /* NSDate.swift */; }; - BCF63566264CE0BB166C4E9A5E5813B4 /* OHHTTPStubsMethodSwizzling.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E80F5D5838EF1CED212189A51CDECFC /* OHHTTPStubsMethodSwizzling.h */; settings = {ATTRIBUTES = (Private, ); }; }; - BD010AFE065304CF36D8D393E5AC0BA3 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFEC79442BEC41FEE0350735CBD50560 /* Window.swift */; }; - BD55D1A0A442815F20D1EA08593B28C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - BD9ADBD01C48E2BCB3BD73E44F8D4C4A /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 383C94650F9F55DF4A8929687DDC7D54 /* Client.swift */; }; - BDB842A784472E304AB98F912EAE8DEB /* UILabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420FF3077E018E758316104CFD3F6FCE /* UILabel.swift */; }; - BE41196F6A3903E59C3306FE3F8B43FE /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E68DD7C656B42116607A5C5ECB6377 /* Notifications.swift */; }; - BEA76FA499D5899BD98DBD891FF921D4 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB3BE55A9F7B00484A23E490F3458E7 /* SatisfyAnyOf.swift */; }; - BEC146596D86E7481E876DF1948F4214 /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE3DEF5E733AC410BF3CA0A1FCBF110F /* SynchronizedUnsubscribeType.swift */; }; - BEC50B9A3392AB4237C2831FB8060D95 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - C0DB70AB368765DC64BFB5FEA75E0696 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16A809DD2A76B1C100643EE9F107009 /* ParameterEncoding.swift */; }; - C18C7ACDD019DEC889DA4CD71726752E /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 654334DCA3AF8F143F2CC184B8F2DF01 /* Bag.swift */; }; - C22311A662E0CC237DACF16C9CF05FCB /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD64E272659AB5E1C47D5D291AABBD1B /* Do.swift */; }; - C29E8A70CC2B15A28AF61082E967F60A /* ShareReplay1WhileConnected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC48836565045F88CF0E2484AC01411 /* ShareReplay1WhileConnected.swift */; }; - C2C33D797F2B12CA3B00F512EDDB2E6D /* Castable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A9BA23FC2B0642B25EACDBBC0B8054F /* Castable.swift */; }; - C2FA6D000DB516363116329FF4DB62F8 /* OperationCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9853FD42DEA1216293C5EA837F3006 /* OperationCondition.swift */; }; - C360952381641F725C15758993A0F665 /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = B229B9D78265484D2AC97E454227CB1A /* UIImage+Diff.m */; }; - C3DCB1D573E62B0FD12B73438DB55FF6 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E5E321CBB36DFDD96BB1E762DC1BAF /* Amb.swift */; }; - C744BE35B3D13AD08B483ECB0D0DAA56 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73DE84DEEA9C6C16606B6CA4B6D43887 /* Zip+arity.swift */; }; - C74CA0AFBB150D87B5EA14BD148FA1E7 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10DAE749EBDFEB3FABD39564A5FD73A3 /* Take.swift */; }; - C755136BFCDFA000C44C8BBCA065E4BE /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5EAF42306F6ED9FDAB9060B22A1B68 /* HaveCount.swift */; }; - C7B6DD7C0456C50289A2C381DFE9FA3F /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A263B75827678A997726732B61A96BA /* MultipartFormData.swift */; }; - C81BEDE79545C013BEBBA0363480FD47 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3173B6C58976BE983BB940B79A782D26 /* DSL+Wait.swift */; }; - CB34E7EC105E0B3A3254185E4A5CE6F2 /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DE443EA916E7B8208B6443471ED1E8 /* AnonymousObserver.swift */; }; - CBA787DC7891A5980CDD5C6B879887AA /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D36F1227D2E1E782B5AD318A69D9A83 /* Attachment.swift */; }; - CC995523F145B9C05E40C37BEA6B3331 /* TimeoutObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B72FCC437D382D258F0C16A0444DB355 /* TimeoutObserver.swift */; }; - CE5C9940D54C346B966CF1A2AEDBB524 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5E61BCF6506298A90B96384F50CD80 /* Debug.swift */; }; - D12C7592ECDE6A62E96D84828829B391 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 648433BEABC724009752CE49AE74D4D4 /* QuartzCore.framework */; }; - D1348F81A59D01A6891F2DD47666C11E /* ReachableOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168B84DE0DB8E3EE3168E0949F63B557 /* ReachableOperation.swift */; }; - D167A4DF293AADD6EE0E1FB5C625B069 /* Zip+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 729F07197B32A2B1C4050D9BC9F2ACD6 /* Zip+CollectionType.swift */; }; - D283ACB4BD55C2015677BB3286B98A7F /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4D203B546C0857472259FCF23DC704A /* RxMutableBox.swift */; }; - D2E06DA27082B98F83A6D1662D3194E1 /* OHHTTPStubs.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C871ACDEC05F7E675A502CE89B7706F /* OHHTTPStubs.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D2F16F20A73F28ADD6D40920F172333F /* SlackWebAPIErrorDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C801CC2880EE27F175C85CB1887DBB2 /* SlackWebAPIErrorDispatcher.swift */; }; - D45096E61E72E772AF46C3BECA03583B /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2006D43F29038181B69A03A8832AF366 /* BeLogical.swift */; }; - D50362D8826A6917E7F56D020AC77C22 /* DataDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0287A01FA11422D4AD83147AE0904B /* DataDownloader.swift */; }; - D50B74BE63351F0FB9C76AF896FE5DDB /* Timed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34E19E24CBB9D17F40EDA5AD81279187 /* Timed.swift */; }; - D5C30BC656C11AF60394E3180A217BB1 /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = B2773C6E5437B3DB81EE9FB4929ACFC5 /* UIImage+Snapshot.m */; }; - D5D4E4F3DCBC766193BAFCB5CF8BA909 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56209112FFAA7959D3C924E180FE1950 /* PriorityQueue.swift */; }; - D645EDCD565BEBB30F9D88278F19412F /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243E29712E914187F22A3DA707B93579 /* Concat.swift */; }; - D6F6009AF7A32EF7B198894DBA33B8CC /* SlientCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0087CD580A76836B6DA6B0C9C353AC33 /* SlientCondition.swift */; }; - D77A781080C6A04E10F06ECBE93F4DB7 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C7827056911EDE4374638A37386C98D /* DisposeBag.swift */; }; - D8E0C72DDE130D4471BB48D2081FD235 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C8DF437B967C48B2799D0C11B3EDE9F /* Nimble-dummy.m */; }; - D9DD6D0D589FF81DCAD3F88BF4A09603 /* Capability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7909B418D628EDBEBAAFEC67FA50958C /* Capability.swift */; }; - DA28D32DDEDCEE33C6FBE008D5F41515 /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE4CA0C211C720D4B5ED50C208C5E6CD /* Decodable.swift */; }; - DA4C716D992EBC200F1597ABC56DAE36 /* FunctionalOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F7157F32C17BA0909103999530E6E1E /* FunctionalOperations.swift */; }; + BCF63566264CE0BB166C4E9A5E5813B4 /* OHHTTPStubsMethodSwizzling.h in Headers */ = {isa = PBXBuildFile; fileRef = BED3965BD19F7A90C5DFD463EF2EBF17 /* OHHTTPStubsMethodSwizzling.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BD010AFE065304CF36D8D393E5AC0BA3 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7CCD2C6E14266514EA3B65C91F816E /* Window.swift */; }; + BD11C5E2BB6F3FA1BCF6387333F591DC /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A45C85D0CE889D5ABF74484C431C8A1 /* Client.swift */; }; + BDB842A784472E304AB98F912EAE8DEB /* UILabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3447D3C0B2FC20BFE32FC7BC419AA1E7 /* UILabel.swift */; }; + BE41196F6A3903E59C3306FE3F8B43FE /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EBF49B74191853A79B16B58E508401 /* Notifications.swift */; }; + BEA76FA499D5899BD98DBD891FF921D4 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CCC87044EC06E2130CE08D6C2A19359 /* SatisfyAnyOf.swift */; }; + BEC146596D86E7481E876DF1948F4214 /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A4B7711318BC44E1244340730F27293 /* SynchronizedUnsubscribeType.swift */; }; + BEC50B9A3392AB4237C2831FB8060D95 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + C0DB70AB368765DC64BFB5FEA75E0696 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B81BE92721BAAC1848E813351DED3F8 /* ParameterEncoding.swift */; }; + C18C7ACDD019DEC889DA4CD71726752E /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D076B6527D42E919243B6C86870D17D6 /* Bag.swift */; }; + C22311A662E0CC237DACF16C9CF05FCB /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = E458ECB53A5068AE251F5C0DAB33F439 /* Do.swift */; }; + C29E8A70CC2B15A28AF61082E967F60A /* ShareReplay1WhileConnected.swift in Sources */ = {isa = PBXBuildFile; fileRef = F561C8735352BCF4A4D0E44274DCCB0F /* ShareReplay1WhileConnected.swift */; }; + C2C33D797F2B12CA3B00F512EDDB2E6D /* Castable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7ABC7C2CEE79AAFA7089C70A9AF1C48 /* Castable.swift */; }; + C2FA6D000DB516363116329FF4DB62F8 /* OperationCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0FFBA68D91ECD9806CF0BA113557D91 /* OperationCondition.swift */; }; + C360952381641F725C15758993A0F665 /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = 2442DF0F204F94D186809B47F0536692 /* UIImage+Diff.m */; }; + C3DCB1D573E62B0FD12B73438DB55FF6 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DF68FE219A517DC6973889F4FC3908E /* Amb.swift */; }; + C744BE35B3D13AD08B483ECB0D0DAA56 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 792E59203E6DC0668DDED438931D3B59 /* Zip+arity.swift */; }; + C74CA0AFBB150D87B5EA14BD148FA1E7 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6D7FBEF156F5AE53D0122563D9F3D46 /* Take.swift */; }; + C755136BFCDFA000C44C8BBCA065E4BE /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E284C0EEE1C585DE7330820DF62C7CC /* HaveCount.swift */; }; + C7B6DD7C0456C50289A2C381DFE9FA3F /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D4267A3B8C535FEB58434B14968205E /* MultipartFormData.swift */; }; + C81BEDE79545C013BEBBA0363480FD47 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5EDFF053106D2FA8019F2AAB5702C7 /* DSL+Wait.swift */; }; + C85E90EE6023476B2F7DDC6333032C49 /* CZForecastioRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D56DC5A6CBF825FC4ED3DE36452346C /* CZForecastioRequest.m */; }; + C9508C776EC8DB04B3318C3AA92E8B6C /* CZWorldWeatherOnlineRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 35D583CB786EBE5DC11475D77CF1269E /* CZWorldWeatherOnlineRequest.m */; }; + CB34E7EC105E0B3A3254185E4A5CE6F2 /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C6FD8F6184735DFF2D1D85824AC412 /* AnonymousObserver.swift */; }; + CC5CB7206240B42C01F58A6D66C4AFF5 /* CZWeatherData+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = B56920C71208ABF4EAAC1AE0FB646275 /* CZWeatherData+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CC995523F145B9C05E40C37BEA6B3331 /* TimeoutObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EFE7DBDFDDA120555EFC6B59DDC2EB4 /* TimeoutObserver.swift */; }; + CE5C9940D54C346B966CF1A2AEDBB524 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FEBD48441D921DEA889A5AB5AE4160F /* Debug.swift */; }; + CF85690B5FC29B62E35A9D851217EF11 /* CZForecastioAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 2418F52D7A8561AC03DDE3526F18F199 /* CZForecastioAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0CE16A6542DF2AF552CFB5E992A4291 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F61CF31662E450F84409407E62608D2 /* Channel.swift */; }; + D12C7592ECDE6A62E96D84828829B391 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71C2BAC3EEA6827AB1B6D5E332E11046 /* QuartzCore.framework */; }; + D1348F81A59D01A6891F2DD47666C11E /* ReachableOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB217022BC2F5CAFDF6E1E08FC6A42E4 /* ReachableOperation.swift */; }; + D167A4DF293AADD6EE0E1FB5C625B069 /* Zip+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC08831BE6FA1130EC538509B0EF049 /* Zip+CollectionType.swift */; }; + D283ACB4BD55C2015677BB3286B98A7F /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB6AEC794FE241DBB014629652C69627 /* RxMutableBox.swift */; }; + D2E06DA27082B98F83A6D1662D3194E1 /* OHHTTPStubs.h in Headers */ = {isa = PBXBuildFile; fileRef = B1FC22A4FEF7C861697F7EF24FFA2083 /* OHHTTPStubs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D45096E61E72E772AF46C3BECA03583B /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC137198DD8848C5B4FF1FDADB668DD /* BeLogical.swift */; }; + D50362D8826A6917E7F56D020AC77C22 /* DataDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB1808C4ADF69A1AB7DEC82AB023CEF /* DataDownloader.swift */; }; + D50B74BE63351F0FB9C76AF896FE5DDB /* Timed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 896165D3F5DAF20F7BBB406BB1D435A9 /* Timed.swift */; }; + D5C30BC656C11AF60394E3180A217BB1 /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = DC9C0695630FFA49EE38E69708C1B41B /* UIImage+Snapshot.m */; }; + D5D4E4F3DCBC766193BAFCB5CF8BA909 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B829D1D86E7011C1D81A50F3CC367607 /* PriorityQueue.swift */; }; + D645EDCD565BEBB30F9D88278F19412F /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 005C8CE367C99397292F027392582860 /* Concat.swift */; }; + D6F6009AF7A32EF7B198894DBA33B8CC /* SlientCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C67D41E0CE4596A003BAAD956B7CF30 /* SlientCondition.swift */; }; + D77A781080C6A04E10F06ECBE93F4DB7 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7937ACC5C7FD066763DE54184374558C /* DisposeBag.swift */; }; + D8E0C72DDE130D4471BB48D2081FD235 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C85BEFDE6BAFDA6041B8D5BA43A18C72 /* Nimble-dummy.m */; }; + D970C505AA93D563D2903063BC26EC64 /* CZWeatherService.m in Sources */ = {isa = PBXBuildFile; fileRef = A5E6622256C5EF17912D5D8E63C1B00B /* CZWeatherService.m */; }; + D9DD6D0D589FF81DCAD3F88BF4A09603 /* Capability.swift in Sources */ = {isa = PBXBuildFile; fileRef = F710A36F93F69A295C9987338494EB6C /* Capability.swift */; }; + DA105EDFF859FD37041A9E6812480A4C /* CZWeatherForecastCondition.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D792CE985D750300BCE9FF8A3A9B3B0 /* CZWeatherForecastCondition.m */; }; + DA28D32DDEDCEE33C6FBE008D5F41515 /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4DEC07B1D0191E1652E5589FFD1F250 /* Decodable.swift */; }; + DA4C716D992EBC200F1597ABC56DAE36 /* FunctionalOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9097C4AB8FF2F04D751E6D773EA025A0 /* FunctionalOperations.swift */; }; DA6B2D31AF5F1629C824DDDC509E88DA /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF9BE29B3B2838243DC2C535ED583ADE /* NSBundle.swift */; }; - DB11A8B30B985C3B3DB0017B8277FB8F /* GrandCentralBoardController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF0B79F33BCA34C15C472F07C2367C7E /* GrandCentralBoardController.swift */; }; - DCA29B36BEE0557ECFAAB171AE3CFB2B /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BC99850F40144B9BABF9E36B45A86A9 /* Range.swift */; }; - DD766F28A8D98EFB217456B714D3B936 /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = E26AFBAB2D0235E99AEC25CAC3DB45FC /* OHHTTPStubsResponse+JSON.m */; }; - DE5F3C28CC8C40B8031C784835B3577D /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74FEBFE4CEFAA892F23B67A5AA68D237 /* MatcherProtocols.swift */; }; - DEB7ED431EB427C643E3C9F53A3E540A /* Overloads.swift in Sources */ = {isa = PBXBuildFile; fileRef = E632FB131D66B8E1142DFAA62D204CCE /* Overloads.swift */; }; - DFB0C455856CE54FA58C734A647A173D /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0098246CEF148429C08ABDEC6E2E134D /* RefCountDisposable.swift */; }; - E008736F5514F44C0E07DD052A7B6D67 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6036ECE82E59973F5A261B47C9070A78 /* AdapterProtocols.swift */; }; - E051741F179EF4BC794E3B91D3F5D9C8 /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46A969E7AAFF26141FFE7EC2669EA13 /* Using.swift */; }; - E0EC3E61C26DBD00D605B842F8BE80D1 /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047CD485C4EB7D849D0A18EB3B23D827 /* ConnectableObservableType.swift */; }; - E1C18DF2C71939C1118B5C895A0EEB2E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - E279D31762AF63A80A6172E9049F57B3 /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CA2FDC0F16367DA48592ACA0848ECAB /* OHHTTPStubsResponse.m */; }; - E28E50A71B0981D33FC3AEFCEDAF20EE /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 85127C4E079555839FFBA777B1385078 /* Result.framework */; }; - E329D218464631C34491EFFDE889BF88 /* Hash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299C4FBA9EFFA270B6B428606227E2C5 /* Hash.swift */; }; + DA9BE2921A7CBF2A9BF58FEB0CF00314 /* PINDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = FBA212657A52A7AEB13356CD4FE25989 /* PINDiskCache.m */; }; + DB11A8B30B985C3B3DB0017B8277FB8F /* GrandCentralBoardController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 623874CAB69E0A7C00EAF0BACF43E4B2 /* GrandCentralBoardController.swift */; }; + DB719F22E3D3D2531181808F032982A1 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9504DFF63EE799DEF8E4045DC7A4AD61 /* UserGroup.swift */; }; + DCA29B36BEE0557ECFAAB171AE3CFB2B /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2237E7A5EA4456E06C6564813B43427 /* Range.swift */; }; + DD766F28A8D98EFB217456B714D3B936 /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84B4668BBEF69A646FCA50CF453288 /* OHHTTPStubsResponse+JSON.m */; }; + DDF48D433321995DD5D07F6A591D5F72 /* CZWeatherLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 262B7ED8C316D23FB117C10065B67192 /* CZWeatherLocation.m */; }; + DE5F3C28CC8C40B8031C784835B3577D /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5709C1B6ADC1180E7A81D20BA4E0286B /* MatcherProtocols.swift */; }; + DEB7ED431EB427C643E3C9F53A3E540A /* Overloads.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8376EBB1AAB5AFB6F53078168D414E3D /* Overloads.swift */; }; + DFB0C455856CE54FA58C734A647A173D /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5890B8BC8EF4311EC0BB249D9A50D1BF /* RefCountDisposable.swift */; }; + E008736F5514F44C0E07DD052A7B6D67 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E76015BE0A47DEC495472E215D38B3 /* AdapterProtocols.swift */; }; + E051741F179EF4BC794E3B91D3F5D9C8 /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB91F0F9C24D455EB272EDD8B372149C /* Using.swift */; }; + E0EC3E61C26DBD00D605B842F8BE80D1 /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EA64F3F98EDB14D69E784A388BA8A53 /* ConnectableObservableType.swift */; }; + E1C18DF2C71939C1118B5C895A0EEB2E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + E279D31762AF63A80A6172E9049F57B3 /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F6F55EE094345E1EA28C18211C37BA5 /* OHHTTPStubsResponse.m */; }; + E27DA7C206F38C3DEBD2102A66F88D5A /* NSDictionary+Internal.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FF98EB0BCF8F48539A108FDD427384C /* NSDictionary+Internal.m */; }; + E28E50A71B0981D33FC3AEFCEDAF20EE /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 981056E7937643999C099CC4914236B6 /* Result.framework */; }; + E296C38B9A19042E0A17CE0A6B0BF68E /* CZWundergroundRequest+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 49CB3F06CE913D71A9E1574CBED61F34 /* CZWundergroundRequest+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E329D218464631C34491EFFDE889BF88 /* Hash.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC70FC80FCE21AE1448B10097FA5F321 /* Hash.swift */; }; E32D2674F23B7A9B1BA56AA7AE3418DC /* GoogleTokenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A58D624139E0B18F4AE2146EBD3892 /* GoogleTokenProvider.swift */; }; - E3A61641F1031307A3267C62BF28B62F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - E42298CEEEFFB9CAE5EE4377970B8160 /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85E52D94983FABC6113E6851BADFA77B /* Empty.swift */; }; - E43DE2D308E98CECEBF629A0AA1325C9 /* ShareReplay1.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF88BA6855E6B0C0B114D0DB99158B79 /* ShareReplay1.swift */; }; - E4BF78E05B8FB224500171EFF754A332 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A206A4461DA25ECB5BAFC0BCE07D6C92 /* SchedulerServices+Emulation.swift */; }; - E4C299CE231594C912902D9BBC59DB4A /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE169E2694066FC604FF006EF7C0B84 /* UIView.swift */; }; - E5AEE35F019A6AF437AE1CAC918CFCA2 /* CloudCapability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3756AED27F4E64842742E9A59496B70F /* CloudCapability.swift */; }; - E70AC7C83E3CAD873E9BCF116B7293D5 /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B261E26FBC95C7600074D38D6C0723 /* RecursiveScheduler.swift */; }; - E82A57C66ECDF027338766B14E03A839 /* Decodable-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B476FCAF5DE1C02B6DD01DD2AF23C9E /* Decodable-dummy.m */; }; - E8679BDDC7BF976D9CC417BB72039574 /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C101944E1C3B3E6CAE67312F890C8680 /* ToArray.swift */; }; - E8DE03684C234604E472C27ECD8F6B70 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8244EDB1D4B13650D89E340FDFA70C2 /* BeAnInstanceOf.swift */; }; + E42298CEEEFFB9CAE5EE4377970B8160 /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED47F46E1E18031796DEAE93B8342BAA /* Empty.swift */; }; + E43DE2D308E98CECEBF629A0AA1325C9 /* ShareReplay1.swift in Sources */ = {isa = PBXBuildFile; fileRef = B54E3AF3FA7EA490214091F929A42A95 /* ShareReplay1.swift */; }; + E4BF78E05B8FB224500171EFF754A332 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E2C42A340AE8D4A73D1474B4336A975 /* SchedulerServices+Emulation.swift */; }; + E4C299CE231594C912902D9BBC59DB4A /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B402E0F4B33CFFD2B7F87A4A454C6007 /* UIView.swift */; }; + E5682F8AB2E56DA5249E69EF2F2670A2 /* CZWundergroundRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 86DD3E7EF4D44A322FB8FD2310B6A3A2 /* CZWundergroundRequest.m */; }; + E5AEE35F019A6AF437AE1CAC918CFCA2 /* CloudCapability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EDFFEE423F6ADE96D1D1C779B2700FF /* CloudCapability.swift */; }; + E70AC7C83E3CAD873E9BCF116B7293D5 /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A7440322B146841314F4DAE90A5F12 /* RecursiveScheduler.swift */; }; + E82A57C66ECDF027338766B14E03A839 /* Decodable-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 272DFA1D97ECFB4465283FBEE1F93C96 /* Decodable-dummy.m */; }; + E8679BDDC7BF976D9CC417BB72039574 /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD62C5D89BE98E58E9994ECFAB182C5 /* ToArray.swift */; }; + E8DE03684C234604E472C27ECD8F6B70 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 726A32AE952D2190D6359AFEE6E140F4 /* BeAnInstanceOf.swift */; }; + E8E616585D9F8C64AB865AADD2C7F427 /* CZWeatherData.m in Sources */ = {isa = PBXBuildFile; fileRef = C098E0E20D37C589007BDF1DEAD5A81B /* CZWeatherData.m */; }; E954CB663880C3E55D4F486AA7600455 /* AccessToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31A9417D12AD2FCDB06CDDD134194E8E /* AccessToken.swift */; }; - EAA652557B70F493923A3447B5D64E0D /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 97CEAD5E0811065D8913E9400975A45D /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; - EAF72839C9497A0D9393D0BB9AC533A8 /* Pods-GrandCentralBoard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 02BA90EC296C98B0B22C2C1E48F338BD /* Pods-GrandCentralBoard-dummy.m */; }; - EB443287E7A3A131D88E63DD886C8490 /* Rendering.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE1E5C0A10FF65CD71D3F545A39F4637 /* Rendering.swift */; }; - EB45F4025CE40B6EC9F41F67CB1636EE /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE406D411D86E78089ED2F75AC6109AE /* Observable+Extensions.swift */; }; - EB9C4D2E388805F9157AA356D4A857D5 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = CB60DA630A1053BC451C2F4A15DFF095 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ED2AAAC136C0DC2389B020B44A139C15 /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196EA3D7ACD96B9D58A9B7200FFB78EE /* ObserverType.swift */; }; - ED448A3A1BCC34CF6F9C0956E8A0A290 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC57DDD3B6A4E6699B4ECF73731060B /* Disposable.swift */; }; - EDAE318F3739E3ADAD9F970A510BF3E8 /* Moya-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 273BB47540EA1B4E6A25258BDD9A02FB /* Moya-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EAA652557B70F493923A3447B5D64E0D /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E5EF35C1C49007198DF207CAF6AD13D /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; + EB443287E7A3A131D88E63DD886C8490 /* Rendering.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1E219B480576DB45D0F766DED52AFD /* Rendering.swift */; }; + EB45F4025CE40B6EC9F41F67CB1636EE /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15D21AAD2F044AEE4AE5DE8CD5E38F7 /* Observable+Extensions.swift */; }; + EB9C4D2E388805F9157AA356D4A857D5 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DD531A23A85ADEBBB1219C56A5BA1949 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC609C695D4526035899EBF11AA06107 /* Starscream-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 939A94598AD85FBCD65736B999562131 /* Starscream-dummy.m */; }; + ED2AAAC136C0DC2389B020B44A139C15 /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 062D646C807B481663064E1C075CEF3D /* ObserverType.swift */; }; + ED448A3A1BCC34CF6F9C0956E8A0A290 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ECC06B17B33B7251DA0746997FF63CE /* Disposable.swift */; }; + EDAE318F3739E3ADAD9F970A510BF3E8 /* Moya-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F44D2E746B7A9C27F71FF48EA1DAF8A5 /* Moya-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF988BD6C02C46E52E7867877C092302 /* gcb-error-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 694A2214460BED92ABB4F9B9B2F3355B /* gcb-error-icon.png */; }; - EFC3DE81AD46EEFDA89F0E7F548193C3 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B8CF3BB2B58FD007701E3ED6899EE3 /* Response.swift */; }; - EFE20ADE81CBE47F13D76267285C4A35 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 959B210516FD6BEF8AC80BB36E70D709 /* FailureMessage.swift */; }; - EFE92E8D3813DD26E78E93EEAF6D7E7E /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC70C3C277D352D222AA6A10B874A3B2 /* Request.swift */; }; - F0E4D14E514B0C0FBF23BA9FB7EE5439 /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85D3383A939BF7A9C409316485EA4C5 /* ScheduledItem.swift */; }; - F128F08C1DEC39A0A9B29F34AE6C329A /* RetryOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A4BF78727973CB87D5DEB6D25F21EB /* RetryOperation.swift */; }; - F28A6C9E51CE2D649D3D4A4EE724DE47 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8430739C0E5FD7941AF5B53361C6A3DB /* Sample.swift */; }; - F2A1BE6C76BBD4B0EEB8A1E604466397 /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B374ECD46A1C0F10A590B5A345A9D39 /* HistoricalSchedulerTimeConverter.swift */; }; - F2B1321195DAB485DE7BE03DFAAAB945 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F00F1D5653212AEF63206B82CD7B0DD8 /* XCTest.framework */; }; - F465AA793B2C85147B3FB2F1126C9A79 /* Observable+Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B992CA39CDFBB780484E110A8F54E408 /* Observable+Concurrency.swift */; }; - F47158C234C50FFB069A1EF8AB26D9F1 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = C1AE3BF16DC25132E16C491CDB94A22C /* FBSnapshotTestController.m */; }; - F5DA05C7D9DB3DD1A27D4BFFC0925DDE /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65A68EB6B358030C82FEC0C04F2AFF07 /* SerialDisposable.swift */; }; - F71DEA24F21D91C17DFEDEB8BECF910C /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33E9BCAD91BD2AF8970D1E11DBEAD846 /* Lock.swift */; }; - F7EC15C63C9DE079543E053E8EF57197 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99965341C449E73C80156A05682B1A0B /* Alamofire.framework */; }; - F883BFE9A98F6A6DDCDA6FA31A702CD1 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27CBC2416FF98421A1410607FE63520E /* RetryWhen.swift */; }; - F961AE12899B75585223EC4AE413CD03 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */; }; - F9E573918295C2E93C05F759C1E02783 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3794978CC83D344729EEAD1B5A8908EA /* InvocableScheduledItem.swift */; }; - FA145DCE313D583C0431D178FB32C96F /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C665482DB2D2FD2074F755E00C0DA04 /* BeEmpty.swift */; }; - FA7EDC2ABE5F3F9255FBF682286D039D /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA251A209C4A938FAF0A74DD804D6D6 /* Utils.swift */; }; - FAF08B3FDA724BB864666BE04DB60067 /* GroupOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E5F9FC63143BF9C48B797AD5BAD7F89 /* GroupOperation.swift */; }; - FC5CCF6B1F82B557EC8FE1DDB1AB152E /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39A9238E227041FD68FDF36BEFBC6A0E /* User.swift */; }; - FD984D1A244310957B82B5FD2F186BC7 /* GCBUtilities.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 33CE35817B078DD24A00BF6C81868FA7 /* GCBUtilities.bundle */; }; - FE23B361A8744AFA6F24309C2DAEEEC7 /* Moya+RxSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE15323B4599B324D2A2FFB6D55EF86 /* Moya+RxSwift.swift */; }; - FF0366DFC597745127A6D92AB83F0D60 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 084AD6CA1A566487FD2F4977064387CF /* BeIdenticalTo.swift */; }; + EFC3DE81AD46EEFDA89F0E7F548193C3 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 169AAA15155EB703C67AE31C394DFDB1 /* Response.swift */; }; + EFE20ADE81CBE47F13D76267285C4A35 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC76C1D884CDA2EA62859F7E97A1955 /* FailureMessage.swift */; }; + EFE92E8D3813DD26E78E93EEAF6D7E7E /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3346E24F87E4349BA8E3808AFFE643 /* Request.swift */; }; + F0E4D14E514B0C0FBF23BA9FB7EE5439 /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFF7CFECD2DB2F7DC9D193AE36D6A2D5 /* ScheduledItem.swift */; }; + F128F08C1DEC39A0A9B29F34AE6C329A /* RetryOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D8B393D19E25A2D2B8DB3FEC9628FE /* RetryOperation.swift */; }; + F28A6C9E51CE2D649D3D4A4EE724DE47 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF07172F7CA8B5B935911DE285990786 /* Sample.swift */; }; + F2A1BE6C76BBD4B0EEB8A1E604466397 /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53738CD22465DA05B1142479A9A42455 /* HistoricalSchedulerTimeConverter.swift */; }; + F2B1321195DAB485DE7BE03DFAAAB945 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D7FBD564C8F1E46FE10614C52205319 /* XCTest.framework */; }; + F465AA793B2C85147B3FB2F1126C9A79 /* Observable+Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4C0E0DCAA45E89F26BF05F4FAB120 /* Observable+Concurrency.swift */; }; + F47158C234C50FFB069A1EF8AB26D9F1 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = 08EA89646662460FF3AD5D46DBFCA748 /* FBSnapshotTestController.m */; }; + F5DA05C7D9DB3DD1A27D4BFFC0925DDE /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C648B448494DFBB4AA625FF897AD1372 /* SerialDisposable.swift */; }; + F6BF0BE842141F256AB3CDE6206DC28C /* CZWundergroundAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = DBFDD052C357E1094865D36ACCEC01F1 /* CZWundergroundAPI.m */; }; + F71DEA24F21D91C17DFEDEB8BECF910C /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DA981083BB21C0A25F43DA362EFDD7 /* Lock.swift */; }; + F7EC15C63C9DE079543E053E8EF57197 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB88BB0CC73BB2714CFDD8E1B6C67A42 /* Alamofire.framework */; }; + F883BFE9A98F6A6DDCDA6FA31A702CD1 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2C1CA5467EBA83684D77A2771DA57F4 /* RetryWhen.swift */; }; + F961AE12899B75585223EC4AE413CD03 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */; }; + F9E573918295C2E93C05F759C1E02783 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B065F887EE3BB082D7A62C7DCE8F688 /* InvocableScheduledItem.swift */; }; + F9F44A84E2286F8627153FD7C66B3AC5 /* SlackKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 76189DA5165ACD8017186CDB3F4B32D2 /* SlackKit-dummy.m */; }; + FA145DCE313D583C0431D178FB32C96F /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A4227030BE3269075FB2865B2040CD /* BeEmpty.swift */; }; + FA7EDC2ABE5F3F9255FBF682286D039D /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = F94C4FDDE82E00C9F0439516DB9579CD /* Utils.swift */; }; + FAF08B3FDA724BB864666BE04DB60067 /* GroupOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C403F709DDBF0A31F530821480E7B5EB /* GroupOperation.swift */; }; + FD984D1A244310957B82B5FD2F186BC7 /* GCBUtilities.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 36ED0255D8D91A9B630BAD0F600C7402 /* GCBUtilities.bundle */; }; + FE23B361A8744AFA6F24309C2DAEEEC7 /* Moya+RxSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0629525A3DF3096A540E8D6B18A26C3 /* Moya+RxSwift.swift */; }; + FE41474DBB43985B66B8DEF6B11D4D05 /* PINCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 79639553D3F3A89CA9D0B54F47A8AF6C /* PINCache-dummy.m */; }; + FE4A66980DF7AF6846A811CE0544F258 /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5E83CAC9D2CE959352BFC9379ABC3 /* Types.swift */; }; + FF0366DFC597745127A6D92AB83F0D60 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592AE0D09DBB86639C94111F21FB4BE0 /* BeIdenticalTo.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 0CDFE034C239E56A710685D8EF690955 /* PBXContainerItemProxy */ = { + 0A3F62A07EE1F2418A892FD88E5F2241 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D8F2187273FA7F9F6E3BD58A2808C5EA; - remoteInfo = Starscream; + remoteGlobalIDString = E5678FC69B99077E1972D149186B2285; + remoteInfo = Result; }; 1261A32EA117A5A91F902D1B9231B419 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -471,27 +535,55 @@ remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; remoteInfo = Alamofire; }; - 28CB74100B9180AFEF7F31BBC9971A38 /* PBXContainerItemProxy */ = { + 2EDDC25289E072F247D0A17F8518ABF0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E5678FC69B99077E1972D149186B2285; - remoteInfo = Result; + remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; + remoteInfo = Alamofire; }; - 2D1A1F81004B2F0AA0EE8A217A0EAEF0 /* PBXContainerItemProxy */ = { + 300E4AFC98E3389270AEED50F6CC9519 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = B5C2C964DE3BBD30C5A05306754CFA47; - remoteInfo = SlackKit; + remoteGlobalIDString = A0933FC1307AD48F89C9FB7CEA3C29C5; + remoteInfo = RxSwift; }; - 300E4AFC98E3389270AEED50F6CC9519 /* PBXContainerItemProxy */ = { + 37AB59E03EF1F88CE097054AA8471F9B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = F610C0EEE17F801D1399A44316DF9DD3; + remoteInfo = Decodable; + }; + 3A7E48CAFE933EB2F11DB5F752439EA3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 17965599DFB5C5C7D9D34C79C6F29C8C; + remoteInfo = GCBCore; + }; + 40F6E2B502FC2C6D00DFEA808F6439DF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = A0933FC1307AD48F89C9FB7CEA3C29C5; remoteInfo = RxSwift; }; + 4BEDD584B3A60C3636B50358AFFA28EB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B616DC0DEE9F1BD8E924286299E95F4; + remoteInfo = PINCache; + }; + 500EF8E2085BE3BE1F5F0383C9E716DF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = F42B8723517C277F9A7CD257D0937E0F; + remoteInfo = Starscream; + }; 581EA616CEDBF350DBE0812C97B38F65 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; @@ -499,19 +591,26 @@ remoteGlobalIDString = E5678FC69B99077E1972D149186B2285; remoteInfo = Result; }; - 5A545F395DFEFCE5BD3FFABC1F85A53B /* PBXContainerItemProxy */ = { + 665B2AE6C9E1F6F56D5488EA280CA187 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D8F2187273FA7F9F6E3BD58A2808C5EA; - remoteInfo = Starscream; + remoteGlobalIDString = A64350DBC118ED8CC0C6B2717CB47F6A; + remoteInfo = MD5; }; - 5D83D110B302933CF98FEE6816601170 /* PBXContainerItemProxy */ = { + 690BE8385288D7FB13B0AE4D7B96C29C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; - remoteInfo = Alamofire; + remoteGlobalIDString = DB836EF658BF1BEF3AABC0A95C67D32D; + remoteInfo = SlackKit; + }; + 6C9F84030CFE9D68DE996AFBA22125B0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6618B30786139FCD27E1CF439C61FF20; + remoteInfo = CZWeatherKit; }; 72FD1BE56A6FAE85ACF7FB02F46E5D47 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -534,28 +633,35 @@ remoteGlobalIDString = F610C0EEE17F801D1399A44316DF9DD3; remoteInfo = Decodable; }; - 8392595F77D8328C6CCF570A0C9476E6 /* PBXContainerItemProxy */ = { + 9352DFE59AB683834C750C9F57CFFE67 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = F610C0EEE17F801D1399A44316DF9DD3; + remoteInfo = Decodable; + }; + 96D1E200F0567115BC7776FBC5DFE465 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = 93DDB4D07205258016E6779F2667E665; remoteInfo = Moya; }; - 9352DFE59AB683834C750C9F57CFFE67 /* PBXContainerItemProxy */ = { + A0B8A724C2F024B474394E265711DCAE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = F610C0EEE17F801D1399A44316DF9DD3; - remoteInfo = Decodable; + remoteGlobalIDString = F42B8723517C277F9A7CD257D0937E0F; + remoteInfo = Starscream; }; - A0CEBD40B4DFBA80A5DEF14ACFFACD30 /* PBXContainerItemProxy */ = { + A3EF3AB61269D329B340FF8E47556562 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = 72FACBE41A020F340B06DAFCE4E4ADFB; remoteInfo = Operations; }; - A3C41DA3A516F60A94FF7211E432E4FA /* PBXContainerItemProxy */ = { + A543958F7AFCD24737E4D8B27173A340 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; @@ -569,26 +675,12 @@ remoteGlobalIDString = 79C040AFDDCE1BCBF6D8B5EB0B85887F; remoteInfo = Alamofire; }; - BCA2EAA1778A97CDB8BFC90B49A9EC75 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = A64350DBC118ED8CC0C6B2717CB47F6A; - remoteInfo = MD5; - }; - CE2057D36F30EBB1FDED1070DFBE74A6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = A0933FC1307AD48F89C9FB7CEA3C29C5; - remoteInfo = RxSwift; - }; - F02B29A11F50D1E893FDABCC0A556AEF /* PBXContainerItemProxy */ = { + AB07FF78F2C0D84DC11718C5E9AC4C23 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = F610C0EEE17F801D1399A44316DF9DD3; - remoteInfo = Decodable; + remoteGlobalIDString = 9B616DC0DEE9F1BD8E924286299E95F4; + remoteInfo = PINCache; }; F23CA0D1E9DB2DB2F315468B5087D974 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -604,514 +696,579 @@ remoteGlobalIDString = 5DB46EA499F9A5E22765121102FCC34B; remoteInfo = FBSnapshotTestCase; }; - FF2253DC7C1E233683DE8804BAD6CDC0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 17965599DFB5C5C7D9D34C79C6F29C8C; - remoteInfo = GCBCore; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 0021C5E8CDD9A71B2DF463D24A440364 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0044C795BFFE925935D64D715F859BDD /* NoFailedDependenciesCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NoFailedDependenciesCondition.swift; path = Sources/Core/Shared/NoFailedDependenciesCondition.swift; sourceTree = ""; }; - 004DF151CB42D6DA46EAC5677831C9CD /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; - 0087CD580A76836B6DA6B0C9C353AC33 /* SlientCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlientCondition.swift; path = Sources/Core/Shared/SlientCondition.swift; sourceTree = ""; }; - 0098246CEF148429C08ABDEC6E2E134D /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; - 00F97EF7B31B1AB6D8660CD5126E9DB2 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; - 01485D785B55C1C38130F3D23C9CEE39 /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; - 02028919FFCD8B080F5ACCBA1E53BB06 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = ""; }; - 0275A8DAEDC8E1C2ECDC89F8E6F9075D /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; + 001A5A845D99C35B1652222641E73AB5 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/Implementations/SkipWhile.swift; sourceTree = ""; }; + 003CBBCD9AEEC1121C4613EE532E6BFE /* CombineLatest+CollectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+CollectionType.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift"; sourceTree = ""; }; + 005C8CE367C99397292F027392582860 /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Implementations/Concat.swift; sourceTree = ""; }; + 01BBFA50753DF9DC868E5ADCA7609ACE /* CZWeatherKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CZWeatherKit.xcconfig; sourceTree = ""; }; + 025C0A7190C1CBB46E9F324FB4A8E1A4 /* Result.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Result.modulemap; sourceTree = ""; }; + 02817F9296DCE595B008D438D44E5122 /* CZWeatherCurrentCondition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherCurrentCondition.h; path = CZWeatherKit/CZWeatherCurrentCondition.h; sourceTree = ""; }; 02BA90EC296C98B0B22C2C1E48F338BD /* Pods-GrandCentralBoard-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GrandCentralBoard-dummy.m"; sourceTree = ""; }; - 046B8130F6A4ABAA8C2E97B7503EDBA2 /* Profiler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Profiler.swift; path = Sources/Core/Shared/Profiler.swift; sourceTree = ""; }; - 047CD485C4EB7D849D0A18EB3B23D827 /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; - 0505683612733DE00917C7398CCA3899 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; - 054579884E746ECB4C5FC305596531A0 /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; - 05DB1EF6050467A624EFFCEF7BA91B7B /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; - 0602E5B0FDF859A66F5A84B25FC3F48F /* Result.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Result.modulemap; sourceTree = ""; }; - 06845F1C5205A28F6CA5A8BCB9E0A0F7 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; - 06F48A41222F6C813CDBD904BCEDD130 /* Pods_GrandCentralBoardTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GrandCentralBoardTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0702AA5CCE53C3AA8C77E5E7A9B38EEB /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = RxSwift/DataStructures/Queue.swift; sourceTree = ""; }; - 0795710D4F49637F27BAAC941DCDA749 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Result/Result.swift; sourceTree = ""; }; - 079627E6114383B5C3E2F469EDCED353 /* NetworkObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkObserver.swift; path = Sources/Core/iOS/NetworkObserver.swift; sourceTree = ""; }; - 079EDBBD982006210C5A00DC75C0E5EC /* OperationQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueue.swift; path = Sources/Core/Shared/OperationQueue.swift; sourceTree = ""; }; - 080A2D287ABAEC0E4250F062CCD0E3AF /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; - 082F91A197BBD89DE9D349655EBCDB52 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 08343499F164DF0A6B9782FD77924A09 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/ObjectiveC/NMBExpectation.swift; sourceTree = ""; }; - 084AD6CA1A566487FD2F4977064387CF /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; - 088983579F518D970ADD12A573EE0215 /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/Implementations/ElementAt.swift; sourceTree = ""; }; - 08DF997FD79EED082568D363CF46A416 /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; + 02CDFD5826A8A8BA335CA7D7157DE2CB /* CredentialsPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CredentialsPlugin.swift; path = Source/Plugins/CredentialsPlugin.swift; sourceTree = ""; }; + 02E853C387CC29E2D33F5762A193C03F /* MD5.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = MD5.modulemap; sourceTree = ""; }; + 03A57D5BE799CAAF2300C3EBB0CF0BCB /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; + 03AA2335BC64823C6C9B665A5D517A23 /* ConnectableObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservable.swift; path = RxSwift/Observables/Implementations/ConnectableObservable.swift; sourceTree = ""; }; + 044D06DA8058DE1ACDACEE2E7B8E6F58 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 04FEF3A26A25B7A90E2969CA7749A674 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 051DE4F9CB980596711F318FF71BC7A4 /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Implementations/Reduce.swift; sourceTree = ""; }; + 05E76015BE0A47DEC495472E215D38B3 /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; + 062D646C807B481663064E1C075CEF3D /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; + 07CBCD6CCBDE82614CA6F64EA893B33C /* Result-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-umbrella.h"; sourceTree = ""; }; + 087046354F6322F16FE4FA2F1E912DE4 /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; + 08DBFB01C6E5249146D23036ABB3E8BE /* WidgetSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WidgetSettings.swift; path = GCBCore/Configuration/WidgetSettings.swift; sourceTree = ""; }; + 08DE1F1FD078AF8751A64C7F854E0E83 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Implementations/Filter.swift; sourceTree = ""; }; + 08DEBE05B9F6B3D00DFA6C9856612880 /* MutuallyExclusive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MutuallyExclusive.swift; path = Sources/Core/Shared/MutuallyExclusive.swift; sourceTree = ""; }; + 08EA89646662460FF3AD5D46DBFCA748 /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; + 08EC4716D980E1721CF9062EBED8FE1A /* Source.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Source.swift; path = GCBCore/Models/Source.swift; sourceTree = ""; }; 09305E11081725F7013174D9ADF85995 /* GCBUtilities.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCBUtilities.xcconfig; sourceTree = ""; }; - 095AE12AE90926F1878026E6A370F6D8 /* LocalConfigurationLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocalConfigurationLoader.swift; path = GCBCore/Configuration/LocalConfigurationLoader.swift; sourceTree = ""; }; - 09798F8AC7BA142F482665D00051B49C /* Channel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Channel.swift; path = SlackKit/Sources/Channel.swift; sourceTree = ""; }; - 0A21B5763652B63DADA3BEE093E53C90 /* Observable+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Debug.swift"; path = "RxSwift/Observables/Observable+Debug.swift"; sourceTree = ""; }; - 0A7112B084DEDA8DB75ABECC1E144E97 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0999E4C7B67895D401A6DCAD1200BBE0 /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Implementations/Sequence.swift; sourceTree = ""; }; + 09A7A420DDD2EFAC68D33CDD0D2650FB /* CZWeatherService+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWeatherService+Internal.h"; path = "CZWeatherKit/CZWeatherService+Internal.h"; sourceTree = ""; }; + 0A0C97AB677266B99F15F6B2808A7A93 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; + 0A33B2BD6DF89F9C424989E952E01883 /* NSURLRequest+HTTPBodyTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURLRequest+HTTPBodyTesting.h"; path = "OHHTTPStubs/Sources/NSURLSession/NSURLRequest+HTTPBodyTesting.h"; sourceTree = ""; }; + 0AA1DE78C7ED6232E613D259C6E93A24 /* Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Compatibility.h; path = OHHTTPStubs/Sources/Compatibility.h; sourceTree = ""; }; + 0ABC7F984CCCEB2DE3DA5277BC273E16 /* MD5-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MD5-prefix.pch"; sourceTree = ""; }; + 0AC6CC20B8D7DEA411E9569CECC737B4 /* GCBCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCBCore.modulemap; sourceTree = ""; }; + 0AFAB0A98DC7605283443EDAFC799249 /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxSwift.modulemap; sourceTree = ""; }; 0B2FE67825A4E6CCB6430624E02BD7B1 /* Pods-GrandCentralBoardTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GrandCentralBoardTests.debug.xcconfig"; sourceTree = ""; }; - 0B476FCAF5DE1C02B6DD01DD2AF23C9E /* Decodable-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Decodable-dummy.m"; sourceTree = ""; }; - 0B5EC04B1F46E2EDD30A6878174A4D19 /* Result-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Result-dummy.m"; sourceTree = ""; }; - 0B96F930221441771B05C680CB04EB5A /* Types.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Types.swift; path = SlackKit/Sources/Types.swift; sourceTree = ""; }; - 0C67182A2965A811DBF189CFB9D77162 /* OHHTTPStubsResponse+JSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OHHTTPStubsResponse+JSON.h"; path = "OHHTTPStubs/Sources/JSON/OHHTTPStubsResponse+JSON.h"; sourceTree = ""; }; - 0CA8F0B84E4EDE03926FA1C802F2C0D7 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; - 0CCC5E8E3D1D9967BF0D4557CABE09F0 /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Implementations/Reduce.swift; sourceTree = ""; }; - 0CF242386D5E5DC0C03ED23C8597B2AD /* NetworkLoggerPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkLoggerPlugin.swift; path = Source/Plugins/NetworkLoggerPlugin.swift; sourceTree = ""; }; - 0D36F1227D2E1E782B5AD318A69D9A83 /* Attachment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Attachment.swift; path = SlackKit/Sources/Attachment.swift; sourceTree = ""; }; - 10967286AC85DF60283B1FF8F6AD9818 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; - 10DAE749EBDFEB3FABD39564A5FD73A3 /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Implementations/Take.swift; sourceTree = ""; }; - 1138B4C8AC394CC7D4E0615A95B70EF4 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; - 126086E8A60B843731A48BD92BA7C1B2 /* Observable+Time.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Time.swift"; path = "RxSwift/Observables/Observable+Time.swift"; sourceTree = ""; }; - 14707705B018B8390629CD7665D446B1 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; - 15315FEA116DDE38A2D9A2CAEB78384D /* SlackKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SlackKit-dummy.m"; sourceTree = ""; }; - 156E2C2D99ADB6F18FF5CE2E77DC5C1D /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; - 157FC95DFCA09649189A3ADF97BC3B23 /* OHHTTPStubs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubs.m; path = OHHTTPStubs/Sources/OHHTTPStubs.m; sourceTree = ""; }; - 15F81C497BC1022D25086A4575DC0ACA /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Nimble.modulemap; sourceTree = ""; }; - 168B84DE0DB8E3EE3168E0949F63B557 /* ReachableOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReachableOperation.swift; path = Sources/Features/Shared/ReachableOperation.swift; sourceTree = ""; }; - 18C63002A529FF403FD72E960142ACCA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 18F2146458ADFA010E48CE4248449496 /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; - 196EA3D7ACD96B9D58A9B7200FFB78EE /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; - 197B593E7B00C93E8474FC723FC49ACD /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; - 1ADE2BBFA13927E96E8BF3D31D5BFF69 /* MutuallyExclusive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MutuallyExclusive.swift; path = Sources/Core/Shared/MutuallyExclusive.swift; sourceTree = ""; }; - 1C801CC2880EE27F175C85CB1887DBB2 /* SlackWebAPIErrorDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlackWebAPIErrorDispatcher.swift; path = SlackKit/Sources/SlackWebAPIErrorDispatcher.swift; sourceTree = ""; }; - 1C8DF437B967C48B2799D0C11B3EDE9F /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; - 1CA2FDC0F16367DA48592ACA0848ECAB /* OHHTTPStubsResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubsResponse.m; path = OHHTTPStubs/Sources/OHHTTPStubsResponse.m; sourceTree = ""; }; - 1CF14CB3A12801BACBE2CCCD738A1366 /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = FBSnapshotTestCase.modulemap; sourceTree = ""; }; - 1D67DE31CE739F3354D20181C30A844E /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; - 1ED0D2A65F9DE3F40F83838F5E53B1D0 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F09DB2B41BEED0B4863A66D01016110 /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; - 1F2E0061EF9C23EBE1B0511B20EA3902 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Implementations/Deferred.swift; sourceTree = ""; }; - 1FD6908905B7449D4B93B7B1FBAC042C /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Implementations/Timeout.swift; sourceTree = ""; }; - 2006D43F29038181B69A03A8832AF366 /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; - 2155B21532D94FB92559674F74BE33D5 /* FBSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-umbrella.h"; sourceTree = ""; }; - 21845DA703DA23ADC2D8891949F80F39 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2259A252AD28027C6C2FF2AF57AFD408 /* MD5.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MD5.xcconfig; sourceTree = ""; }; - 22D31D636C4F27D80DA5D066D4CCCC24 /* OHPathHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHPathHelpers.m; path = OHHTTPStubs/Sources/OHPathHelpers/OHPathHelpers.m; sourceTree = ""; }; + 0B6D4C8D6B7B74FB3F3AAAF8AFCDB212 /* Manager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Manager.swift; path = Source/Manager.swift; sourceTree = ""; }; + 0C12091C0DE031607BA77C2A1847C25D /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/Implementations/DelaySubscription.swift; sourceTree = ""; }; + 0D3FA257B9D9D0B99AB105833B619049 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; + 0D56DC5A6CBF825FC4ED3DE36452346C /* CZForecastioRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZForecastioRequest.m; path = CZWeatherKit/CZForecastioRequest.m; sourceTree = ""; }; + 0DF6709A08D2BD6663F2965D466574E3 /* CZWeatherRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWeatherRequest.m; path = CZWeatherKit/CZWeatherRequest.m; sourceTree = ""; }; + 0E048E02E302092F175A7DF890E1029D /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; + 0E290D8E0DA3EC99EE363F963A05DE98 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0E2E6D8A96F09738922295D307BBF824 /* Decodable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Decodable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0EB1808C4ADF69A1AB7DEC82AB023CEF /* DataDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataDownloader.swift; path = GCBCore/DataDownloader.swift; sourceTree = ""; }; + 0F3D0B023F4645C1DD28D34C0C63287D /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; + 0FD66CD9B5066BCA8CE70CB0F79099DB /* PINCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = PINCache.modulemap; sourceTree = ""; }; + 10C77B30E9094B581285427B6F98074A /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; + 1156237286877FCB9D9E036950AF494E /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Implementations/Throttle.swift; sourceTree = ""; }; + 11682CB7E400282C383F858014D7EDA2 /* CZWeatherKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = CZWeatherKit.modulemap; sourceTree = ""; }; + 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 12653217F63D028DFDC39549ED7D08AE /* SlackWebAPIErrorDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlackWebAPIErrorDispatcher.swift; path = SlackKit/Sources/SlackWebAPIErrorDispatcher.swift; sourceTree = ""; }; + 12E87C4F96B10FBC7D1ABC7F67408005 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; + 1363E07B9A4111D5CDFA32B8A245F35E /* GCBCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCBCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1368B4159EE1FD22492BA2DC5AE9E0D7 /* Stream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stream.swift; path = Source/Stream.swift; sourceTree = ""; }; + 138902410265822F46424F09E7E896CB /* DelayOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelayOperation.swift; path = Sources/Core/Shared/DelayOperation.swift; sourceTree = ""; }; + 147ACA3E9072F582D4467776453D9D26 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; + 1485A636A575830A6F4661CCDDC006E5 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; + 1575E2D351DDE2BE8777DD3275D1FF58 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousInvocable.swift; path = RxSwift/Schedulers/Internal/AnonymousInvocable.swift; sourceTree = ""; }; + 1620A4D44FB0DAA1682AE846A33375DB /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 166EAB01A582CDDCBB0C443303E6D740 /* OperationQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueue.swift; path = Sources/Core/Shared/OperationQueue.swift; sourceTree = ""; }; + 169AAA15155EB703C67AE31C394DFDB1 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + 16D8B393D19E25A2D2B8DB3FEC9628FE /* RetryOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryOperation.swift; path = Sources/Core/Shared/RetryOperation.swift; sourceTree = ""; }; + 19875C26FCDAED3E60832CD343DD21AD /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + 1A6A3017853CBF546D77D54DEF14E129 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/Nimble/Adapters/ObjectiveC/NMBStringify.h; sourceTree = ""; }; + 1BDFA2139F3D52052D7464AB6A5683FD /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + 1C619DD8D8E4DFD880FCA411D24990D8 /* ResultType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResultType.swift; path = Result/ResultType.swift; sourceTree = ""; }; + 1CFE92A5B1BF12460F74C754B4188546 /* SlackKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SlackKit.xcconfig; sourceTree = ""; }; + 1D4FC445973667C379C36EBCE6ABC8F5 /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; + 1DD953A23C4E4AFADBD227DE27A6B4F3 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 1DF68FE219A517DC6973889F4FC3908E /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Implementations/Amb.swift; sourceTree = ""; }; + 1DFD65AD665E3A96183E93B0F40DA403 /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; + 1E03AFAD740BD6F255FC346161B0D4C3 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = RxSwift/Platform/Platform.Darwin.swift; sourceTree = ""; }; + 1F2881597E19C227D0ADCD3FFD7A718C /* OHHTTPStubs-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubs-dummy.m"; sourceTree = ""; }; + 1F438AE000B7D9FEDDC6371B566A3A21 /* MD5-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MD5-dummy.m"; sourceTree = ""; }; + 1F82A5C655E786E01E02F90C77D352C8 /* Operations.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Operations.xcconfig; sourceTree = ""; }; + 2032075B3A73D7CD088315B1D94A9075 /* SlackKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SlackKit-umbrella.h"; sourceTree = ""; }; + 207EC3BB70412EDF14308BF57AC59474 /* PINCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PINCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 215D2E11E68625ADB53C7A2C2C99B54F /* SlackKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SlackKit-prefix.pch"; sourceTree = ""; }; + 21CBA93E427433F90EFA22F44789CF99 /* ConfigurationDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConfigurationDownloader.swift; path = GCBCore/Configuration/ConfigurationDownloader.swift; sourceTree = ""; }; + 21CC15734C457BB4C719760F31A7D30E /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; + 21E62CB9626D7B352B0FD2F0C5DB56CA /* Result-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-prefix.pch"; sourceTree = ""; }; + 21EC9C4F2E15DAA22D8B9272899A7961 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; + 23048286EBD0EC01FB5F3CDDF894556A /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; 233F7F99D65CD34895EC198D4D480B49 /* UIColor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = ""; }; + 236874A5661A734F37C32C47477F7E48 /* OHHTTPStubs+NSURLSessionConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OHHTTPStubs+NSURLSessionConfiguration.m"; path = "OHHTTPStubs/Sources/NSURLSession/OHHTTPStubs+NSURLSessionConfiguration.m"; sourceTree = ""; }; + 2381A530E4127ED29ADC11C7BBB08F50 /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; + 2418F52D7A8561AC03DDE3526F18F199 /* CZForecastioAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZForecastioAPI.h; path = CZWeatherKit/CZForecastioAPI.h; sourceTree = ""; }; 2430D47613A0B779B4246919E809C29E /* Pods-GrandCentralBoard-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GrandCentralBoard-acknowledgements.markdown"; sourceTree = ""; }; - 243ACC1C68D1C750FC91973EBB66A440 /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; - 243E29712E914187F22A3DA707B93579 /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Implementations/Concat.swift; sourceTree = ""; }; + 2442DF0F204F94D186809B47F0536692 /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; + 24E2B4A8485C2836BE4DBC02FCD0E9AB /* OHHTTPStubs-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubs-prefix.pch"; sourceTree = ""; }; 250D550EF48C21789BEECEC98F89A80B /* GCBUtilities-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCBUtilities-dummy.m"; sourceTree = ""; }; 2534E75138611D5FFE2743EB84FE7D03 /* LabelWithSpacing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LabelWithSpacing.swift; sourceTree = ""; }; - 272C4C52643025573021F5DF6467CDA2 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; - 273BB47540EA1B4E6A25258BDD9A02FB /* Moya-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-umbrella.h"; sourceTree = ""; }; - 278DD143D24D8A2D70FBDC773976DC9A /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = RxSwift/Platform/Platform.Darwin.swift; sourceTree = ""; }; - 27C84AE0538A9EA1FEECFCCF0EE65139 /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; - 27CBC2416FF98421A1410607FE63520E /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/Implementations/RetryWhen.swift; sourceTree = ""; }; - 2865591B1F8096A1D797A91560F5FD41 /* GCBCore.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCBCore.xcconfig; sourceTree = ""; }; - 290F221233475BA26A7F415013648C18 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/Operators.swift; sourceTree = ""; }; - 297995529B1E3355A2EEECA08ACDB593 /* Bot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bot.swift; path = SlackKit/Sources/Bot.swift; sourceTree = ""; }; - 299C4FBA9EFFA270B6B428606227E2C5 /* Hash.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Hash.swift; path = Sources/Hash.swift; sourceTree = ""; }; - 29AC07BA8148BA2E48CE4896B358690C /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+arity.swift"; sourceTree = ""; }; - 2A4CF91E474A84D0D193A82F6F55CB07 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; - 2AC48836565045F88CF0E2484AC01411 /* ShareReplay1WhileConnected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1WhileConnected.swift; path = RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift; sourceTree = ""; }; - 2B3CED4AA0F48F9C12849DE0B00E826A /* OHHTTPStubsResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubsResponse.h; path = OHHTTPStubs/Sources/OHHTTPStubsResponse.h; sourceTree = ""; }; - 2BC99850F40144B9BABF9E36B45A86A9 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Implementations/Range.swift; sourceTree = ""; }; - 2C655631835C5BC83CF9FFED58FB24D9 /* Observable+Creation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Creation.swift"; path = "RxSwift/Observables/Observable+Creation.swift"; sourceTree = ""; }; - 2D6BEEC76D7B89CA22433364A9C5C669 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/Implementations/CombineLatest.swift; sourceTree = ""; }; - 2DB476F378A374425A4A872AC041CDB8 /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; - 2DE27FC17C82093E8FD803ACBF9A1515 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/Nimble/Adapters/ObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; - 2FDCB9B1A2B0C2F7DC927B2E4220B1B9 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/Nimble/Adapters/ObjectiveC/NMBStringify.m; sourceTree = ""; }; - 30B261E26FBC95C7600074D38D6C0723 /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; - 30FD4600467B1A5E1CBB314767D50398 /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Implementations/Skip.swift; sourceTree = ""; }; - 3173B6C58976BE983BB940B79A782D26 /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; + 25402BD10C01F92A6BF6A8A1529F143A /* Result.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Result.xcconfig; sourceTree = ""; }; + 254DB530F74E96DF4D248EBC441C77E6 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = RxSwift/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; + 259D36F30D4703E0D9515BE06D4CA355 /* Operation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operation.swift; path = Sources/Core/Shared/Operation.swift; sourceTree = ""; }; + 25D4519C15A99C03986C81791EA2DDE3 /* PINCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PINCache.h; path = PINCache/PINCache.h; sourceTree = ""; }; + 260D8C5D7389EC0AA7BB495C9EB40B7A /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/Nimble/Adapters/ObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; + 262B7ED8C316D23FB117C10065B67192 /* CZWeatherLocation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWeatherLocation.m; path = CZWeatherKit/CZWeatherLocation.m; sourceTree = ""; }; + 262D2897D26F2DC9F978E332F43FA176 /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Implementations/Merge.swift; sourceTree = ""; }; + 26338D945FE88171237E30C2712706B4 /* ErrorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorType.swift; path = GCBCore/Extensions/ErrorType.swift; sourceTree = ""; }; + 271E62520F0E60A939FECB1DFFCBE8CD /* Decodable.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Decodable.modulemap; sourceTree = ""; }; + 272DFA1D97ECFB4465283FBEE1F93C96 /* Decodable-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Decodable-dummy.m"; sourceTree = ""; }; + 28259B52FFCAD15D1F1D555AAE300014 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 28A1E503DDAB03523C735B123228DEDD /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Implementations/Generate.swift; sourceTree = ""; }; + 29CCC30515407C65034467737CE54F7F /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; + 2A1474FA93D24756FC513E213FCFD00C /* CZOpenWeatherMapRequest+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZOpenWeatherMapRequest+Internal.h"; path = "CZWeatherKit/CZOpenWeatherMapRequest+Internal.h"; sourceTree = ""; }; + 2C88363E0695421EDB039A027351F6B9 /* IntExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IntExtension.swift; path = Sources/IntExtension.swift; sourceTree = ""; }; + 2CA682DFE2CF3324CE676F0A8A81F628 /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Implementations/Zip.swift; sourceTree = ""; }; + 2CCC20C08696FCF2F7F31CD4A96643B0 /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; + 2DF89F2C182D6E329A20375DDA321C77 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; + 2E7116CF3C41811A406E3F37B5D34B15 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2F3346E24F87E4349BA8E3808AFFE643 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + 302D66FDACEC1E2E28D48C6FF2C42774 /* CZWeatherDataCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherDataCache.h; path = CZWeatherKit/CZWeatherDataCache.h; sourceTree = ""; }; + 30AA5DDDD96211BE6636A21B423EB558 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; + 30F6437701A5AF68CC47C4EC49192973 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Result/Result.swift; sourceTree = ""; }; + 317212F1121A961F93384B76ABF68E48 /* Observable+Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Single.swift"; path = "RxSwift/Observables/Observable+Single.swift"; sourceTree = ""; }; 31A9417D12AD2FCDB06CDDD134194E8E /* AccessToken.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AccessToken.swift; sourceTree = ""; }; - 33499355C23055D0C81B487ECC2F4C19 /* ObserveOnSerialDispatchQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOnSerialDispatchQueue.swift; path = RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift; sourceTree = ""; }; + 329C2E2ED9DFF4683827BC35BBF7CE68 /* NSURLRequest+HTTPBodyTesting.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURLRequest+HTTPBodyTesting.m"; path = "OHHTTPStubs/Sources/NSURLSession/NSURLRequest+HTTPBodyTesting.m"; sourceTree = ""; }; 33559246F8D22087C7A0A986F9B3EAA1 /* Pods-GrandCentralBoardTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GrandCentralBoardTests-resources.sh"; sourceTree = ""; }; - 338B52C968A713CDBFC6ECDC6F35D535 /* MD5-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MD5-dummy.m"; sourceTree = ""; }; - 33CE35817B078DD24A00BF6C81868FA7 /* GCBUtilities.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GCBUtilities.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 33E9BCAD91BD2AF8970D1E11DBEAD846 /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; - 34C881F73539227FEB265497F95D90A4 /* Variable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Variable.swift; path = RxSwift/Subjects/Variable.swift; sourceTree = ""; }; - 34E19E24CBB9D17F40EDA5AD81279187 /* Timed.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timed.swift; path = GCBCore/Models/Timed.swift; sourceTree = ""; }; - 35530FF0B9A1FD7E0099A73660CD869A /* RepeatedOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RepeatedOperation.swift; path = Sources/Core/Shared/RepeatedOperation.swift; sourceTree = ""; }; - 361095E8F6A8ED8807780F2F59E1797D /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; - 366B28F41D087F6D3BAF2A90EAAFA9C2 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = RxSwift/Platform/Platform.Linux.swift; sourceTree = ""; }; - 3756AED27F4E64842742E9A59496B70F /* CloudCapability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudCapability.swift; path = Sources/Features/Shared/CloudCapability.swift; sourceTree = ""; }; - 379189330FF43C9E763923EDFDFE9D12 /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = SlackKit/Sources/Event.swift; sourceTree = ""; }; - 3794978CC83D344729EEAD1B5A8908EA /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; - 3820ECD867565C57835F86DC97873733 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; - 383C94650F9F55DF4A8929687DDC7D54 /* Client.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Client.swift; path = SlackKit/Sources/Client.swift; sourceTree = ""; }; - 38587901E5E1831929D293E6400D9312 /* OHHTTPStubs+NSURLSessionConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OHHTTPStubs+NSURLSessionConfiguration.m"; path = "OHHTTPStubs/Sources/NSURLSession/OHHTTPStubs+NSURLSessionConfiguration.m"; sourceTree = ""; }; - 38D333ACDABF2AD5333AE3910BC7549D /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; - 38DA258D07BD4ACEC35B7AEED3118AFC /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; - 397DFB0A60859D6FF57502AF819CDC10 /* Endpoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Endpoint.swift; path = Source/Endpoint.swift; sourceTree = ""; }; - 39A9238E227041FD68FDF36BEFBC6A0E /* User.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = User.swift; path = SlackKit/Sources/User.swift; sourceTree = ""; }; - 3A6E9399F96ED325C10CC4F01AD4FD2D /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/Implementations/WithLatestFrom.swift; sourceTree = ""; }; - 3C240764FD41F48F6A3FDB326A7665F3 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3C4BBA245812CB85529D0D4FDD616492 /* Download.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Download.swift; path = Source/Download.swift; sourceTree = ""; }; - 3E1329CE692820DBC82618ECB7DB4BF6 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; - 3E80F5D5838EF1CED212189A51CDECFC /* OHHTTPStubsMethodSwizzling.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubsMethodSwizzling.h; path = OHHTTPStubs/Sources/NSURLSession/OHHTTPStubsMethodSwizzling.h; sourceTree = ""; }; - 3F5535223CB91EC32EA973602DEE2B7C /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; - 3F6D1E341D943A7B479D39D47A4E741B /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/Implementations/TakeUntil.swift; sourceTree = ""; }; - 3F7157F32C17BA0909103999530E6E1E /* FunctionalOperations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FunctionalOperations.swift; path = Sources/Core/Shared/FunctionalOperations.swift; sourceTree = ""; }; - 3F72F736B81A5AB31E6F2DB9734F937A /* Moya.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Moya.xcconfig; sourceTree = ""; }; - 3FFD1B43174636A84FACDDAB8CF62BAF /* Observable+StandardSequenceOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+StandardSequenceOperators.swift"; path = "RxSwift/Observables/Observable+StandardSequenceOperators.swift"; sourceTree = ""; }; - 404209F485814F76C74826EBA339F062 /* Moya.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Moya.modulemap; sourceTree = ""; }; - 405C0BBDBA2FCC2A4AEAE736E6F757F9 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; - 420FF3077E018E758316104CFD3F6FCE /* UILabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UILabel.swift; path = GCBCore/Extensions/UILabel.swift; sourceTree = ""; }; - 424B72FB4E1251C9E64628CF561E7502 /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; - 42CEE2FBEDD6B412ED56466D8D234E45 /* MD5-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MD5-umbrella.h"; sourceTree = ""; }; - 431A12D9BCED3C61FBB07E77E070AE8C /* Support.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Support.swift; path = Sources/Core/Shared/Support.swift; sourceTree = ""; }; - 43454B0B140E7602BC3C29F257F610FB /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; - 43D973208A5BCC2362649DE6FB02A308 /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; - 43FEF7F304095D2F947D092F519D7A97 /* Observable+Binding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Binding.swift"; path = "RxSwift/Observables/Observable+Binding.swift"; sourceTree = ""; }; - 44313306E6719B5398ED4B11FF575098 /* OHHTTPStubsMethodSwizzling.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubsMethodSwizzling.m; path = OHHTTPStubs/Sources/NSURLSession/OHHTTPStubsMethodSwizzling.m; sourceTree = ""; }; - 444A5358B278DA045CC632B5437D63AD /* EventDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventDelegate.swift; path = SlackKit/Sources/EventDelegate.swift; sourceTree = ""; }; - 4564F0D8AD46D32CC82698AC146B3975 /* CombineLatest+CollectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+CollectionType.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift"; sourceTree = ""; }; + 337ACCF8635B3B8BC0B7008E65A46D98 /* NetworkActivityPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkActivityPlugin.swift; path = Source/Plugins/NetworkActivityPlugin.swift; sourceTree = ""; }; + 33E689D9DC0A1F6243ACB3B4F923C4CD /* ExclusivityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExclusivityManager.swift; path = Sources/Core/Shared/ExclusivityManager.swift; sourceTree = ""; }; + 33E90278E6F4D1AE30EFF5E344865430 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/Implementations/CombineLatest.swift; sourceTree = ""; }; + 3447D3C0B2FC20BFE32FC7BC419AA1E7 /* UILabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UILabel.swift; path = GCBCore/Extensions/UILabel.swift; sourceTree = ""; }; + 3528E822582F7330CE6CC4DB58E7A97A /* Operations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Operations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 352C749B5889EAFDE9ECA29DB723C156 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Implementations/Deferred.swift; sourceTree = ""; }; + 35776B662CD81337BA97B9A2F564D78D /* CZOpenWeatherMapAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZOpenWeatherMapAPI.m; path = CZWeatherKit/CZOpenWeatherMapAPI.m; sourceTree = ""; }; + 35D583CB786EBE5DC11475D77CF1269E /* CZWorldWeatherOnlineRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWorldWeatherOnlineRequest.m; path = CZWeatherKit/CZWorldWeatherOnlineRequest.m; sourceTree = ""; }; + 36ED0255D8D91A9B630BAD0F600C7402 /* GCBUtilities.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GCBUtilities.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 36F66E62293BDBB56BDAA8AE73934C4D /* CZWeatherKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CZWeatherKit-prefix.pch"; sourceTree = ""; }; + 37A18EB9CFE4E30502776AACF75923C5 /* Reachability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reachability.swift; path = Sources/Features/Shared/Reachability.swift; sourceTree = ""; }; + 37DA981083BB21C0A25F43DA362EFDD7 /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; + 382BEC7A71126A1C030A5C0948E1C1BD /* SlackKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SlackKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 385290186EC8EBF16D223697EDD977AD /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; + 38EBA7A087A5BF87A755A7639A1759F3 /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; + 39372F4E10E829D80311BE706E66E05F /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Implementations/Repeat.swift; sourceTree = ""; }; + 3A24965AF386235FE08F3C73C9FB4E91 /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; + 3A288E3E5FC875FAB1D2B0142DCCA056 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; + 3AF566A3A4276FBEF31FA3D9027AE0EB /* CZClimacons.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZClimacons.h; path = CZWeatherKit/CZClimacons.h; sourceTree = ""; }; + 3B065F887EE3BB082D7A62C7DCE8F688 /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; + 3B3084B40C2B17FDE6EAF5FD551F346C /* GCBCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCBCore-dummy.m"; sourceTree = ""; }; + 3B81BE92721BAAC1848E813351DED3F8 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + 3C886B5F4C567686AB159E11F99F4ECB /* File.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = File.swift; path = SlackKit/Sources/File.swift; sourceTree = ""; }; + 3E465E856B21EB0B8FC7995295EF6C5C /* CZWeatherHourlyCondition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWeatherHourlyCondition.m; path = CZWeatherKit/CZWeatherHourlyCondition.m; sourceTree = ""; }; + 3E60A7851A634388A08E46DF639318B5 /* OHHTTPStubs-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubs-umbrella.h"; sourceTree = ""; }; + 416AB18847085E478F0005A36AA2EADE /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Implementations/Never.swift; sourceTree = ""; }; + 42B0138E9E12041042997A33F7550BE1 /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; + 452D51542007324AD99FAB50095C580C /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; + 45329FD9FB9F88CAEBCCDCE2A312E7C2 /* CZWeatherKitInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherKitInternal.h; path = CZWeatherKit/CZWeatherKitInternal.h; sourceTree = ""; }; + 454746958637E6F6CDB8BE29767120E2 /* CZWeatherKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CZWeatherKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45A58D624139E0B18F4AE2146EBD3892 /* GoogleTokenProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GoogleTokenProvider.swift; sourceTree = ""; }; - 462E9662BE5AB1EF4DD4F4E41E9EEA7C /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; - 46431C3CA657423902D634498B670455 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 47062B7CD13E89BF17A175DDB1DF7611 /* SynchronizedSubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedSubscribeType.swift; path = RxSwift/Concurrency/SynchronizedSubscribeType.swift; sourceTree = ""; }; - 47A11C7A571B36FBB0D5A54A8113922D /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; - 484FF5581B7851D7BC5EE639B3848CCC /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 48ADC7B2AB8E3AA9401F71A80D5C218F /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/Implementations/StartWith.swift; sourceTree = ""; }; - 48BB3DD2F196D91D26891FDA75D2BD5A /* UIViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewController.swift; path = GCBCore/Extensions/UIViewController.swift; sourceTree = ""; }; - 49A4620B1C93BE5AB187FA83837E465A /* Operations-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Operations-dummy.m"; sourceTree = ""; }; - 4A4A7CF5B0F7FC7AE39B9B1FF550786E /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; - 4A780D03D9B260614AFA5CA569FD4839 /* Starscream-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-umbrella.h"; sourceTree = ""; }; - 4AB6CD7D5FFE6F59C03229692518D51C /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; - 4AF9922A53C0F00E01DCDF987B2C32BC /* ConfigurationDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConfigurationDownloader.swift; path = GCBCore/Configuration/ConfigurationDownloader.swift; sourceTree = ""; }; - 4B58283BF1679F8F3C82EBA0A13E57A0 /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Implementations/Producer.swift; sourceTree = ""; }; - 4CB763FF006BF4CE837CE79C81B61860 /* ConnectableObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservable.swift; path = RxSwift/Observables/Implementations/ConnectableObservable.swift; sourceTree = ""; }; - 4DBAE639BE3B9B16BBEC71E47B09CD58 /* UIOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIOperation.swift; path = Sources/Core/iOS/UIOperation.swift; sourceTree = ""; }; - 4E5F9FC63143BF9C48B797AD5BAD7F89 /* GroupOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupOperation.swift; path = Sources/Core/Shared/GroupOperation.swift; sourceTree = ""; }; - 4F86F574BE165FEAD4E328BC234385E7 /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Implementations/Scan.swift; sourceTree = ""; }; + 47F366107629F3CA413E9CA8FD0F6ECB /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Implementations/Multicast.swift; sourceTree = ""; }; + 4826F4C473195BFF18B92007D023C972 /* PINDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PINDiskCache.h; path = PINCache/PINDiskCache.h; sourceTree = ""; }; + 485E7E75364E70635964F0ED4F3F5520 /* CZWeatherLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherLocation.h; path = CZWeatherKit/CZWeatherLocation.h; sourceTree = ""; }; + 4986A7085C1D93F0CCFD5B6AAA7567A2 /* CZWeatherCurrentCondition+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWeatherCurrentCondition+Internal.h"; path = "CZWeatherKit/CZWeatherCurrentCondition+Internal.h"; sourceTree = ""; }; + 49AEDCE732764A7CD41C203205355016 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; + 49CB3F06CE913D71A9E1574CBED61F34 /* CZWundergroundRequest+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWundergroundRequest+Internal.h"; path = "CZWeatherKit/CZWundergroundRequest+Internal.h"; sourceTree = ""; }; + 49EBF49B74191853A79B16B58E508401 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; + 4BF5E83CAC9D2CE959352BFC9379ABC3 /* Types.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Types.swift; path = SlackKit/Sources/Types.swift; sourceTree = ""; }; + 4C04776AF55A3D9D81CEC17B3396978B /* NSValueCastable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSValueCastable.swift; path = Sources/NSValueCastable.swift; sourceTree = ""; }; + 4D50230900D66E763BBE61EA45AE6A4E /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/Nimble/Adapters/ObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; + 4D9DCFB210ED0F236A0D3AE54CEDF08F /* RefCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCount.swift; path = RxSwift/Observables/Implementations/RefCount.swift; sourceTree = ""; }; + 4DAF20830F81C8C08D32DA74ABC10CCA /* Observable+Binding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Binding.swift"; path = "RxSwift/Observables/Observable+Binding.swift"; sourceTree = ""; }; + 4EADD9C8A63F08C6AE7F3050F674074A /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; + 4EC08831BE6FA1130EC538509B0EF049 /* Zip+CollectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+CollectionType.swift"; path = "RxSwift/Observables/Implementations/Zip+CollectionType.swift"; sourceTree = ""; }; + 4EDFFEE423F6ADE96D1D1C779B2700FF /* CloudCapability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudCapability.swift; path = Sources/Features/Shared/CloudCapability.swift; sourceTree = ""; }; + 4F217B1700BB931C158333F1A765A2FC /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; + 4F61CF31662E450F84409407E62608D2 /* Channel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Channel.swift; path = SlackKit/Sources/Channel.swift; sourceTree = ""; }; + 4F76D589FE2B17BD1EB65789C59AACDB /* CZWeatherKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherKit.h; path = CZWeatherKit/CZWeatherKit.h; sourceTree = ""; }; + 4F8FEECF9B9E2AFA84CF85FA84139731 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; 4FC6C9CF731E3517976892964CC9A51E /* GCBUtilities.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCBUtilities.modulemap; sourceTree = ""; }; - 500BCE51B8A1864F6393247415A1471F /* SSLSecurity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSLSecurity.swift; path = Source/SSLSecurity.swift; sourceTree = ""; }; - 5069A62D7A27A00BD41324F081844E16 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/Implementations/TakeWhile.swift; sourceTree = ""; }; - 51241CFCCD32670B416010BEB96FB314 /* CloudKitOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudKitOperation.swift; path = Sources/Features/Shared/CloudKitOperation.swift; sourceTree = ""; }; - 51A5BB0934C50FA5E10B76DD47E10299 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/Nimble/Adapters/ObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; - 51B3AEE2D84137BABEFE3090EEC91AEF /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; - 520D4BBA9AAABE0AB125029F3853762D /* Stream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stream.swift; path = Source/Stream.swift; sourceTree = ""; }; - 5451C904DBE00AB51DB2A41C5365D739 /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; - 547574CE39F96ABFA4825A56054D142B /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; - 54B2322B9350C90D3DAC12C333461381 /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; - 54DE443EA916E7B8208B6443471ED1E8 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; - 555E03487B8F7AFA3C966A5D1AF497F9 /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; - 55B32CFD914449868EC9A504955F5A58 /* BlockCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockCondition.swift; path = Sources/Core/Shared/BlockCondition.swift; sourceTree = ""; }; - 56209112FFAA7959D3C924E180FE1950 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = RxSwift/DataStructures/PriorityQueue.swift; sourceTree = ""; }; - 576AF4FE3A7B0179C0DD82C352325723 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 584D004AABB698E755FCE17546F88425 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 58D7DCE768F0667C29C71C4C75097D86 /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; - 59314DCBBB2102CD0C7BA4800CBA1310 /* ComposedOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComposedOperation.swift; path = Sources/Core/Shared/ComposedOperation.swift; sourceTree = ""; }; - 595147E7B6E61BF61F63BC8B9102BA22 /* ResultType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResultType.swift; path = Result/ResultType.swift; sourceTree = ""; }; - 597F5D3B60CF635EE33D82348D8589AF /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; - 5A9BA23FC2B0642B25EACDBBC0B8054F /* Castable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Castable.swift; path = Sources/Castable.swift; sourceTree = ""; }; + 4FD78CB18F047D2124592BBBC3A3BDB9 /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; + 503CD2C4FE62A99886E8ED1AC45E70A8 /* Job.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Job.swift; path = GCBCore/Job.swift; sourceTree = ""; }; + 50C0EA87FCCDB68DEB0DD3D60257ADFD /* Operations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Operations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 517DD957A2AD0B3931B32025E094F61A /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5198C63545DB5814BCACB842F7096A51 /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; + 51DB27EB3D0B1064FCE7A1FF54AAF1AE /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Implementations/Producer.swift; sourceTree = ""; }; + 52D74E8B9F8E150B83F528079CA95AE6 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; + 53738CD22465DA05B1142479A9A42455 /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; + 54B35086EFACC9E43FEEA284105E78CE /* UIApplication+StrictKeyWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+StrictKeyWindow.m"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m"; sourceTree = ""; }; + 54EF80B8F107DDC5954A5CB68909FE40 /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Implementations/Buffer.swift; sourceTree = ""; }; + 55866D6EF1BE1AE86E583E0E884379AF /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; + 5659C8A47E9FDB68D59A113E17BF9042 /* Moya-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-prefix.pch"; sourceTree = ""; }; + 56838821C598FB290B91276D2C3F48AD /* Moya.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Moya.swift; path = Source/Moya.swift; sourceTree = ""; }; + 56C28A1442CD872F8853F7458CC7265B /* MD5.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MD5.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5709C1B6ADC1180E7A81D20BA4E0286B /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; + 57FDF85C9318FD5BD63CE69F6AE6FA98 /* OHHTTPStubsSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OHHTTPStubsSwift.swift; path = OHHTTPStubs/Sources/Swift/OHHTTPStubsSwift.swift; sourceTree = ""; }; + 5804B85C707593866DCB0F9FC10DAF8E /* Endpoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Endpoint.swift; path = Source/Endpoint.swift; sourceTree = ""; }; + 5890B8BC8EF4311EC0BB249D9A50D1BF /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; + 5890C7E12E9F9FD6D7A97B00E9FFC50B /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 59131A290544F112A0FD7995748207E7 /* OHHTTPStubsResponse+JSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OHHTTPStubsResponse+JSON.h"; path = "OHHTTPStubs/Sources/JSON/OHHTTPStubsResponse+JSON.h"; sourceTree = ""; }; + 592AE0D09DBB86639C94111F21FB4BE0 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; + 5A45C85D0CE889D5ABF74484C431C8A1 /* Client.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Client.swift; path = SlackKit/Sources/Client.swift; sourceTree = ""; }; 5AF7D63AA2EB036A5CA90BABC2EDEE3E /* Pods-GrandCentralBoardTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GrandCentralBoardTests-acknowledgements.markdown"; sourceTree = ""; }; - 5B05C3BFC6DC296F1E8AAC1948B6D58B /* UserGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserGroup.swift; path = SlackKit/Sources/UserGroup.swift; sourceTree = ""; }; 5B1946F2D882133DCF2F11ADB23A80C3 /* NetworkRequestManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkRequestManager.swift; sourceTree = ""; }; - 5B1C17190E826FCCC1350CEBAE72CF43 /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; - 5C1C4A20C6491C1710A9CD4CEDE11BBF /* DecodingError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DecodingError.swift; path = Sources/DecodingError.swift; sourceTree = ""; }; - 5C53F88134B1763B9D5B017926E2A266 /* Moya+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Moya+Alamofire.swift"; path = "Source/Moya+Alamofire.swift"; sourceTree = ""; }; - 5C81BAAF645203FA593B6ECFAE22DCE9 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/ObjectiveC/NMBObjCMatcher.swift; sourceTree = ""; }; - 5CCF49F39356F77C0589547137998980 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; - 5CE81ADE336CB9BF0DF76A2979A8FA99 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; - 5DCC50731144D700AC8FB353AB968338 /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; - 5E8D3DF50F4E55F27765EF0FEFB560B7 /* SlackKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SlackKit-umbrella.h"; sourceTree = ""; }; - 5F7607F0A37A9C3D307BFF1EE61FB025 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; - 5FF2E9FC1A53A98022E90178CF78B5F4 /* EventHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventHandler.swift; path = SlackKit/Sources/EventHandler.swift; sourceTree = ""; }; - 6036ECE82E59973F5A261B47C9070A78 /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; - 608F45D2BEB10003A9A96C12F7132C6B /* SlackWebAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlackWebAPI.swift; path = SlackKit/Sources/SlackWebAPI.swift; sourceTree = ""; }; - 609E6D219205D48AB275B8E3EB7B6E59 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/Implementations/SubscribeOn.swift; sourceTree = ""; }; - 618925624C3466DB58E357543374378E /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Implementations/Just.swift; sourceTree = ""; }; - 625EE20C48945234E6D9076BF18B11E3 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; + 5B2E64DD128C61A11C7F6E061A9BF933 /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/Implementations/WithLatestFrom.swift; sourceTree = ""; }; + 5B5DBA8F7FE666B159F819089EDA47A5 /* OHHTTPStubs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubs.m; path = OHHTTPStubs/Sources/OHHTTPStubs.m; sourceTree = ""; }; + 5BDEACB6246243123A0406EE1FF2FE2B /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; + 5C1D380AEDFFBC1928CDBAB3900CF222 /* Widget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Widget.swift; path = GCBCore/Widget.swift; sourceTree = ""; }; + 5CE05CCC296CCDEAA9D5E580F42BC488 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5CF2B8A7314E50E09D8FE8893F8E453C /* Decodable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Decodable.h; path = Sources/Decodable.h; sourceTree = ""; }; + 5E803C3F4BCBD8570797C469B96C3A55 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + 5FEBD48441D921DEA889A5AB5AE4160F /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Implementations/Debug.swift; sourceTree = ""; }; + 613A7CCA2061D9CDB49FCDB9E589F515 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/Operators.swift; sourceTree = ""; }; + 613E3B7F8A9996831D3040586BC7A1D3 /* CZWeatherRequest+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWeatherRequest+Internal.h"; path = "CZWeatherKit/CZWeatherRequest+Internal.h"; sourceTree = ""; }; + 6173A031FA951E5E89A7B22362B4EAF2 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Implementations/Timeout.swift; sourceTree = ""; }; + 61744593F89B4D12A2CEB42BF7FE0AA6 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/Implementations/TakeWhile.swift; sourceTree = ""; }; + 619EB4F447A653D72F7821015BCE760B /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; + 61A342B20853A1CB089B903BA8B45FC1 /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; + 61C6FD8F6184735DFF2D1D85824AC412 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; + 623874CAB69E0A7C00EAF0BACF43E4B2 /* GrandCentralBoardController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GrandCentralBoardController.swift; path = GCBCore/GrandCentralBoardController.swift; sourceTree = ""; }; 62916263FA820243FA500862EB8CE145 /* Pods-GrandCentralBoardTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GrandCentralBoardTests-acknowledgements.plist"; sourceTree = ""; }; - 62F82CC65D29391C34411995CC23DD88 /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Implementations/Repeat.swift; sourceTree = ""; }; - 630F44CBE9AB50D0D7DD2A6577D02C60 /* NSURLRequest+HTTPBodyTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURLRequest+HTTPBodyTesting.h"; path = "OHHTTPStubs/Sources/NSURLSession/NSURLRequest+HTTPBodyTesting.h"; sourceTree = ""; }; - 631BB84CCDC1A4368864B39B1002EC7B /* Result-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-umbrella.h"; sourceTree = ""; }; - 63B66AE93F7EAF1D980C296DCD7BD4CC /* Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Compatibility.h; path = OHHTTPStubs/Sources/Compatibility.h; sourceTree = ""; }; - 640930B7BC2AF8E90CB7EB0C6721D586 /* SlackKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SlackKit.modulemap; sourceTree = ""; }; - 648433BEABC724009752CE49AE74D4D4 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 653A3F1ED5E466B3BCCED1D2395C57EB /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = GCBCore/Configuration/Configuration.swift; sourceTree = ""; }; - 654334DCA3AF8F143F2CC184B8F2DF01 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = RxSwift/DataStructures/Bag.swift; sourceTree = ""; }; - 656A2AD8678482A3414D3183F77340D9 /* Observable+Aggregate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Aggregate.swift"; path = "RxSwift/Observables/Observable+Aggregate.swift"; sourceTree = ""; }; - 65A68EB6B358030C82FEC0C04F2AFF07 /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; - 6631A5868834D5EAD9B4C06769D85BBF /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; + 62DA3FE71CE9BCD380E5EDE80C3F3193 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; + 63AFCFD3626BD1677D8DD0EC875B2AA5 /* BackgroundObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BackgroundObserver.swift; path = Sources/Core/iOS/BackgroundObserver.swift; sourceTree = ""; }; + 63DFCFBFCF8173EC390341082A2CA8D9 /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Implementations/Scan.swift; sourceTree = ""; }; + 644573D029641CA7952EFF093940C270 /* CZWundergroundRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWundergroundRequest.h; path = CZWeatherKit/CZWundergroundRequest.h; sourceTree = ""; }; + 648147622FFDA83846EB8D1927CEE2E5 /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+arity.swift"; sourceTree = ""; }; + 654ECC37332791E3E91CF55E6B4B1F6F /* CZWeatherHourlyCondition+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWeatherHourlyCondition+Internal.h"; path = "CZWeatherKit/CZWeatherHourlyCondition+Internal.h"; sourceTree = ""; }; + 658D6D77A9A575CB3A09357D0C84D2C0 /* Parse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Parse.swift; path = Sources/Parse.swift; sourceTree = ""; }; + 65F622871CA4C41A0E99CD415739D345 /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; + 6631C8F602D85EE46AE5C19A3B386FF6 /* Observable+Aggregate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Aggregate.swift"; path = "RxSwift/Observables/Observable+Aggregate.swift"; sourceTree = ""; }; 669939856A2DDD4891CEB53B9A2E8FCE /* ResourceBundle-GCBUtilities-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-GCBUtilities-Info.plist"; sourceTree = ""; }; - 66A1E9C5A5BB0F5E0F446B23075582D9 /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/Implementations/DelaySubscription.swift; sourceTree = ""; }; - 670C35710186AC7DCCD80DF3A656B3AA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 670D225B87645A98748B2F14B63FED62 /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Implementations/Generate.swift; sourceTree = ""; }; - 67F329A43C714B2A0D7A7492BF682D35 /* Generics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generics.swift; path = Sources/Generics.swift; sourceTree = ""; }; - 6802EBC2D159B9560CFAD2FC68480C41 /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 680DE9381D53CDF7878C1EEBBBA4C7FB /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + 66F872E2DA5BDC191FB39C413E4096C6 /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; + 678E820315A406C37633B7D990DDD994 /* CZOpenWeatherMapRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZOpenWeatherMapRequest.m; path = CZWeatherKit/CZOpenWeatherMapRequest.m; sourceTree = ""; }; + 67BF28D7B8BAF9DBEE1274BD3AE6271B /* Generators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generators.swift; path = Sources/Core/Shared/Generators.swift; sourceTree = ""; }; + 683602810D0BFF8D342CF09E7AA69549 /* CZOpenWeatherMapAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZOpenWeatherMapAPI.h; path = CZWeatherKit/CZOpenWeatherMapAPI.h; sourceTree = ""; }; + 69386107A543F4417FBD7D78AEBBF2B3 /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = FBSnapshotTestCase.modulemap; sourceTree = ""; }; 694A2214460BED92ABB4F9B9B2F3355B /* gcb-error-icon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "gcb-error-icon.png"; sourceTree = ""; }; - 699CCCB7C1CA24AD04493F18CDC9F062 /* Observable+Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Single.swift"; path = "RxSwift/Observables/Observable+Single.swift"; sourceTree = ""; }; - 6C5C243C9EAF503B6D2322CC358143D5 /* BlockOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockOperation.swift; path = Sources/Core/Shared/BlockOperation.swift; sourceTree = ""; }; - 6CF26820ABE38690543664615CD1CCB1 /* Result.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Result.xcconfig; sourceTree = ""; }; - 6DA251A209C4A938FAF0A74DD804D6D6 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = Sources/Utils.swift; sourceTree = ""; }; - 6DEC4254B3E88D7C30F2F9E376646A9F /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxSwift.modulemap; sourceTree = ""; }; - 6ED7F12A4243B628F8FD801B7DA9BA90 /* ReachabilityCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReachabilityCondition.swift; path = Sources/Features/Shared/ReachabilityCondition.swift; sourceTree = ""; }; - 7027821F8195805CB696AB998443E551 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = RxSwift/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; - 7089F72423629637335BF3128795FDE8 /* Decodable-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Decodable-umbrella.h"; sourceTree = ""; }; - 70A6A16FEA4D781FF6A04DAD6EE1F6CC /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Implementations/Zip.swift; sourceTree = ""; }; - 7124A8B55899A0443DC62BCE0C5ADBEF /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; + 69544FB5B1C9B81D0749EBE81970DB9C /* Moya.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Moya.modulemap; sourceTree = ""; }; + 6A3AA4341727301E6E94ADD24D5776C2 /* DecodingError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DecodingError.swift; path = Sources/DecodingError.swift; sourceTree = ""; }; + 6B2B7A2387BEC8E8932B93145FCBB4B2 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Implementations/Just.swift; sourceTree = ""; }; + 6C2F9432076561167003EBF55DB2C84E /* Observable+Creation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Creation.swift"; path = "RxSwift/Observables/Observable+Creation.swift"; sourceTree = ""; }; + 6C67556D2A88B84A6632C15E1F5FDBB7 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; + 6CCC87044EC06E2130CE08D6C2A19359 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; + 6D2AF56EF9F1A169AF85D5841CB934EB /* Starscream-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-prefix.pch"; sourceTree = ""; }; + 6D73708354C0C565DB1D17179F21905B /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Implementations/Timer.swift; sourceTree = ""; }; + 6E284C0EEE1C585DE7330820DF62C7CC /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; + 6E5EF35C1C49007198DF207CAF6AD13D /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; + 6EA64F3F98EDB14D69E784A388BA8A53 /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; + 6ECC06B17B33B7251DA0746997FF63CE /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; + 6F1D9B2CF6D3EB2BCBB2C6E9E1946469 /* Starscream.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Starscream.modulemap; sourceTree = ""; }; + 6F6F55EE094345E1EA28C18211C37BA5 /* OHHTTPStubsResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubsResponse.m; path = OHHTTPStubs/Sources/OHHTTPStubsResponse.m; sourceTree = ""; }; + 6F7705ED2C309032E92ECA6B1DADF589 /* CZWeatherLocation+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWeatherLocation+Internal.h"; path = "CZWeatherKit/CZWeatherLocation+Internal.h"; sourceTree = ""; }; + 6F84B4668BBEF69A646FCA50CF453288 /* OHHTTPStubsResponse+JSON.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OHHTTPStubsResponse+JSON.m"; path = "OHHTTPStubs/Sources/JSON/OHHTTPStubsResponse+JSON.m"; sourceTree = ""; }; + 6FF797697B45F5626B1046FB2A7ADA79 /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; + 70A62AE472A59312A80CA5B879737843 /* UIViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewController.swift; path = GCBCore/Extensions/UIViewController.swift; sourceTree = ""; }; 71376C070C2B25EEA99B025ACAAFA68D /* Pods-GrandCentralBoard.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-GrandCentralBoard.modulemap"; sourceTree = ""; }; 719FFD44B50DF8CC2F5A28533C8BF8B8 /* WidgetTemplateView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = WidgetTemplateView.xib; sourceTree = ""; }; - 721630214CB014361E7D2DC0CAF7242E /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; - 7228EBB47363C5076B8EBF47D415B1A1 /* Reachability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reachability.swift; path = Sources/Features/Shared/Reachability.swift; sourceTree = ""; }; - 727AE1290FAF12BA08FD7A550E8D7D3E /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Implementations/Multicast.swift; sourceTree = ""; }; - 729F07197B32A2B1C4050D9BC9F2ACD6 /* Zip+CollectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+CollectionType.swift"; path = "RxSwift/Observables/Implementations/Zip+CollectionType.swift"; sourceTree = ""; }; - 72B8B59BEAD47EB457F703D20412A9D4 /* OperationObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationObserver.swift; path = Sources/Core/Shared/OperationObserver.swift; sourceTree = ""; }; - 72E4743B3C2758A9EE613EB64764DD2D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 72F4129424A3C0CE2400EAD1C0BB3437 /* OHPathHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHPathHelpers.h; path = OHHTTPStubs/Sources/OHPathHelpers/OHPathHelpers.h; sourceTree = ""; }; - 73DE84DEEA9C6C16606B6CA4B6D43887 /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Implementations/Zip+arity.swift"; sourceTree = ""; }; - 740D1078C4A9F2BAE5CDEFD3F369BB88 /* Operations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Operations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 74444A4F8955D35CE2CC9010002176AB /* GCBCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCBCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 74667AE9BF6BC1D2D143D2B550AD5D12 /* Widget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Widget.swift; path = GCBCore/Widget.swift; sourceTree = ""; }; - 74FEBFE4CEFAA892F23B67A5AA68D237 /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; - 750BAEB00D36519A68DE054FFFD241E6 /* OHHTTPStubsSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OHHTTPStubsSwift.swift; path = OHHTTPStubs/Sources/Swift/OHHTTPStubsSwift.swift; sourceTree = ""; }; - 752FB12DA4248428101BEE2F8B9F9ED3 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + 71C2BAC3EEA6827AB1B6D5E332E11046 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 723A8B7D10F5B632A256CF78EBB62259 /* BlockOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockOperation.swift; path = Sources/Core/Shared/BlockOperation.swift; sourceTree = ""; }; + 726A32AE952D2190D6359AFEE6E140F4 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; + 72AEA30C63E64B9CA2C83D344B6D0938 /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = SlackKit/Sources/Event.swift; sourceTree = ""; }; + 7364E548EB7CF488B2E24FBDDBBE8451 /* PINCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PINCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 74275AF025CBF943739074B80DFDAD55 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/Nimble/Adapters/ObjectiveC/NMBStringify.m; sourceTree = ""; }; + 745AB54F92DD37167927DB6762BC3C9B /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; + 74F2755E5D4716AC8CD20E0239D02B00 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; + 76189DA5165ACD8017186CDB3F4B32D2 /* SlackKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SlackKit-dummy.m"; sourceTree = ""; }; + 764FDF2FAB1D0641D94F6747CBD72C2F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 766B23567C247CDF63DD55357F9C8E0F /* Pods-GrandCentralBoardTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GrandCentralBoardTests-umbrella.h"; sourceTree = ""; }; - 7861F70B550B33280882A5ABF8F4ED88 /* Moya-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-prefix.pch"; sourceTree = ""; }; - 7909B418D628EDBEBAAFEC67FA50958C /* Capability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Capability.swift; path = Sources/Features/Shared/Capability.swift; sourceTree = ""; }; - 79FBA3F4394BB499147E004222AAE9F9 /* SlackKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SlackKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7A0F6357BC37F4E87953873630A11AEE /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/Nimble/Adapters/ObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; - 7A16760172B10E95CC1A755501BD8BEC /* BlockObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockObserver.swift; path = Sources/Core/Shared/BlockObserver.swift; sourceTree = ""; }; - 7A263B75827678A997726732B61A96BA /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; - 7AA54EDA1AE20F9361C74BCAF35894F0 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; - 7AF9DA9CE305FF472D0040BFBE470D9F /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; - 7B0565220ED25AC3B95D95473DB9E999 /* MD5.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MD5.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7B374ECD46A1C0F10A590B5A345A9D39 /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; - 7BF0705DA3715365B1EC4D085BB7E3C1 /* Pods_GrandCentralBoard.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GrandCentralBoard.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C07EB3224EA24699B98A96267124C88 /* Moya.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Moya.swift; path = Source/Moya.swift; sourceTree = ""; }; - 7C665482DB2D2FD2074F755E00C0DA04 /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; - 7C66F697F0481E963E77BE6EAE22A90F /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; - 7CEA6C9B4E5D0E5A245DD6FD695F4691 /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/Implementations/ObserveOn.swift; sourceTree = ""; }; - 7D88D19D4888FBBFFA587AE972F95143 /* Observable+Moya.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Moya.swift"; path = "Source/RxSwift/Observable+Moya.swift"; sourceTree = ""; }; - 7EE29A44B3A9D9ADBCFB06B96CC77DC7 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; - 7F34B1087835AD1C1820FFD8B2B873D4 /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; - 7F70342C4931C2D9BBA9DA8FFAD98C81 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Implementations/Map.swift; sourceTree = ""; }; - 81F0D18CBFD293294B88A60B41D2BC49 /* DispatchQueueSchedulerQOS.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueSchedulerQOS.swift; path = RxSwift/Schedulers/DispatchQueueSchedulerQOS.swift; sourceTree = ""; }; - 824104CB876FBA932A5654A42B8FF2FD /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = GCBCore/Result.swift; sourceTree = ""; }; - 82E68DD7C656B42116607A5C5ECB6377 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; - 82EA5EB0A9CA77D8E959BFE4C58DD252 /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; - 8430739C0E5FD7941AF5B53361C6A3DB /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Implementations/Sample.swift; sourceTree = ""; }; + 7746D53B740F94E30FA2EF5C36990E48 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; + 7798C30FA16235C36DF68546E46B2BFE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 78000935E761EE1F5C1AE353F1D57A81 /* ComposedOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComposedOperation.swift; path = Sources/Core/Shared/ComposedOperation.swift; sourceTree = ""; }; + 78A0920B012D88A959BED3CBFB580005 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; + 78D2CBE3A3F6E68BC4838C14EC1FEA8E /* CZWeatherKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CZWeatherKit-umbrella.h"; sourceTree = ""; }; + 792E59203E6DC0668DDED438931D3B59 /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Implementations/Zip+arity.swift"; sourceTree = ""; }; + 7937ACC5C7FD066763DE54184374558C /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; + 79503ACB2B7C18C8103244782DFF548C /* NSData+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSData+Extension.swift"; path = "Sources/NSData+Extension.swift"; sourceTree = ""; }; + 79639553D3F3A89CA9D0B54F47A8AF6C /* PINCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PINCache-dummy.m"; sourceTree = ""; }; + 7981621A460D53FBF5064140DC277351 /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = ""; }; + 7A29F449111F9929D52AD12B321D300E /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; + 7AC137198DD8848C5B4FF1FDADB668DD /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; + 7AD0A8CDCF821D0581703F52B1364ABC /* Result-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Result-dummy.m"; sourceTree = ""; }; + 7AE5DADF80C3E9D5650D28BC2A06F367 /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; + 7AE7D155CDF12A86414B8F34894E8AC3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7B0FA76DEBF5034F13856B15D142BC2B /* Decodable-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Decodable-prefix.pch"; sourceTree = ""; }; + 7BC3DD0BD9ADEAD9C96CECB640CDEB9C /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + 7BD58018F55E6C7AA133CBDFCF9D9836 /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; + 7C091C305291244D4DC0B7D957A34822 /* Observable+Multiple.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Multiple.swift"; path = "RxSwift/Observables/Observable+Multiple.swift"; sourceTree = ""; }; + 7C7B5F837FDF5309FC1041BEB18B2B48 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; + 7C9C83007783BC69E2F7028A6F9EB65E /* CloudKitInterface.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudKitInterface.swift; path = Sources/Features/Shared/CloudKitInterface.swift; sourceTree = ""; }; + 7D7FBD564C8F1E46FE10614C52205319 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 7E1E219B480576DB45D0F766DED52AFD /* Rendering.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rendering.swift; path = GCBCore/Rendering.swift; sourceTree = ""; }; + 7E5A496A1AA4CF3335027D8A7356B2C7 /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; + 7F42B655758D10D25BA60165E593FC17 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; + 7FA65057AC514DF4AE3905D404FE9F67 /* ReachabilityCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReachabilityCondition.swift; path = Sources/Features/Shared/ReachabilityCondition.swift; sourceTree = ""; }; + 80176A889AD146D89EF9FB4D9BFB34E6 /* ThreadSafety.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadSafety.swift; path = Sources/Core/Shared/ThreadSafety.swift; sourceTree = ""; }; + 8021C34885D23553F78929C63F763177 /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; + 803EC29A41FE2384D81E3E19868BEF3B /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + 806E4C948521C0FE8232AE34823C8491 /* CZForecastioRequest+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZForecastioRequest+Internal.h"; path = "CZWeatherKit/CZForecastioRequest+Internal.h"; sourceTree = ""; }; + 80CCF5E0F068882E97186C4A79621628 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 80EECA637B691A52FA3A1F9A4827B561 /* CZOpenWeatherMapRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZOpenWeatherMapRequest.h; path = CZWeatherKit/CZOpenWeatherMapRequest.h; sourceTree = ""; }; + 817F7DA7732EB0F365314086F0055F84 /* CZWundergroundAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWundergroundAPI.h; path = CZWeatherKit/CZWundergroundAPI.h; sourceTree = ""; }; + 8376EBB1AAB5AFB6F53078168D414E3D /* Overloads.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Overloads.swift; path = Sources/Overloads.swift; sourceTree = ""; }; + 83CEC853890773573BD338573AE77668 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + 83DC01985094885B377380616EFB00C6 /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; 84BB25052EE15065E422BBA715EEA8FF /* Pods-GrandCentralBoard-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GrandCentralBoard-acknowledgements.plist"; sourceTree = ""; }; - 85127C4E079555839FFBA777B1385078 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 85E52D94983FABC6113E6851BADFA77B /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Implementations/Empty.swift; sourceTree = ""; }; - 86C4319B94A7ADE4BD2F133F0F116B98 /* Moya-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Moya-dummy.m"; sourceTree = ""; }; - 86CD330E579433137D556DD43E5C0BC6 /* OHHTTPStubs.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = OHHTTPStubs.modulemap; sourceTree = ""; }; - 8738E6C0FC1210F12E30887AAAB21858 /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; - 877B078FFC9067D07D9078AB4384D2A0 /* Result-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Result-prefix.pch"; sourceTree = ""; }; - 878664DE0B1FBFF4A4E19FD913EC2857 /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/Implementations/DistinctUntilChanged.swift; sourceTree = ""; }; - 88C05540C600AA1971C15A2296297733 /* CredentialsPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CredentialsPlugin.swift; path = Source/Plugins/CredentialsPlugin.swift; sourceTree = ""; }; - 89303583EA79D5325EB4CABDE91F7C93 /* AnonymousObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObservable.swift; path = RxSwift/Observables/Implementations/AnonymousObservable.swift; sourceTree = ""; }; - 8A43E2A5D12762BB2DDCFA5FB6611C3F /* NSData+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSData+Extension.swift"; path = "Sources/NSData+Extension.swift"; sourceTree = ""; }; - 8B4BBA3BBF6D2AB43B99E35F796A3DC5 /* RawRepresentableDecodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RawRepresentableDecodable.swift; path = Sources/RawRepresentableDecodable.swift; sourceTree = ""; }; - 8B89FD74A740C255B4152E9D803A2643 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; - 8C17B8DE2BAEDAF16D5C537AF88EAE51 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; - 8C2E1CAE64061289717D5CF65C888F40 /* Plugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Plugin.swift; path = Source/Plugin.swift; sourceTree = ""; }; - 8C7392247101398C4A7CA1DF6F6BB1B2 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; - 8C871ACDEC05F7E675A502CE89B7706F /* OHHTTPStubs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubs.h; path = OHHTTPStubs/Sources/OHHTTPStubs.h; sourceTree = ""; }; - 8D2D2103543A13315CCF086FC5EF8CB4 /* SlackKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SlackKit-prefix.pch"; sourceTree = ""; }; + 84BD96EC5D0AFE3B211580ACF4B13195 /* Observable+Moya.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Moya.swift"; path = "Source/RxSwift/Observable+Moya.swift"; sourceTree = ""; }; + 84CB26F2CC144247A50096290DDFB48F /* CZWeatherCurrentCondition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWeatherCurrentCondition.m; path = CZWeatherKit/CZWeatherCurrentCondition.m; sourceTree = ""; }; + 84E4C0E0DCAA45E89F26BF05F4FAB120 /* Observable+Concurrency.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Concurrency.swift"; path = "RxSwift/Observables/Observable+Concurrency.swift"; sourceTree = ""; }; + 85B231960C0F83971BA3C2ACAB282958 /* OHHTTPStubsResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubsResponse.h; path = OHHTTPStubs/Sources/OHHTTPStubsResponse.h; sourceTree = ""; }; + 8688A4A51E3AA602B1C801FB5A55F4C3 /* DispatchQueueSchedulerQOS.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueSchedulerQOS.swift; path = RxSwift/Schedulers/DispatchQueueSchedulerQOS.swift; sourceTree = ""; }; + 86DD3E7EF4D44A322FB8FD2310B6A3A2 /* CZWundergroundRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWundergroundRequest.m; path = CZWeatherKit/CZWundergroundRequest.m; sourceTree = ""; }; + 87061D23958D8DFA85B774892E5C242D /* BytesSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BytesSequence.swift; path = Sources/BytesSequence.swift; sourceTree = ""; }; + 871B3F1A8E23448CBC8FC2BEC3B48F2C /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 87CF642DD323B3009BB8E64B2ED57EB7 /* Download.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Download.swift; path = Source/Download.swift; sourceTree = ""; }; + 8892B7A0E511DC6F31583DC879AFB2E3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 88B0EC9DCEEDD6AB85903AD714FBBBCC /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/ObjectiveC/NMBObjCMatcher.swift; sourceTree = ""; }; + 896165D3F5DAF20F7BBB406BB1D435A9 /* Timed.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timed.swift; path = GCBCore/Models/Timed.swift; sourceTree = ""; }; + 8A3E31CA93138718487DAD5D57625BEE /* NAryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NAryDisposable.swift; path = RxSwift/Disposables/NAryDisposable.swift; sourceTree = ""; }; + 8B042580ED92652AB4B1C622698DC37C /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Implementations/Skip.swift; sourceTree = ""; }; + 8C67D41E0CE4596A003BAAD956B7CF30 /* SlientCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlientCondition.swift; path = Sources/Core/Shared/SlientCondition.swift; sourceTree = ""; }; + 8C7CB2B2755EE88C5C7AEB169924324E /* Moya-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Moya-dummy.m"; sourceTree = ""; }; + 8CE807D6448B1823E7833D7AD1C0F865 /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/Implementations/ObserveOn.swift; sourceTree = ""; }; + 8CEAE1E84DAEF699FC2EA620DCF50831 /* Operations-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Operations-prefix.pch"; sourceTree = ""; }; + 8D37F45399F5A3C0099A2B4AF5703AD8 /* OHHTTPStubs.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = OHHTTPStubs.xcconfig; sourceTree = ""; }; + 8E1A3628D0D90CEE66A42C4D1CDCBC5D /* Moya.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Moya.xcconfig; sourceTree = ""; }; + 8E2C42A340AE8D4A73D1474B4336A975 /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; + 8E863ADB2B44F16237A045AC4840E27A /* UserConfirmationCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserConfirmationCondition.swift; path = Sources/Features/iOS/UserConfirmationCondition.swift; sourceTree = ""; }; 8E92FA46DD9469B5C614F2DE1698B8E6 /* Pods-GrandCentralBoard-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GrandCentralBoard-umbrella.h"; sourceTree = ""; }; - 8F31EEBEB5F031504B458DB2817F68EB /* Starscream.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Starscream.xcconfig; sourceTree = ""; }; - 8F3B2DF761343D1229BD101FE5D4281A /* Decodable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Decodable.h; path = Sources/Decodable.h; sourceTree = ""; }; - 902FD2C17FBC2DC30E782D064596F970 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CurrentTestCaseTracker.h; path = Sources/Nimble/Adapters/ObjectiveC/CurrentTestCaseTracker.h; sourceTree = ""; }; - 90938ED83405035D1F70E6DBEC61ED52 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Implementations/Error.swift; sourceTree = ""; }; - 909626418F7D4525358ECA0CB99D8F50 /* Manager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Manager.swift; path = Source/Manager.swift; sourceTree = ""; }; - 90E2606B214596E576925F344EA99452 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; - 9309619FD62944F6AF33B353B05161EB /* GCBCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCBCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8EA96CA7DAA8AACFFD3242E2D9DB09A3 /* Operations-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Operations-dummy.m"; sourceTree = ""; }; + 8EBDF55DB367F9D4B097B31206C7B0B2 /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; + 8EC90D4BC833FE734544F30207A46B4A /* CloudKitOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudKitOperation.swift; path = Sources/Features/Shared/CloudKitOperation.swift; sourceTree = ""; }; + 8EFE7DBDFDDA120555EFC6B59DDC2EB4 /* TimeoutObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimeoutObserver.swift; path = Sources/Core/Shared/TimeoutObserver.swift; sourceTree = ""; }; + 8F7CCD2C6E14266514EA3B65C91F816E /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Implementations/Window.swift; sourceTree = ""; }; + 8F9A0551CE1960D3BD918E2886B4B72B /* Generics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generics.swift; path = Sources/Generics.swift; sourceTree = ""; }; + 903578142A78F8BFC402CC990EC3617A /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/Implementations/AddRef.swift; sourceTree = ""; }; + 9097C4AB8FF2F04D751E6D773EA025A0 /* FunctionalOperations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FunctionalOperations.swift; path = Sources/Core/Shared/FunctionalOperations.swift; sourceTree = ""; }; + 90A4227030BE3269075FB2865B2040CD /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; + 91D9F6C9A4529E97228E30808A5489DC /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; + 924C52A68436C0367F46E1704CBB6280 /* Observable+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Debug.swift"; path = "RxSwift/Observables/Observable+Debug.swift"; sourceTree = ""; }; + 939A94598AD85FBCD65736B999562131 /* Starscream-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Starscream-dummy.m"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9412F8D170DADD2D40B36E35E7ADDCEF /* Pods-GrandCentralBoard.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GrandCentralBoard.release.xcconfig"; sourceTree = ""; }; - 9464AC690BB9D130A23394697C810E5B /* Operations.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Operations.xcconfig; sourceTree = ""; }; - 94686B7E6FF6537A2D40EC7EE4356BB6 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; - 948B99A222992D22FCCCCC54472BFD23 /* Team.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Team.swift; path = SlackKit/Sources/Team.swift; sourceTree = ""; }; - 94A20C9F8C5A7D02C65E08F326850363 /* RefCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCount.swift; path = RxSwift/Observables/Implementations/RefCount.swift; sourceTree = ""; }; - 95100EE29A3E87352B9004C46201C1E2 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9592EFB53207F923F6437A3C62C68380 /* Scheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scheduler.swift; path = GCBCore/Scheduler.swift; sourceTree = ""; }; - 959B210516FD6BEF8AC80BB36E70D709 /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; - 95F7D53858ECA06103556F2D7C8260A3 /* Decodable-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Decodable-prefix.pch"; sourceTree = ""; }; - 97CEAD5E0811065D8913E9400975A45D /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; - 990AB471645915530460ED5B4296B026 /* AlertOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlertOperation.swift; path = Sources/Core/iOS/AlertOperation.swift; sourceTree = ""; }; - 994785D1704FCA1AC4E3B8B25257CF44 /* Repeatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeatable.swift; path = Sources/Core/Shared/Repeatable.swift; sourceTree = ""; }; - 99965341C449E73C80156A05682B1A0B /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9A65978C9F21A6622092D46A7698972E /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; - 9A6D95D337C004BD47FC86A3757251CA /* OHHTTPStubs.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = OHHTTPStubs.xcconfig; sourceTree = ""; }; - 9AAFB418A9C7CF9C11CD2CC841684049 /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; - 9ABE5EC463FC662460A2919A1594CE35 /* File.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = File.swift; path = SlackKit/Sources/File.swift; sourceTree = ""; }; - 9B0C2DBF17F4C7B9BDEF3C7A6A1AC68A /* Source.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Source.swift; path = GCBCore/Models/Source.swift; sourceTree = ""; }; - 9C7827056911EDE4374638A37386C98D /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; - 9CFDB345105A082F37F41E1D7014E38B /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; + 94F8F400D3FD130596C5D03F8C14F310 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9504DFF63EE799DEF8E4045DC7A4AD61 /* UserGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserGroup.swift; path = SlackKit/Sources/UserGroup.swift; sourceTree = ""; }; + 95471B594BC00260369AA577A3C22847 /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; + 9724157927B4D7CB63CF12F0E022FF92 /* PINMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PINMemoryCache.h; path = PINCache/PINMemoryCache.h; sourceTree = ""; }; + 97BD34DE6798A198FECC179DE52BC0DE /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + 980A076319EB87EC8EA4248C389173CC /* GCBCore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCBCore-umbrella.h"; sourceTree = ""; }; + 981056E7937643999C099CC4914236B6 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 98614607CBD343503CDF215F6705B975 /* NSDictionary+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Internal.h"; path = "CZWeatherKit/NSDictionary+Internal.h"; sourceTree = ""; }; + 98A7440322B146841314F4DAE90A5F12 /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; + 98C5881DCEB83D4E0BE24B121BD89E62 /* OHHTTPStubs.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = OHHTTPStubs.modulemap; sourceTree = ""; }; + 98E4E8625F5595C092B27DC33B7FABD2 /* Repeatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeatable.swift; path = Sources/Core/Shared/Repeatable.swift; sourceTree = ""; }; + 996C3EE1D040401F06A4AB6D630C3DFD /* Message.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Message.swift; path = SlackKit/Sources/Message.swift; sourceTree = ""; }; + 999954921F1306760303035CC229DEEC /* PINCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PINCache-umbrella.h"; sourceTree = ""; }; + 9A4B7711318BC44E1244340730F27293 /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; + 9A9EE1A68093540F9E930AD4C02B93B9 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = RxSwift/Platform/Platform.Linux.swift; sourceTree = ""; }; + 9ACC53A09475233325564B813F4A8FAF /* PINCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PINCache.m; path = PINCache/PINCache.m; sourceTree = ""; }; + 9B43CC1D87B550DBA08E6B0FB64612AA /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = ""; }; + 9B89A9BAB951F05BD540C7621426DDAF /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; + 9BDF87E9275016631FC39A3DD923CFD5 /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; + 9BEB3EF5950D33103E7CA26DBD8121A2 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/ObjectiveC/NMBExpectation.swift; sourceTree = ""; }; + 9CD2C7C0CF7D6C73A49DB4F009D02CAB /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D19D6D66DE8326F7116CD43C5EFFC8A /* CloudKitOperationExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudKitOperationExtensions.swift; path = Sources/Features/Shared/CloudKitOperationExtensions.swift; sourceTree = ""; }; + 9D4267A3B8C535FEB58434B14968205E /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + 9D792CE985D750300BCE9FF8A3A9B3B0 /* CZWeatherForecastCondition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWeatherForecastCondition.m; path = CZWeatherKit/CZWeatherForecastCondition.m; sourceTree = ""; }; + 9DA09A47FAA9F05C8AFCDB6C0276B840 /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/Implementations/TakeUntil.swift; sourceTree = ""; }; + 9DE378872F49E41BE7F0A435C78A3484 /* CZForecastioRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZForecastioRequest.h; path = CZWeatherKit/CZForecastioRequest.h; sourceTree = ""; }; 9E442282FE5CABFC1C2E505CAF848976 /* Pods-GrandCentralBoard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GrandCentralBoard.debug.xcconfig"; sourceTree = ""; }; - 9EE1D87B1699AA665E41385FC8D3A6B8 /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; - 9EE534DD63BEE73F262AAA76134834AE /* UIAlertController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIAlertController.swift; path = GCBCore/Extensions/UIAlertController.swift; sourceTree = ""; }; - 9F0B551049B3FFA725BD21FD7F3CA734 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9F5CEBF7B60B7A5EFB1145F6B332BD86 /* OHHTTPStubs-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubs-prefix.pch"; sourceTree = ""; }; - A206A4461DA25ECB5BAFC0BCE07D6C92 /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; - A28A8ECD3356DBC4004B238913411FF2 /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; - A2CA7E52C339B9AC7FFBB7ECE4F1E269 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A328BD481B280A4580739FE8FCC46B1A /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; - A35A34F460B3DDEF7300274455963701 /* Starscream-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Starscream-dummy.m"; sourceTree = ""; }; - A3FE64F781D63931FD33805D6A19B7D7 /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; - A4A67AB5218C594446FA1C9314129EA3 /* NSValueCastable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSValueCastable.swift; path = Sources/NSValueCastable.swift; sourceTree = ""; }; - A4E70AB3885B2FF6B50EA0E6930939EA /* NegatedCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NegatedCondition.swift; path = Sources/Core/Shared/NegatedCondition.swift; sourceTree = ""; }; + 9FE7E71EE02CA6598DE44A76912FE696 /* Upload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Upload.swift; path = Source/Upload.swift; sourceTree = ""; }; + 9FF98EB0BCF8F48539A108FDD427384C /* NSDictionary+Internal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Internal.m"; path = "CZWeatherKit/NSDictionary+Internal.m"; sourceTree = ""; }; + A01BD6D8133F42BD3ED4BC68C1BBABD8 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Implementations/Catch.swift; sourceTree = ""; }; + A0B2D488DA61F8D8583BA2777593D6E4 /* CZWeatherService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherService.h; path = CZWeatherKit/CZWeatherService.h; sourceTree = ""; }; + A21E1CE87731B382D49E07980BC58A22 /* MD5-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MD5-umbrella.h"; sourceTree = ""; }; + A256DAD3A2A14F983C65AB3737654684 /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; + A2C1CA5467EBA83684D77A2771DA57F4 /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/Implementations/RetryWhen.swift; sourceTree = ""; }; + A2E0D7AD2C312893393D31A332DB584D /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Implementations/Switch.swift; sourceTree = ""; }; + A2F4C3F46947519FFBCAF57E65D8B171 /* Variable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Variable.swift; path = RxSwift/Subjects/Variable.swift; sourceTree = ""; }; + A37EBAF248BA81E9A25C7C8C4C29B19E /* UIApplication+StrictKeyWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+StrictKeyWindow.h"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h"; sourceTree = ""; }; + A39C0A6267E4E32CA93DFADAA0D7F1C0 /* Pods_GrandCentralBoard.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GrandCentralBoard.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A4B77F8A3824C1281EB8AC7257CCAA26 /* GCBCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCBCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A4DEC07B1D0191E1652E5589FFD1F250 /* Decodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Decodable.swift; path = Sources/Decodable.swift; sourceTree = ""; }; + A58F7B07C31410BDED0C4B5D8F368354 /* Starscream.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Starscream.xcconfig; sourceTree = ""; }; + A5AB5B3A20465860C55AEC48196B2FB2 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; A5DEF27942BEE4774CB6F85AC1904567 /* GoogleAPIDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GoogleAPIDataProvider.swift; sourceTree = ""; }; - A6EFB439000D0087BC0320B8F9902A37 /* ResultInjection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResultInjection.swift; path = Sources/Core/Shared/ResultInjection.swift; sourceTree = ""; }; - A76C9D7112B25AAC0E5E7C1ACD8A7B07 /* GCBCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCBCore.modulemap; sourceTree = ""; }; - A7E4A6B7EB4094BEE9B64D5AD7B3CF54 /* URLSessionTaskOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionTaskOperation.swift; path = Sources/Features/Shared/URLSessionTaskOperation.swift; sourceTree = ""; }; - A7E5E321CBB36DFDD96BB1E762DC1BAF /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Implementations/Amb.swift; sourceTree = ""; }; - A802F0947899F0CA9B2DDAA17B7D1CC2 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; - A8E8D411F3AD640A9350A023E31F0F5A /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; - A90FA6FE5E2924CC51ED4F60842BC078 /* Upload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Upload.swift; path = Source/Upload.swift; sourceTree = ""; }; - A9F2A27B2BA2F6778DB33990D771C6F9 /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/Implementations/TakeLast.swift; sourceTree = ""; }; - AA5EB374CD3B03B02BF98E4A1C5BE09C /* BackgroundObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BackgroundObserver.swift; path = Sources/Core/iOS/BackgroundObserver.swift; sourceTree = ""; }; - ABD8103E98463EC51324AC371AB9B8C4 /* GCBCore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCBCore-umbrella.h"; sourceTree = ""; }; - AC1CD92EC7F6FE038F482FD5A76521BE /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; - ACB4B5794215AECC2671801807A5357E /* UIApplication+StrictKeyWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+StrictKeyWindow.h"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h"; sourceTree = ""; }; + A5E6622256C5EF17912D5D8E63C1B00B /* CZWeatherService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWeatherService.m; path = CZWeatherKit/CZWeatherService.m; sourceTree = ""; }; + A5E8F172C004C6A6BA9B960BA4E021CD /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; + A66610611AE02699CB7A30C8588034CE /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A688C7F6111B05F13630500C10E8FC51 /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = Sources/Core/Shared/Logging.swift; sourceTree = ""; }; + A75D2621FD6E28A3CAFF24F9DEDD8D97 /* CZWeatherForecastCondition+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWeatherForecastCondition+Internal.h"; path = "CZWeatherKit/CZWeatherForecastCondition+Internal.h"; sourceTree = ""; }; + A8782DBA67E5A8C42D0054038260C92A /* CZWeatherKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CZWeatherKit-dummy.m"; sourceTree = ""; }; + A9C9D3800DBC925BB1FC5356FFF28F5F /* AutoStack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoStack.swift; path = GCBCore/Views/AutoStack.swift; sourceTree = ""; }; + A9DBE69F7B6E7E56AC86ED57033415F4 /* PINMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PINMemoryCache.m; path = PINCache/PINMemoryCache.m; sourceTree = ""; }; + AB2978FEF790D3130E1667CA6B60308E /* OHPathHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHPathHelpers.h; path = OHHTTPStubs/Sources/OHPathHelpers/OHPathHelpers.h; sourceTree = ""; }; + AB88BB0CC73BB2714CFDD8E1B6C67A42 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AC274016FAF7DEB7995DA607B2DCDE1A /* Starscream-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-umbrella.h"; sourceTree = ""; }; + AC5A7C080C9E312389568AEECC19B928 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; + AC7D22A1BC7CCFA43356B7C8F7D35E74 /* Observable+Time.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Time.swift"; path = "RxSwift/Observables/Observable+Time.swift"; sourceTree = ""; }; + AD0C464CF4A288281B24536F8D9C07DA /* LoggingObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoggingObserver.swift; path = Sources/Core/Shared/LoggingObserver.swift; sourceTree = ""; }; + AD9028C599B99188FF3AA543FDCE09AA /* StableCompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StableCompositeDisposable.swift; path = RxSwift/Disposables/StableCompositeDisposable.swift; sourceTree = ""; }; + ADD18FDCA13C4259452343BF874E90F8 /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; ADD706AA70C4DE99ED52E020FD4615FB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AE9CAC6C3D8BBED064D6A8264B76073B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AF1B25F55A3E41E099ED233421589E72 /* Parse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Parse.swift; path = Sources/Parse.swift; sourceTree = ""; }; - B0102A57BF2F88BE2B13B155EB62B6AC /* Decodable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Decodable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AE76885BB68F1DDB7492AA259B36AABE /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/Implementations/DistinctUntilChanged.swift; sourceTree = ""; }; + AE8816C602F53112572342B980D49DC4 /* Profiler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Profiler.swift; path = Sources/Core/Shared/Profiler.swift; sourceTree = ""; }; + AEC0B75B747B34575671D901D3574EAB /* NetworkInterface.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkInterface.swift; path = SlackKit/Sources/NetworkInterface.swift; sourceTree = ""; }; + AF07172F7CA8B5B935911DE285990786 /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Implementations/Sample.swift; sourceTree = ""; }; + AF2BCCEC2016C9267293D7DD715228F9 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; + AF846C165563CCFB0E95B34C67F3A60F /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; + AF86536ABABE8315BAB2FEC994D39335 /* PINCache.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PINCache.xcconfig; sourceTree = ""; }; + B03A8D57B9DE1D49AC095BE31D5587E1 /* CZWeatherData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherData.h; path = CZWeatherKit/CZWeatherData.h; sourceTree = ""; }; B102A4C5E1AA548F9F4F3F5AB586C5C9 /* GCBUtilities-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCBUtilities-umbrella.h"; sourceTree = ""; }; - B1FAF105DF656E679FAE955379B1C7EB /* NAryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NAryDisposable.swift; path = RxSwift/Disposables/NAryDisposable.swift; sourceTree = ""; }; - B229B9D78265484D2AC97E454227CB1A /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; - B2773C6E5437B3DB81EE9FB4929ACFC5 /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; - B2FE2542E68DB6A105833468075DC9B4 /* DelayOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelayOperation.swift; path = Sources/Core/Shared/DelayOperation.swift; sourceTree = ""; }; - B32C6D311DD3EA40771854D6946470B0 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/Nimble/Adapters/ObjectiveC/NMBStringify.h; sourceTree = ""; }; - B4A8B1646879B16CB2231308C9EF9015 /* UserConfirmationCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserConfirmationCondition.swift; path = Sources/Features/iOS/UserConfirmationCondition.swift; sourceTree = ""; }; - B5A25F6F9E8CB7A6FEFD8900D697ECBF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B5FCD2BF80B00EA2B659D08B7A46815B /* Observable+Multiple.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Multiple.swift"; path = "RxSwift/Observables/Observable+Multiple.swift"; sourceTree = ""; }; - B612E35C49BA7379D882DB354835230B /* GCBCore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCBCore-prefix.pch"; sourceTree = ""; }; - B70E306FFDD8B673E65811DA6C65B374 /* HashProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashProtocol.swift; path = Sources/HashProtocol.swift; sourceTree = ""; }; - B72FCC437D382D258F0C16A0444DB355 /* TimeoutObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimeoutObserver.swift; path = Sources/Core/Shared/TimeoutObserver.swift; sourceTree = ""; }; - B85D3383A939BF7A9C409316485EA4C5 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; - B93194A078C07629874A611D5E0F2131 /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; - B992CA39CDFBB780484E110A8F54E408 /* Observable+Concurrency.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Concurrency.swift"; path = "RxSwift/Observables/Observable+Concurrency.swift"; sourceTree = ""; }; - B9A4BF78727973CB87D5DEB6D25F21EB /* RetryOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryOperation.swift; path = Sources/Core/Shared/RetryOperation.swift; sourceTree = ""; }; - BB800284240CA31EEA0EFB746DA0C3F9 /* AutoStack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoStack.swift; path = GCBCore/Views/AutoStack.swift; sourceTree = ""; }; - BCE15323B4599B324D2A2FFB6D55EF86 /* Moya+RxSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Moya+RxSwift.swift"; path = "Source/RxSwift/Moya+RxSwift.swift"; sourceTree = ""; }; - BD46E1CE16C17EBA81CBAB9018905C98 /* NetworkActivityPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkActivityPlugin.swift; path = Source/Plugins/NetworkActivityPlugin.swift; sourceTree = ""; }; - BE4CA0C211C720D4B5ED50C208C5E6CD /* Decodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Decodable.swift; path = Sources/Decodable.swift; sourceTree = ""; }; - BEC36BDAC8B8A60ED3D1727B77655322 /* UIApplication+StrictKeyWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+StrictKeyWindow.m"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m"; sourceTree = ""; }; - BF5E61BCF6506298A90B96384F50CD80 /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Implementations/Debug.swift; sourceTree = ""; }; - BF88BA6855E6B0C0B114D0DB99158B79 /* ShareReplay1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1.swift; path = RxSwift/Observables/Implementations/ShareReplay1.swift; sourceTree = ""; }; - BF9532E97AB69116452446FF01F58BD6 /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; + B1FC22A4FEF7C861697F7EF24FFA2083 /* OHHTTPStubs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubs.h; path = OHHTTPStubs/Sources/OHHTTPStubs.h; sourceTree = ""; }; + B22DF01C84C772212D032A3F8AFA9215 /* OHPathHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHPathHelpers.m; path = OHHTTPStubs/Sources/OHPathHelpers/OHPathHelpers.m; sourceTree = ""; }; + B23E534A88041EC06C5735DC80BE4E31 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = GCBCore/Configuration/Configuration.swift; sourceTree = ""; }; + B2A7F287B5B7D4E8975424FCD96F5E25 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; + B3864EF9D95FC380FE6DC3D55ACDF5B5 /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; + B3A249D63E560DB4C6E1D169185FB815 /* GCBUtilities.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCBUtilities.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B402E0F4B33CFFD2B7F87A4A454C6007 /* UIView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIView.swift; path = GCBCore/Extensions/UIView.swift; sourceTree = ""; }; + B54E3AF3FA7EA490214091F929A42A95 /* ShareReplay1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1.swift; path = RxSwift/Observables/Implementations/ShareReplay1.swift; sourceTree = ""; }; + B56920C71208ABF4EAAC1AE0FB646275 /* CZWeatherData+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CZWeatherData+Internal.h"; path = "CZWeatherKit/CZWeatherData+Internal.h"; sourceTree = ""; }; + B570D63C3187E60805E032FCF3024A0E /* ImmediateScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateScheduler.swift; path = RxSwift/Schedulers/ImmediateScheduler.swift; sourceTree = ""; }; + B5CFF5407387D136FBCA29313995345D /* HashProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashProtocol.swift; path = Sources/HashProtocol.swift; sourceTree = ""; }; + B5D37292C77D9492E6E4228CAAC43D70 /* PINCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PINCache-prefix.pch"; sourceTree = ""; }; + B65C061A82B2F970A58ACC7723754AE5 /* WebSocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = Source/WebSocket.swift; sourceTree = ""; }; + B713E0FD0F9BCF814D40E7127BD94B7E /* ClientExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ClientExtensions.swift; path = SlackKit/Sources/ClientExtensions.swift; sourceTree = ""; }; + B7ABC7C2CEE79AAFA7089C70A9AF1C48 /* Castable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Castable.swift; path = Sources/Castable.swift; sourceTree = ""; }; + B806A64A4CDF085707D6128AE8B72575 /* NetworkObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkObserver.swift; path = Sources/Core/iOS/NetworkObserver.swift; sourceTree = ""; }; + B811E93430B9D7B81778B697B04CC13E /* Scheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scheduler.swift; path = GCBCore/Scheduler.swift; sourceTree = ""; }; + B82659B9946A78AB3410BAC442F44CE8 /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; + B829D1D86E7011C1D81A50F3CC367607 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = RxSwift/DataStructures/PriorityQueue.swift; sourceTree = ""; }; + B89940DC10F8642BE09481E5110A9544 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; + B8DCDD3F73C4FCF412DFAD051987646F /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = RxSwift/DataStructures/Queue.swift; sourceTree = ""; }; + BAF86C6B35E1BD1A85AE0AC7A34A556B /* ObserveOnSerialDispatchQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOnSerialDispatchQueue.swift; path = RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift; sourceTree = ""; }; + BB20501F1485542B64064338710A4F03 /* User.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = User.swift; path = SlackKit/Sources/User.swift; sourceTree = ""; }; + BB217022BC2F5CAFDF6E1E08FC6A42E4 /* ReachableOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReachableOperation.swift; path = Sources/Features/Shared/ReachableOperation.swift; sourceTree = ""; }; + BB91EDC75CA3D65336413CFAED25461B /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; + BBABE62A1C45E254CB971620847127BF /* CZWeatherAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherAPI.h; path = CZWeatherKit/CZWeatherAPI.h; sourceTree = ""; }; + BC70FC80FCE21AE1448B10097FA5F321 /* Hash.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Hash.swift; path = Sources/Hash.swift; sourceTree = ""; }; + BDC4B5872E67A1F3C51C0299F724C7AD /* EventHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventHandler.swift; path = SlackKit/Sources/EventHandler.swift; sourceTree = ""; }; + BDE43FF22BE9FD0C1BD31A02B953B430 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BDF7F3B27AAD16A0163CBB0F62C41977 /* MD5.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MD5.xcconfig; sourceTree = ""; }; + BE0BF2B7F0BEE27B6196D950DEE2E6D7 /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; + BE0DBA3C3EA8D5D046FC843742B21067 /* Decodable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Decodable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BE92319A90076FB670702AC53D8B1936 /* CZWeatherRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherRequest.h; path = CZWeatherKit/CZWeatherRequest.h; sourceTree = ""; }; + BED3965BD19F7A90C5DFD463EF2EBF17 /* OHHTTPStubsMethodSwizzling.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubsMethodSwizzling.h; path = OHHTTPStubs/Sources/NSURLSession/OHHTTPStubsMethodSwizzling.h; sourceTree = ""; }; BFDC846CD6D42E8E40C710933794920B /* Pods-GrandCentralBoardTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GrandCentralBoardTests-dummy.m"; sourceTree = ""; }; - BFF6DC3373AADB5CE157ACF7115F4F6A /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; - C0694B362772B82E346615AFACCC55C6 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousInvocable.swift; path = RxSwift/Schedulers/Internal/AnonymousInvocable.swift; sourceTree = ""; }; - C101944E1C3B3E6CAE67312F890C8680 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/Implementations/ToArray.swift; sourceTree = ""; }; - C112D441AFA83AFCC441357A4BC04182 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; - C1AE3BF16DC25132E16C491CDB94A22C /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; - C2A9F8F6FB21DC52EEFF6874F4039FF3 /* MD5-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MD5-prefix.pch"; sourceTree = ""; }; - C3F9D561B60E7E6CF911A1748FFE4BD1 /* Operation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operation.swift; path = Sources/Core/Shared/Operation.swift; sourceTree = ""; }; - C46A969E7AAFF26141FFE7EC2669EA13 /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Implementations/Using.swift; sourceTree = ""; }; - C4856C8532A1322951B1237CF0C22BB6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C4AA5A6E73E26D410EA10E661DBD32CD /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; - C4D1901C1562B9C0D583EFDEBE0E484D /* GCBCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCBCore-dummy.m"; sourceTree = ""; }; - C659372D31D8FF6B2C83453D431C9E0F /* NetworkInterface.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkInterface.swift; path = SlackKit/Sources/NetworkInterface.swift; sourceTree = ""; }; - C69036EEFF9C18B2D82B1596D71AC269 /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; - C69BB1D5761428E835DD801725E5D2E7 /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Implementations/Timer.swift; sourceTree = ""; }; - C6CFB25333DDA01625BC083D46422610 /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; - C6F5A47B4E653728A6E65E0B2D80911A /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; - C71E1DED1AD96E5913C7C1ECFB2602A3 /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Implementations/Buffer.swift; sourceTree = ""; }; - C76511FFCA133B2CAC435B0585176831 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/Implementations/AddRef.swift; sourceTree = ""; }; - C8354235A4D4FCE6C995FA98D553DCB2 /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; - C8505763032347405391E8EE0BFE84C5 /* Generators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generators.swift; path = Sources/Core/Shared/Generators.swift; sourceTree = ""; }; - C863AA0BF82F84F7635F14812FF0030B /* Operations.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Operations.modulemap; sourceTree = ""; }; + C098E0E20D37C589007BDF1DEAD5A81B /* CZWeatherData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWeatherData.m; path = CZWeatherKit/CZWeatherData.m; sourceTree = ""; }; + C15D21AAD2F044AEE4AE5DE8CD5E38F7 /* Observable+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Extensions.swift"; path = "RxSwift/Observable+Extensions.swift"; sourceTree = ""; }; + C1B2344DBFCA72493243FB3F673748B3 /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; + C1C7A0118A85D5155A4DD1A9195C7A23 /* Nullability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nullability.h; path = PINCache/Nullability.h; sourceTree = ""; }; + C22C5DA9167582839B66C21B74322467 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; + C2353CE125C65E342D4E23AF4F71ACAD /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/Implementations/ElementAt.swift; sourceTree = ""; }; + C2CCDDA0318F57C019CB21FB877783DC /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; + C3194E9AB650E3D76844CBC23A19F8FE /* RepeatedOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RepeatedOperation.swift; path = Sources/Core/Shared/RepeatedOperation.swift; sourceTree = ""; }; + C403F709DDBF0A31F530821480E7B5EB /* GroupOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupOperation.swift; path = Sources/Core/Shared/GroupOperation.swift; sourceTree = ""; }; + C45CB54AB6F93AF4F6AA1A557E77271C /* NegatedCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NegatedCondition.swift; path = Sources/Core/Shared/NegatedCondition.swift; sourceTree = ""; }; + C463632345D526E24B0B68636C13B397 /* Pods_GrandCentralBoardTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GrandCentralBoardTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C471652298ECDB675407971C4AEB74E6 /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; + C4D2A2A50D844627860B146B1800F76D /* CZPINWeatherDataCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZPINWeatherDataCache.m; path = CZWeatherKit/CZPINWeatherDataCache.m; sourceTree = ""; }; + C4DBB0EE4F6ED8632F1B73BCDE2B318E /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; + C61F10AB2EC6A441B81F1666E7417A92 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C648B448494DFBB4AA625FF897AD1372 /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; + C85BEFDE6BAFDA6041B8D5BA43A18C72 /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; + C8A570695E40CD3933C7717ADD4457E0 /* Team.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Team.swift; path = SlackKit/Sources/Team.swift; sourceTree = ""; }; + C8C1EE36B884CA88E59941CBDC0A2A5D /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; C94974D66E387FADC6755904972A617A /* Pods-GrandCentralBoardTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GrandCentralBoardTests-frameworks.sh"; sourceTree = ""; }; - CA0E0FF7EF7BED90CBFAA20275CF9F69 /* Starscream.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Starscream.modulemap; sourceTree = ""; }; - CA2DFA4D1AB5E2524A83D96E1E78001E /* StableCompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StableCompositeDisposable.swift; path = RxSwift/Disposables/StableCompositeDisposable.swift; sourceTree = ""; }; - CAA5D1B18AFEB88932EDC0F31515D8F6 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Implementations/Filter.swift; sourceTree = ""; }; - CAE169E2694066FC604FF006EF7C0B84 /* UIView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIView.swift; path = GCBCore/Extensions/UIView.swift; sourceTree = ""; }; - CAE5EDB48F3F0DFB7CAD33A79A5508E5 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; - CB60DA630A1053BC451C2F4A15DFF095 /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/Nimble/Adapters/ObjectiveC/DSL.h; sourceTree = ""; }; - CBA3A9F15C3C9E819BE5AF38121BCA9E /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; - CC0287A01FA11422D4AD83147AE0904B /* DataDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataDownloader.swift; path = GCBCore/DataDownloader.swift; sourceTree = ""; }; - CC119C8B59A97490BBC8102E8BE61433 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CC5EAF42306F6ED9FDAB9060B22A1B68 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; - CD4E2E227CA97B375F1F2A4F3AEDA6C0 /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; - CF31CC12E204B1AD8C702AE6028F3301 /* OHHTTPStubs-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubs-dummy.m"; sourceTree = ""; }; - CF4C9ECF1F504D9104DBA70DF2C5275D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CA20ABBBE65CB501F7FF4748DE2923DB /* Decodable-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Decodable-umbrella.h"; sourceTree = ""; }; + CAEECE654E4CD8B27C932738B3D6A4B8 /* Observable+StandardSequenceOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+StandardSequenceOperators.swift"; path = "RxSwift/Observables/Observable+StandardSequenceOperators.swift"; sourceTree = ""; }; + CBD62C5D89BE98E58E9994ECFAB182C5 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/Implementations/ToArray.swift; sourceTree = ""; }; + CD048D723C388D093040537FC421C18B /* AlertOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlertOperation.swift; path = Sources/Core/iOS/AlertOperation.swift; sourceTree = ""; }; + CD31B3DBBC4AA8D74C575AB7142E5D53 /* AnonymousObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObservable.swift; path = RxSwift/Observables/Implementations/AnonymousObservable.swift; sourceTree = ""; }; + CD6CE0A6E2EC4F8E1B91D99AFE1DB2C1 /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; + CD9975B1831AFFBE5993BD4114308536 /* EventDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventDispatcher.swift; path = SlackKit/Sources/EventDispatcher.swift; sourceTree = ""; }; + CDA99A08B84A1B309ED264F3F41F0EB0 /* CZPINWeatherDataCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZPINWeatherDataCache.h; path = CZWeatherKit/CZPINWeatherDataCache.h; sourceTree = ""; }; + CDB9F49D0E3366F8B631D16A4A7A020C /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; + CDD494E5B511AE9DC0BFD70CFD91E494 /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; + CE465BA9C66E7DD99254FF4269847FBE /* SynchronizedSubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedSubscribeType.swift; path = RxSwift/Concurrency/SynchronizedSubscribeType.swift; sourceTree = ""; }; + CE50EDFA3E1E104ABDA2871894BAB938 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Nimble.modulemap; sourceTree = ""; }; + CE52E76729FD012A7688AF3992171DE6 /* ResultInjection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResultInjection.swift; path = Sources/Core/Shared/ResultInjection.swift; sourceTree = ""; }; + CE6EFDC4BA6B75C67298019621CDF4DB /* BlockCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockCondition.swift; path = Sources/Core/Shared/BlockCondition.swift; sourceTree = ""; }; + CEE1793A7D509E82AD27969A60D05551 /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Implementations/Sink.swift; sourceTree = ""; }; + CFC76C1D884CDA2EA62859F7E97A1955 /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; + D076B6527D42E919243B6C86870D17D6 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = RxSwift/DataStructures/Bag.swift; sourceTree = ""; }; + D07D28143A1FD212852820FE92BC58DA /* CZWeatherKitTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherKitTypes.h; path = CZWeatherKit/CZWeatherKitTypes.h; sourceTree = ""; }; D1621159C8E999A52621578B02915F4A /* Pods-GrandCentralBoard-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GrandCentralBoard-frameworks.sh"; sourceTree = ""; }; - D3277EFC0269B67962F78C06B7931724 /* Decodable.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Decodable.modulemap; sourceTree = ""; }; - D3DFFF2127EE61C83432C2DBF5BC1635 /* MD5.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = MD5.modulemap; sourceTree = ""; }; + D2237E7A5EA4456E06C6564813B43427 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Implementations/Range.swift; sourceTree = ""; }; + D232E2FE323C1CC6F02058F90A2FA195 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; + D2622EDC5F2B2F033C32AF8283680806 /* SlackKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SlackKit.modulemap; sourceTree = ""; }; + D27A009DF98D02462EE0488A4982695A /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Implementations/Map.swift; sourceTree = ""; }; D4479DC7913D076E7ED9FAD25977C366 /* Pods-GrandCentralBoardTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-GrandCentralBoardTests.modulemap"; sourceTree = ""; }; - D4C4C2BA9F8D3B0F472D142EF722BD37 /* Operations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Operations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D799904C9EA3619A5A17D1426432623B /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; - D7AC5885D19EE7737F14ED367EACF88D /* Starscream-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-prefix.pch"; sourceTree = ""; }; - D82DADCD75E732EC961898DFE08626BD /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + D460D4CC9DD7F2DFD3CFEADDDD2DAD93 /* GCBCore.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCBCore.xcconfig; sourceTree = ""; }; + D4D2F0BE87765E06885BCBC6297007AF /* LocalConfigurationLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocalConfigurationLoader.swift; path = GCBCore/Configuration/LocalConfigurationLoader.swift; sourceTree = ""; }; + D578065D7D3956A6A63B8765D9709FC3 /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; + D59AFB00D9678FACE7AD7E0FC1D2C044 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D5C91234BB9AF0409CE87FBAA1758F77 /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/Implementations/TakeLast.swift; sourceTree = ""; }; + D61291F2F3350AA7EEC042A00B653599 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CurrentTestCaseTracker.h; path = Sources/Nimble/Adapters/ObjectiveC/CurrentTestCaseTracker.h; sourceTree = ""; }; + D68CACEA9363EBD82EE187827A086AB1 /* NetworkLoggerPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkLoggerPlugin.swift; path = Source/Plugins/NetworkLoggerPlugin.swift; sourceTree = ""; }; + D6E8DCFB611F2A319D755B358C928B49 /* RawRepresentableDecodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RawRepresentableDecodable.swift; path = Sources/RawRepresentableDecodable.swift; sourceTree = ""; }; + D72E107EE3B3A89D26D4F598A97AD5C5 /* Plugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Plugin.swift; path = Source/Plugin.swift; sourceTree = ""; }; + D8B58171D15B0D8F812EDEC5562C3083 /* CZWorldWeatherOnlineAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWorldWeatherOnlineAPI.m; path = CZWeatherKit/CZWorldWeatherOnlineAPI.m; sourceTree = ""; }; D9FB9ACFB25B2A93FF6BA4FC279D4232 /* GCBUtilities-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCBUtilities-prefix.pch"; sourceTree = ""; }; - DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - DA7904C27B06117F02444D40FA515343 /* ErrorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorType.swift; path = GCBCore/Extensions/ErrorType.swift; sourceTree = ""; }; - DAF51A9CC8DA974C053F05BC85A0154D /* ThreadSafety.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadSafety.swift; path = Sources/Core/Shared/ThreadSafety.swift; sourceTree = ""; }; - DC7D6051817FD398DBE5B64BC489FC32 /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; - DCB3BE55A9F7B00484A23E490F3458E7 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; - DD620D65F4DA271F67654EF3A6692020 /* Decodable.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Decodable.xcconfig; sourceTree = ""; }; - DD9853FD42DEA1216293C5EA837F3006 /* OperationCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationCondition.swift; path = Sources/Core/Shared/OperationCondition.swift; sourceTree = ""; }; - DDF915A24AC928B6CED96ABDFE445362 /* IntExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IntExtension.swift; path = Sources/IntExtension.swift; sourceTree = ""; }; - DE47631E7E66CC87A9868F9F8812A57F /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Implementations/Throttle.swift; sourceTree = ""; }; - DE493C5D29E5887CDB85B7DE9A8F7358 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; - DE99478EB0EB9C59C53A558F94850DC5 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/Implementations/SkipWhile.swift; sourceTree = ""; }; + DB1374601308D3E4E20991CB28427F6B /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = GCBCore/Result.swift; sourceTree = ""; }; + DBFDD052C357E1094865D36ACCEC01F1 /* CZWundergroundAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZWundergroundAPI.m; path = CZWeatherKit/CZWundergroundAPI.m; sourceTree = ""; }; + DC1FFD5B92D5794E6DC871DCC7486C0A /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; + DC9C0695630FFA49EE38E69708C1B41B /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; + DD531A23A85ADEBBB1219C56A5BA1949 /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/Nimble/Adapters/ObjectiveC/DSL.h; sourceTree = ""; }; + DDC78157203E2CD368DD737649105666 /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; + DE173CEC9E72882FF93759F16D4418D9 /* CZWorldWeatherOnlineAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWorldWeatherOnlineAPI.h; path = CZWeatherKit/CZWorldWeatherOnlineAPI.h; sourceTree = ""; }; DF103821431B110AAF0249FFCEE04605 /* WidgetTemplateView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WidgetTemplateView.swift; sourceTree = ""; }; - DF7A7B081E14D4CDA40309F42C5597F4 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; - DF82329F34EBA32E2795BFE4531086BE /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; - DF902E50CFDC72C52AC9C6DA943DAF11 /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; - DFA24992E5E49BECD9EA4EA8717E6A78 /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; - E054316752028477F4E2A0D7499B76E8 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Implementations/Catch.swift; sourceTree = ""; }; - E08EC309EACF58564BECA58803892951 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/Implementations/SkipUntil.swift; sourceTree = ""; }; - E0CEC605BA166E4C729B5178FF3F6C7F /* Job.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Job.swift; path = GCBCore/Job.swift; sourceTree = ""; }; - E139E09ECC387B79C8B3E493E000056A /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; - E1B8CF3BB2B58FD007701E3ED6899EE3 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; - E1D4EF976BBD0DE8FBDA2ACC67ABBB60 /* Operations-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Operations-prefix.pch"; sourceTree = ""; }; - E25343E3B0074B7945ADA2B1186CF11B /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = Sources/Core/Shared/Logging.swift; sourceTree = ""; }; - E26AFBAB2D0235E99AEC25CAC3DB45FC /* OHHTTPStubsResponse+JSON.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OHHTTPStubsResponse+JSON.m"; path = "OHHTTPStubs/Sources/JSON/OHHTTPStubsResponse+JSON.m"; sourceTree = ""; }; - E36525FA547514CFD81168868872742A /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; - E3A7734CEFD56FE51508FEAD980F373B /* EventDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventDispatcher.swift; path = SlackKit/Sources/EventDispatcher.swift; sourceTree = ""; }; - E3BFAB75F8B8758E22D852231FD6CE9D /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Implementations/Sequence.swift; sourceTree = ""; }; + DF43EFB7F4F4789898975A8E41C67DF0 /* CZForecastioAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CZForecastioAPI.m; path = CZWeatherKit/CZForecastioAPI.m; sourceTree = ""; }; + DF90400F3F43ACD3A8E9D522A5F7A3CF /* Support.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Support.swift; path = Sources/Core/Shared/Support.swift; sourceTree = ""; }; + E0CCCC703E0556100006AE20A5CF1C91 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E0FFBA68D91ECD9806CF0BA113557D91 /* OperationCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationCondition.swift; path = Sources/Core/Shared/OperationCondition.swift; sourceTree = ""; }; + E1247131A81E857BAE0143C19D1C0BED /* ConfigurationRefresher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConfigurationRefresher.swift; path = GCBCore/Configuration/ConfigurationRefresher.swift; sourceTree = ""; }; + E1B26F4B3D701AD6EA651E33D8E7F287 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; + E2CBB44A244B03514A2C9E8D6B16BAF6 /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; + E3FE140B00E9999149393998D3615E5D /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/Implementations/SubscribeOn.swift; sourceTree = ""; }; + E40455FC13D39DF345873D8DB7B35C65 /* CZWeatherHourlyCondition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherHourlyCondition.h; path = CZWeatherKit/CZWeatherHourlyCondition.h; sourceTree = ""; }; E44D5C465A18B14D4F4F249BC20667CB /* Pods-GrandCentralBoard-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GrandCentralBoard-resources.sh"; sourceTree = ""; }; - E5C4D585C39F5968F8EB9276D93A4747 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; + E458ECB53A5068AE251F5C0DAB33F439 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Implementations/Do.swift; sourceTree = ""; }; + E4B95C639014BF8E74EF74493AE58E3F /* SlackWebAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlackWebAPI.swift; path = SlackKit/Sources/SlackWebAPI.swift; sourceTree = ""; }; + E4BBBA71B106E2FA5E47EB76CF35BB88 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; + E5563C58E957DC137723F65EA887A119 /* FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.xcconfig; sourceTree = ""; }; + E5B9C6A214BE8884350BEA1D46318A83 /* BlockObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockObserver.swift; path = Sources/Core/Shared/BlockObserver.swift; sourceTree = ""; }; E60564ED6A6E624F8031DD63011C9D8B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E632FB131D66B8E1142DFAA62D204CCE /* Overloads.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Overloads.swift; path = Sources/Overloads.swift; sourceTree = ""; }; - E7474AA7F1B7C0B1E0C42FC5DC0B6B44 /* WebSocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = Source/WebSocket.swift; sourceTree = ""; }; - E77192C2ECF1B42A0E3703A82C494CE5 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/Implementations/SingleAsync.swift; sourceTree = ""; }; - E801171AA37386AF690254664F780B64 /* CloudKitOperationExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudKitOperationExtensions.swift; path = Sources/Features/Shared/CloudKitOperationExtensions.swift; sourceTree = ""; }; + E6683E84B93C3659F7136845681EEDFD /* OHHTTPStubsMethodSwizzling.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubsMethodSwizzling.m; path = OHHTTPStubs/Sources/NSURLSession/OHHTTPStubsMethodSwizzling.m; sourceTree = ""; }; + E6963CEF1A4780F77C987D7C4983DF80 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Implementations/Error.swift; sourceTree = ""; }; + E6CC947C120AE98416F608343B2657B4 /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/Nimble/Adapters/ObjectiveC/DSL.m; sourceTree = ""; }; + E700FCD6B0A674553FA8F9D5C9B72521 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; + E74A19005820F2EEAEA82AA298EE90B6 /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; + E783BF88D79135E279E80E05A931470A /* UIOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIOperation.swift; path = Sources/Core/iOS/UIOperation.swift; sourceTree = ""; }; + E7BED73129EE85F31757AEDB2228BA1B /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + E84B2FB3171DD18BBD065C929CBE4254 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E8D334F1BC8BC15BFD08C185233E425E /* Pods-GrandCentralBoardTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GrandCentralBoardTests.release.xcconfig"; sourceTree = ""; }; - EA4182174CFF0387C1D1308D61F3D220 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; - EA5E029688A097299760EEEE5BADFBDB /* ExclusivityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExclusivityManager.swift; path = Sources/Core/Shared/ExclusivityManager.swift; sourceTree = ""; }; - EAC57DDD3B6A4E6699B4ECF73731060B /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; - EADF08D96A432E81457631FF7DD98665 /* ClientExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ClientExtensions.swift; path = SlackKit/Sources/ClientExtensions.swift; sourceTree = ""; }; - EB68C258F5AAD17B492167054C183F2A /* GCBUtilities.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCBUtilities.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EC57432F624E4DAFC08988E0BC19190C /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = ""; }; - EC70C3C277D352D222AA6A10B874A3B2 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; - ECD8DFBD0B607CFA643F1C114AC9D816 /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Implementations/Merge.swift; sourceTree = ""; }; - ED238925D8D6DCC8A449E8C42039B7E9 /* CloudKitInterface.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CloudKitInterface.swift; path = Sources/Features/Shared/CloudKitInterface.swift; sourceTree = ""; }; - EDBEBF19368AA4D5A79D7533E17F500D /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Implementations/Sink.swift; sourceTree = ""; }; + E8E60DACA0D5472FC3825A1A1C3D2CBC /* Operations.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Operations.modulemap; sourceTree = ""; }; + E94568BF5900B47E66BA019EFDD5A543 /* GatedOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GatedOperation.swift; path = Sources/Core/Shared/GatedOperation.swift; sourceTree = ""; }; + E94EA0F0FA1F8F3B1F411B05736E2E29 /* CZWorldWeatherOnlineRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWorldWeatherOnlineRequest.h; path = CZWeatherKit/CZWorldWeatherOnlineRequest.h; sourceTree = ""; }; + EA16AEF3C7EE6F086EAD02E60717B194 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; + EA22966660CB2DAAF6AFBA0D26B8BDD4 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/Implementations/SingleAsync.swift; sourceTree = ""; }; + EA3938366EE68736562D0E2E13B4D3C8 /* Operations-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Operations-umbrella.h"; sourceTree = ""; }; + EA9FE8512D3D4042B9677A147A46808C /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EBEACD8FDA1AE6C60B7767F3208741DD /* FBSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-umbrella.h"; sourceTree = ""; }; + ECA8D7AB9D851D47525A49D0E7961ADF /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; + ED47F46E1E18031796DEAE93B8342BAA /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Implementations/Empty.swift; sourceTree = ""; }; EDCAE189E8FE9A5B1C835E8B13A8BB8C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - EE1E5C0A10FF65CD71D3F545A39F4637 /* Rendering.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rendering.swift; path = GCBCore/Rendering.swift; sourceTree = ""; }; - EE383CCE12388DDEC9BD49B1A52303CF /* GatedOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GatedOperation.swift; path = Sources/Core/Shared/GatedOperation.swift; sourceTree = ""; }; - EE406D411D86E78089ED2F75AC6109AE /* Observable+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Extensions.swift"; path = "RxSwift/Observable+Extensions.swift"; sourceTree = ""; }; - EE64485C12FF4BA4F7D3794159B18D7D /* SlackKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SlackKit.xcconfig; sourceTree = ""; }; - F00F1D5653212AEF63206B82CD7B0DD8 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - F09B89D360CA5972F43C9A3528F44271 /* WidgetSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WidgetSettings.swift; path = GCBCore/Configuration/WidgetSettings.swift; sourceTree = ""; }; - F1116CFDC279C354DAC3E5E13F6C4630 /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; - F16A809DD2A76B1C100643EE9F107009 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; - F1AB6893C3D1029850A5CB4A38CD354F /* BytesSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BytesSequence.swift; path = Sources/BytesSequence.swift; sourceTree = ""; }; - F24FFC6DA9A683F20A49C2FC8186FCC5 /* Message.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Message.swift; path = SlackKit/Sources/Message.swift; sourceTree = ""; }; - F2B1264CDFB8196810B752BCFF4C016A /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Implementations/Never.swift; sourceTree = ""; }; - F2B67B5C16830EC11E80AF38ACFF31C5 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; - F2BF56C1CF85834E2789A6785AB6097A /* Operations-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Operations-umbrella.h"; sourceTree = ""; }; - F2C1B693C5FBBEC0F7202281D32555B2 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; - F384C60BD88AB186688E700792A282CE /* NSURLRequest+HTTPBodyTesting.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURLRequest+HTTPBodyTesting.m"; path = "OHHTTPStubs/Sources/NSURLSession/NSURLRequest+HTTPBodyTesting.m"; sourceTree = ""; }; - F4D203B546C0857472259FCF23DC704A /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; - F537988229A14A9D6674AC964872F692 /* ConfigurationRefresher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConfigurationRefresher.swift; path = GCBCore/Configuration/ConfigurationRefresher.swift; sourceTree = ""; }; - F58E256DFC2C7E2239EACF7E3AF19FDE /* OHHTTPStubs-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubs-umbrella.h"; sourceTree = ""; }; - F6237C1D8BE2A9D0597C84A2EEE23CC4 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Implementations/Switch.swift; sourceTree = ""; }; - F66D37D3EB8401B1CB857F8B570DBF2A /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; - F6CF0B94F8A0CEE9F2001679A3383A69 /* LoggingObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoggingObserver.swift; path = Sources/Core/Shared/LoggingObserver.swift; sourceTree = ""; }; + EDEE3942509470D586341FC0507E4F08 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; + EE01E88120957751AC432E46A974CBA5 /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; + EEFEF81C4A92B882D19C48EFF13E8275 /* EventDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventDelegate.swift; path = SlackKit/Sources/EventDelegate.swift; sourceTree = ""; }; + EFF2E4571B774496B9378C2539E8D912 /* GCBCore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCBCore-prefix.pch"; sourceTree = ""; }; + F0629525A3DF3096A540E8D6B18A26C3 /* Moya+RxSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Moya+RxSwift.swift"; path = "Source/RxSwift/Moya+RxSwift.swift"; sourceTree = ""; }; + F1011C8071865C86AB9DF7B68CFE5AC6 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F1E5BFAADB84667FA1CAD0E1191564BA /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; + F2017D45A3B851D82D0592A1F7A464C9 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/Implementations/SkipUntil.swift; sourceTree = ""; }; + F24D85E34707F80D83DFC916A9D5FC79 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; + F2BE67D96112EFA1A8E08E43195ADE85 /* SSLSecurity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSLSecurity.swift; path = Source/SSLSecurity.swift; sourceTree = ""; }; + F3CD4569E4087D04C39EEDAC76B405FA /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/Nimble/Adapters/ObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; + F44D2E746B7A9C27F71FF48EA1DAF8A5 /* Moya-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Moya-umbrella.h"; sourceTree = ""; }; + F4C65EE2551A368A4994FDCF162B5D6D /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; + F4CCD5ECFA2F593A40462E36DD1A978A /* URLSessionTaskOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionTaskOperation.swift; path = Sources/Features/Shared/URLSessionTaskOperation.swift; sourceTree = ""; }; + F561C8735352BCF4A4D0E44274DCCB0F /* ShareReplay1WhileConnected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1WhileConnected.swift; path = RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift; sourceTree = ""; }; + F62EE7D6E9A5C9B2B4A149126DD909B3 /* UIAlertController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIAlertController.swift; path = GCBCore/Extensions/UIAlertController.swift; sourceTree = ""; }; + F66EC9FDC10F328014316601575DCBDF /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F6AF0971043E9BD162252E24533BE1EC /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/Implementations/StartWith.swift; sourceTree = ""; }; + F6D7FBEF156F5AE53D0122563D9F3D46 /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Implementations/Take.swift; sourceTree = ""; }; F6ED868FD4EBB716287900A6D688A4CA /* NSDate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NSDate.swift; sourceTree = ""; }; - F78154CA72B7036A0C3AE660A3ACF44A /* ImmediateScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateScheduler.swift; path = RxSwift/Schedulers/ImmediateScheduler.swift; sourceTree = ""; }; - F822E0BA5B9339261A00FEE5D55ED142 /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F8244EDB1D4B13650D89E340FDFA70C2 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; - FBC77F96AB921B154BC0A1A1C71BCD98 /* FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.xcconfig; sourceTree = ""; }; - FCA8A190868AFFB54602320DF22F7A97 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; - FCAC91C4E8944BD3B77CD755BDE93010 /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FD64E272659AB5E1C47D5D291AABBD1B /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Implementations/Do.swift; sourceTree = ""; }; - FE3DEF5E733AC410BF3CA0A1FCBF110F /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; - FE5B571E13FA6E35830D1798F8F3F4DA /* Decodable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Decodable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FF0B79F33BCA34C15C472F07C2367C7E /* GrandCentralBoardController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GrandCentralBoardController.swift; path = GCBCore/GrandCentralBoardController.swift; sourceTree = ""; }; - FF0D6FCA301209F5361A64B13CAA1C9E /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; - FF2F7CBADE93427AA24638911829C80B /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/Nimble/Adapters/ObjectiveC/DSL.m; sourceTree = ""; }; + F710A36F93F69A295C9987338494EB6C /* Capability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Capability.swift; path = Sources/Features/Shared/Capability.swift; sourceTree = ""; }; + F7244B91C311E5CBE6125C6C9778A0E9 /* Moya+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Moya+Alamofire.swift"; path = "Source/Moya+Alamofire.swift"; sourceTree = ""; }; + F7939EA80D80C2CDFFF424667A2FE5B6 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; + F7BD0FC2EAA01D10FEC0767B539977DB /* OperationObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationObserver.swift; path = Sources/Core/Shared/OperationObserver.swift; sourceTree = ""; }; + F94833733165341FD539521EC8DE6118 /* Bot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bot.swift; path = SlackKit/Sources/Bot.swift; sourceTree = ""; }; + F94C4FDDE82E00C9F0439516DB9579CD /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = Sources/Utils.swift; sourceTree = ""; }; + FA7827CF2CAAF5FC74BA7BBAD8F36711 /* CZWeatherForecastCondition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CZWeatherForecastCondition.h; path = CZWeatherKit/CZWeatherForecastCondition.h; sourceTree = ""; }; + FAF87E50E33F63F5B76204E33EFCA86C /* NoFailedDependenciesCondition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NoFailedDependenciesCondition.swift; path = Sources/Core/Shared/NoFailedDependenciesCondition.swift; sourceTree = ""; }; + FB6AEC794FE241DBB014629652C69627 /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; + FB91F0F9C24D455EB272EDD8B372149C /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Implementations/Using.swift; sourceTree = ""; }; + FBA212657A52A7AEB13356CD4FE25989 /* PINDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PINDiskCache.m; path = PINCache/PINDiskCache.m; sourceTree = ""; }; + FCD221348770C2177A95D3594D2B1AAA /* Attachment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Attachment.swift; path = SlackKit/Sources/Attachment.swift; sourceTree = ""; }; + FCFCB8D83FE163A9D6D29E116DC65D2D /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; + FD31882A2DA504F8028009B8A5D972D4 /* Decodable.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Decodable.xcconfig; sourceTree = ""; }; + FF5EDFF053106D2FA8019F2AAB5702C7 /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; FF9BE29B3B2838243DC2C535ED583ADE /* NSBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NSBundle.swift; sourceTree = ""; }; - FFEC79442BEC41FEE0350735CBD50560 /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Implementations/Window.swift; sourceTree = ""; }; + FFF7CFECD2DB2F7DC9D193AE36D6A2D5 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1123,6 +1280,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 12CEE24499F34EF6FCAE5CC758BC6E20 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AAA41774534387A4F753365D90FDA225 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1BAC094EAB9F57C011395737E6D8F43C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1131,6 +1296,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 2603A4C972E4F74BF1E72C62073E81DF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 901393E3095FDAC404F023ED4B3A02DC /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 2729395F7368E0B745A0E2264A1BFF79 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1147,43 +1320,43 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3C41B498F300DC84CED0BB04FAB43D1B /* Frameworks */ = { + 499896331EBFE0C3D1318622D8F73CF6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7C9C6A5BC9B4E0DDDF7D685E33B6CDF6 /* Foundation.framework in Frameworks */, - 13008DDE535CDDEC86E88D51221BCB00 /* Starscream.framework in Frameworks */, + F961AE12899B75585223EC4AE413CD03 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 499896331EBFE0C3D1318622D8F73CF6 /* Frameworks */ = { + 814CED54143F7D650E1E243061F9400E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F961AE12899B75585223EC4AE413CD03 /* Foundation.framework in Frameworks */, + E1C18DF2C71939C1118B5C895A0EEB2E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 606D98C4DB15D13177E55117A92FFBE2 /* Frameworks */ = { + 923778B4BA09BC9EEC8A467B65B5A722 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E3A61641F1031307A3267C62BF28B62F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 814CED54143F7D650E1E243061F9400E /* Frameworks */ = { + A818114274DECFB9B744144080BA4850 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E1C18DF2C71939C1118B5C895A0EEB2E /* Foundation.framework in Frameworks */, + 175AA88367C7CCBD4B4F4EE15A4CB8CE /* Foundation.framework in Frameworks */, + 7E70DED14EE16C50080C10B5AF99DA64 /* PINCache.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 923778B4BA09BC9EEC8A467B65B5A722 /* Frameworks */ = { + A83C8B43085288EC1793F83B2853B471 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7990A139A04CFA4AD2737ABD6CADA72F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1198,6 +1371,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + B11D44533C846811EBD04B6261AC8980 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 699EB21919A6552704CC326E56C96B95 /* Foundation.framework in Frameworks */, + 38EA5177CA3EF67CADE2C24B79DEB015 /* Starscream.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; B1729F851F648EC60EE93CDB3C8BAEAD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1226,14 +1408,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C57DCC79BA2F080CDBC0F17B10232670 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BD55D1A0A442815F20D1EA08593B28C9 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; E207016083A887126F6F5002E37F951C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1278,14 +1452,62 @@ path = ..; sourceTree = ""; }; - 096ABF1DA17292B862426341E461360C /* FBSnapshotTestCase */ = { + 035C9429874F10B909888784ED509576 /* Standard */ = { isa = PBXGroup; children = ( - F8F3CEF6553CCE12A0F8A29DB18D5E0F /* Core */, - 9F74E76E8078243D13B3D248E79FC56F /* Support Files */, - FF9B8AD918D6DC76AE51D3EDDD3DE3D9 /* SwiftSupport */, + CD048D723C388D093040537FC421C18B /* AlertOperation.swift */, + 63AFCFD3626BD1677D8DD0EC875B2AA5 /* BackgroundObserver.swift */, + CE6EFDC4BA6B75C67298019621CDF4DB /* BlockCondition.swift */, + E5B9C6A214BE8884350BEA1D46318A83 /* BlockObserver.swift */, + 723A8B7D10F5B632A256CF78EBB62259 /* BlockOperation.swift */, + F710A36F93F69A295C9987338494EB6C /* Capability.swift */, + 4EDFFEE423F6ADE96D1D1C779B2700FF /* CloudCapability.swift */, + 7C9C83007783BC69E2F7028A6F9EB65E /* CloudKitInterface.swift */, + 8EC90D4BC833FE734544F30207A46B4A /* CloudKitOperation.swift */, + 9D19D6D66DE8326F7116CD43C5EFFC8A /* CloudKitOperationExtensions.swift */, + 78000935E761EE1F5C1AE353F1D57A81 /* ComposedOperation.swift */, + 138902410265822F46424F09E7E896CB /* DelayOperation.swift */, + 33E689D9DC0A1F6243ACB3B4F923C4CD /* ExclusivityManager.swift */, + 9097C4AB8FF2F04D751E6D773EA025A0 /* FunctionalOperations.swift */, + E94568BF5900B47E66BA019EFDD5A543 /* GatedOperation.swift */, + 67BF28D7B8BAF9DBEE1274BD3AE6271B /* Generators.swift */, + C403F709DDBF0A31F530821480E7B5EB /* GroupOperation.swift */, + A688C7F6111B05F13630500C10E8FC51 /* Logging.swift */, + AD0C464CF4A288281B24536F8D9C07DA /* LoggingObserver.swift */, + 08DEBE05B9F6B3D00DFA6C9856612880 /* MutuallyExclusive.swift */, + C45CB54AB6F93AF4F6AA1A557E77271C /* NegatedCondition.swift */, + B806A64A4CDF085707D6128AE8B72575 /* NetworkObserver.swift */, + FAF87E50E33F63F5B76204E33EFCA86C /* NoFailedDependenciesCondition.swift */, + 259D36F30D4703E0D9515BE06D4CA355 /* Operation.swift */, + E0FFBA68D91ECD9806CF0BA113557D91 /* OperationCondition.swift */, + F7BD0FC2EAA01D10FEC0767B539977DB /* OperationObserver.swift */, + 166EAB01A582CDDCBB0C443303E6D740 /* OperationQueue.swift */, + AE8816C602F53112572342B980D49DC4 /* Profiler.swift */, + 37A18EB9CFE4E30502776AACF75923C5 /* Reachability.swift */, + 7FA65057AC514DF4AE3905D404FE9F67 /* ReachabilityCondition.swift */, + BB217022BC2F5CAFDF6E1E08FC6A42E4 /* ReachableOperation.swift */, + 98E4E8625F5595C092B27DC33B7FABD2 /* Repeatable.swift */, + C3194E9AB650E3D76844CBC23A19F8FE /* RepeatedOperation.swift */, + CE52E76729FD012A7688AF3992171DE6 /* ResultInjection.swift */, + 16D8B393D19E25A2D2B8DB3FEC9628FE /* RetryOperation.swift */, + 8C67D41E0CE4596A003BAAD956B7CF30 /* SlientCondition.swift */, + DF90400F3F43ACD3A8E9D522A5F7A3CF /* Support.swift */, + 80176A889AD146D89EF9FB4D9BFB34E6 /* ThreadSafety.swift */, + 8EFE7DBDFDDA120555EFC6B59DDC2EB4 /* TimeoutObserver.swift */, + E783BF88D79135E279E80E05A931470A /* UIOperation.swift */, + F4CCD5ECFA2F593A40462E36DD1A978A /* URLSessionTaskOperation.swift */, + 8E863ADB2B44F16237A045AC4840E27A /* UserConfirmationCondition.swift */, ); - path = FBSnapshotTestCase; + name = Standard; + sourceTree = ""; + }; + 04C14F44E61CB35270535F46DB3AA965 /* JSON */ = { + isa = PBXGroup; + children = ( + 59131A290544F112A0FD7995748207E7 /* OHHTTPStubsResponse+JSON.h */, + 6F84B4668BBEF69A646FCA50CF453288 /* OHHTTPStubsResponse+JSON.m */, + ); + name = JSON; sourceTree = ""; }; 0D99D817930F836DE830E8B5D0E72959 /* Extensions */ = { @@ -1316,35 +1538,18 @@ path = "Target Support Files/Pods-GrandCentralBoard"; sourceTree = ""; }; - 15DC3893A14BEBE272B5AC38D1215B46 /* Support Files */ = { + 190F60023A650C26616DCD87D8B646CF /* Support Files */ = { isa = PBXGroup; children = ( - 18C63002A529FF403FD72E960142ACCA /* Info.plist */, - 6DEC4254B3E88D7C30F2F9E376646A9F /* RxSwift.modulemap */, - 9EE1D87B1699AA665E41385FC8D3A6B8 /* RxSwift.xcconfig */, - 3F5535223CB91EC32EA973602DEE2B7C /* RxSwift-dummy.m */, - DF82329F34EBA32E2795BFE4531086BE /* RxSwift-prefix.pch */, - E36525FA547514CFD81168868872742A /* RxSwift-umbrella.h */, + 2E7116CF3C41811A406E3F37B5D34B15 /* Info.plist */, + 02E853C387CC29E2D33F5762A193C03F /* MD5.modulemap */, + BDF7F3B27AAD16A0163CBB0F62C41977 /* MD5.xcconfig */, + 1F438AE000B7D9FEDDC6371B566A3A21 /* MD5-dummy.m */, + 0ABC7F984CCCEB2DE3DA5277BC273E16 /* MD5-prefix.pch */, + A21E1CE87731B382D49E07980BC58A22 /* MD5-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/RxSwift"; - sourceTree = ""; - }; - 173A19475D179B35DB24158CC42B3185 /* Decodable */ = { - isa = PBXGroup; - children = ( - 5A9BA23FC2B0642B25EACDBBC0B8054F /* Castable.swift */, - 8F3B2DF761343D1229BD101FE5D4281A /* Decodable.h */, - BE4CA0C211C720D4B5ED50C208C5E6CD /* Decodable.swift */, - 5C1C4A20C6491C1710A9CD4CEDE11BBF /* DecodingError.swift */, - A4A67AB5218C594446FA1C9314129EA3 /* NSValueCastable.swift */, - 290F221233475BA26A7F415013648C18 /* Operators.swift */, - E632FB131D66B8E1142DFAA62D204CCE /* Overloads.swift */, - AF1B25F55A3E41E099ED233421589E72 /* Parse.swift */, - 8B4BBA3BBF6D2AB43B99E35F796A3DC5 /* RawRepresentableDecodable.swift */, - B1FB268F869850F8F056891714225209 /* Support Files */, - ); - path = Decodable; + path = "../Target Support Files/MD5"; sourceTree = ""; }; 1A26B34F58AC4E23111DC5F4D85A4040 /* GCBUtilities */ = { @@ -1357,11 +1562,11 @@ path = GCBUtilities; sourceTree = ""; }; - 1B4A8CF664336669458FD1067DEA2FBC /* Operations */ = { + 1F9C0B45AA863320CD2A4CA11D536897 /* Operations */ = { isa = PBXGroup; children = ( - AE295DD133FD59C2BDB69F1C768F4029 /* Standard */, - 3699B341FF90D92EF7E721EA79B89797 /* Support Files */, + 035C9429874F10B909888784ED509576 /* Standard */, + F462566D3E363D98A13A12EB010059EC /* Support Files */, ); path = Operations; sourceTree = ""; @@ -1374,27 +1579,122 @@ name = "Development Pods"; sourceTree = ""; }; - 3699B341FF90D92EF7E721EA79B89797 /* Support Files */ = { + 22C98F989D88B3732D6F93C86E14C148 /* Core */ = { + isa = PBXGroup; + children = ( + 02CDFD5826A8A8BA335CA7D7157DE2CB /* CredentialsPlugin.swift */, + 5804B85C707593866DCB0F9FC10DAF8E /* Endpoint.swift */, + E700FCD6B0A674553FA8F9D5C9B72521 /* Error.swift */, + 9B43CC1D87B550DBA08E6B0FB64612AA /* Image.swift */, + 56838821C598FB290B91276D2C3F48AD /* Moya.swift */, + F7244B91C311E5CBE6125C6C9778A0E9 /* Moya+Alamofire.swift */, + 337ACCF8635B3B8BC0B7008E65A46D98 /* NetworkActivityPlugin.swift */, + D68CACEA9363EBD82EE187827A086AB1 /* NetworkLoggerPlugin.swift */, + D72E107EE3B3A89D26D4F598A97AD5C5 /* Plugin.swift */, + 169AAA15155EB703C67AE31C394DFDB1 /* Response.swift */, + ); + name = Core; + sourceTree = ""; + }; + 22E212532BF631958332D714E3EDF049 /* OHHTTPStubs */ = { + isa = PBXGroup; + children = ( + 424A755CFC4592339DE0D1ED962C300B /* Core */, + 04C14F44E61CB35270535F46DB3AA965 /* JSON */, + 895FA38ED88B178C8310B01979DB6F58 /* NSURLSession */, + AECD2EFC35EC342658E9D2BB08A927DB /* OHPathHelpers */, + 89C9FA99D139D15778D301A8E5130117 /* Support Files */, + 775874185F53DB66AEDA6DA2456A7517 /* Swift */, + ); + path = OHHTTPStubs; + sourceTree = ""; + }; + 2973DD792C75B8BB7D05841CCC1EC43A /* Support Files */ = { isa = PBXGroup; children = ( - 0021C5E8CDD9A71B2DF463D24A440364 /* Info.plist */, - C863AA0BF82F84F7635F14812FF0030B /* Operations.modulemap */, - 9464AC690BB9D130A23394697C810E5B /* Operations.xcconfig */, - 49A4620B1C93BE5AB187FA83837E465A /* Operations-dummy.m */, - E1D4EF976BBD0DE8FBDA2ACC67ABBB60 /* Operations-prefix.pch */, - F2BF56C1CF85834E2789A6785AB6097A /* Operations-umbrella.h */, + 0AC6CC20B8D7DEA411E9569CECC737B4 /* GCBCore.modulemap */, + D460D4CC9DD7F2DFD3CFEADDDD2DAD93 /* GCBCore.xcconfig */, + 3B3084B40C2B17FDE6EAF5FD551F346C /* GCBCore-dummy.m */, + EFF2E4571B774496B9378C2539E8D912 /* GCBCore-prefix.pch */, + 980A076319EB87EC8EA4248C389173CC /* GCBCore-umbrella.h */, + C61F10AB2EC6A441B81F1666E7417A92 /* Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/Operations"; + path = "../Target Support Files/GCBCore"; sourceTree = ""; }; - 395DCF14800491F1E9C9F0E2D83E5133 /* RxSwift */ = { + 2A32463C89210CA3AB9C99477D328B9A /* GCBCore */ = { isa = PBXGroup; children = ( - BCE15323B4599B324D2A2FFB6D55EF86 /* Moya+RxSwift.swift */, - 7D88D19D4888FBBFFA587AE972F95143 /* Observable+Moya.swift */, + A9C9D3800DBC925BB1FC5356FFF28F5F /* AutoStack.swift */, + B23E534A88041EC06C5735DC80BE4E31 /* Configuration.swift */, + 21CBA93E427433F90EFA22F44789CF99 /* ConfigurationDownloader.swift */, + E1247131A81E857BAE0143C19D1C0BED /* ConfigurationRefresher.swift */, + 0EB1808C4ADF69A1AB7DEC82AB023CEF /* DataDownloader.swift */, + 26338D945FE88171237E30C2712706B4 /* ErrorType.swift */, + 623874CAB69E0A7C00EAF0BACF43E4B2 /* GrandCentralBoardController.swift */, + 503CD2C4FE62A99886E8ED1AC45E70A8 /* Job.swift */, + D4D2F0BE87765E06885BCBC6297007AF /* LocalConfigurationLoader.swift */, + 7E1E219B480576DB45D0F766DED52AFD /* Rendering.swift */, + DB1374601308D3E4E20991CB28427F6B /* Result.swift */, + B811E93430B9D7B81778B697B04CC13E /* Scheduler.swift */, + 08EC4716D980E1721CF9062EBED8FE1A /* Source.swift */, + 896165D3F5DAF20F7BBB406BB1D435A9 /* Timed.swift */, + F62EE7D6E9A5C9B2B4A149126DD909B3 /* UIAlertController.swift */, + 3447D3C0B2FC20BFE32FC7BC419AA1E7 /* UILabel.swift */, + B402E0F4B33CFFD2B7F87A4A454C6007 /* UIView.swift */, + 70A62AE472A59312A80CA5B879737843 /* UIViewController.swift */, + 5C1D380AEDFFBC1928CDBAB3900CF222 /* Widget.swift */, + 08DBFB01C6E5249146D23036ABB3E8BE /* WidgetSettings.swift */, + 2973DD792C75B8BB7D05841CCC1EC43A /* Support Files */, ); - name = RxSwift; + path = GCBCore; + sourceTree = ""; + }; + 3293A966A1CE3EB2E4A74F9C27056EA2 /* FBSnapshotTestCase */ = { + isa = PBXGroup; + children = ( + 54FC00A746772915CDD8A5281A88BEF7 /* Core */, + BCE9A00A038C8DD9AEC23DAF820EE951 /* Support Files */, + 482FB066032637EE077098C18EF498AE /* SwiftSupport */, + ); + path = FBSnapshotTestCase; + sourceTree = ""; + }; + 3DAAC4A1B2AC560FC2241F2092D9D2E2 /* Starscream */ = { + isa = PBXGroup; + children = ( + F2BE67D96112EFA1A8E08E43195ADE85 /* SSLSecurity.swift */, + B65C061A82B2F970A58ACC7723754AE5 /* WebSocket.swift */, + 459B287101973F552B78EFABDF95326D /* Support Files */, + ); + path = Starscream; + sourceTree = ""; + }; + 3F43C82664CAF19D56FA41FE91DE64E4 /* SlackKit */ = { + isa = PBXGroup; + children = ( + FCD221348770C2177A95D3594D2B1AAA /* Attachment.swift */, + F94833733165341FD539521EC8DE6118 /* Bot.swift */, + 4F61CF31662E450F84409407E62608D2 /* Channel.swift */, + 5A45C85D0CE889D5ABF74484C431C8A1 /* Client.swift */, + B713E0FD0F9BCF814D40E7127BD94B7E /* ClientExtensions.swift */, + 72AEA30C63E64B9CA2C83D344B6D0938 /* Event.swift */, + EEFEF81C4A92B882D19C48EFF13E8275 /* EventDelegate.swift */, + CD9975B1831AFFBE5993BD4114308536 /* EventDispatcher.swift */, + BDC4B5872E67A1F3C51C0299F724C7AD /* EventHandler.swift */, + 3C886B5F4C567686AB159E11F99F4ECB /* File.swift */, + 996C3EE1D040401F06A4AB6D630C3DFD /* Message.swift */, + AEC0B75B747B34575671D901D3574EAB /* NetworkInterface.swift */, + E4B95C639014BF8E74EF74493AE58E3F /* SlackWebAPI.swift */, + 12653217F63D028DFDC39549ED7D08AE /* SlackWebAPIErrorDispatcher.swift */, + C8A570695E40CD3933C7717ADD4457E0 /* Team.swift */, + 4BF5E83CAC9D2CE959352BFC9379ABC3 /* Types.swift */, + BB20501F1485542B64064338710A4F03 /* User.swift */, + 9504DFF63EE799DEF8E4045DC7A4AD61 /* UserGroup.swift */, + BA9F4BEC8C60A8ACD709F2B0E68C1F4F /* Support Files */, + ); + path = SlackKit; sourceTree = ""; }; 4249D076238D20E9321EE9B3811F5FD9 /* Views */ = { @@ -1405,47 +1705,230 @@ path = Views; sourceTree = ""; }; - 478E31D30D29A2546D8318A5F6231CFE /* Swift */ = { + 424A755CFC4592339DE0D1ED962C300B /* Core */ = { isa = PBXGroup; children = ( - 750BAEB00D36519A68DE054FFFD241E6 /* OHHTTPStubsSwift.swift */, + 0AA1DE78C7ED6232E613D259C6E93A24 /* Compatibility.h */, + B1FC22A4FEF7C861697F7EF24FFA2083 /* OHHTTPStubs.h */, + 5B5DBA8F7FE666B159F819089EDA47A5 /* OHHTTPStubs.m */, + 85B231960C0F83971BA3C2ACAB282958 /* OHHTTPStubsResponse.h */, + 6F6F55EE094345E1EA28C18211C37BA5 /* OHHTTPStubsResponse.m */, ); - name = Swift; + name = Core; sourceTree = ""; }; - 53001F8FA7E5D30C799AED3C056D73F3 /* Pods */ = { + 459B287101973F552B78EFABDF95326D /* Support Files */ = { isa = PBXGroup; children = ( - B65F45FB66EB2A8953E6F7453A79D9CD /* Alamofire */, - 173A19475D179B35DB24158CC42B3185 /* Decodable */, - 096ABF1DA17292B862426341E461360C /* FBSnapshotTestCase */, - C6AF753C849286C45A3E791956AD9877 /* GCBCore */, - B5ED91ABB482ED863E227F2BEC3AC3CF /* MD5 */, - 77F7E591961A40BB532A9C72E21021C0 /* Moya */, - E431895C5FCE56E803D2DE695C3BF316 /* Nimble */, - BDF885F56E5CE21F77576161C851616D /* OHHTTPStubs */, - 1B4A8CF664336669458FD1067DEA2FBC /* Operations */, - 947F6DE8E9D2269C43C7CAB01E267ADC /* Result */, - D5967D664CEC9D4592C3611BDAEAD36B /* RxSwift */, - AC18DC861D7A3D0F2369540BAA16AEEA /* SlackKit */, - 95AA3B296A73DF9622A35FE7D2142773 /* Starscream */, + E0CCCC703E0556100006AE20A5CF1C91 /* Info.plist */, + 6F1D9B2CF6D3EB2BCBB2C6E9E1946469 /* Starscream.modulemap */, + A58F7B07C31410BDED0C4B5D8F368354 /* Starscream.xcconfig */, + 939A94598AD85FBCD65736B999562131 /* Starscream-dummy.m */, + 6D2AF56EF9F1A169AF85D5841CB934EB /* Starscream-prefix.pch */, + AC274016FAF7DEB7995DA607B2DCDE1A /* Starscream-umbrella.h */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/Starscream"; sourceTree = ""; }; - 5342EA35FC1767967B7AD01400AAC750 /* Core */ = { + 46DAA05AC457FB486F8CBF81300759EF /* Products */ = { isa = PBXGroup; children = ( - 88C05540C600AA1971C15A2296297733 /* CredentialsPlugin.swift */, - 397DFB0A60859D6FF57502AF819CDC10 /* Endpoint.swift */, - AC1CD92EC7F6FE038F482FD5A76521BE /* Error.swift */, - 02028919FFCD8B080F5ACCBA1E53BB06 /* Image.swift */, - 7C07EB3224EA24699B98A96267124C88 /* Moya.swift */, - 5C53F88134B1763B9D5B017926E2A266 /* Moya+Alamofire.swift */, - BD46E1CE16C17EBA81CBAB9018905C98 /* NetworkActivityPlugin.swift */, - 0CF242386D5E5DC0C03ED23C8597B2AD /* NetworkLoggerPlugin.swift */, - 8C2E1CAE64061289717D5CF65C888F40 /* Plugin.swift */, - E1B8CF3BB2B58FD007701E3ED6899EE3 /* Response.swift */, + 9CD2C7C0CF7D6C73A49DB4F009D02CAB /* Alamofire.framework */, + 454746958637E6F6CDB8BE29767120E2 /* CZWeatherKit.framework */, + BE0DBA3C3EA8D5D046FC843742B21067 /* Decodable.framework */, + 871B3F1A8E23448CBC8FC2BEC3B48F2C /* FBSnapshotTestCase.framework */, + A4B77F8A3824C1281EB8AC7257CCAA26 /* GCBCore.framework */, + 36ED0255D8D91A9B630BAD0F600C7402 /* GCBUtilities.bundle */, + B3A249D63E560DB4C6E1D169185FB815 /* GCBUtilities.framework */, + 56C28A1442CD872F8853F7458CC7265B /* MD5.framework */, + EA9FE8512D3D4042B9677A147A46808C /* Moya.framework */, + 517DD957A2AD0B3931B32025E094F61A /* Nimble.framework */, + F1011C8071865C86AB9DF7B68CFE5AC6 /* OHHTTPStubs.framework */, + 3528E822582F7330CE6CC4DB58E7A97A /* Operations.framework */, + 7364E548EB7CF488B2E24FBDDBBE8451 /* PINCache.framework */, + A39C0A6267E4E32CA93DFADAA0D7F1C0 /* Pods_GrandCentralBoard.framework */, + C463632345D526E24B0B68636C13B397 /* Pods_GrandCentralBoardTests.framework */, + 5890C7E12E9F9FD6D7A97B00E9FFC50B /* Result.framework */, + 80CCF5E0F068882E97186C4A79621628 /* RxSwift.framework */, + 382BEC7A71126A1C030A5C0948E1C1BD /* SlackKit.framework */, + F66EC9FDC10F328014316601575DCBDF /* Starscream.framework */, + ); + name = Products; + sourceTree = ""; + }; + 482FB066032637EE077098C18EF498AE /* SwiftSupport */ = { + isa = PBXGroup; + children = ( + A5AB5B3A20465860C55AEC48196B2FB2 /* SwiftSupport.swift */, + ); + name = SwiftSupport; + sourceTree = ""; + }; + 54B691DE283BC14FA82FCF57E04A077B /* RxSwift */ = { + isa = PBXGroup; + children = ( + 903578142A78F8BFC402CC990EC3617A /* AddRef.swift */, + 1DF68FE219A517DC6973889F4FC3908E /* Amb.swift */, + ADD18FDCA13C4259452343BF874E90F8 /* AnonymousDisposable.swift */, + 1575E2D351DDE2BE8777DD3275D1FF58 /* AnonymousInvocable.swift */, + CD31B3DBBC4AA8D74C575AB7142E5D53 /* AnonymousObservable.swift */, + 61C6FD8F6184735DFF2D1D85824AC412 /* AnonymousObserver.swift */, + 21EC9C4F2E15DAA22D8B9272899A7961 /* AnyObserver.swift */, + 6FF797697B45F5626B1046FB2A7ADA79 /* AsyncLock.swift */, + D076B6527D42E919243B6C86870D17D6 /* Bag.swift */, + B89940DC10F8642BE09481E5110A9544 /* BehaviorSubject.swift */, + 49AEDCE732764A7CD41C203205355016 /* BinaryDisposable.swift */, + 9B89A9BAB951F05BD540C7621426DDAF /* BooleanDisposable.swift */, + 54EF80B8F107DDC5954A5CB68909FE40 /* Buffer.swift */, + 087046354F6322F16FE4FA2F1E912DE4 /* Cancelable.swift */, + A01BD6D8133F42BD3ED4BC68C1BBABD8 /* Catch.swift */, + 33E90278E6F4D1AE30EFF5E344865430 /* CombineLatest.swift */, + 648147622FFDA83846EB8D1927CEE2E5 /* CombineLatest+arity.swift */, + 003CBBCD9AEEC1121C4613EE532E6BFE /* CombineLatest+CollectionType.swift */, + 2DF89F2C182D6E329A20375DDA321C77 /* CompositeDisposable.swift */, + 005C8CE367C99397292F027392582860 /* Concat.swift */, + 7A29F449111F9929D52AD12B321D300E /* ConcurrentDispatchQueueScheduler.swift */, + A256DAD3A2A14F983C65AB3737654684 /* ConcurrentMainScheduler.swift */, + 03AA2335BC64823C6C9B665A5D517A23 /* ConnectableObservable.swift */, + 6EA64F3F98EDB14D69E784A388BA8A53 /* ConnectableObservableType.swift */, + CDB9F49D0E3366F8B631D16A4A7A020C /* CurrentThreadScheduler.swift */, + 5FEBD48441D921DEA889A5AB5AE4160F /* Debug.swift */, + 352C749B5889EAFDE9ECA29DB723C156 /* Deferred.swift */, + 0C12091C0DE031607BA77C2A1847C25D /* DelaySubscription.swift */, + 8688A4A51E3AA602B1C801FB5A55F4C3 /* DispatchQueueSchedulerQOS.swift */, + 6ECC06B17B33B7251DA0746997FF63CE /* Disposable.swift */, + 7937ACC5C7FD066763DE54184374558C /* DisposeBag.swift */, + E4BBBA71B106E2FA5E47EB76CF35BB88 /* DisposeBase.swift */, + AE76885BB68F1DDB7492AA259B36AABE /* DistinctUntilChanged.swift */, + E458ECB53A5068AE251F5C0DAB33F439 /* Do.swift */, + C2353CE125C65E342D4E23AF4F71ACAD /* ElementAt.swift */, + ED47F46E1E18031796DEAE93B8342BAA /* Empty.swift */, + E6963CEF1A4780F77C987D7C4983DF80 /* Error.swift */, + 385290186EC8EBF16D223697EDD977AD /* Errors.swift */, + 745AB54F92DD37167927DB6762BC3C9B /* Event.swift */, + 08DE1F1FD078AF8751A64C7F854E0E83 /* Filter.swift */, + 28A1E503DDAB03523C735B123228DEDD /* Generate.swift */, + EDEE3942509470D586341FC0507E4F08 /* HistoricalScheduler.swift */, + 53738CD22465DA05B1142479A9A42455 /* HistoricalSchedulerTimeConverter.swift */, + B570D63C3187E60805E032FCF3024A0E /* ImmediateScheduler.swift */, + 91D9F6C9A4529E97228E30808A5489DC /* ImmediateSchedulerType.swift */, + 254DB530F74E96DF4D248EBC441C77E6 /* InfiniteSequence.swift */, + 3B065F887EE3BB082D7A62C7DCE8F688 /* InvocableScheduledItem.swift */, + FCFCB8D83FE163A9D6D29E116DC65D2D /* InvocableType.swift */, + 6B2B7A2387BEC8E8932B93145FCBB4B2 /* Just.swift */, + 37DA981083BB21C0A25F43DA362EFDD7 /* Lock.swift */, + 4EADD9C8A63F08C6AE7F3050F674074A /* LockOwnerType.swift */, + 62DA3FE71CE9BCD380E5EDE80C3F3193 /* MainScheduler.swift */, + D27A009DF98D02462EE0488A4982695A /* Map.swift */, + 262D2897D26F2DC9F978E332F43FA176 /* Merge.swift */, + 47F366107629F3CA413E9CA8FD0F6ECB /* Multicast.swift */, + 8A3E31CA93138718487DAD5D57625BEE /* NAryDisposable.swift */, + 416AB18847085E478F0005A36AA2EADE /* Never.swift */, + DC1FFD5B92D5794E6DC871DCC7486C0A /* NopDisposable.swift */, + 4F8FEECF9B9E2AFA84CF85FA84139731 /* Observable.swift */, + 6631C8F602D85EE46AE5C19A3B386FF6 /* Observable+Aggregate.swift */, + 4DAF20830F81C8C08D32DA74ABC10CCA /* Observable+Binding.swift */, + 84E4C0E0DCAA45E89F26BF05F4FAB120 /* Observable+Concurrency.swift */, + 6C2F9432076561167003EBF55DB2C84E /* Observable+Creation.swift */, + 924C52A68436C0367F46E1704CBB6280 /* Observable+Debug.swift */, + C15D21AAD2F044AEE4AE5DE8CD5E38F7 /* Observable+Extensions.swift */, + 7C091C305291244D4DC0B7D957A34822 /* Observable+Multiple.swift */, + 317212F1121A961F93384B76ABF68E48 /* Observable+Single.swift */, + CAEECE654E4CD8B27C932738B3D6A4B8 /* Observable+StandardSequenceOperators.swift */, + AC7D22A1BC7CCFA43356B7C8F7D35E74 /* Observable+Time.swift */, + C1B2344DBFCA72493243FB3F673748B3 /* ObservableConvertibleType.swift */, + C4DBB0EE4F6ED8632F1B73BCDE2B318E /* ObservableType.swift */, + 8CE807D6448B1823E7833D7AD1C0F865 /* ObserveOn.swift */, + BAF86C6B35E1BD1A85AE0AC7A34A556B /* ObserveOnSerialDispatchQueue.swift */, + 4F217B1700BB931C158333F1A765A2FC /* ObserverBase.swift */, + 062D646C807B481663064E1C075CEF3D /* ObserverType.swift */, + 619EB4F447A653D72F7821015BCE760B /* OperationQueueScheduler.swift */, + 1E03AFAD740BD6F255FC346161B0D4C3 /* Platform.Darwin.swift */, + 9A9EE1A68093540F9E930AD4C02B93B9 /* Platform.Linux.swift */, + B829D1D86E7011C1D81A50F3CC367607 /* PriorityQueue.swift */, + 51DB27EB3D0B1064FCE7A1FF54AAF1AE /* Producer.swift */, + 7BD58018F55E6C7AA133CBDFCF9D9836 /* PublishSubject.swift */, + B8DCDD3F73C4FCF412DFAD051987646F /* Queue.swift */, + D2237E7A5EA4456E06C6564813B43427 /* Range.swift */, + 98A7440322B146841314F4DAE90A5F12 /* RecursiveScheduler.swift */, + 051DE4F9CB980596711F318FF71BC7A4 /* Reduce.swift */, + 4D9DCFB210ED0F236A0D3AE54CEDF08F /* RefCount.swift */, + 5890B8BC8EF4311EC0BB249D9A50D1BF /* RefCountDisposable.swift */, + 39372F4E10E829D80311BE706E66E05F /* Repeat.swift */, + 8021C34885D23553F78929C63F763177 /* ReplaySubject.swift */, + A2C1CA5467EBA83684D77A2771DA57F4 /* RetryWhen.swift */, + 9BDF87E9275016631FC39A3DD923CFD5 /* Rx.swift */, + FB6AEC794FE241DBB014629652C69627 /* RxMutableBox.swift */, + AF07172F7CA8B5B935911DE285990786 /* Sample.swift */, + 63DFCFBFCF8173EC390341082A2CA8D9 /* Scan.swift */, + B82659B9946A78AB3410BAC442F44CE8 /* ScheduledDisposable.swift */, + FFF7CFECD2DB2F7DC9D193AE36D6A2D5 /* ScheduledItem.swift */, + 1DFD65AD665E3A96183E93B0F40DA403 /* ScheduledItemType.swift */, + 8E2C42A340AE8D4A73D1474B4336A975 /* SchedulerServices+Emulation.swift */, + E2CBB44A244B03514A2C9E8D6B16BAF6 /* SchedulerType.swift */, + 0999E4C7B67895D401A6DCAD1200BBE0 /* Sequence.swift */, + 5198C63545DB5814BCACB842F7096A51 /* SerialDispatchQueueScheduler.swift */, + C648B448494DFBB4AA625FF897AD1372 /* SerialDisposable.swift */, + B54E3AF3FA7EA490214091F929A42A95 /* ShareReplay1.swift */, + F561C8735352BCF4A4D0E44274DCCB0F /* ShareReplay1WhileConnected.swift */, + AF846C165563CCFB0E95B34C67F3A60F /* SingleAssignmentDisposable.swift */, + EA22966660CB2DAAF6AFBA0D26B8BDD4 /* SingleAsync.swift */, + CEE1793A7D509E82AD27969A60D05551 /* Sink.swift */, + 8B042580ED92652AB4B1C622698DC37C /* Skip.swift */, + F2017D45A3B851D82D0592A1F7A464C9 /* SkipUntil.swift */, + 001A5A845D99C35B1652222641E73AB5 /* SkipWhile.swift */, + AD9028C599B99188FF3AA543FDCE09AA /* StableCompositeDisposable.swift */, + F6AF0971043E9BD162252E24533BE1EC /* StartWith.swift */, + B2A7F287B5B7D4E8975424FCD96F5E25 /* String+Rx.swift */, + BB91EDC75CA3D65336413CFAED25461B /* SubjectType.swift */, + E3FE140B00E9999149393998D3615E5D /* SubscribeOn.swift */, + 03A57D5BE799CAAF2300C3EBB0CF0BCB /* SubscriptionDisposable.swift */, + A2E0D7AD2C312893393D31A332DB584D /* Switch.swift */, + 74F2755E5D4716AC8CD20E0239D02B00 /* SynchronizedDisposeType.swift */, + 6C67556D2A88B84A6632C15E1F5FDBB7 /* SynchronizedOnType.swift */, + CE465BA9C66E7DD99254FF4269847FBE /* SynchronizedSubscribeType.swift */, + 9A4B7711318BC44E1244340730F27293 /* SynchronizedUnsubscribeType.swift */, + D578065D7D3956A6A63B8765D9709FC3 /* TailRecursiveSink.swift */, + F6D7FBEF156F5AE53D0122563D9F3D46 /* Take.swift */, + D5C91234BB9AF0409CE87FBAA1758F77 /* TakeLast.swift */, + 9DA09A47FAA9F05C8AFCDB6C0276B840 /* TakeUntil.swift */, + 61744593F89B4D12A2CEB42BF7FE0AA6 /* TakeWhile.swift */, + 1156237286877FCB9D9E036950AF494E /* Throttle.swift */, + 6173A031FA951E5E89A7B22362B4EAF2 /* Timeout.swift */, + 6D73708354C0C565DB1D17179F21905B /* Timer.swift */, + CBD62C5D89BE98E58E9994ECFAB182C5 /* ToArray.swift */, + FB91F0F9C24D455EB272EDD8B372149C /* Using.swift */, + A2F4C3F46947519FFBCAF57E65D8B171 /* Variable.swift */, + AF2BCCEC2016C9267293D7DD715228F9 /* VirtualTimeConverterType.swift */, + CDD494E5B511AE9DC0BFD70CFD91E494 /* VirtualTimeScheduler.swift */, + 8F7CCD2C6E14266514EA3B65C91F816E /* Window.swift */, + 5B2E64DD128C61A11C7F6E061A9BF933 /* WithLatestFrom.swift */, + 2CA682DFE2CF3324CE676F0A8A81F628 /* Zip.swift */, + 792E59203E6DC0668DDED438931D3B59 /* Zip+arity.swift */, + 4EC08831BE6FA1130EC538509B0EF049 /* Zip+CollectionType.swift */, + 7693CE04313E6D38E00F9D7B4C09CAA1 /* Support Files */, + ); + path = RxSwift; + sourceTree = ""; + }; + 54FC00A746772915CDD8A5281A88BEF7 /* Core */ = { + isa = PBXGroup; + children = ( + 5BDEACB6246243123A0406EE1FF2FE2B /* FBSnapshotTestCase.h */, + 66F872E2DA5BDC191FB39C413E4096C6 /* FBSnapshotTestCase.m */, + 2CCC20C08696FCF2F7F31CD4A96643B0 /* FBSnapshotTestCasePlatform.h */, + 3A24965AF386235FE08F3C73C9FB4E91 /* FBSnapshotTestCasePlatform.m */, + 10C77B30E9094B581285427B6F98074A /* FBSnapshotTestController.h */, + 08EA89646662460FF3AD5D46DBFCA748 /* FBSnapshotTestController.m */, + A37EBAF248BA81E9A25C7C8C4C29B19E /* UIApplication+StrictKeyWindow.h */, + 54B35086EFACC9E43FEEA284105E78CE /* UIApplication+StrictKeyWindow.m */, + 6E5EF35C1C49007198DF207CAF6AD13D /* UIImage+Compare.h */, + 452D51542007324AD99FAB50095C580C /* UIImage+Compare.m */, + EE01E88120957751AC432E46A974CBA5 /* UIImage+Diff.h */, + 2442DF0F204F94D186809B47F0536692 /* UIImage+Diff.m */, + 83DC01985094885B377380616EFB00C6 /* UIImage+Snapshot.h */, + DC9C0695630FFA49EE38E69708C1B41B /* UIImage+Snapshot.m */, ); name = Core; sourceTree = ""; @@ -1458,125 +1941,119 @@ path = Views; sourceTree = ""; }; - 5888204560009B0EE6364240854AC820 /* Frameworks */ = { + 5E3FC094BE9761EFD4E5CFAF58F5897F /* Resources */ = { isa = PBXGroup; children = ( - 99965341C449E73C80156A05682B1A0B /* Alamofire.framework */, - FE5B571E13FA6E35830D1798F8F3F4DA /* Decodable.framework */, - 9309619FD62944F6AF33B353B05161EB /* GCBCore.framework */, - 740D1078C4A9F2BAE5CDEFD3F369BB88 /* Operations.framework */, - 85127C4E079555839FFBA777B1385078 /* Result.framework */, - 584D004AABB698E755FCE17546F88425 /* RxSwift.framework */, - FCAC91C4E8944BD3B77CD755BDE93010 /* Starscream.framework */, - 58B7F8818B63E9B48E068D5177EBAE87 /* tvOS */, + 694A2214460BED92ABB4F9B9B2F3355B /* gcb-error-icon.png */, ); - name = Frameworks; + path = Resources; sourceTree = ""; }; - 58B7F8818B63E9B48E068D5177EBAE87 /* tvOS */ = { + 61CDE2D7ABC31E780EBCABC1BA6B640F /* tvOS */ = { isa = PBXGroup; children = ( - 405C0BBDBA2FCC2A4AEAE736E6F757F9 /* CFNetwork.framework */, - DA51384BF0852E58BEC25C70008876F7 /* Foundation.framework */, - 648433BEABC724009752CE49AE74D4D4 /* QuartzCore.framework */, - 72E4743B3C2758A9EE613EB64764DD2D /* UIKit.framework */, - F00F1D5653212AEF63206B82CD7B0DD8 /* XCTest.framework */, + 803EC29A41FE2384D81E3E19868BEF3B /* CFNetwork.framework */, + 1196E231A532EA13E497ED4E24FA50C6 /* Foundation.framework */, + 71C2BAC3EEA6827AB1B6D5E332E11046 /* QuartzCore.framework */, + 044D06DA8058DE1ACDACEE2E7B8E6F58 /* UIKit.framework */, + 7D7FBD564C8F1E46FE10614C52205319 /* XCTest.framework */, ); name = tvOS; sourceTree = ""; }; - 5B0FCAB4EA1B4687DD9A7993ED303C06 /* Support Files */ = { + 6D933BF6B2C2F3E5AC9E123051F1CECF /* Support Files */ = { isa = PBXGroup; children = ( - 46431C3CA657423902D634498B670455 /* Info.plist */, - 0602E5B0FDF859A66F5A84B25FC3F48F /* Result.modulemap */, - 6CF26820ABE38690543664615CD1CCB1 /* Result.xcconfig */, - 0B5EC04B1F46E2EDD30A6878174A4D19 /* Result-dummy.m */, - 877B078FFC9067D07D9078AB4384D2A0 /* Result-prefix.pch */, - 631BB84CCDC1A4368864B39B1002EC7B /* Result-umbrella.h */, + 5CE05CCC296CCDEAA9D5E580F42BC488 /* Info.plist */, + 69544FB5B1C9B81D0749EBE81970DB9C /* Moya.modulemap */, + 8E1A3628D0D90CEE66A42C4D1CDCBC5D /* Moya.xcconfig */, + 8C7CB2B2755EE88C5C7AEB169924324E /* Moya-dummy.m */, + 5659C8A47E9FDB68D59A113E17BF9042 /* Moya-prefix.pch */, + F44D2E746B7A9C27F71FF48EA1DAF8A5 /* Moya-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/Result"; + path = "../Target Support Files/Moya"; sourceTree = ""; }; - 5B3FB2C77DC035BAD9585AB928AB7FB2 /* Core */ = { + 70AC0AF63234A6EF9837A51AD3162A57 /* Support Files */ = { isa = PBXGroup; children = ( - 63B66AE93F7EAF1D980C296DCD7BD4CC /* Compatibility.h */, - 8C871ACDEC05F7E675A502CE89B7706F /* OHHTTPStubs.h */, - 157FC95DFCA09649189A3ADF97BC3B23 /* OHHTTPStubs.m */, - 2B3CED4AA0F48F9C12849DE0B00E826A /* OHHTTPStubsResponse.h */, - 1CA2FDC0F16367DA48592ACA0848ECAB /* OHHTTPStubsResponse.m */, + 83CEC853890773573BD338573AE77668 /* Alamofire.modulemap */, + 7BC3DD0BD9ADEAD9C96CECB640CDEB9C /* Alamofire.xcconfig */, + 1DD953A23C4E4AFADBD227DE27A6B4F3 /* Alamofire-dummy.m */, + AC5A7C080C9E312389568AEECC19B928 /* Alamofire-prefix.pch */, + 5E803C3F4BCBD8570797C469B96C3A55 /* Alamofire-umbrella.h */, + 94F8F400D3FD130596C5D03F8C14F310 /* Info.plist */, ); - name = Core; + name = "Support Files"; + path = "../Target Support Files/Alamofire"; sourceTree = ""; }; - 5E3FC094BE9761EFD4E5CFAF58F5897F /* Resources */ = { + 714FBE96C42000F6749009D83D3D51C6 /* Frameworks */ = { isa = PBXGroup; children = ( - 694A2214460BED92ABB4F9B9B2F3355B /* gcb-error-icon.png */, + AB88BB0CC73BB2714CFDD8E1B6C67A42 /* Alamofire.framework */, + 0E2E6D8A96F09738922295D307BBF824 /* Decodable.framework */, + 1363E07B9A4111D5CDFA32B8A245F35E /* GCBCore.framework */, + 50C0EA87FCCDB68DEB0DD3D60257ADFD /* Operations.framework */, + 207EC3BB70412EDF14308BF57AC59474 /* PINCache.framework */, + 981056E7937643999C099CC4914236B6 /* Result.framework */, + A66610611AE02699CB7A30C8588034CE /* RxSwift.framework */, + 1620A4D44FB0DAA1682AE846A33375DB /* Starscream.framework */, + 61CDE2D7ABC31E780EBCABC1BA6B640F /* tvOS */, ); - path = Resources; + name = Frameworks; sourceTree = ""; }; - 61BCBE19853675D5BF0BDEEBFC0756D2 /* Support Files */ = { + 76158DD0E7747B532A43FCB3F0BDAEB4 /* Support Files */ = { isa = PBXGroup; children = ( - CF4C9ECF1F504D9104DBA70DF2C5275D /* Info.plist */, - 640930B7BC2AF8E90CB7EB0C6721D586 /* SlackKit.modulemap */, - EE64485C12FF4BA4F7D3794159B18D7D /* SlackKit.xcconfig */, - 15315FEA116DDE38A2D9A2CAEB78384D /* SlackKit-dummy.m */, - 8D2D2103543A13315CCF086FC5EF8CB4 /* SlackKit-prefix.pch */, - 5E8D3DF50F4E55F27765EF0FEFB560B7 /* SlackKit-umbrella.h */, + 8892B7A0E511DC6F31583DC879AFB2E3 /* Info.plist */, + CE50EDFA3E1E104ABDA2871894BAB938 /* Nimble.modulemap */, + 3A288E3E5FC875FAB1D2B0142DCCA056 /* Nimble.xcconfig */, + C85BEFDE6BAFDA6041B8D5BA43A18C72 /* Nimble-dummy.m */, + 7746D53B740F94E30FA2EF5C36990E48 /* Nimble-prefix.pch */, + 0E048E02E302092F175A7DF890E1029D /* Nimble-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/SlackKit"; + path = "../Target Support Files/Nimble"; sourceTree = ""; }; - 6850F8D95DDC3A1A9735329CC9F772A7 /* Products */ = { + 7641C30D079899E2C8AEE5BAC2798BA2 /* PINCache */ = { isa = PBXGroup; children = ( - 082F91A197BBD89DE9D349655EBCDB52 /* Alamofire.framework */, - B0102A57BF2F88BE2B13B155EB62B6AC /* Decodable.framework */, - 95100EE29A3E87352B9004C46201C1E2 /* FBSnapshotTestCase.framework */, - 74444A4F8955D35CE2CC9010002176AB /* GCBCore.framework */, - 33CE35817B078DD24A00BF6C81868FA7 /* GCBUtilities.bundle */, - EB68C258F5AAD17B492167054C183F2A /* GCBUtilities.framework */, - 7B0565220ED25AC3B95D95473DB9E999 /* MD5.framework */, - F822E0BA5B9339261A00FEE5D55ED142 /* Moya.framework */, - 3C240764FD41F48F6A3FDB326A7665F3 /* Nimble.framework */, - CC119C8B59A97490BBC8102E8BE61433 /* OHHTTPStubs.framework */, - D4C4C2BA9F8D3B0F472D142EF722BD37 /* Operations.framework */, - 7BF0705DA3715365B1EC4D085BB7E3C1 /* Pods_GrandCentralBoard.framework */, - 06F48A41222F6C813CDBD904BCEDD130 /* Pods_GrandCentralBoardTests.framework */, - 1ED0D2A65F9DE3F40F83838F5E53B1D0 /* Result.framework */, - 576AF4FE3A7B0179C0DD82C352325723 /* RxSwift.framework */, - 79FBA3F4394BB499147E004222AAE9F9 /* SlackKit.framework */, - 6802EBC2D159B9560CFAD2FC68480C41 /* Starscream.framework */, - ); - name = Products; + C1C7A0118A85D5155A4DD1A9195C7A23 /* Nullability.h */, + 25D4519C15A99C03986C81791EA2DDE3 /* PINCache.h */, + 9ACC53A09475233325564B813F4A8FAF /* PINCache.m */, + 4826F4C473195BFF18B92007D023C972 /* PINDiskCache.h */, + FBA212657A52A7AEB13356CD4FE25989 /* PINDiskCache.m */, + 9724157927B4D7CB63CF12F0E022FF92 /* PINMemoryCache.h */, + A9DBE69F7B6E7E56AC86ED57033415F4 /* PINMemoryCache.m */, + C39D16C3C858088CD7D292EF4FBF05B6 /* Support Files */, + ); + path = PINCache; sourceTree = ""; }; - 77F7E591961A40BB532A9C72E21021C0 /* Moya */ = { + 7693CE04313E6D38E00F9D7B4C09CAA1 /* Support Files */ = { isa = PBXGroup; children = ( - 5342EA35FC1767967B7AD01400AAC750 /* Core */, - 395DCF14800491F1E9C9F0E2D83E5133 /* RxSwift */, - EAC905B09D1C1D6AEB8F3BA1D7D6DF46 /* Support Files */, + D59AFB00D9678FACE7AD7E0FC1D2C044 /* Info.plist */, + 0AFAB0A98DC7605283443EDAFC799249 /* RxSwift.modulemap */, + C471652298ECDB675407971C4AEB74E6 /* RxSwift.xcconfig */, + 95471B594BC00260369AA577A3C22847 /* RxSwift-dummy.m */, + BE0BF2B7F0BEE27B6196D950DEE2E6D7 /* RxSwift-prefix.pch */, + A5E8F172C004C6A6BA9B960BA4E021CD /* RxSwift-umbrella.h */, ); - path = Moya; + name = "Support Files"; + path = "../Target Support Files/RxSwift"; sourceTree = ""; }; - 7A0956E9216DF251EECF5CAAF599DDD3 /* NSURLSession */ = { + 775874185F53DB66AEDA6DA2456A7517 /* Swift */ = { isa = PBXGroup; children = ( - 630F44CBE9AB50D0D7DD2A6577D02C60 /* NSURLRequest+HTTPBodyTesting.h */, - F384C60BD88AB186688E700792A282CE /* NSURLRequest+HTTPBodyTesting.m */, - 38587901E5E1831929D293E6400D9312 /* OHHTTPStubs+NSURLSessionConfiguration.m */, - 3E80F5D5838EF1CED212189A51CDECFC /* OHHTTPStubsMethodSwizzling.h */, - 44313306E6719B5398ED4B11FF575098 /* OHHTTPStubsMethodSwizzling.m */, + 57FDF85C9318FD5BD63CE69F6AE6FA98 /* OHHTTPStubsSwift.swift */, ); - name = NSURLSession; + name = Swift; sourceTree = ""; }; 7AF9BE43AFCC45D2EB240155FC470574 /* GCBUtilities */ = { @@ -1588,64 +2065,161 @@ path = GCBUtilities; sourceTree = ""; }; + 7B891818805D7B7A1FFFF12B8AC9BCD7 /* Alamofire */ = { + isa = PBXGroup; + children = ( + 97BD34DE6798A198FECC179DE52BC0DE /* Alamofire.swift */, + 87CF642DD323B3009BB8E64B2ED57EB7 /* Download.swift */, + D232E2FE323C1CC6F02058F90A2FA195 /* Error.swift */, + 0B6D4C8D6B7B74FB3F3AAAF8AFCDB212 /* Manager.swift */, + 9D4267A3B8C535FEB58434B14968205E /* MultipartFormData.swift */, + 19875C26FCDAED3E60832CD343DD21AD /* NetworkReachabilityManager.swift */, + 49EBF49B74191853A79B16B58E508401 /* Notifications.swift */, + 3B81BE92721BAAC1848E813351DED3F8 /* ParameterEncoding.swift */, + 2F3346E24F87E4349BA8E3808AFFE643 /* Request.swift */, + E7BED73129EE85F31757AEDB2228BA1B /* Response.swift */, + 1BDFA2139F3D52052D7464AB6A5683FD /* ResponseSerialization.swift */, + 147ACA3E9072F582D4467776453D9D26 /* Result.swift */, + F7939EA80D80C2CDFFF424667A2FE5B6 /* ServerTrustPolicy.swift */, + 1368B4159EE1FD22492BA2DC5AE9E0D7 /* Stream.swift */, + ECA8D7AB9D851D47525A49D0E7961ADF /* Timeline.swift */, + 9FE7E71EE02CA6598DE44A76912FE696 /* Upload.swift */, + 0D3FA257B9D9D0B99AB105833B619049 /* Validation.swift */, + 70AC0AF63234A6EF9837A51AD3162A57 /* Support Files */, + ); + path = Alamofire; + sourceTree = ""; + }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 2108A765410704620C323A40388C421A /* Development Pods */, - 5888204560009B0EE6364240854AC820 /* Frameworks */, - 53001F8FA7E5D30C799AED3C056D73F3 /* Pods */, - 6850F8D95DDC3A1A9735329CC9F772A7 /* Products */, + 714FBE96C42000F6749009D83D3D51C6 /* Frameworks */, + B3A45182F58A7862C5F5D557574A8A35 /* Pods */, + 46DAA05AC457FB486F8CBF81300759EF /* Products */, E9DD34CF730C0096009EFCA283DBDB0A /* Targets Support Files */, ); sourceTree = ""; }; - 89673EDF039EC7D2FC3020931E8D6327 /* Support Files */ = { + 8417B201E9E5B72A53BBD6A1F8B03F44 /* MD5 */ = { isa = PBXGroup; children = ( - 462E9662BE5AB1EF4DD4F4E41E9EEA7C /* Alamofire.modulemap */, - D82DADCD75E732EC961898DFE08626BD /* Alamofire.xcconfig */, - F2B67B5C16830EC11E80AF38ACFF31C5 /* Alamofire-dummy.m */, - 3820ECD867565C57835F86DC97873733 /* Alamofire-prefix.pch */, - 680DE9381D53CDF7878C1EEBBBA4C7FB /* Alamofire-umbrella.h */, - 0A7112B084DEDA8DB75ABECC1E144E97 /* Info.plist */, + 87061D23958D8DFA85B774892E5C242D /* BytesSequence.swift */, + 8F9A0551CE1960D3BD918E2886B4B72B /* Generics.swift */, + BC70FC80FCE21AE1448B10097FA5F321 /* Hash.swift */, + B5CFF5407387D136FBCA29313995345D /* HashProtocol.swift */, + 2C88363E0695421EDB039A027351F6B9 /* IntExtension.swift */, + 7981621A460D53FBF5064140DC277351 /* MD5.swift */, + 79503ACB2B7C18C8103244782DFF548C /* NSData+Extension.swift */, + F94C4FDDE82E00C9F0439516DB9579CD /* Utils.swift */, + 190F60023A650C26616DCD87D8B646CF /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Alamofire"; + path = MD5; sourceTree = ""; }; - 947F6DE8E9D2269C43C7CAB01E267ADC /* Result */ = { + 85167A5FE61DA6CF31F55B37D072F89C /* CZWeatherKit */ = { isa = PBXGroup; children = ( - 0795710D4F49637F27BAAC941DCDA749 /* Result.swift */, - 595147E7B6E61BF61F63BC8B9102BA22 /* ResultType.swift */, - 5B0FCAB4EA1B4687DD9A7993ED303C06 /* Support Files */, - ); - path = Result; + 3AF566A3A4276FBEF31FA3D9027AE0EB /* CZClimacons.h */, + 2418F52D7A8561AC03DDE3526F18F199 /* CZForecastioAPI.h */, + DF43EFB7F4F4789898975A8E41C67DF0 /* CZForecastioAPI.m */, + 9DE378872F49E41BE7F0A435C78A3484 /* CZForecastioRequest.h */, + 0D56DC5A6CBF825FC4ED3DE36452346C /* CZForecastioRequest.m */, + 806E4C948521C0FE8232AE34823C8491 /* CZForecastioRequest+Internal.h */, + 683602810D0BFF8D342CF09E7AA69549 /* CZOpenWeatherMapAPI.h */, + 35776B662CD81337BA97B9A2F564D78D /* CZOpenWeatherMapAPI.m */, + 80EECA637B691A52FA3A1F9A4827B561 /* CZOpenWeatherMapRequest.h */, + 678E820315A406C37633B7D990DDD994 /* CZOpenWeatherMapRequest.m */, + 2A1474FA93D24756FC513E213FCFD00C /* CZOpenWeatherMapRequest+Internal.h */, + CDA99A08B84A1B309ED264F3F41F0EB0 /* CZPINWeatherDataCache.h */, + C4D2A2A50D844627860B146B1800F76D /* CZPINWeatherDataCache.m */, + BBABE62A1C45E254CB971620847127BF /* CZWeatherAPI.h */, + 02817F9296DCE595B008D438D44E5122 /* CZWeatherCurrentCondition.h */, + 84CB26F2CC144247A50096290DDFB48F /* CZWeatherCurrentCondition.m */, + 4986A7085C1D93F0CCFD5B6AAA7567A2 /* CZWeatherCurrentCondition+Internal.h */, + B03A8D57B9DE1D49AC095BE31D5587E1 /* CZWeatherData.h */, + C098E0E20D37C589007BDF1DEAD5A81B /* CZWeatherData.m */, + B56920C71208ABF4EAAC1AE0FB646275 /* CZWeatherData+Internal.h */, + 302D66FDACEC1E2E28D48C6FF2C42774 /* CZWeatherDataCache.h */, + FA7827CF2CAAF5FC74BA7BBAD8F36711 /* CZWeatherForecastCondition.h */, + 9D792CE985D750300BCE9FF8A3A9B3B0 /* CZWeatherForecastCondition.m */, + A75D2621FD6E28A3CAFF24F9DEDD8D97 /* CZWeatherForecastCondition+Internal.h */, + E40455FC13D39DF345873D8DB7B35C65 /* CZWeatherHourlyCondition.h */, + 3E465E856B21EB0B8FC7995295EF6C5C /* CZWeatherHourlyCondition.m */, + 654ECC37332791E3E91CF55E6B4B1F6F /* CZWeatherHourlyCondition+Internal.h */, + 4F76D589FE2B17BD1EB65789C59AACDB /* CZWeatherKit.h */, + 45329FD9FB9F88CAEBCCDCE2A312E7C2 /* CZWeatherKitInternal.h */, + D07D28143A1FD212852820FE92BC58DA /* CZWeatherKitTypes.h */, + 485E7E75364E70635964F0ED4F3F5520 /* CZWeatherLocation.h */, + 262B7ED8C316D23FB117C10065B67192 /* CZWeatherLocation.m */, + 6F7705ED2C309032E92ECA6B1DADF589 /* CZWeatherLocation+Internal.h */, + BE92319A90076FB670702AC53D8B1936 /* CZWeatherRequest.h */, + 0DF6709A08D2BD6663F2965D466574E3 /* CZWeatherRequest.m */, + 613E3B7F8A9996831D3040586BC7A1D3 /* CZWeatherRequest+Internal.h */, + A0B2D488DA61F8D8583BA2777593D6E4 /* CZWeatherService.h */, + A5E6622256C5EF17912D5D8E63C1B00B /* CZWeatherService.m */, + 09A7A420DDD2EFAC68D33CDD0D2650FB /* CZWeatherService+Internal.h */, + DE173CEC9E72882FF93759F16D4418D9 /* CZWorldWeatherOnlineAPI.h */, + D8B58171D15B0D8F812EDEC5562C3083 /* CZWorldWeatherOnlineAPI.m */, + E94EA0F0FA1F8F3B1F411B05736E2E29 /* CZWorldWeatherOnlineRequest.h */, + 35D583CB786EBE5DC11475D77CF1269E /* CZWorldWeatherOnlineRequest.m */, + 817F7DA7732EB0F365314086F0055F84 /* CZWundergroundAPI.h */, + DBFDD052C357E1094865D36ACCEC01F1 /* CZWundergroundAPI.m */, + 644573D029641CA7952EFF093940C270 /* CZWundergroundRequest.h */, + 86DD3E7EF4D44A322FB8FD2310B6A3A2 /* CZWundergroundRequest.m */, + 49CB3F06CE913D71A9E1574CBED61F34 /* CZWundergroundRequest+Internal.h */, + 98614607CBD343503CDF215F6705B975 /* NSDictionary+Internal.h */, + 9FF98EB0BCF8F48539A108FDD427384C /* NSDictionary+Internal.m */, + D9760E4BE0D639723785F985604F032D /* Support Files */, + ); + path = CZWeatherKit; sourceTree = ""; }; - 95AA3B296A73DF9622A35FE7D2142773 /* Starscream */ = { + 895FA38ED88B178C8310B01979DB6F58 /* NSURLSession */ = { isa = PBXGroup; children = ( - 500BCE51B8A1864F6393247415A1471F /* SSLSecurity.swift */, - E7474AA7F1B7C0B1E0C42FC5DC0B6B44 /* WebSocket.swift */, - BE5FA0B81CFD144739F8434B3C687696 /* Support Files */, + 0A33B2BD6DF89F9C424989E952E01883 /* NSURLRequest+HTTPBodyTesting.h */, + 329C2E2ED9DFF4683827BC35BBF7CE68 /* NSURLRequest+HTTPBodyTesting.m */, + 236874A5661A734F37C32C47477F7E48 /* OHHTTPStubs+NSURLSessionConfiguration.m */, + BED3965BD19F7A90C5DFD463EF2EBF17 /* OHHTTPStubsMethodSwizzling.h */, + E6683E84B93C3659F7136845681EEDFD /* OHHTTPStubsMethodSwizzling.m */, ); - path = Starscream; + name = NSURLSession; sourceTree = ""; }; - 9F74E76E8078243D13B3D248E79FC56F /* Support Files */ = { + 89C9FA99D139D15778D301A8E5130117 /* Support Files */ = { isa = PBXGroup; children = ( - 1CF14CB3A12801BACBE2CCCD738A1366 /* FBSnapshotTestCase.modulemap */, - FBC77F96AB921B154BC0A1A1C71BCD98 /* FBSnapshotTestCase.xcconfig */, - 721630214CB014361E7D2DC0CAF7242E /* FBSnapshotTestCase-dummy.m */, - 54B2322B9350C90D3DAC12C333461381 /* FBSnapshotTestCase-prefix.pch */, - 2155B21532D94FB92559674F74BE33D5 /* FBSnapshotTestCase-umbrella.h */, - A2CA7E52C339B9AC7FFBB7ECE4F1E269 /* Info.plist */, + 0E290D8E0DA3EC99EE363F963A05DE98 /* Info.plist */, + 98C5881DCEB83D4E0BE24B121BD89E62 /* OHHTTPStubs.modulemap */, + 8D37F45399F5A3C0099A2B4AF5703AD8 /* OHHTTPStubs.xcconfig */, + 1F2881597E19C227D0ADCD3FFD7A718C /* OHHTTPStubs-dummy.m */, + 24E2B4A8485C2836BE4DBC02FCD0E9AB /* OHHTTPStubs-prefix.pch */, + 3E60A7851A634388A08E46DF639318B5 /* OHHTTPStubs-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/FBSnapshotTestCase"; + path = "../Target Support Files/OHHTTPStubs"; + sourceTree = ""; + }; + 93327D696178092EA32D0B4F062EE458 /* Result */ = { + isa = PBXGroup; + children = ( + 30F6437701A5AF68CC47C4EC49192973 /* Result.swift */, + 1C619DD8D8E4DFD880FCA411D24990D8 /* ResultType.swift */, + C0E8D0E441818AC20E663E558C493D66 /* Support Files */, + ); + path = Result; + sourceTree = ""; + }; + A15075426B47594F48935E1C3AC6EF2B /* Moya */ = { + isa = PBXGroup; + children = ( + 22C98F989D88B3732D6F93C86E14C148 /* Core */, + E162CA1CF6726C8DFCE33DA88849CCF8 /* RxSwift */, + 6D933BF6B2C2F3E5AC9E123051F1CECF /* Support Files */, + ); + path = Moya; sourceTree = ""; }; A4FB553B0818FA811A8B70D7F52B8DB3 /* Pods-GrandCentralBoardTests */ = { @@ -1666,189 +2240,166 @@ path = "Target Support Files/Pods-GrandCentralBoardTests"; sourceTree = ""; }; - AC18DC861D7A3D0F2369540BAA16AEEA /* SlackKit */ = { - isa = PBXGroup; - children = ( - 0D36F1227D2E1E782B5AD318A69D9A83 /* Attachment.swift */, - 297995529B1E3355A2EEECA08ACDB593 /* Bot.swift */, - 09798F8AC7BA142F482665D00051B49C /* Channel.swift */, - 383C94650F9F55DF4A8929687DDC7D54 /* Client.swift */, - EADF08D96A432E81457631FF7DD98665 /* ClientExtensions.swift */, - 379189330FF43C9E763923EDFDFE9D12 /* Event.swift */, - 444A5358B278DA045CC632B5437D63AD /* EventDelegate.swift */, - E3A7734CEFD56FE51508FEAD980F373B /* EventDispatcher.swift */, - 5FF2E9FC1A53A98022E90178CF78B5F4 /* EventHandler.swift */, - 9ABE5EC463FC662460A2919A1594CE35 /* File.swift */, - F24FFC6DA9A683F20A49C2FC8186FCC5 /* Message.swift */, - C659372D31D8FF6B2C83453D431C9E0F /* NetworkInterface.swift */, - 608F45D2BEB10003A9A96C12F7132C6B /* SlackWebAPI.swift */, - 1C801CC2880EE27F175C85CB1887DBB2 /* SlackWebAPIErrorDispatcher.swift */, - 948B99A222992D22FCCCCC54472BFD23 /* Team.swift */, - 0B96F930221441771B05C680CB04EB5A /* Types.swift */, - 39A9238E227041FD68FDF36BEFBC6A0E /* User.swift */, - 5B05C3BFC6DC296F1E8AAC1948B6D58B /* UserGroup.swift */, - 61BCBE19853675D5BF0BDEEBFC0756D2 /* Support Files */, - ); - path = SlackKit; - sourceTree = ""; - }; - AE295DD133FD59C2BDB69F1C768F4029 /* Standard */ = { + ABFA91CC097C91A4CE2ED6E56FC0D365 /* Nimble */ = { isa = PBXGroup; children = ( - 990AB471645915530460ED5B4296B026 /* AlertOperation.swift */, - AA5EB374CD3B03B02BF98E4A1C5BE09C /* BackgroundObserver.swift */, - 55B32CFD914449868EC9A504955F5A58 /* BlockCondition.swift */, - 7A16760172B10E95CC1A755501BD8BEC /* BlockObserver.swift */, - 6C5C243C9EAF503B6D2322CC358143D5 /* BlockOperation.swift */, - 7909B418D628EDBEBAAFEC67FA50958C /* Capability.swift */, - 3756AED27F4E64842742E9A59496B70F /* CloudCapability.swift */, - ED238925D8D6DCC8A449E8C42039B7E9 /* CloudKitInterface.swift */, - 51241CFCCD32670B416010BEB96FB314 /* CloudKitOperation.swift */, - E801171AA37386AF690254664F780B64 /* CloudKitOperationExtensions.swift */, - 59314DCBBB2102CD0C7BA4800CBA1310 /* ComposedOperation.swift */, - B2FE2542E68DB6A105833468075DC9B4 /* DelayOperation.swift */, - EA5E029688A097299760EEEE5BADFBDB /* ExclusivityManager.swift */, - 3F7157F32C17BA0909103999530E6E1E /* FunctionalOperations.swift */, - EE383CCE12388DDEC9BD49B1A52303CF /* GatedOperation.swift */, - C8505763032347405391E8EE0BFE84C5 /* Generators.swift */, - 4E5F9FC63143BF9C48B797AD5BAD7F89 /* GroupOperation.swift */, - E25343E3B0074B7945ADA2B1186CF11B /* Logging.swift */, - F6CF0B94F8A0CEE9F2001679A3383A69 /* LoggingObserver.swift */, - 1ADE2BBFA13927E96E8BF3D31D5BFF69 /* MutuallyExclusive.swift */, - A4E70AB3885B2FF6B50EA0E6930939EA /* NegatedCondition.swift */, - 079627E6114383B5C3E2F469EDCED353 /* NetworkObserver.swift */, - 0044C795BFFE925935D64D715F859BDD /* NoFailedDependenciesCondition.swift */, - C3F9D561B60E7E6CF911A1748FFE4BD1 /* Operation.swift */, - DD9853FD42DEA1216293C5EA837F3006 /* OperationCondition.swift */, - 72B8B59BEAD47EB457F703D20412A9D4 /* OperationObserver.swift */, - 079EDBBD982006210C5A00DC75C0E5EC /* OperationQueue.swift */, - 046B8130F6A4ABAA8C2E97B7503EDBA2 /* Profiler.swift */, - 7228EBB47363C5076B8EBF47D415B1A1 /* Reachability.swift */, - 6ED7F12A4243B628F8FD801B7DA9BA90 /* ReachabilityCondition.swift */, - 168B84DE0DB8E3EE3168E0949F63B557 /* ReachableOperation.swift */, - 994785D1704FCA1AC4E3B8B25257CF44 /* Repeatable.swift */, - 35530FF0B9A1FD7E0099A73660CD869A /* RepeatedOperation.swift */, - A6EFB439000D0087BC0320B8F9902A37 /* ResultInjection.swift */, - B9A4BF78727973CB87D5DEB6D25F21EB /* RetryOperation.swift */, - 0087CD580A76836B6DA6B0C9C353AC33 /* SlientCondition.swift */, - 431A12D9BCED3C61FBB07E77E070AE8C /* Support.swift */, - DAF51A9CC8DA974C053F05BC85A0154D /* ThreadSafety.swift */, - B72FCC437D382D258F0C16A0444DB355 /* TimeoutObserver.swift */, - 4DBAE639BE3B9B16BBEC71E47B09CD58 /* UIOperation.swift */, - A7E4A6B7EB4094BEE9B64D5AD7B3CF54 /* URLSessionTaskOperation.swift */, - B4A8B1646879B16CB2231308C9EF9015 /* UserConfirmationCondition.swift */, + 05E76015BE0A47DEC495472E215D38B3 /* AdapterProtocols.swift */, + C2CCDDA0318F57C019CB21FB877783DC /* AllPass.swift */, + 12E87C4F96B10FBC7D1ABC7F67408005 /* AssertionDispatcher.swift */, + 38EBA7A087A5BF87A755A7639A1759F3 /* AssertionRecorder.swift */, + 7F42B655758D10D25BA60165E593FC17 /* Async.swift */, + 21CC15734C457BB4C719760F31A7D30E /* AsyncMatcherWrapper.swift */, + CD6CE0A6E2EC4F8E1B91D99AFE1DB2C1 /* BeAKindOf.swift */, + 726A32AE952D2190D6359AFEE6E140F4 /* BeAnInstanceOf.swift */, + 42B0138E9E12041042997A33F7550BE1 /* BeCloseTo.swift */, + 90A4227030BE3269075FB2865B2040CD /* BeEmpty.swift */, + C8C1EE36B884CA88E59941CBDC0A2A5D /* BeginWith.swift */, + 23048286EBD0EC01FB5F3CDDF894556A /* BeGreaterThan.swift */, + 30AA5DDDD96211BE6636A21B423EB558 /* BeGreaterThanOrEqualTo.swift */, + 592AE0D09DBB86639C94111F21FB4BE0 /* BeIdenticalTo.swift */, + 1D4FC445973667C379C36EBCE6ABC8F5 /* BeLessThan.swift */, + C22C5DA9167582839B66C21B74322467 /* BeLessThanOrEqual.swift */, + 7AC137198DD8848C5B4FF1FDADB668DD /* BeLogical.swift */, + 7C7B5F837FDF5309FC1041BEB18B2B48 /* BeNil.swift */, + 61A342B20853A1CB089B903BA8B45FC1 /* BeVoid.swift */, + 8EBDF55DB367F9D4B097B31206C7B0B2 /* Contain.swift */, + D61291F2F3350AA7EEC042A00B653599 /* CurrentTestCaseTracker.h */, + DD531A23A85ADEBBB1219C56A5BA1949 /* DSL.h */, + E6CC947C120AE98416F608343B2657B4 /* DSL.m */, + 29CCC30515407C65034467737CE54F7F /* DSL.swift */, + FF5EDFF053106D2FA8019F2AAB5702C7 /* DSL+Wait.swift */, + E74A19005820F2EEAEA82AA298EE90B6 /* EndWith.swift */, + 0F3D0B023F4645C1DD28D34C0C63287D /* Equal.swift */, + E1B26F4B3D701AD6EA651E33D8E7F287 /* Errors.swift */, + 52D74E8B9F8E150B83F528079CA95AE6 /* Expectation.swift */, + EA16AEF3C7EE6F086EAD02E60717B194 /* Expression.swift */, + CFC76C1D884CDA2EA62859F7E97A1955 /* FailureMessage.swift */, + DDC78157203E2CD368DD737649105666 /* Functional.swift */, + 6E284C0EEE1C585DE7330820DF62C7CC /* HaveCount.swift */, + F4C65EE2551A368A4994FDCF162B5D6D /* Match.swift */, + 78A0920B012D88A959BED3CBFB580005 /* MatcherFunc.swift */, + 5709C1B6ADC1180E7A81D20BA4E0286B /* MatcherProtocols.swift */, + 7AE5DADF80C3E9D5650D28BC2A06F367 /* MatchError.swift */, + 1485A636A575830A6F4661CCDDC006E5 /* Nimble.h */, + 55866D6EF1BE1AE86E583E0E884379AF /* NimbleEnvironment.swift */, + 0A0C97AB677266B99F15F6B2808A7A93 /* NimbleXCTestHandler.swift */, + 260D8C5D7389EC0AA7BB495C9EB40B7A /* NMBExceptionCapture.h */, + F3CD4569E4087D04C39EEDAC76B405FA /* NMBExceptionCapture.m */, + 9BEB3EF5950D33103E7CA26DBD8121A2 /* NMBExpectation.swift */, + 88B0EC9DCEEDD6AB85903AD714FBBBCC /* NMBObjCMatcher.swift */, + 1A6A3017853CBF546D77D54DEF14E129 /* NMBStringify.h */, + 74275AF025CBF943739074B80DFDAD55 /* NMBStringify.m */, + B3864EF9D95FC380FE6DC3D55ACDF5B5 /* PostNotification.swift */, + 4FD78CB18F047D2124592BBBC3A3BDB9 /* RaisesException.swift */, + 6CCC87044EC06E2130CE08D6C2A19359 /* SatisfyAnyOf.swift */, + F24D85E34707F80D83DFC916A9D5FC79 /* SourceLocation.swift */, + 2381A530E4127ED29ADC11C7BBB08F50 /* Stringers.swift */, + 65F622871CA4C41A0E99CD415739D345 /* ThrowError.swift */, + 4D50230900D66E763BBE61EA45AE6A4E /* XCTestObservationCenter+Register.m */, + 76158DD0E7747B532A43FCB3F0BDAEB4 /* Support Files */, ); - name = Standard; + path = Nimble; sourceTree = ""; }; - B1FB268F869850F8F056891714225209 /* Support Files */ = { + AECD2EFC35EC342658E9D2BB08A927DB /* OHPathHelpers */ = { isa = PBXGroup; children = ( - D3277EFC0269B67962F78C06B7931724 /* Decodable.modulemap */, - DD620D65F4DA271F67654EF3A6692020 /* Decodable.xcconfig */, - 0B476FCAF5DE1C02B6DD01DD2AF23C9E /* Decodable-dummy.m */, - 95F7D53858ECA06103556F2D7C8260A3 /* Decodable-prefix.pch */, - 7089F72423629637335BF3128795FDE8 /* Decodable-umbrella.h */, - C4856C8532A1322951B1237CF0C22BB6 /* Info.plist */, + AB2978FEF790D3130E1667CA6B60308E /* OHPathHelpers.h */, + B22DF01C84C772212D032A3F8AFA9215 /* OHPathHelpers.m */, ); - name = "Support Files"; - path = "../Target Support Files/Decodable"; + name = OHPathHelpers; sourceTree = ""; }; - B5ED91ABB482ED863E227F2BEC3AC3CF /* MD5 */ = { + B3A45182F58A7862C5F5D557574A8A35 /* Pods */ = { isa = PBXGroup; children = ( - F1AB6893C3D1029850A5CB4A38CD354F /* BytesSequence.swift */, - 67F329A43C714B2A0D7A7492BF682D35 /* Generics.swift */, - 299C4FBA9EFFA270B6B428606227E2C5 /* Hash.swift */, - B70E306FFDD8B673E65811DA6C65B374 /* HashProtocol.swift */, - DDF915A24AC928B6CED96ABDFE445362 /* IntExtension.swift */, - EC57432F624E4DAFC08988E0BC19190C /* MD5.swift */, - 8A43E2A5D12762BB2DDCFA5FB6611C3F /* NSData+Extension.swift */, - 6DA251A209C4A938FAF0A74DD804D6D6 /* Utils.swift */, - C7E08EC2C4282A825F4016EA3DFBE300 /* Support Files */, + 7B891818805D7B7A1FFFF12B8AC9BCD7 /* Alamofire */, + 85167A5FE61DA6CF31F55B37D072F89C /* CZWeatherKit */, + D68F1AD5876EB6E30BCBCE4290BFA83D /* Decodable */, + 3293A966A1CE3EB2E4A74F9C27056EA2 /* FBSnapshotTestCase */, + 2A32463C89210CA3AB9C99477D328B9A /* GCBCore */, + 8417B201E9E5B72A53BBD6A1F8B03F44 /* MD5 */, + A15075426B47594F48935E1C3AC6EF2B /* Moya */, + ABFA91CC097C91A4CE2ED6E56FC0D365 /* Nimble */, + 22E212532BF631958332D714E3EDF049 /* OHHTTPStubs */, + 1F9C0B45AA863320CD2A4CA11D536897 /* Operations */, + 7641C30D079899E2C8AEE5BAC2798BA2 /* PINCache */, + 93327D696178092EA32D0B4F062EE458 /* Result */, + 54B691DE283BC14FA82FCF57E04A077B /* RxSwift */, + 3F43C82664CAF19D56FA41FE91DE64E4 /* SlackKit */, + 3DAAC4A1B2AC560FC2241F2092D9D2E2 /* Starscream */, ); - path = MD5; + name = Pods; sourceTree = ""; }; - B6213BB4AAE27BE15AB8885326D7EBA1 /* Support Files */ = { + B3C7ABFDB96BEEB6DB94C6B0A5165095 /* Support Files */ = { isa = PBXGroup; children = ( - AE9CAC6C3D8BBED064D6A8264B76073B /* Info.plist */, - 86CD330E579433137D556DD43E5C0BC6 /* OHHTTPStubs.modulemap */, - 9A6D95D337C004BD47FC86A3757251CA /* OHHTTPStubs.xcconfig */, - CF31CC12E204B1AD8C702AE6028F3301 /* OHHTTPStubs-dummy.m */, - 9F5CEBF7B60B7A5EFB1145F6B332BD86 /* OHHTTPStubs-prefix.pch */, - F58E256DFC2C7E2239EACF7E3AF19FDE /* OHHTTPStubs-umbrella.h */, + 271E62520F0E60A939FECB1DFFCBE8CD /* Decodable.modulemap */, + FD31882A2DA504F8028009B8A5D972D4 /* Decodable.xcconfig */, + 272DFA1D97ECFB4465283FBEE1F93C96 /* Decodable-dummy.m */, + 7B0FA76DEBF5034F13856B15D142BC2B /* Decodable-prefix.pch */, + CA20ABBBE65CB501F7FF4748DE2923DB /* Decodable-umbrella.h */, + 28259B52FFCAD15D1F1D555AAE300014 /* Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/OHHTTPStubs"; + path = "../Target Support Files/Decodable"; sourceTree = ""; }; - B65F45FB66EB2A8953E6F7453A79D9CD /* Alamofire */ = { + BA9F4BEC8C60A8ACD709F2B0E68C1F4F /* Support Files */ = { isa = PBXGroup; children = ( - 9A65978C9F21A6622092D46A7698972E /* Alamofire.swift */, - 3C4BBA245812CB85529D0D4FDD616492 /* Download.swift */, - 8C17B8DE2BAEDAF16D5C537AF88EAE51 /* Error.swift */, - 909626418F7D4525358ECA0CB99D8F50 /* Manager.swift */, - 7A263B75827678A997726732B61A96BA /* MultipartFormData.swift */, - 197B593E7B00C93E8474FC723FC49ACD /* NetworkReachabilityManager.swift */, - 82E68DD7C656B42116607A5C5ECB6377 /* Notifications.swift */, - F16A809DD2A76B1C100643EE9F107009 /* ParameterEncoding.swift */, - EC70C3C277D352D222AA6A10B874A3B2 /* Request.swift */, - 752FB12DA4248428101BEE2F8B9F9ED3 /* Response.swift */, - A802F0947899F0CA9B2DDAA17B7D1CC2 /* ResponseSerialization.swift */, - 5CCF49F39356F77C0589547137998980 /* Result.swift */, - 8B89FD74A740C255B4152E9D803A2643 /* ServerTrustPolicy.swift */, - 520D4BBA9AAABE0AB125029F3853762D /* Stream.swift */, - 9CFDB345105A082F37F41E1D7014E38B /* Timeline.swift */, - A90FA6FE5E2924CC51ED4F60842BC078 /* Upload.swift */, - 547574CE39F96ABFA4825A56054D142B /* Validation.swift */, - 89673EDF039EC7D2FC3020931E8D6327 /* Support Files */, + 04FEF3A26A25B7A90E2969CA7749A674 /* Info.plist */, + D2622EDC5F2B2F033C32AF8283680806 /* SlackKit.modulemap */, + 1CFE92A5B1BF12460F74C754B4188546 /* SlackKit.xcconfig */, + 76189DA5165ACD8017186CDB3F4B32D2 /* SlackKit-dummy.m */, + 215D2E11E68625ADB53C7A2C2C99B54F /* SlackKit-prefix.pch */, + 2032075B3A73D7CD088315B1D94A9075 /* SlackKit-umbrella.h */, ); - path = Alamofire; + name = "Support Files"; + path = "../Target Support Files/SlackKit"; sourceTree = ""; }; - BDF885F56E5CE21F77576161C851616D /* OHHTTPStubs */ = { + BCE9A00A038C8DD9AEC23DAF820EE951 /* Support Files */ = { isa = PBXGroup; children = ( - 5B3FB2C77DC035BAD9585AB928AB7FB2 /* Core */, - E3F7C8057108BEEB8D8AAE14357924A3 /* JSON */, - 7A0956E9216DF251EECF5CAAF599DDD3 /* NSURLSession */, - DB90717D11B852D60DBEDD6907B675ED /* OHPathHelpers */, - B6213BB4AAE27BE15AB8885326D7EBA1 /* Support Files */, - 478E31D30D29A2546D8318A5F6231CFE /* Swift */, + 69386107A543F4417FBD7D78AEBBF2B3 /* FBSnapshotTestCase.modulemap */, + E5563C58E957DC137723F65EA887A119 /* FBSnapshotTestCase.xcconfig */, + F1E5BFAADB84667FA1CAD0E1191564BA /* FBSnapshotTestCase-dummy.m */, + 7E5A496A1AA4CF3335027D8A7356B2C7 /* FBSnapshotTestCase-prefix.pch */, + EBEACD8FDA1AE6C60B7767F3208741DD /* FBSnapshotTestCase-umbrella.h */, + 7AE7D155CDF12A86414B8F34894E8AC3 /* Info.plist */, ); - path = OHHTTPStubs; + name = "Support Files"; + path = "../Target Support Files/FBSnapshotTestCase"; sourceTree = ""; }; - BE5FA0B81CFD144739F8434B3C687696 /* Support Files */ = { + C0E8D0E441818AC20E663E558C493D66 /* Support Files */ = { isa = PBXGroup; children = ( - B5A25F6F9E8CB7A6FEFD8900D697ECBF /* Info.plist */, - CA0E0FF7EF7BED90CBFAA20275CF9F69 /* Starscream.modulemap */, - 8F31EEBEB5F031504B458DB2817F68EB /* Starscream.xcconfig */, - A35A34F460B3DDEF7300274455963701 /* Starscream-dummy.m */, - D7AC5885D19EE7737F14ED367EACF88D /* Starscream-prefix.pch */, - 4A780D03D9B260614AFA5CA569FD4839 /* Starscream-umbrella.h */, + 764FDF2FAB1D0641D94F6747CBD72C2F /* Info.plist */, + 025C0A7190C1CBB46E9F324FB4A8E1A4 /* Result.modulemap */, + 25402BD10C01F92A6BF6A8A1529F143A /* Result.xcconfig */, + 7AD0A8CDCF821D0581703F52B1364ABC /* Result-dummy.m */, + 21E62CB9626D7B352B0FD2F0C5DB56CA /* Result-prefix.pch */, + 07CBCD6CCBDE82614CA6F64EA893B33C /* Result-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/Starscream"; + path = "../Target Support Files/Result"; sourceTree = ""; }; - C4FBFBF262EF8C547771327E9CBAE42B /* Support Files */ = { + C39D16C3C858088CD7D292EF4FBF05B6 /* Support Files */ = { isa = PBXGroup; children = ( - A76C9D7112B25AAC0E5E7C1ACD8A7B07 /* GCBCore.modulemap */, - 2865591B1F8096A1D797A91560F5FD41 /* GCBCore.xcconfig */, - C4D1901C1562B9C0D583EFDEBE0E484D /* GCBCore-dummy.m */, - B612E35C49BA7379D882DB354835230B /* GCBCore-prefix.pch */, - ABD8103E98463EC51324AC371AB9B8C4 /* GCBCore-umbrella.h */, - 670C35710186AC7DCCD80DF3A656B3AA /* Info.plist */, + 7798C30FA16235C36DF68546E46B2BFE /* Info.plist */, + 0FD66CD9B5066BCA8CE70CB0F79099DB /* PINCache.modulemap */, + AF86536ABABE8315BAB2FEC994D39335 /* PINCache.xcconfig */, + 79639553D3F3A89CA9D0B54F47A8AF6C /* PINCache-dummy.m */, + B5D37292C77D9492E6E4228CAAC43D70 /* PINCache-prefix.pch */, + 999954921F1306760303035CC229DEEC /* PINCache-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/GCBCore"; + path = "../Target Support Files/PINCache"; sourceTree = ""; }; C541500A439E4EF6F0F02AD9554D87A6 /* Resources */ = { @@ -1859,286 +2410,44 @@ name = Resources; sourceTree = ""; }; - C6AF753C849286C45A3E791956AD9877 /* GCBCore */ = { - isa = PBXGroup; - children = ( - BB800284240CA31EEA0EFB746DA0C3F9 /* AutoStack.swift */, - 653A3F1ED5E466B3BCCED1D2395C57EB /* Configuration.swift */, - 4AF9922A53C0F00E01DCDF987B2C32BC /* ConfigurationDownloader.swift */, - F537988229A14A9D6674AC964872F692 /* ConfigurationRefresher.swift */, - CC0287A01FA11422D4AD83147AE0904B /* DataDownloader.swift */, - DA7904C27B06117F02444D40FA515343 /* ErrorType.swift */, - FF0B79F33BCA34C15C472F07C2367C7E /* GrandCentralBoardController.swift */, - E0CEC605BA166E4C729B5178FF3F6C7F /* Job.swift */, - 095AE12AE90926F1878026E6A370F6D8 /* LocalConfigurationLoader.swift */, - EE1E5C0A10FF65CD71D3F545A39F4637 /* Rendering.swift */, - 824104CB876FBA932A5654A42B8FF2FD /* Result.swift */, - 9592EFB53207F923F6437A3C62C68380 /* Scheduler.swift */, - 9B0C2DBF17F4C7B9BDEF3C7A6A1AC68A /* Source.swift */, - 34E19E24CBB9D17F40EDA5AD81279187 /* Timed.swift */, - 9EE534DD63BEE73F262AAA76134834AE /* UIAlertController.swift */, - 420FF3077E018E758316104CFD3F6FCE /* UILabel.swift */, - CAE169E2694066FC604FF006EF7C0B84 /* UIView.swift */, - 48BB3DD2F196D91D26891FDA75D2BD5A /* UIViewController.swift */, - 74667AE9BF6BC1D2D143D2B550AD5D12 /* Widget.swift */, - F09B89D360CA5972F43C9A3528F44271 /* WidgetSettings.swift */, - C4FBFBF262EF8C547771327E9CBAE42B /* Support Files */, - ); - path = GCBCore; - sourceTree = ""; - }; - C7E08EC2C4282A825F4016EA3DFBE300 /* Support Files */ = { + D68F1AD5876EB6E30BCBCE4290BFA83D /* Decodable */ = { isa = PBXGroup; children = ( - 9F0B551049B3FFA725BD21FD7F3CA734 /* Info.plist */, - D3DFFF2127EE61C83432C2DBF5BC1635 /* MD5.modulemap */, - 2259A252AD28027C6C2FF2AF57AFD408 /* MD5.xcconfig */, - 338B52C968A713CDBFC6ECDC6F35D535 /* MD5-dummy.m */, - C2A9F8F6FB21DC52EEFF6874F4039FF3 /* MD5-prefix.pch */, - 42CEE2FBEDD6B412ED56466D8D234E45 /* MD5-umbrella.h */, + B7ABC7C2CEE79AAFA7089C70A9AF1C48 /* Castable.swift */, + 5CF2B8A7314E50E09D8FE8893F8E453C /* Decodable.h */, + A4DEC07B1D0191E1652E5589FFD1F250 /* Decodable.swift */, + 6A3AA4341727301E6E94ADD24D5776C2 /* DecodingError.swift */, + 4C04776AF55A3D9D81CEC17B3396978B /* NSValueCastable.swift */, + 613A7CCA2061D9CDB49FCDB9E589F515 /* Operators.swift */, + 8376EBB1AAB5AFB6F53078168D414E3D /* Overloads.swift */, + 658D6D77A9A575CB3A09357D0C84D2C0 /* Parse.swift */, + D6E8DCFB611F2A319D755B358C928B49 /* RawRepresentableDecodable.swift */, + B3C7ABFDB96BEEB6DB94C6B0A5165095 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/MD5"; + path = Decodable; sourceTree = ""; }; - CCEE00222356FDFA48FD690294C7DF61 /* Support Files */ = { + D9760E4BE0D639723785F985604F032D /* Support Files */ = { isa = PBXGroup; children = ( - 484FF5581B7851D7BC5EE639B3848CCC /* Info.plist */, - 15F81C497BC1022D25086A4575DC0ACA /* Nimble.modulemap */, - C112D441AFA83AFCC441357A4BC04182 /* Nimble.xcconfig */, - 1C8DF437B967C48B2799D0C11B3EDE9F /* Nimble-dummy.m */, - FCA8A190868AFFB54602320DF22F7A97 /* Nimble-prefix.pch */, - 5B1C17190E826FCCC1350CEBAE72CF43 /* Nimble-umbrella.h */, + 11682CB7E400282C383F858014D7EDA2 /* CZWeatherKit.modulemap */, + 01BBFA50753DF9DC868E5ADCA7609ACE /* CZWeatherKit.xcconfig */, + A8782DBA67E5A8C42D0054038260C92A /* CZWeatherKit-dummy.m */, + 36F66E62293BDBB56BDAA8AE73934C4D /* CZWeatherKit-prefix.pch */, + 78D2CBE3A3F6E68BC4838C14EC1FEA8E /* CZWeatherKit-umbrella.h */, + E84B2FB3171DD18BBD065C929CBE4254 /* Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/Nimble"; - sourceTree = ""; - }; - D5967D664CEC9D4592C3611BDAEAD36B /* RxSwift */ = { - isa = PBXGroup; - children = ( - C76511FFCA133B2CAC435B0585176831 /* AddRef.swift */, - A7E5E321CBB36DFDD96BB1E762DC1BAF /* Amb.swift */, - A3FE64F781D63931FD33805D6A19B7D7 /* AnonymousDisposable.swift */, - C0694B362772B82E346615AFACCC55C6 /* AnonymousInvocable.swift */, - 89303583EA79D5325EB4CABDE91F7C93 /* AnonymousObservable.swift */, - 54DE443EA916E7B8208B6443471ED1E8 /* AnonymousObserver.swift */, - C6F5A47B4E653728A6E65E0B2D80911A /* AnyObserver.swift */, - DC7D6051817FD398DBE5B64BC489FC32 /* AsyncLock.swift */, - 654334DCA3AF8F143F2CC184B8F2DF01 /* Bag.swift */, - 2A4CF91E474A84D0D193A82F6F55CB07 /* BehaviorSubject.swift */, - 0505683612733DE00917C7398CCA3899 /* BinaryDisposable.swift */, - 2DB476F378A374425A4A872AC041CDB8 /* BooleanDisposable.swift */, - C71E1DED1AD96E5913C7C1ECFB2602A3 /* Buffer.swift */, - 08DF997FD79EED082568D363CF46A416 /* Cancelable.swift */, - E054316752028477F4E2A0D7499B76E8 /* Catch.swift */, - 2D6BEEC76D7B89CA22433364A9C5C669 /* CombineLatest.swift */, - 29AC07BA8148BA2E48CE4896B358690C /* CombineLatest+arity.swift */, - 4564F0D8AD46D32CC82698AC146B3975 /* CombineLatest+CollectionType.swift */, - 3E1329CE692820DBC82618ECB7DB4BF6 /* CompositeDisposable.swift */, - 243E29712E914187F22A3DA707B93579 /* Concat.swift */, - C8354235A4D4FCE6C995FA98D553DCB2 /* ConcurrentDispatchQueueScheduler.swift */, - 424B72FB4E1251C9E64628CF561E7502 /* ConcurrentMainScheduler.swift */, - 4CB763FF006BF4CE837CE79C81B61860 /* ConnectableObservable.swift */, - 047CD485C4EB7D849D0A18EB3B23D827 /* ConnectableObservableType.swift */, - 6631A5868834D5EAD9B4C06769D85BBF /* CurrentThreadScheduler.swift */, - BF5E61BCF6506298A90B96384F50CD80 /* Debug.swift */, - 1F2E0061EF9C23EBE1B0511B20EA3902 /* Deferred.swift */, - 66A1E9C5A5BB0F5E0F446B23075582D9 /* DelaySubscription.swift */, - 81F0D18CBFD293294B88A60B41D2BC49 /* DispatchQueueSchedulerQOS.swift */, - EAC57DDD3B6A4E6699B4ECF73731060B /* Disposable.swift */, - 9C7827056911EDE4374638A37386C98D /* DisposeBag.swift */, - FF0D6FCA301209F5361A64B13CAA1C9E /* DisposeBase.swift */, - 878664DE0B1FBFF4A4E19FD913EC2857 /* DistinctUntilChanged.swift */, - FD64E272659AB5E1C47D5D291AABBD1B /* Do.swift */, - 088983579F518D970ADD12A573EE0215 /* ElementAt.swift */, - 85E52D94983FABC6113E6851BADFA77B /* Empty.swift */, - 90938ED83405035D1F70E6DBEC61ED52 /* Error.swift */, - 94686B7E6FF6537A2D40EC7EE4356BB6 /* Errors.swift */, - C6CFB25333DDA01625BC083D46422610 /* Event.swift */, - CAA5D1B18AFEB88932EDC0F31515D8F6 /* Filter.swift */, - 670D225B87645A98748B2F14B63FED62 /* Generate.swift */, - DF7A7B081E14D4CDA40309F42C5597F4 /* HistoricalScheduler.swift */, - 7B374ECD46A1C0F10A590B5A345A9D39 /* HistoricalSchedulerTimeConverter.swift */, - F78154CA72B7036A0C3AE660A3ACF44A /* ImmediateScheduler.swift */, - 51B3AEE2D84137BABEFE3090EEC91AEF /* ImmediateSchedulerType.swift */, - 7027821F8195805CB696AB998443E551 /* InfiniteSequence.swift */, - 3794978CC83D344729EEAD1B5A8908EA /* InvocableScheduledItem.swift */, - CD4E2E227CA97B375F1F2A4F3AEDA6C0 /* InvocableType.swift */, - 618925624C3466DB58E357543374378E /* Just.swift */, - 33E9BCAD91BD2AF8970D1E11DBEAD846 /* Lock.swift */, - 361095E8F6A8ED8807780F2F59E1797D /* LockOwnerType.swift */, - 00F97EF7B31B1AB6D8660CD5126E9DB2 /* MainScheduler.swift */, - 7F70342C4931C2D9BBA9DA8FFAD98C81 /* Map.swift */, - ECD8DFBD0B607CFA643F1C114AC9D816 /* Merge.swift */, - 727AE1290FAF12BA08FD7A550E8D7D3E /* Multicast.swift */, - B1FAF105DF656E679FAE955379B1C7EB /* NAryDisposable.swift */, - F2B1264CDFB8196810B752BCFF4C016A /* Never.swift */, - 054579884E746ECB4C5FC305596531A0 /* NopDisposable.swift */, - 14707705B018B8390629CD7665D446B1 /* Observable.swift */, - 656A2AD8678482A3414D3183F77340D9 /* Observable+Aggregate.swift */, - 43FEF7F304095D2F947D092F519D7A97 /* Observable+Binding.swift */, - B992CA39CDFBB780484E110A8F54E408 /* Observable+Concurrency.swift */, - 2C655631835C5BC83CF9FFED58FB24D9 /* Observable+Creation.swift */, - 0A21B5763652B63DADA3BEE093E53C90 /* Observable+Debug.swift */, - EE406D411D86E78089ED2F75AC6109AE /* Observable+Extensions.swift */, - B5FCD2BF80B00EA2B659D08B7A46815B /* Observable+Multiple.swift */, - 699CCCB7C1CA24AD04493F18CDC9F062 /* Observable+Single.swift */, - 3FFD1B43174636A84FACDDAB8CF62BAF /* Observable+StandardSequenceOperators.swift */, - 126086E8A60B843731A48BD92BA7C1B2 /* Observable+Time.swift */, - 080A2D287ABAEC0E4250F062CCD0E3AF /* ObservableConvertibleType.swift */, - E139E09ECC387B79C8B3E493E000056A /* ObservableType.swift */, - 7CEA6C9B4E5D0E5A245DD6FD695F4691 /* ObserveOn.swift */, - 33499355C23055D0C81B487ECC2F4C19 /* ObserveOnSerialDispatchQueue.swift */, - 90E2606B214596E576925F344EA99452 /* ObserverBase.swift */, - 196EA3D7ACD96B9D58A9B7200FFB78EE /* ObserverType.swift */, - 8738E6C0FC1210F12E30887AAAB21858 /* OperationQueueScheduler.swift */, - 278DD143D24D8A2D70FBDC773976DC9A /* Platform.Darwin.swift */, - 366B28F41D087F6D3BAF2A90EAAFA9C2 /* Platform.Linux.swift */, - 56209112FFAA7959D3C924E180FE1950 /* PriorityQueue.swift */, - 4B58283BF1679F8F3C82EBA0A13E57A0 /* Producer.swift */, - 38DA258D07BD4ACEC35B7AEED3118AFC /* PublishSubject.swift */, - 0702AA5CCE53C3AA8C77E5E7A9B38EEB /* Queue.swift */, - 2BC99850F40144B9BABF9E36B45A86A9 /* Range.swift */, - 30B261E26FBC95C7600074D38D6C0723 /* RecursiveScheduler.swift */, - 0CCC5E8E3D1D9967BF0D4557CABE09F0 /* Reduce.swift */, - 94A20C9F8C5A7D02C65E08F326850363 /* RefCount.swift */, - 0098246CEF148429C08ABDEC6E2E134D /* RefCountDisposable.swift */, - 62F82CC65D29391C34411995CC23DD88 /* Repeat.swift */, - BF9532E97AB69116452446FF01F58BD6 /* ReplaySubject.swift */, - 27CBC2416FF98421A1410607FE63520E /* RetryWhen.swift */, - 43D973208A5BCC2362649DE6FB02A308 /* Rx.swift */, - F4D203B546C0857472259FCF23DC704A /* RxMutableBox.swift */, - 8430739C0E5FD7941AF5B53361C6A3DB /* Sample.swift */, - 4F86F574BE165FEAD4E328BC234385E7 /* Scan.swift */, - 05DB1EF6050467A624EFFCEF7BA91B7B /* ScheduledDisposable.swift */, - B85D3383A939BF7A9C409316485EA4C5 /* ScheduledItem.swift */, - 555E03487B8F7AFA3C966A5D1AF497F9 /* ScheduledItemType.swift */, - A206A4461DA25ECB5BAFC0BCE07D6C92 /* SchedulerServices+Emulation.swift */, - 43454B0B140E7602BC3C29F257F610FB /* SchedulerType.swift */, - E3BFAB75F8B8758E22D852231FD6CE9D /* Sequence.swift */, - 47A11C7A571B36FBB0D5A54A8113922D /* SerialDispatchQueueScheduler.swift */, - 65A68EB6B358030C82FEC0C04F2AFF07 /* SerialDisposable.swift */, - BF88BA6855E6B0C0B114D0DB99158B79 /* ShareReplay1.swift */, - 2AC48836565045F88CF0E2484AC01411 /* ShareReplay1WhileConnected.swift */, - 01485D785B55C1C38130F3D23C9CEE39 /* SingleAssignmentDisposable.swift */, - E77192C2ECF1B42A0E3703A82C494CE5 /* SingleAsync.swift */, - EDBEBF19368AA4D5A79D7533E17F500D /* Sink.swift */, - 30FD4600467B1A5E1CBB314767D50398 /* Skip.swift */, - E08EC309EACF58564BECA58803892951 /* SkipUntil.swift */, - DE99478EB0EB9C59C53A558F94850DC5 /* SkipWhile.swift */, - CA2DFA4D1AB5E2524A83D96E1E78001E /* StableCompositeDisposable.swift */, - 48ADC7B2AB8E3AA9401F71A80D5C218F /* StartWith.swift */, - 10967286AC85DF60283B1FF8F6AD9818 /* String+Rx.swift */, - 7F34B1087835AD1C1820FFD8B2B873D4 /* SubjectType.swift */, - 609E6D219205D48AB275B8E3EB7B6E59 /* SubscribeOn.swift */, - 272C4C52643025573021F5DF6467CDA2 /* SubscriptionDisposable.swift */, - F6237C1D8BE2A9D0597C84A2EEE23CC4 /* Switch.swift */, - 156E2C2D99ADB6F18FF5CE2E77DC5C1D /* SynchronizedDisposeType.swift */, - 625EE20C48945234E6D9076BF18B11E3 /* SynchronizedOnType.swift */, - 47062B7CD13E89BF17A175DDB1DF7611 /* SynchronizedSubscribeType.swift */, - FE3DEF5E733AC410BF3CA0A1FCBF110F /* SynchronizedUnsubscribeType.swift */, - DFA24992E5E49BECD9EA4EA8717E6A78 /* TailRecursiveSink.swift */, - 10DAE749EBDFEB3FABD39564A5FD73A3 /* Take.swift */, - A9F2A27B2BA2F6778DB33990D771C6F9 /* TakeLast.swift */, - 3F6D1E341D943A7B479D39D47A4E741B /* TakeUntil.swift */, - 5069A62D7A27A00BD41324F081844E16 /* TakeWhile.swift */, - DE47631E7E66CC87A9868F9F8812A57F /* Throttle.swift */, - 1FD6908905B7449D4B93B7B1FBAC042C /* Timeout.swift */, - C69BB1D5761428E835DD801725E5D2E7 /* Timer.swift */, - C101944E1C3B3E6CAE67312F890C8680 /* ToArray.swift */, - C46A969E7AAFF26141FFE7EC2669EA13 /* Using.swift */, - 34C881F73539227FEB265497F95D90A4 /* Variable.swift */, - E5C4D585C39F5968F8EB9276D93A4747 /* VirtualTimeConverterType.swift */, - A328BD481B280A4580739FE8FCC46B1A /* VirtualTimeScheduler.swift */, - FFEC79442BEC41FEE0350735CBD50560 /* Window.swift */, - 3A6E9399F96ED325C10CC4F01AD4FD2D /* WithLatestFrom.swift */, - 70A6A16FEA4D781FF6A04DAD6EE1F6CC /* Zip.swift */, - 73DE84DEEA9C6C16606B6CA4B6D43887 /* Zip+arity.swift */, - 729F07197B32A2B1C4050D9BC9F2ACD6 /* Zip+CollectionType.swift */, - 15DC3893A14BEBE272B5AC38D1215B46 /* Support Files */, - ); - path = RxSwift; - sourceTree = ""; - }; - DB90717D11B852D60DBEDD6907B675ED /* OHPathHelpers */ = { - isa = PBXGroup; - children = ( - 72F4129424A3C0CE2400EAD1C0BB3437 /* OHPathHelpers.h */, - 22D31D636C4F27D80DA5D066D4CCCC24 /* OHPathHelpers.m */, - ); - name = OHPathHelpers; - sourceTree = ""; - }; - E3F7C8057108BEEB8D8AAE14357924A3 /* JSON */ = { - isa = PBXGroup; - children = ( - 0C67182A2965A811DBF189CFB9D77162 /* OHHTTPStubsResponse+JSON.h */, - E26AFBAB2D0235E99AEC25CAC3DB45FC /* OHHTTPStubsResponse+JSON.m */, - ); - name = JSON; + path = "../Target Support Files/CZWeatherKit"; sourceTree = ""; }; - E431895C5FCE56E803D2DE695C3BF316 /* Nimble */ = { + E162CA1CF6726C8DFCE33DA88849CCF8 /* RxSwift */ = { isa = PBXGroup; children = ( - 6036ECE82E59973F5A261B47C9070A78 /* AdapterProtocols.swift */, - 243ACC1C68D1C750FC91973EBB66A440 /* AllPass.swift */, - D799904C9EA3619A5A17D1426432623B /* AssertionDispatcher.swift */, - 0275A8DAEDC8E1C2ECDC89F8E6F9075D /* AssertionRecorder.swift */, - 7EE29A44B3A9D9ADBCFB06B96CC77DC7 /* Async.swift */, - BFF6DC3373AADB5CE157ACF7115F4F6A /* AsyncMatcherWrapper.swift */, - 004DF151CB42D6DA46EAC5677831C9CD /* BeAKindOf.swift */, - F8244EDB1D4B13650D89E340FDFA70C2 /* BeAnInstanceOf.swift */, - 7AF9DA9CE305FF472D0040BFBE470D9F /* BeCloseTo.swift */, - 7C665482DB2D2FD2074F755E00C0DA04 /* BeEmpty.swift */, - 18F2146458ADFA010E48CE4248449496 /* BeginWith.swift */, - F66D37D3EB8401B1CB857F8B570DBF2A /* BeGreaterThan.swift */, - 7AA54EDA1AE20F9361C74BCAF35894F0 /* BeGreaterThanOrEqualTo.swift */, - 084AD6CA1A566487FD2F4977064387CF /* BeIdenticalTo.swift */, - 9AAFB418A9C7CF9C11CD2CC841684049 /* BeLessThan.swift */, - DE493C5D29E5887CDB85B7DE9A8F7358 /* BeLessThanOrEqual.swift */, - 2006D43F29038181B69A03A8832AF366 /* BeLogical.swift */, - 8C7392247101398C4A7CA1DF6F6BB1B2 /* BeNil.swift */, - 1F09DB2B41BEED0B4863A66D01016110 /* BeVoid.swift */, - 27C84AE0538A9EA1FEECFCCF0EE65139 /* Contain.swift */, - 902FD2C17FBC2DC30E782D064596F970 /* CurrentTestCaseTracker.h */, - CB60DA630A1053BC451C2F4A15DFF095 /* DSL.h */, - FF2F7CBADE93427AA24638911829C80B /* DSL.m */, - 5CE81ADE336CB9BF0DF76A2979A8FA99 /* DSL.swift */, - 3173B6C58976BE983BB940B79A782D26 /* DSL+Wait.swift */, - 7124A8B55899A0443DC62BCE0C5ADBEF /* EndWith.swift */, - B93194A078C07629874A611D5E0F2131 /* Equal.swift */, - 5F7607F0A37A9C3D307BFF1EE61FB025 /* Errors.swift */, - EA4182174CFF0387C1D1308D61F3D220 /* Expectation.swift */, - 4AB6CD7D5FFE6F59C03229692518D51C /* Expression.swift */, - 959B210516FD6BEF8AC80BB36E70D709 /* FailureMessage.swift */, - F1116CFDC279C354DAC3E5E13F6C4630 /* Functional.swift */, - CC5EAF42306F6ED9FDAB9060B22A1B68 /* HaveCount.swift */, - A8E8D411F3AD640A9350A023E31F0F5A /* Match.swift */, - 0CA8F0B84E4EDE03926FA1C802F2C0D7 /* MatcherFunc.swift */, - 74FEBFE4CEFAA892F23B67A5AA68D237 /* MatcherProtocols.swift */, - 38D333ACDABF2AD5333AE3910BC7549D /* MatchError.swift */, - 1D67DE31CE739F3354D20181C30A844E /* Nimble.h */, - 4A4A7CF5B0F7FC7AE39B9B1FF550786E /* NimbleEnvironment.swift */, - 1138B4C8AC394CC7D4E0615A95B70EF4 /* NimbleXCTestHandler.swift */, - 7A0F6357BC37F4E87953873630A11AEE /* NMBExceptionCapture.h */, - 2DE27FC17C82093E8FD803ACBF9A1515 /* NMBExceptionCapture.m */, - 08343499F164DF0A6B9782FD77924A09 /* NMBExpectation.swift */, - 5C81BAAF645203FA593B6ECFAE22DCE9 /* NMBObjCMatcher.swift */, - B32C6D311DD3EA40771854D6946470B0 /* NMBStringify.h */, - 2FDCB9B1A2B0C2F7DC927B2E4220B1B9 /* NMBStringify.m */, - 7C66F697F0481E963E77BE6EAE22A90F /* PostNotification.swift */, - 597F5D3B60CF635EE33D82348D8589AF /* RaisesException.swift */, - DCB3BE55A9F7B00484A23E490F3458E7 /* SatisfyAnyOf.swift */, - CAE5EDB48F3F0DFB7CAD33A79A5508E5 /* SourceLocation.swift */, - C69036EEFF9C18B2D82B1596D71AC269 /* Stringers.swift */, - 82EA5EB0A9CA77D8E959BFE4C58DD252 /* ThrowError.swift */, - 51A5BB0934C50FA5E10B76DD47E10299 /* XCTestObservationCenter+Register.m */, - CCEE00222356FDFA48FD690294C7DF61 /* Support Files */, + F0629525A3DF3096A540E8D6B18A26C3 /* Moya+RxSwift.swift */, + 84BD96EC5D0AFE3B211580ACF4B13195 /* Observable+Moya.swift */, ); - path = Nimble; + name = RxSwift; sourceTree = ""; }; E9DD34CF730C0096009EFCA283DBDB0A /* Targets Support Files */ = { @@ -2150,20 +2459,6 @@ name = "Targets Support Files"; sourceTree = ""; }; - EAC905B09D1C1D6AEB8F3BA1D7D6DF46 /* Support Files */ = { - isa = PBXGroup; - children = ( - 21845DA703DA23ADC2D8891949F80F39 /* Info.plist */, - 404209F485814F76C74826EBA339F062 /* Moya.modulemap */, - 3F72F736B81A5AB31E6F2DB9734F937A /* Moya.xcconfig */, - 86C4319B94A7ADE4BD2F133F0F116B98 /* Moya-dummy.m */, - 7861F70B550B33280882A5ABF8F4ED88 /* Moya-prefix.pch */, - 273BB47540EA1B4E6A25258BDD9A02FB /* Moya-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/Moya"; - sourceTree = ""; - }; F126F159B677CBB7475E468A44A09E01 /* Support Files */ = { isa = PBXGroup; children = ( @@ -2179,25 +2474,18 @@ path = "Pods/Target Support Files/GCBUtilities"; sourceTree = ""; }; - F8F3CEF6553CCE12A0F8A29DB18D5E0F /* Core */ = { + F462566D3E363D98A13A12EB010059EC /* Support Files */ = { isa = PBXGroup; children = ( - F2C1B693C5FBBEC0F7202281D32555B2 /* FBSnapshotTestCase.h */, - DF902E50CFDC72C52AC9C6DA943DAF11 /* FBSnapshotTestCase.m */, - 5DCC50731144D700AC8FB353AB968338 /* FBSnapshotTestCasePlatform.h */, - C4AA5A6E73E26D410EA10E661DBD32CD /* FBSnapshotTestCasePlatform.m */, - A28A8ECD3356DBC4004B238913411FF2 /* FBSnapshotTestController.h */, - C1AE3BF16DC25132E16C491CDB94A22C /* FBSnapshotTestController.m */, - ACB4B5794215AECC2671801807A5357E /* UIApplication+StrictKeyWindow.h */, - BEC36BDAC8B8A60ED3D1727B77655322 /* UIApplication+StrictKeyWindow.m */, - 97CEAD5E0811065D8913E9400975A45D /* UIImage+Compare.h */, - 58D7DCE768F0667C29C71C4C75097D86 /* UIImage+Compare.m */, - 5451C904DBE00AB51DB2A41C5365D739 /* UIImage+Diff.h */, - B229B9D78265484D2AC97E454227CB1A /* UIImage+Diff.m */, - CBA3A9F15C3C9E819BE5AF38121BCA9E /* UIImage+Snapshot.h */, - B2773C6E5437B3DB81EE9FB4929ACFC5 /* UIImage+Snapshot.m */, + BDE43FF22BE9FD0C1BD31A02B953B430 /* Info.plist */, + E8E60DACA0D5472FC3825A1A1C3D2CBC /* Operations.modulemap */, + 1F82A5C655E786E01E02F90C77D352C8 /* Operations.xcconfig */, + 8EA96CA7DAA8AACFFD3242E2D9DB09A3 /* Operations-dummy.m */, + 8CEAE1E84DAEF699FC2EA620DCF50831 /* Operations-prefix.pch */, + EA3938366EE68736562D0E2E13B4D3C8 /* Operations-umbrella.h */, ); - name = Core; + name = "Support Files"; + path = "../Target Support Files/Operations"; sourceTree = ""; }; FC6365B346CCBE66BDA7AE15F985C726 /* Utilities */ = { @@ -2212,17 +2500,17 @@ path = Utilities; sourceTree = ""; }; - FF9B8AD918D6DC76AE51D3EDDD3DE3D9 /* SwiftSupport */ = { - isa = PBXGroup; - children = ( - 06845F1C5205A28F6CA5A8BCB9E0A0F7 /* SwiftSupport.swift */, - ); - name = SwiftSupport; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 087D5A25E11E70B52D5EF478EBF72CC8 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1657B36950BF0E6580ECCC9CFA6E6147 /* Starscream-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 0AA9BDD2EE167077970D198258CF5519 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -2234,32 +2522,16 @@ 68B245DB47CA60F8F9ADCA1E8CCDC324 /* UIApplication+StrictKeyWindow.h in Headers */, EAA652557B70F493923A3447B5D64E0D /* UIImage+Compare.h in Headers */, 61EBC5CF0D5E065C88028B49C6B8D3B3 /* UIImage+Diff.h in Headers */, - 34A1C7E576C58A9D3F3101448308BF3E /* UIImage+Snapshot.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0B2EFDE20E72749C0F83F1BDF739794E /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 15D58D88F02BFA12E514AB9B95AE1089 /* SlackKit-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 28529079BF4EED15B5B1B1549FF09A5F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - A5D84DB3FD86F22F0E206CE7C2C138DF /* Decodable-umbrella.h in Headers */, - 41BCE7C53124EDAB0C0B27BDA0195450 /* Decodable.h in Headers */, + 34A1C7E576C58A9D3F3101448308BF3E /* UIImage+Snapshot.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 43C3ECF28B3B3AF6CDB7B4984BC20675 /* Headers */ = { + 28529079BF4EED15B5B1B1549FF09A5F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3A193123D41E3D7B54CDFB726643EF1D /* Starscream-umbrella.h in Headers */, + A5D84DB3FD86F22F0E206CE7C2C138DF /* Decodable-umbrella.h in Headers */, + 41BCE7C53124EDAB0C0B27BDA0195450 /* Decodable.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2303,6 +2575,67 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9B29CC9492F07C5A083F4370ACAC6065 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B7A3A78987EF2EEF046256A63B931250 /* CZClimacons.h in Headers */, + CF85690B5FC29B62E35A9D851217EF11 /* CZForecastioAPI.h in Headers */, + 4254E471521DEC0FF06959669221B0BB /* CZForecastioRequest+Internal.h in Headers */, + 1D3A110B0386158975B14A393F987BBF /* CZForecastioRequest.h in Headers */, + 042ABDD937EFB0948FEDBEBD71AFEA1D /* CZOpenWeatherMapAPI.h in Headers */, + 1E51AE3232EDC2BF8D8AA5F4098443B5 /* CZOpenWeatherMapRequest+Internal.h in Headers */, + A1ABF2BD945A09D6559CB0B17CCD7710 /* CZOpenWeatherMapRequest.h in Headers */, + A7AD3B0CD4AB123002B4F70D9C567F24 /* CZPINWeatherDataCache.h in Headers */, + 73CF110EC0A789BFA7F55D4961EFCEBA /* CZWeatherAPI.h in Headers */, + 79414B89929A286D62172E21E7FF2093 /* CZWeatherCurrentCondition+Internal.h in Headers */, + 9787D556F832CD3DE69D29FBA3F096D8 /* CZWeatherCurrentCondition.h in Headers */, + CC5CB7206240B42C01F58A6D66C4AFF5 /* CZWeatherData+Internal.h in Headers */, + 06790EC112F6D2CF69798025878CC187 /* CZWeatherData.h in Headers */, + 4DE76C3FAE89ACA45F1A90392717047C /* CZWeatherDataCache.h in Headers */, + 9993D01B066727888935A0699FF4FB73 /* CZWeatherForecastCondition+Internal.h in Headers */, + 64B7A9F6A1C0284F15F2A2F62278C6CB /* CZWeatherForecastCondition.h in Headers */, + B909A1689530C0EDDC2E03A5F29A2652 /* CZWeatherHourlyCondition+Internal.h in Headers */, + 68B4917E1F9928EE518E809229C8B7AE /* CZWeatherHourlyCondition.h in Headers */, + 369FBCB8511B64930CF03C3497830E8B /* CZWeatherKit-umbrella.h in Headers */, + 7C772FC3912BF34398E6209EB1BC420B /* CZWeatherKit.h in Headers */, + 8D5E5A1CD5C388BFDD3C5773514BF35F /* CZWeatherKitInternal.h in Headers */, + AE7952D37E0DA1D99305195E317349B3 /* CZWeatherKitTypes.h in Headers */, + 0805CB8726C7D1937B13B59A5EAC67F4 /* CZWeatherLocation+Internal.h in Headers */, + 7204DFA5FC3993A50B94513709953A01 /* CZWeatherLocation.h in Headers */, + B2E0CA6E237C71687C99AFBDACD9A97E /* CZWeatherRequest+Internal.h in Headers */, + 146B835DE97CCD70A8CDFD4D9286B00E /* CZWeatherRequest.h in Headers */, + 4DE09ED206F7615C60AEAF43DFBC309E /* CZWeatherService+Internal.h in Headers */, + 61B49EB8612799226013F77A13B4082F /* CZWeatherService.h in Headers */, + A66AE0842F4CA9486488BE82C11E0F8E /* CZWorldWeatherOnlineAPI.h in Headers */, + 5C40AA54FA7400F89EBE098691962EE6 /* CZWorldWeatherOnlineRequest.h in Headers */, + 72E173DFDEDBD78FDCE7F689DA68D478 /* CZWundergroundAPI.h in Headers */, + E296C38B9A19042E0A17CE0A6B0BF68E /* CZWundergroundRequest+Internal.h in Headers */, + 963AAF6D5C1D701B3DFDE511B3B826E8 /* CZWundergroundRequest.h in Headers */, + 5F0227E6C892590D065BC5848A0F8820 /* NSDictionary+Internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A772716508D9CD93037ECA0A5A073A12 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3DAE99BA407D66AC3AF45B46F71621CF /* Pods-GrandCentralBoard-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A7A52BC0007DDD5D1DBC14475B145D9C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0B011BE0E9CC13471125CA0CEECBFC35 /* Nullability.h in Headers */, + 85A49483A4350107A564B9A39730FA72 /* PINCache-umbrella.h in Headers */, + 90A9A28DC809318792F23BBC482843CF /* PINCache.h in Headers */, + 4EDC7BEB9DA2DF41C48E95FDC45D9719 /* PINDiskCache.h in Headers */, + AF5908B01CCF82A54BC12F2122DCB502 /* PINMemoryCache.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; BD99C459C3DBD3049CE296A25311EC02 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -2332,11 +2665,11 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E5F1D391C90CAA14506A397ACD2804DA /* Headers */ = { + E77376997FF232EEDD6BC75461F276CA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 291241E5896A174AFE8AC26F8BA4D6F0 /* Pods-GrandCentralBoard-umbrella.h in Headers */, + 60BADE62C42A9AD4686D000644019860 /* SlackKit-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2394,7 +2727,7 @@ ); name = GCBUtilities; productName = GCBUtilities; - productReference = EB68C258F5AAD17B492167054C183F2A /* GCBUtilities.framework */; + productReference = B3A249D63E560DB4C6E1D169185FB815 /* GCBUtilities.framework */; productType = "com.apple.product-type.framework"; }; 17965599DFB5C5C7D9D34C79C6F29C8C /* GCBCore */ = { @@ -2413,7 +2746,7 @@ ); name = GCBCore; productName = GCBCore; - productReference = 74444A4F8955D35CE2CC9010002176AB /* GCBCore.framework */; + productReference = A4B77F8A3824C1281EB8AC7257CCAA26 /* GCBCore.framework */; productType = "com.apple.product-type.framework"; }; 31EE77A896058E13866BD0D9E07513C0 /* GCBUtilities-GCBUtilities */ = { @@ -2430,7 +2763,7 @@ ); name = "GCBUtilities-GCBUtilities"; productName = "GCBUtilities-GCBUtilities"; - productReference = 33CE35817B078DD24A00BF6C81868FA7 /* GCBUtilities.bundle */; + productReference = 36ED0255D8D91A9B630BAD0F600C7402 /* GCBUtilities.bundle */; productType = "com.apple.product-type.bundle"; }; 40FF1C77152F384080A1A02E90A36DA9 /* Nimble */ = { @@ -2447,7 +2780,7 @@ ); name = Nimble; productName = Nimble; - productReference = 3C240764FD41F48F6A3FDB326A7665F3 /* Nimble.framework */; + productReference = 517DD957A2AD0B3931B32025E094F61A /* Nimble.framework */; productType = "com.apple.product-type.framework"; }; 5DB46EA499F9A5E22765121102FCC34B /* FBSnapshotTestCase */ = { @@ -2464,7 +2797,25 @@ ); name = FBSnapshotTestCase; productName = FBSnapshotTestCase; - productReference = 95100EE29A3E87352B9004C46201C1E2 /* FBSnapshotTestCase.framework */; + productReference = 871B3F1A8E23448CBC8FC2BEC3B48F2C /* FBSnapshotTestCase.framework */; + productType = "com.apple.product-type.framework"; + }; + 6618B30786139FCD27E1CF439C61FF20 /* CZWeatherKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = C17A8BBC4EF011A9633A7CA18860D4F4 /* Build configuration list for PBXNativeTarget "CZWeatherKit" */; + buildPhases = ( + 188555574C1B19139944115CE3B9A3AA /* Sources */, + A818114274DECFB9B744144080BA4850 /* Frameworks */, + 9B29CC9492F07C5A083F4370ACAC6065 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + C58B4189B6A442C5CF1D3F19B5EBB496 /* PBXTargetDependency */, + ); + name = CZWeatherKit; + productName = CZWeatherKit; + productReference = 454746958637E6F6CDB8BE29767120E2 /* CZWeatherKit.framework */; productType = "com.apple.product-type.framework"; }; 72FACBE41A020F340B06DAFCE4E4ADFB /* Operations */ = { @@ -2481,7 +2832,7 @@ ); name = Operations; productName = Operations; - productReference = D4C4C2BA9F8D3B0F472D142EF722BD37 /* Operations.framework */; + productReference = 3528E822582F7330CE6CC4DB58E7A97A /* Operations.framework */; productType = "com.apple.product-type.framework"; }; 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */ = { @@ -2498,7 +2849,7 @@ ); name = Alamofire; productName = Alamofire; - productReference = 082F91A197BBD89DE9D349655EBCDB52 /* Alamofire.framework */; + productReference = 9CD2C7C0CF7D6C73A49DB4F009D02CAB /* Alamofire.framework */; productType = "com.apple.product-type.framework"; }; 819D98B2274D0D02398DA2FD14346272 /* OHHTTPStubs */ = { @@ -2515,7 +2866,7 @@ ); name = OHHTTPStubs; productName = OHHTTPStubs; - productReference = CC119C8B59A97490BBC8102E8BE61433 /* OHHTTPStubs.framework */; + productReference = F1011C8071865C86AB9DF7B68CFE5AC6 /* OHHTTPStubs.framework */; productType = "com.apple.product-type.framework"; }; 88A834E5DEFA567D840BB841A29192EE /* Pods-GrandCentralBoardTests */ = { @@ -2535,7 +2886,7 @@ ); name = "Pods-GrandCentralBoardTests"; productName = "Pods-GrandCentralBoardTests"; - productReference = 06F48A41222F6C813CDBD904BCEDD130 /* Pods_GrandCentralBoardTests.framework */; + productReference = C463632345D526E24B0B68636C13B397 /* Pods_GrandCentralBoardTests.framework */; productType = "com.apple.product-type.framework"; }; 93DDB4D07205258016E6779F2667E665 /* Moya */ = { @@ -2555,7 +2906,24 @@ ); name = Moya; productName = Moya; - productReference = F822E0BA5B9339261A00FEE5D55ED142 /* Moya.framework */; + productReference = EA9FE8512D3D4042B9677A147A46808C /* Moya.framework */; + productType = "com.apple.product-type.framework"; + }; + 9B616DC0DEE9F1BD8E924286299E95F4 /* PINCache */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D2A8BB3E8F13BE97A92A47E9C75D4C1 /* Build configuration list for PBXNativeTarget "PINCache" */; + buildPhases = ( + 2E553F747B95411DDB04B1EC735B2422 /* Sources */, + 2603A4C972E4F74BF1E72C62073E81DF /* Frameworks */, + A7A52BC0007DDD5D1DBC14475B145D9C /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PINCache; + productName = PINCache; + productReference = 7364E548EB7CF488B2E24FBDDBBE8451 /* PINCache.framework */; productType = "com.apple.product-type.framework"; }; A0933FC1307AD48F89C9FB7CEA3C29C5 /* RxSwift */ = { @@ -2572,7 +2940,7 @@ ); name = RxSwift; productName = RxSwift; - productReference = 576AF4FE3A7B0179C0DD82C352325723 /* RxSwift.framework */; + productReference = 80CCF5E0F068882E97186C4A79621628 /* RxSwift.framework */; productType = "com.apple.product-type.framework"; }; A64350DBC118ED8CC0C6B2717CB47F6A /* MD5 */ = { @@ -2589,70 +2957,55 @@ ); name = MD5; productName = MD5; - productReference = 7B0565220ED25AC3B95D95473DB9E999 /* MD5.framework */; - productType = "com.apple.product-type.framework"; - }; - B5C2C964DE3BBD30C5A05306754CFA47 /* SlackKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6C1D90A737201201CA0E16199C1F2B1B /* Build configuration list for PBXNativeTarget "SlackKit" */; - buildPhases = ( - 1693C3608C529CA48C33086379C7F591 /* Sources */, - 3C41B498F300DC84CED0BB04FAB43D1B /* Frameworks */, - 0B2EFDE20E72749C0F83F1BDF739794E /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 183039152AFA682D46AD84D6499DBD16 /* PBXTargetDependency */, - ); - name = SlackKit; - productName = SlackKit; - productReference = 79FBA3F4394BB499147E004222AAE9F9 /* SlackKit.framework */; + productReference = 56C28A1442CD872F8853F7458CC7265B /* MD5.framework */; productType = "com.apple.product-type.framework"; }; - C0E6A761E0719C9BFF3444E16856AB45 /* Pods-GrandCentralBoard */ = { + C73070CACB673E5B9F8D87DFE6D625F7 /* Pods-GrandCentralBoard */ = { isa = PBXNativeTarget; - buildConfigurationList = 53192FFC1ED57C8C6A2831B3279707C2 /* Build configuration list for PBXNativeTarget "Pods-GrandCentralBoard" */; + buildConfigurationList = 383BB257667A9675259BC58225359249 /* Build configuration list for PBXNativeTarget "Pods-GrandCentralBoard" */; buildPhases = ( - 40DB14BF8041685FDB48D5985978416F /* Sources */, - 606D98C4DB15D13177E55117A92FFBE2 /* Frameworks */, - E5F1D391C90CAA14506A397ACD2804DA /* Headers */, + F324313E9C9A231220C5B0EB168C50DF /* Sources */, + A83C8B43085288EC1793F83B2853B471 /* Frameworks */, + A772716508D9CD93037ECA0A5A073A12 /* Headers */, ); buildRules = ( ); dependencies = ( - 67C38383ED8946D902F2046FFDF4738D /* PBXTargetDependency */, - C72A338CA1E0093C94ABF8A26DDA0F20 /* PBXTargetDependency */, - 4F42107FC96E1FD1860087E8C38E34BF /* PBXTargetDependency */, - 043E75A88DDF52253297ED9D21B0DDB7 /* PBXTargetDependency */, - 3C3903E0891F59B2CEB9EFE961E23C0B /* PBXTargetDependency */, - 0702F1087F8C4BB4022B4091B7EBC0A0 /* PBXTargetDependency */, - F269B8813E8824EAB6462BC2EC8EC2E5 /* PBXTargetDependency */, - 9767D0152CD5F11FBF6D6380C0BE5849 /* PBXTargetDependency */, - DDF4A9A51ACC4A104AFD2124B06564E1 /* PBXTargetDependency */, - 38469A9E19019D81DC22A25296CC2799 /* PBXTargetDependency */, - 0866FF5EE2AB46A383F21C654E8453F9 /* PBXTargetDependency */, + B59C59B24AD9BD9EFC83F0B4B4C63DF5 /* PBXTargetDependency */, + 12A7823011B16F5CEA802BF70A440019 /* PBXTargetDependency */, + 2AB97BD14257D2E3055BB0A86E0F390C /* PBXTargetDependency */, + BABB41A5B7A0BBBF766E5399B5EB1B89 /* PBXTargetDependency */, + F1BEA8EAAEF2E44782654A23C2618B8D /* PBXTargetDependency */, + E01BE9593C72A5E597199D8D43BD6093 /* PBXTargetDependency */, + 4D9BB9EA835AE1ABDC2F51E0A0A90CEA /* PBXTargetDependency */, + 6CEE02CB8CB36E3248F028212E10914C /* PBXTargetDependency */, + F852206A21BA85420C674768A98F4D1C /* PBXTargetDependency */, + 1D4EE98237CB48618F252B40FC4CF74A /* PBXTargetDependency */, + D978FE9129252A19DA33342E6B6083B4 /* PBXTargetDependency */, + 7302D49838F01F0B0ECD41E7ED3D3072 /* PBXTargetDependency */, + C702B686A02A5121F8FF68340C316940 /* PBXTargetDependency */, ); name = "Pods-GrandCentralBoard"; productName = "Pods-GrandCentralBoard"; - productReference = 7BF0705DA3715365B1EC4D085BB7E3C1 /* Pods_GrandCentralBoard.framework */; + productReference = A39C0A6267E4E32CA93DFADAA0D7F1C0 /* Pods_GrandCentralBoard.framework */; productType = "com.apple.product-type.framework"; }; - D8F2187273FA7F9F6E3BD58A2808C5EA /* Starscream */ = { + DB836EF658BF1BEF3AABC0A95C67D32D /* SlackKit */ = { isa = PBXNativeTarget; - buildConfigurationList = 21D96D8FC32F1025825D4F46744FAF93 /* Build configuration list for PBXNativeTarget "Starscream" */; + buildConfigurationList = FFE9DAE9816459A4D65A150B9904DFDF /* Build configuration list for PBXNativeTarget "SlackKit" */; buildPhases = ( - 991AD71495B6F2BF051ECAECB14DAF6F /* Sources */, - C57DCC79BA2F080CDBC0F17B10232670 /* Frameworks */, - 43C3ECF28B3B3AF6CDB7B4984BC20675 /* Headers */, + 27F8A10C595DD2DD777E11BAF441BFD6 /* Sources */, + B11D44533C846811EBD04B6261AC8980 /* Frameworks */, + E77376997FF232EEDD6BC75461F276CA /* Headers */, ); buildRules = ( ); dependencies = ( + AC3885E311FE104A443D0F6FEA690619 /* PBXTargetDependency */, ); - name = Starscream; - productName = Starscream; - productReference = 6802EBC2D159B9560CFAD2FC68480C41 /* Starscream.framework */; + name = SlackKit; + productName = SlackKit; + productReference = 382BEC7A71126A1C030A5C0948E1C1BD /* SlackKit.framework */; productType = "com.apple.product-type.framework"; }; E5678FC69B99077E1972D149186B2285 /* Result */ = { @@ -2669,7 +3022,24 @@ ); name = Result; productName = Result; - productReference = 1ED0D2A65F9DE3F40F83838F5E53B1D0 /* Result.framework */; + productReference = 5890C7E12E9F9FD6D7A97B00E9FFC50B /* Result.framework */; + productType = "com.apple.product-type.framework"; + }; + F42B8723517C277F9A7CD257D0937E0F /* Starscream */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0C8CA11931EE18F7EFD065BBE5F73D9C /* Build configuration list for PBXNativeTarget "Starscream" */; + buildPhases = ( + FE7C87182562E12651CE11FCCEB2B170 /* Sources */, + 12CEE24499F34EF6FCAE5CC758BC6E20 /* Frameworks */, + 087D5A25E11E70B52D5EF478EBF72CC8 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Starscream; + productName = Starscream; + productReference = F66EC9FDC10F328014316601575DCBDF /* Starscream.framework */; productType = "com.apple.product-type.framework"; }; F610C0EEE17F801D1399A44316DF9DD3 /* Decodable */ = { @@ -2686,7 +3056,7 @@ ); name = Decodable; productName = Decodable; - productReference = B0102A57BF2F88BE2B13B155EB62B6AC /* Decodable.framework */; + productReference = BE0DBA3C3EA8D5D046FC843742B21067 /* Decodable.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -2706,11 +3076,12 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 6850F8D95DDC3A1A9735329CC9F772A7 /* Products */; + productRefGroup = 46DAA05AC457FB486F8CBF81300759EF /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */, + 6618B30786139FCD27E1CF439C61FF20 /* CZWeatherKit */, F610C0EEE17F801D1399A44316DF9DD3 /* Decodable */, 5DB46EA499F9A5E22765121102FCC34B /* FBSnapshotTestCase */, 17965599DFB5C5C7D9D34C79C6F29C8C /* GCBCore */, @@ -2721,12 +3092,13 @@ 40FF1C77152F384080A1A02E90A36DA9 /* Nimble */, 819D98B2274D0D02398DA2FD14346272 /* OHHTTPStubs */, 72FACBE41A020F340B06DAFCE4E4ADFB /* Operations */, - C0E6A761E0719C9BFF3444E16856AB45 /* Pods-GrandCentralBoard */, + 9B616DC0DEE9F1BD8E924286299E95F4 /* PINCache */, + C73070CACB673E5B9F8D87DFE6D625F7 /* Pods-GrandCentralBoard */, 88A834E5DEFA567D840BB841A29192EE /* Pods-GrandCentralBoardTests */, E5678FC69B99077E1972D149186B2285 /* Result */, A0933FC1307AD48F89C9FB7CEA3C29C5 /* RxSwift */, - B5C2C964DE3BBD30C5A05306754CFA47 /* SlackKit */, - D8F2187273FA7F9F6E3BD58A2808C5EA /* Starscream */, + DB836EF658BF1BEF3AABC0A95C67D32D /* SlackKit */, + F42B8723517C277F9A7CD257D0937E0F /* Starscream */, ); }; /* End PBXProject section */ @@ -2752,29 +3124,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 1693C3608C529CA48C33086379C7F591 /* Sources */ = { + 188555574C1B19139944115CE3B9A3AA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - CBA787DC7891A5980CDD5C6B879887AA /* Attachment.swift in Sources */, - 3064C97CD1302187C10E020BCB6B5678 /* Bot.swift in Sources */, - A68F66D660111A93636B42563C54891E /* Channel.swift in Sources */, - BD9ADBD01C48E2BCB3BD73E44F8D4C4A /* Client.swift in Sources */, - 49662062F914734CEF9EA76A56F236CE /* ClientExtensions.swift in Sources */, - 10FCB523DF20316C66E5001A67E48AD8 /* Event.swift in Sources */, - 290570AE7220D66E1A65B0033FB0DCD4 /* EventDelegate.swift in Sources */, - 91FAE3F1EECE69515B8030DBEA0B812F /* EventDispatcher.swift in Sources */, - AE3CF0A631F7CB7B7408475DA412C186 /* EventHandler.swift in Sources */, - 82AF809ACDE94CBDEEE981FD8BB7A655 /* File.swift in Sources */, - 19B4BA581CD7B76472E8C71FBBD2723A /* Message.swift in Sources */, - 88A4169D67853F300470E21D97AA6583 /* NetworkInterface.swift in Sources */, - 700DA72C42E098CB58B7BB2177C6924D /* SlackKit-dummy.m in Sources */, - 9FC73E2087308B82F9E3CBBFBCE091AD /* SlackWebAPI.swift in Sources */, - D2F16F20A73F28ADD6D40920F172333F /* SlackWebAPIErrorDispatcher.swift in Sources */, - 6A446044928F14194D4909BF306491C1 /* Team.swift in Sources */, - 78D5543ACC110C4A0A626CEB5F3761B0 /* Types.swift in Sources */, - FC5CCF6B1F82B557EC8FE1DDB1AB152E /* User.swift in Sources */, - 3B8F6E9A319EF3560D3DEA24A5E1B470 /* UserGroup.swift in Sources */, + 5DF25FE096EF71C84D48A1F5E6DA4D25 /* CZForecastioAPI.m in Sources */, + C85E90EE6023476B2F7DDC6333032C49 /* CZForecastioRequest.m in Sources */, + 8A4776EB19208E4A6AF3E2A78605712B /* CZOpenWeatherMapAPI.m in Sources */, + 3D0ABAFF2CD24A07C6008BCBBB76FBBA /* CZOpenWeatherMapRequest.m in Sources */, + AD3DB8BEFA2AD3D8D74479BC9123B062 /* CZPINWeatherDataCache.m in Sources */, + 04ADD7FB9A14AEE0ED605F82FFB67EAA /* CZWeatherCurrentCondition.m in Sources */, + E8E616585D9F8C64AB865AADD2C7F427 /* CZWeatherData.m in Sources */, + DA105EDFF859FD37041A9E6812480A4C /* CZWeatherForecastCondition.m in Sources */, + 09E9062F6E40EB168AC11B75855CEAF7 /* CZWeatherHourlyCondition.m in Sources */, + 70919FDDAB0D5145DC31E89D4CD4F323 /* CZWeatherKit-dummy.m in Sources */, + DDF48D433321995DD5D07F6A591D5F72 /* CZWeatherLocation.m in Sources */, + 09B288D5ED1C243EB11A853ECE77BA68 /* CZWeatherRequest.m in Sources */, + D970C505AA93D563D2903063BC26EC64 /* CZWeatherService.m in Sources */, + 9396CAD20BF27C850285105FC1C883B4 /* CZWorldWeatherOnlineAPI.m in Sources */, + C9508C776EC8DB04B3318C3AA92E8B6C /* CZWorldWeatherOnlineRequest.m in Sources */, + F6BF0BE842141F256AB3CDE6206DC28C /* CZWundergroundAPI.m in Sources */, + E5682F8AB2E56DA5249E69EF2F2670A2 /* CZWundergroundRequest.m in Sources */, + E27DA7C206F38C3DEBD2102A66F88D5A /* NSDictionary+Internal.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2845,6 +3216,43 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 27F8A10C595DD2DD777E11BAF441BFD6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A72DA657DB85EFBDFF1F30B318E62D /* Attachment.swift in Sources */, + 100634E8E71BECD0614E7491E0A92B6C /* Bot.swift in Sources */, + D0CE16A6542DF2AF552CFB5E992A4291 /* Channel.swift in Sources */, + BD11C5E2BB6F3FA1BCF6387333F591DC /* Client.swift in Sources */, + 26B4F2CFBCEA0187CA5F9EF27470C7EF /* ClientExtensions.swift in Sources */, + 0E6F0812A86CADC22AE469234636E997 /* Event.swift in Sources */, + 8C12FC250DDFB1877E4CB209382A8F52 /* EventDelegate.swift in Sources */, + 991E5CAF383D016EC76A0435EB622718 /* EventDispatcher.swift in Sources */, + 65F131774875E513DF408DEFC00B2249 /* EventHandler.swift in Sources */, + 56E94C84186911FF68E52014EA35A0ED /* File.swift in Sources */, + 346A39CDC6EF0A3DA0DEAA0DB89B7C61 /* Message.swift in Sources */, + 13A504CED0A759862615BC25B718EA74 /* NetworkInterface.swift in Sources */, + F9F44A84E2286F8627153FD7C66B3AC5 /* SlackKit-dummy.m in Sources */, + 9DE2E0452247D591667DC8E673799776 /* SlackWebAPI.swift in Sources */, + AA9AFEF5AB3AAEBADDCDFD039C9E235C /* SlackWebAPIErrorDispatcher.swift in Sources */, + AF0501E39D93552EC77F5C7A1DF398A5 /* Team.swift in Sources */, + FE4A66980DF7AF6846A811CE0544F258 /* Types.swift in Sources */, + 16E232C992C2AA0F6080820B6EC8C1D2 /* User.swift in Sources */, + DB719F22E3D3D2531181808F032982A1 /* UserGroup.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2E553F747B95411DDB04B1EC735B2422 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FE41474DBB43985B66B8DEF6B11D4D05 /* PINCache-dummy.m in Sources */, + 5722B65CB1E5B77F099D9205A750B071 /* PINCache.m in Sources */, + DA9BE2921A7CBF2A9BF58FEB0CF00314 /* PINDiskCache.m in Sources */, + 3E906FBFD2680C5D3C22CE004C2223D3 /* PINMemoryCache.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 337549000DC5C66F56B6DE17D8960D0C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3008,14 +3416,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 40DB14BF8041685FDB48D5985978416F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EAF72839C9497A0D9393D0BB9AC533A8 /* Pods-GrandCentralBoard-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 48AE5F6A6BC1CC0328D35EC2621B440C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3211,43 +3611,39 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 991AD71495B6F2BF051ECAECB14DAF6F /* Sources */ = { + EB3AD6F2031CEA0FFC593B9D8BC1B3E3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8BEA1B7349BF66EFD97713CFD0FCF2D4 /* SSLSecurity.swift in Sources */, - A74464665880D867F5BEF001DE890FA6 /* Starscream-dummy.m in Sources */, - 0559F125B9B86C93E30CB6CD26D7601E /* WebSocket.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - EB3AD6F2031CEA0FFC593B9D8BC1B3E3 /* Sources */ = { + F324313E9C9A231220C5B0EB168C50DF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0621518898325A8AC21A4978B74E3A88 /* Pods-GrandCentralBoard-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FE7C87182562E12651CE11FCCEB2B170 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + ACE4B5C8B18C989E9278A45A167C5F24 /* SSLSecurity.swift in Sources */, + EC609C695D4526035899EBF11AA06107 /* Starscream-dummy.m in Sources */, + 681BFBE0CAAF7ABA3F9676F54125F5F2 /* WebSocket.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 043E75A88DDF52253297ED9D21B0DDB7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = GCBUtilities; - target = 0710B66EB4C6A392E23981C1B8D50F13 /* GCBUtilities */; - targetProxy = A3C41DA3A516F60A94FF7211E432E4FA /* PBXContainerItemProxy */; - }; - 0702F1087F8C4BB4022B4091B7EBC0A0 /* PBXTargetDependency */ = { + 12A7823011B16F5CEA802BF70A440019 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Moya; - target = 93DDB4D07205258016E6779F2667E665 /* Moya */; - targetProxy = 8392595F77D8328C6CCF570A0C9476E6 /* PBXContainerItemProxy */; - }; - 0866FF5EE2AB46A383F21C654E8453F9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Starscream; - target = D8F2187273FA7F9F6E3BD58A2808C5EA /* Starscream */; - targetProxy = 5A545F395DFEFCE5BD3FFABC1F85A53B /* PBXContainerItemProxy */; + name = CZWeatherKit; + target = 6618B30786139FCD27E1CF439C61FF20 /* CZWeatherKit */; + targetProxy = 6C9F84030CFE9D68DE996AFBA22125B0 /* PBXContainerItemProxy */; }; 1789B87385EE57C899F12E45796B7F31 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -3255,11 +3651,17 @@ target = 72FACBE41A020F340B06DAFCE4E4ADFB /* Operations */; targetProxy = 159D53D796791E7675C3B9C8116357A1 /* PBXContainerItemProxy */; }; - 183039152AFA682D46AD84D6499DBD16 /* PBXTargetDependency */ = { + 1D4EE98237CB48618F252B40FC4CF74A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Starscream; - target = D8F2187273FA7F9F6E3BD58A2808C5EA /* Starscream */; - targetProxy = 0CDFE034C239E56A710685D8EF690955 /* PBXContainerItemProxy */; + name = Result; + target = E5678FC69B99077E1972D149186B2285 /* Result */; + targetProxy = 0A3F62A07EE1F2418A892FD88E5F2241 /* PBXContainerItemProxy */; + }; + 2AB97BD14257D2E3055BB0A86E0F390C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Decodable; + target = F610C0EEE17F801D1399A44316DF9DD3 /* Decodable */; + targetProxy = 37AB59E03EF1F88CE097054AA8471F9B /* PBXContainerItemProxy */; }; 2DFABCBB0EF0C8D7955C74DB8DE73446 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -3273,35 +3675,23 @@ target = 40FF1C77152F384080A1A02E90A36DA9 /* Nimble */; targetProxy = 7413713B2708A54504A1003E009F191B /* PBXContainerItemProxy */; }; - 38469A9E19019D81DC22A25296CC2799 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SlackKit; - target = B5C2C964DE3BBD30C5A05306754CFA47 /* SlackKit */; - targetProxy = 2D1A1F81004B2F0AA0EE8A217A0EAEF0 /* PBXContainerItemProxy */; - }; - 3C3903E0891F59B2CEB9EFE961E23C0B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = MD5; - target = A64350DBC118ED8CC0C6B2717CB47F6A /* MD5 */; - targetProxy = BCA2EAA1778A97CDB8BFC90B49A9EC75 /* PBXContainerItemProxy */; - }; 43DD9EAB19CA83CF9D544BFFEF0E21AA /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Alamofire; target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; targetProxy = 267F0075CECEB982FBB93BEBDC6162D6 /* PBXContainerItemProxy */; }; - 4F42107FC96E1FD1860087E8C38E34BF /* PBXTargetDependency */ = { + 4D9BB9EA835AE1ABDC2F51E0A0A90CEA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = GCBCore; - target = 17965599DFB5C5C7D9D34C79C6F29C8C /* GCBCore */; - targetProxy = FF2253DC7C1E233683DE8804BAD6CDC0 /* PBXContainerItemProxy */; + name = Moya; + target = 93DDB4D07205258016E6779F2667E665 /* Moya */; + targetProxy = 96D1E200F0567115BC7776FBC5DFE465 /* PBXContainerItemProxy */; }; - 67C38383ED8946D902F2046FFDF4738D /* PBXTargetDependency */ = { + 6CEE02CB8CB36E3248F028212E10914C /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Alamofire; - target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; - targetProxy = 5D83D110B302933CF98FEE6816601170 /* PBXContainerItemProxy */; + name = Operations; + target = 72FACBE41A020F340B06DAFCE4E4ADFB /* Operations */; + targetProxy = A3EF3AB61269D329B340FF8E47556562 /* PBXContainerItemProxy */; }; 6D235C056CC85847228514A918B9C035 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -3315,6 +3705,12 @@ target = F610C0EEE17F801D1399A44316DF9DD3 /* Decodable */; targetProxy = 74541121BF65EC61EAF56439BDD7CA46 /* PBXContainerItemProxy */; }; + 7302D49838F01F0B0ECD41E7ED3D3072 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SlackKit; + target = DB836EF658BF1BEF3AABC0A95C67D32D /* SlackKit */; + targetProxy = 690BE8385288D7FB13B0AE4D7B96C29C /* PBXContainerItemProxy */; + }; 7F42F364AA833CB24AA20D3E6630FE1E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "GCBUtilities-GCBUtilities"; @@ -3339,11 +3735,11 @@ target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; targetProxy = A929DBBB7412851448BAD17BD2FA9C06 /* PBXContainerItemProxy */; }; - 9767D0152CD5F11FBF6D6380C0BE5849 /* PBXTargetDependency */ = { + AC3885E311FE104A443D0F6FEA690619 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Result; - target = E5678FC69B99077E1972D149186B2285 /* Result */; - targetProxy = 28CB74100B9180AFEF7F31BBC9971A38 /* PBXContainerItemProxy */; + name = Starscream; + target = F42B8723517C277F9A7CD257D0937E0F /* Starscream */; + targetProxy = A0B8A724C2F024B474394E265711DCAE /* PBXContainerItemProxy */; }; AC43CFB5655C9D08BF49FB1015620C68 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -3351,17 +3747,41 @@ target = E5678FC69B99077E1972D149186B2285 /* Result */; targetProxy = 581EA616CEDBF350DBE0812C97B38F65 /* PBXContainerItemProxy */; }; - C72A338CA1E0093C94ABF8A26DDA0F20 /* PBXTargetDependency */ = { + B59C59B24AD9BD9EFC83F0B4B4C63DF5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Decodable; - target = F610C0EEE17F801D1399A44316DF9DD3 /* Decodable */; - targetProxy = F02B29A11F50D1E893FDABCC0A556AEF /* PBXContainerItemProxy */; + name = Alamofire; + target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; + targetProxy = 2EDDC25289E072F247D0A17F8518ABF0 /* PBXContainerItemProxy */; + }; + BABB41A5B7A0BBBF766E5399B5EB1B89 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GCBCore; + target = 17965599DFB5C5C7D9D34C79C6F29C8C /* GCBCore */; + targetProxy = 3A7E48CAFE933EB2F11DB5F752439EA3 /* PBXContainerItemProxy */; + }; + C58B4189B6A442C5CF1D3F19B5EBB496 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PINCache; + target = 9B616DC0DEE9F1BD8E924286299E95F4 /* PINCache */; + targetProxy = 4BEDD584B3A60C3636B50358AFFA28EB /* PBXContainerItemProxy */; + }; + C702B686A02A5121F8FF68340C316940 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Starscream; + target = F42B8723517C277F9A7CD257D0937E0F /* Starscream */; + targetProxy = 500EF8E2085BE3BE1F5F0383C9E716DF /* PBXContainerItemProxy */; }; - DDF4A9A51ACC4A104AFD2124B06564E1 /* PBXTargetDependency */ = { + D978FE9129252A19DA33342E6B6083B4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = RxSwift; target = A0933FC1307AD48F89C9FB7CEA3C29C5 /* RxSwift */; - targetProxy = CE2057D36F30EBB1FDED1070DFBE74A6 /* PBXContainerItemProxy */; + targetProxy = 40F6E2B502FC2C6D00DFEA808F6439DF /* PBXContainerItemProxy */; + }; + E01BE9593C72A5E597199D8D43BD6093 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MD5; + target = A64350DBC118ED8CC0C6B2717CB47F6A /* MD5 */; + targetProxy = 665B2AE6C9E1F6F56D5488EA280CA187 /* PBXContainerItemProxy */; }; EDDE8F42069B045983E6E750B56CDB9B /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -3369,11 +3789,17 @@ target = 79C040AFDDCE1BCBF6D8B5EB0B85887F /* Alamofire */; targetProxy = 72FD1BE56A6FAE85ACF7FB02F46E5D47 /* PBXContainerItemProxy */; }; - F269B8813E8824EAB6462BC2EC8EC2E5 /* PBXTargetDependency */ = { + F1BEA8EAAEF2E44782654A23C2618B8D /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Operations; - target = 72FACBE41A020F340B06DAFCE4E4ADFB /* Operations */; - targetProxy = A0CEBD40B4DFBA80A5DEF14ACFFACD30 /* PBXContainerItemProxy */; + name = GCBUtilities; + target = 0710B66EB4C6A392E23981C1B8D50F13 /* GCBUtilities */; + targetProxy = A543958F7AFCD24737E4D8B27173A340 /* PBXContainerItemProxy */; + }; + F852206A21BA85420C674768A98F4D1C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PINCache; + target = 9B616DC0DEE9F1BD8E924286299E95F4 /* PINCache */; + targetProxy = AB07FF78F2C0D84DC11718C5E9AC4C23 /* PBXContainerItemProxy */; }; FA10754E3AEAB00924565FAB7B361138 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -3386,7 +3812,7 @@ /* Begin XCBuildConfiguration section */ 02401A1C87DC5BE8F19D5DD467B9AA7F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C112D441AFA83AFCC441357A4BC04182 /* Nimble.xcconfig */; + baseConfigurationReference = 3A288E3E5FC875FAB1D2B0142DCCA056 /* Nimble.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -3415,7 +3841,7 @@ }; 069D1B10F92CBB056FAE6F19A8841AE9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D82DADCD75E732EC961898DFE08626BD /* Alamofire.xcconfig */; + baseConfigurationReference = 7BC3DD0BD9ADEAD9C96CECB640CDEB9C /* Alamofire.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -3444,7 +3870,7 @@ }; 075AC1990F0BD04F95B7CD198F5C13E9 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2259A252AD28027C6C2FF2AF57AFD408 /* MD5.xcconfig */; + baseConfigurationReference = BDF7F3B27AAD16A0163CBB0F62C41977 /* MD5.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -3472,7 +3898,7 @@ }; 07F8381A5F25C2FF1A5F721F64A22998 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9A6D95D337C004BD47FC86A3757251CA /* OHHTTPStubs.xcconfig */; + baseConfigurationReference = 8D37F45399F5A3C0099A2B4AF5703AD8 /* OHHTTPStubs.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -3498,9 +3924,98 @@ }; name = Release; }; + 140B4B0FEE9CB5C9C46B47FEAD04CF3D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 01BBFA50753DF9DC868E5ADCA7609ACE /* CZWeatherKit.xcconfig */; + buildSettings = { + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/CZWeatherKit/CZWeatherKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CZWeatherKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/CZWeatherKit/CZWeatherKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = CZWeatherKit; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1D11C7551882C908392E9B398108806E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AF86536ABABE8315BAB2FEC994D39335 /* PINCache.xcconfig */; + buildSettings = { + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/PINCache/PINCache-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/PINCache/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/PINCache/PINCache.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = PINCache; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 1D5A80D39DF6732329CFA3033B1248B6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9E442282FE5CABFC1C2E505CAF848976 /* Pods-GrandCentralBoard.debug.xcconfig */; + buildSettings = { + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-GrandCentralBoard/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_GrandCentralBoard; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 1D8FA71F85DD215B7DDC489E0D01D7E6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3F72F736B81A5AB31E6F2DB9734F937A /* Moya.xcconfig */; + baseConfigurationReference = 8E1A3628D0D90CEE66A42C4D1CDCBC5D /* Moya.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -3566,7 +4081,7 @@ }; 2B3F70238032368AAFF8A63FC51DB2E2 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2865591B1F8096A1D797A91560F5FD41 /* GCBCore.xcconfig */; + baseConfigurationReference = D460D4CC9DD7F2DFD3CFEADDDD2DAD93 /* GCBCore.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -3612,7 +4127,7 @@ }; 344E0B60DC2F757C4468B6A7536F1607 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C112D441AFA83AFCC441357A4BC04182 /* Nimble.xcconfig */; + baseConfigurationReference = 3A288E3E5FC875FAB1D2B0142DCCA056 /* Nimble.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -3636,11 +4151,40 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Release; + }; + 36BF7A2FDF2ADD5D4F5289247C7C2B9E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C471652298ECDB675407971C4AEB74E6 /* RxSwift.xcconfig */; + buildSettings = { + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = RxSwift; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; }; - 36BF7A2FDF2ADD5D4F5289247C7C2B9E /* Debug */ = { + 4262B911C441169A974E006974F41D72 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9EE1D87B1699AA665E41385FC8D3A6B8 /* RxSwift.xcconfig */; + baseConfigurationReference = AF86536ABABE8315BAB2FEC994D39335 /* PINCache.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -3650,16 +4194,15 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/PINCache/PINCache-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/PINCache/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; + MODULEMAP_FILE = "Target Support Files/PINCache/PINCache.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = RxSwift; + PRODUCT_NAME = PINCache; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; @@ -3669,7 +4212,7 @@ }; 42D0A383F758586A209E8D71A597BDC1 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9EE1D87B1699AA665E41385FC8D3A6B8 /* RxSwift.xcconfig */; + baseConfigurationReference = C471652298ECDB675407971C4AEB74E6 /* RxSwift.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -3697,7 +4240,7 @@ }; 4D2434D3DAD0EC23950319192D7576BA /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9A6D95D337C004BD47FC86A3757251CA /* OHHTTPStubs.xcconfig */; + baseConfigurationReference = 8D37F45399F5A3C0099A2B4AF5703AD8 /* OHHTTPStubs.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -3724,99 +4267,94 @@ }; name = Debug; }; - 693ACB1FE2B150D60E4A14269874A7B6 /* Release */ = { + 606DE8C8352BC9F1CCB7271A9138A149 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D82DADCD75E732EC961898DFE08626BD /* Alamofire.xcconfig */; + baseConfigurationReference = A58F7B07C31410BDED0C4B5D8F368354 /* Starscream.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Starscream/Starscream-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Starscream/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Alamofire; + MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Starscream; SDKROOT = appletvos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 85B43EB66673C21566BC90C668D920CA /* Debug */ = { + 66D3863BDCDC62967C459FA5CD68D503 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FBC77F96AB921B154BC0A1A1C71BCD98 /* FBSnapshotTestCase.xcconfig */; + baseConfigurationReference = 1CFE92A5B1BF12460F74C754B4188546 /* SlackKit.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SlackKit/SlackKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SlackKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = FBSnapshotTestCase; + MODULEMAP_FILE = "Target Support Files/SlackKit/SlackKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = SlackKit; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 8CE54847553E3019B73DE1B519F6BED5 /* Debug */ = { + 693ACB1FE2B150D60E4A14269874A7B6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0B2FE67825A4E6CCB6430624E02BD7B1 /* Pods-GrandCentralBoardTests.debug.xcconfig */; + baseConfigurationReference = 7BC3DD0BD9ADEAD9C96CECB640CDEB9C /* Alamofire.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-GrandCentralBoardTests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_GrandCentralBoardTests; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Alamofire; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 8CF8423E91C6147EEC20186468617EED /* Release */ = { + 6ECC1372A79D83C9BF1A6A51365BF292 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9412F8D170DADD2D40B36E35E7ADDCEF /* Pods-GrandCentralBoard.release.xcconfig */; + baseConfigurationReference = 01BBFA50753DF9DC868E5ADCA7609ACE /* CZWeatherKit.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -3826,17 +4364,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-GrandCentralBoard/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CZWeatherKit/CZWeatherKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CZWeatherKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.modulemap"; + MODULEMAP_FILE = "Target Support Files/CZWeatherKit/CZWeatherKit.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_GrandCentralBoard; + PRODUCT_NAME = CZWeatherKit; SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; @@ -3846,12 +4380,12 @@ }; name = Release; }; - 92213815AF50B2D66D64C21D2628AE3F /* Release */ = { + 81942A502EE8ACD524B4405B9A183312 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EE64485C12FF4BA4F7D3794159B18D7D /* SlackKit.xcconfig */; + baseConfigurationReference = 1CFE92A5B1BF12460F74C754B4188546 /* SlackKit.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -3863,48 +4397,50 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/SlackKit/SlackKit.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = SlackKit; SDKROOT = appletvos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 976BD9C4A8330CE4E41904FC9E00F495 /* Release */ = { + 85B43EB66673C21566BC90C668D920CA /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6CF26820ABE38690543664615CD1CCB1 /* Result.xcconfig */; + baseConfigurationReference = E5563C58E957DC137723F65EA887A119 /* FBSnapshotTestCase.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Result/Result-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Result/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Result/Result.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Result; + MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = FBSnapshotTestCase; SDKROOT = appletvos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 9B757AD03A2260EFC5F6482F7D0BF729 /* Debug */ = { + 8CE54847553E3019B73DE1B519F6BED5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6CF26820ABE38690543664615CD1CCB1 /* Result.xcconfig */; + baseConfigurationReference = 0B2FE67825A4E6CCB6430624E02BD7B1 /* Pods-GrandCentralBoardTests.debug.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -3914,13 +4450,17 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Result/Result-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Result/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-GrandCentralBoardTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Result/Result.modulemap"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Result; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_GrandCentralBoardTests; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -3931,38 +4471,37 @@ }; name = Debug; }; - 9F713C3DC6A18B29F6F755C7021A1EA8 /* Debug */ = { + 976BD9C4A8330CE4E41904FC9E00F495 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DD620D65F4DA271F67654EF3A6692020 /* Decodable.xcconfig */; + baseConfigurationReference = 25402BD10C01F92A6BF6A8A1529F143A /* Result.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Decodable/Decodable-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Decodable/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Result/Result-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Result/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Decodable/Decodable.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Decodable; + MODULEMAP_FILE = "Target Support Files/Result/Result.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Result; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - A0C02F0EF0F615E2A5429636201197A7 /* Debug */ = { + 9B757AD03A2260EFC5F6482F7D0BF729 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9E442282FE5CABFC1C2E505CAF848976 /* Pods-GrandCentralBoard.debug.xcconfig */; + baseConfigurationReference = 25402BD10C01F92A6BF6A8A1529F143A /* Result.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -3972,17 +4511,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-GrandCentralBoard/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Result/Result-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Result/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.modulemap"; + MODULEMAP_FILE = "Target Support Files/Result/Result.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_GrandCentralBoard; + PRODUCT_NAME = Result; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -3993,12 +4528,12 @@ }; name = Debug; }; - B19758886571030C5804D98599B5A304 /* Release */ = { + 9F713C3DC6A18B29F6F755C7021A1EA8 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DD620D65F4DA271F67654EF3A6692020 /* Decodable.xcconfig */; + baseConfigurationReference = FD31882A2DA504F8028009B8A5D972D4 /* Decodable.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -4010,49 +4545,49 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/Decodable/Decodable.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = Decodable; SDKROOT = appletvos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - BB67273DDC879C596DA927FDD9CE8823 /* Debug */ = { + AC069A4936A3F2A42B135946D4F029BC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2259A252AD28027C6C2FF2AF57AFD408 /* MD5.xcconfig */; + baseConfigurationReference = A58F7B07C31410BDED0C4B5D8F368354 /* Starscream.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MD5/MD5-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MD5/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Starscream/Starscream-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Starscream/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MD5/MD5.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = MD5; + MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Starscream; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - BEB4D3B0093FAC52F283D939DBBC7446 /* Release */ = { + B19758886571030C5804D98599B5A304 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8F31EEBEB5F031504B458DB2817F68EB /* Starscream.xcconfig */; + baseConfigurationReference = FD31882A2DA504F8028009B8A5D972D4 /* Decodable.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -4062,13 +4597,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Starscream/Starscream-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Starscream/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Decodable/Decodable-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Decodable/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; + MODULEMAP_FILE = "Target Support Files/Decodable/Decodable.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Starscream; + PRODUCT_NAME = Decodable; SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; @@ -4078,9 +4613,9 @@ }; name = Release; }; - C17021ACBA32917A963AD6100A55FEF9 /* Debug */ = { + BB67273DDC879C596DA927FDD9CE8823 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EE64485C12FF4BA4F7D3794159B18D7D /* SlackKit.xcconfig */; + baseConfigurationReference = BDF7F3B27AAD16A0163CBB0F62C41977 /* MD5.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -4090,13 +4625,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/SlackKit/SlackKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SlackKit/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/MD5/MD5-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MD5/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SlackKit/SlackKit.modulemap"; + MODULEMAP_FILE = "Target Support Files/MD5/MD5.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = SlackKit; + PRODUCT_NAME = MD5; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -4109,7 +4644,7 @@ }; CD39CDC820C82BF01FA9F3B0FE539E5B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9464AC690BB9D130A23394697C810E5B /* Operations.xcconfig */; + baseConfigurationReference = 1F82A5C655E786E01E02F90C77D352C8 /* Operations.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -4184,7 +4719,7 @@ }; D60C548DB5071C7C33A2DEF6269A15CE /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3F72F736B81A5AB31E6F2DB9734F937A /* Moya.xcconfig */; + baseConfigurationReference = 8E1A3628D0D90CEE66A42C4D1CDCBC5D /* Moya.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -4211,9 +4746,9 @@ }; name = Debug; }; - DE540C828FA702EEA45B28C103375ECB /* Release */ = { + D9C1F99FCE8CB05B456095480189C15D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2865591B1F8096A1D797A91560F5FD41 /* GCBCore.xcconfig */; + baseConfigurationReference = 9412F8D170DADD2D40B36E35E7ADDCEF /* Pods-GrandCentralBoard.release.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -4223,13 +4758,17 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/GCBCore/GCBCore-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GCBCore/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-GrandCentralBoard/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/GCBCore/GCBCore.modulemap"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = GCBCore; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_GrandCentralBoard; SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; @@ -4239,9 +4778,9 @@ }; name = Release; }; - DFD34C3F9093BC08CC36F26AFC41774A /* Release */ = { + DE540C828FA702EEA45B28C103375ECB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 09305E11081725F7013174D9ADF85995 /* GCBUtilities.xcconfig */; + baseConfigurationReference = D460D4CC9DD7F2DFD3CFEADDDD2DAD93 /* GCBCore.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -4251,13 +4790,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/GCBUtilities/GCBUtilities-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GCBUtilities/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/GCBCore/GCBCore-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GCBCore/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/GCBUtilities/GCBUtilities.modulemap"; + MODULEMAP_FILE = "Target Support Files/GCBCore/GCBCore.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = GCBUtilities; + PRODUCT_NAME = GCBCore; SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; @@ -4267,34 +4806,33 @@ }; name = Release; }; - E40196E21236F0DD773540EAC2901C97 /* Debug */ = { + DFD34C3F9093BC08CC36F26AFC41774A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8F31EEBEB5F031504B458DB2817F68EB /* Starscream.xcconfig */; + baseConfigurationReference = 09305E11081725F7013174D9ADF85995 /* GCBUtilities.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Starscream/Starscream-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Starscream/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/GCBUtilities/GCBUtilities-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GCBUtilities/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Starscream; + MODULEMAP_FILE = "Target Support Files/GCBUtilities/GCBUtilities.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = GCBUtilities; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; E46DC92EE7EAE9E9F6A4C179BBDAC949 /* Debug */ = { isa = XCBuildConfiguration; @@ -4340,7 +4878,7 @@ }; EEFB94A8A7EBA40EC1933AD76D98FA14 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9464AC690BB9D130A23394697C810E5B /* Operations.xcconfig */; + baseConfigurationReference = 1F82A5C655E786E01E02F90C77D352C8 /* Operations.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -4400,7 +4938,7 @@ }; FAC10AB7E79005A9D209BEA9B2E41FF6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FBC77F96AB921B154BC0A1A1C71BCD98 /* FBSnapshotTestCase.xcconfig */; + baseConfigurationReference = E5563C58E957DC137723F65EA887A119 /* FBSnapshotTestCase.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -4447,20 +4985,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 0CB1947C8C0B336A2B4D259C0DD94077 /* Build configuration list for PBXNativeTarget "GCBCore" */ = { + 0C8CA11931EE18F7EFD065BBE5F73D9C /* Build configuration list for PBXNativeTarget "Starscream" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2B3F70238032368AAFF8A63FC51DB2E2 /* Debug */, - DE540C828FA702EEA45B28C103375ECB /* Release */, + 606DE8C8352BC9F1CCB7271A9138A149 /* Debug */, + AC069A4936A3F2A42B135946D4F029BC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 21D96D8FC32F1025825D4F46744FAF93 /* Build configuration list for PBXNativeTarget "Starscream" */ = { + 0CB1947C8C0B336A2B4D259C0DD94077 /* Build configuration list for PBXNativeTarget "GCBCore" */ = { isa = XCConfigurationList; buildConfigurations = ( - E40196E21236F0DD773540EAC2901C97 /* Debug */, - BEB4D3B0093FAC52F283D939DBBC7446 /* Release */, + 2B3F70238032368AAFF8A63FC51DB2E2 /* Debug */, + DE540C828FA702EEA45B28C103375ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -4483,29 +5021,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 3CFB42910790CF0BDBCCEBAACD6B9367 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { + 383BB257667A9675259BC58225359249 /* Build configuration list for PBXNativeTarget "Pods-GrandCentralBoard" */ = { isa = XCConfigurationList; buildConfigurations = ( - 069D1B10F92CBB056FAE6F19A8841AE9 /* Debug */, - 693ACB1FE2B150D60E4A14269874A7B6 /* Release */, + 1D5A80D39DF6732329CFA3033B1248B6 /* Debug */, + D9C1F99FCE8CB05B456095480189C15D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 42C4253310A5BEE0E8426287E7BF4B9C /* Build configuration list for PBXNativeTarget "MD5" */ = { + 3CFB42910790CF0BDBCCEBAACD6B9367 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { isa = XCConfigurationList; buildConfigurations = ( - BB67273DDC879C596DA927FDD9CE8823 /* Debug */, - 075AC1990F0BD04F95B7CD198F5C13E9 /* Release */, + 069D1B10F92CBB056FAE6F19A8841AE9 /* Debug */, + 693ACB1FE2B150D60E4A14269874A7B6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 53192FFC1ED57C8C6A2831B3279707C2 /* Build configuration list for PBXNativeTarget "Pods-GrandCentralBoard" */ = { + 42C4253310A5BEE0E8426287E7BF4B9C /* Build configuration list for PBXNativeTarget "MD5" */ = { isa = XCConfigurationList; buildConfigurations = ( - A0C02F0EF0F615E2A5429636201197A7 /* Debug */, - 8CF8423E91C6147EEC20186468617EED /* Release */, + BB67273DDC879C596DA927FDD9CE8823 /* Debug */, + 075AC1990F0BD04F95B7CD198F5C13E9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -4519,11 +5057,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6C1D90A737201201CA0E16199C1F2B1B /* Build configuration list for PBXNativeTarget "SlackKit" */ = { + 6D2A8BB3E8F13BE97A92A47E9C75D4C1 /* Build configuration list for PBXNativeTarget "PINCache" */ = { isa = XCConfigurationList; buildConfigurations = ( - C17021ACBA32917A963AD6100A55FEF9 /* Debug */, - 92213815AF50B2D66D64C21D2628AE3F /* Release */, + 4262B911C441169A974E006974F41D72 /* Debug */, + 1D11C7551882C908392E9B398108806E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -4591,6 +5129,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C17A8BBC4EF011A9633A7CA18860D4F4 /* Build configuration list for PBXNativeTarget "CZWeatherKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 140B4B0FEE9CB5C9C46B47FEAD04CF3D /* Debug */, + 6ECC1372A79D83C9BF1A6A51365BF292 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FFE9DAE9816459A4D65A150B9904DFDF /* Build configuration list for PBXNativeTarget "SlackKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 81942A502EE8ACD524B4405B9A183312 /* Debug */, + 66D3863BDCDC62967C459FA5CD68D503 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; diff --git a/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-dummy.m b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-dummy.m new file mode 100644 index 0000000..5b453f1 --- /dev/null +++ b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_CZWeatherKit : NSObject +@end +@implementation PodsDummy_CZWeatherKit +@end diff --git a/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-prefix.pch b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-umbrella.h b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-umbrella.h new file mode 100644 index 0000000..b8db7d4 --- /dev/null +++ b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit-umbrella.h @@ -0,0 +1,39 @@ +#import + +#import "CZClimacons.h" +#import "CZForecastioAPI.h" +#import "CZForecastioRequest+Internal.h" +#import "CZForecastioRequest.h" +#import "CZOpenWeatherMapAPI.h" +#import "CZOpenWeatherMapRequest+Internal.h" +#import "CZOpenWeatherMapRequest.h" +#import "CZPINWeatherDataCache.h" +#import "CZWeatherAPI.h" +#import "CZWeatherCurrentCondition+Internal.h" +#import "CZWeatherCurrentCondition.h" +#import "CZWeatherData+Internal.h" +#import "CZWeatherData.h" +#import "CZWeatherDataCache.h" +#import "CZWeatherForecastCondition+Internal.h" +#import "CZWeatherForecastCondition.h" +#import "CZWeatherHourlyCondition+Internal.h" +#import "CZWeatherHourlyCondition.h" +#import "CZWeatherKit.h" +#import "CZWeatherKitInternal.h" +#import "CZWeatherKitTypes.h" +#import "CZWeatherLocation+Internal.h" +#import "CZWeatherLocation.h" +#import "CZWeatherRequest+Internal.h" +#import "CZWeatherRequest.h" +#import "CZWeatherService+Internal.h" +#import "CZWeatherService.h" +#import "CZWorldWeatherOnlineAPI.h" +#import "CZWorldWeatherOnlineRequest.h" +#import "CZWundergroundAPI.h" +#import "CZWundergroundRequest+Internal.h" +#import "CZWundergroundRequest.h" +#import "NSDictionary+Internal.h" + +FOUNDATION_EXPORT double CZWeatherKitVersionNumber; +FOUNDATION_EXPORT const unsigned char CZWeatherKitVersionString[]; + diff --git a/Pods/Target Support Files/CZWeatherKit/CZWeatherKit.modulemap b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit.modulemap new file mode 100644 index 0000000..1e9059d --- /dev/null +++ b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit.modulemap @@ -0,0 +1,6 @@ +framework module CZWeatherKit { + umbrella header "CZWeatherKit-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/CZWeatherKit/CZWeatherKit.xcconfig b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit.xcconfig new file mode 100644 index 0000000..18150fc --- /dev/null +++ b/Pods/Target Support Files/CZWeatherKit/CZWeatherKit.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/PINCache" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/CZWeatherKit/Info.plist b/Pods/Target Support Files/CZWeatherKit/Info.plist new file mode 100644 index 0000000..a4986a1 --- /dev/null +++ b/Pods/Target Support Files/CZWeatherKit/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.2.7 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Pods/Target Support Files/PINCache/Info.plist b/Pods/Target Support Files/PINCache/Info.plist new file mode 100644 index 0000000..fcd9376 --- /dev/null +++ b/Pods/Target Support Files/PINCache/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.2.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Pods/Target Support Files/PINCache/PINCache-dummy.m b/Pods/Target Support Files/PINCache/PINCache-dummy.m new file mode 100644 index 0000000..717c2b7 --- /dev/null +++ b/Pods/Target Support Files/PINCache/PINCache-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_PINCache : NSObject +@end +@implementation PodsDummy_PINCache +@end diff --git a/Pods/Target Support Files/PINCache/PINCache-prefix.pch b/Pods/Target Support Files/PINCache/PINCache-prefix.pch new file mode 100644 index 0000000..5e15de4 --- /dev/null +++ b/Pods/Target Support Files/PINCache/PINCache-prefix.pch @@ -0,0 +1,7 @@ +#ifdef __OBJC__ +#import +#endif + +#ifndef TARGET_OS_WATCH + #define TARGET_OS_WATCH 0 +#endif diff --git a/Pods/Target Support Files/PINCache/PINCache-umbrella.h b/Pods/Target Support Files/PINCache/PINCache-umbrella.h new file mode 100644 index 0000000..05d1f87 --- /dev/null +++ b/Pods/Target Support Files/PINCache/PINCache-umbrella.h @@ -0,0 +1,10 @@ +#import + +#import "Nullability.h" +#import "PINCache.h" +#import "PINDiskCache.h" +#import "PINMemoryCache.h" + +FOUNDATION_EXPORT double PINCacheVersionNumber; +FOUNDATION_EXPORT const unsigned char PINCacheVersionString[]; + diff --git a/Pods/Target Support Files/PINCache/PINCache.modulemap b/Pods/Target Support Files/PINCache/PINCache.modulemap new file mode 100644 index 0000000..d6699ef --- /dev/null +++ b/Pods/Target Support Files/PINCache/PINCache.modulemap @@ -0,0 +1,6 @@ +framework module PINCache { + umbrella header "PINCache-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/PINCache/PINCache.xcconfig b/Pods/Target Support Files/PINCache/PINCache.xcconfig new file mode 100644 index 0000000..ac889d0 --- /dev/null +++ b/Pods/Target Support Files/PINCache/PINCache.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/PINCache +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = -framework "Foundation" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.markdown b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.markdown index c838218..9734db2 100644 --- a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.markdown @@ -24,6 +24,32 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## CZWeatherKit + +Copyright (c) 2015, Comyar Zaheri +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ## Decodable The MIT License (MIT) @@ -1481,6 +1507,211 @@ SOFTWARE. +## PINCache + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [2013] [Tumblr, Inc.] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + ## Result The MIT License (MIT) diff --git a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.plist b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.plist index 5a87e3c..ca09cab 100644 --- a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-acknowledgements.plist @@ -39,6 +39,36 @@ THE SOFTWARE. Type PSGroupSpecifier + + FooterText + Copyright (c) 2015, Comyar Zaheri +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Title + CZWeatherKit + Type + PSGroupSpecifier + FooterText The MIT License (MIT) @@ -1520,6 +1550,215 @@ SOFTWARE. Type PSGroupSpecifier + + FooterText + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [2013] [Tumblr, Inc.] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + Title + PINCache + Type + PSGroupSpecifier + FooterText The MIT License (MIT) diff --git a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-frameworks.sh b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-frameworks.sh index e5f3b53..ea586a1 100755 --- a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-frameworks.sh +++ b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard-frameworks.sh @@ -85,12 +85,14 @@ strip_invalid_archs() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" + install_framework "$BUILT_PRODUCTS_DIR/CZWeatherKit/CZWeatherKit.framework" install_framework "$BUILT_PRODUCTS_DIR/Decodable/Decodable.framework" install_framework "$BUILT_PRODUCTS_DIR/GCBCore/GCBCore.framework" install_framework "$BUILT_PRODUCTS_DIR/GCBUtilities/GCBUtilities.framework" install_framework "$BUILT_PRODUCTS_DIR/MD5/MD5.framework" install_framework "$BUILT_PRODUCTS_DIR/Moya/Moya.framework" install_framework "$BUILT_PRODUCTS_DIR/Operations/Operations.framework" + install_framework "$BUILT_PRODUCTS_DIR/PINCache/PINCache.framework" install_framework "$BUILT_PRODUCTS_DIR/Result/Result.framework" install_framework "$BUILT_PRODUCTS_DIR/RxSwift/RxSwift.framework" install_framework "$BUILT_PRODUCTS_DIR/SlackKit/SlackKit.framework" @@ -98,12 +100,14 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" + install_framework "$BUILT_PRODUCTS_DIR/CZWeatherKit/CZWeatherKit.framework" install_framework "$BUILT_PRODUCTS_DIR/Decodable/Decodable.framework" install_framework "$BUILT_PRODUCTS_DIR/GCBCore/GCBCore.framework" install_framework "$BUILT_PRODUCTS_DIR/GCBUtilities/GCBUtilities.framework" install_framework "$BUILT_PRODUCTS_DIR/MD5/MD5.framework" install_framework "$BUILT_PRODUCTS_DIR/Moya/Moya.framework" install_framework "$BUILT_PRODUCTS_DIR/Operations/Operations.framework" + install_framework "$BUILT_PRODUCTS_DIR/PINCache/PINCache.framework" install_framework "$BUILT_PRODUCTS_DIR/Result/Result.framework" install_framework "$BUILT_PRODUCTS_DIR/RxSwift/RxSwift.framework" install_framework "$BUILT_PRODUCTS_DIR/SlackKit/SlackKit.framework" diff --git a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.debug.xcconfig b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.debug.xcconfig index e32616d..156306e 100644 --- a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.debug.xcconfig +++ b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.debug.xcconfig @@ -1,9 +1,9 @@ EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/PINCache" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "Decodable" -framework "GCBCore" -framework "GCBUtilities" -framework "MD5" -framework "Moya" -framework "Operations" -framework "Result" -framework "RxSwift" -framework "SlackKit" -framework "Starscream" +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit/CZWeatherKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PINCache/PINCache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CZWeatherKit" -framework "Decodable" -framework "GCBCore" -framework "GCBUtilities" -framework "MD5" -framework "Moya" -framework "Operations" -framework "PINCache" -framework "Result" -framework "RxSwift" -framework "SlackKit" -framework "Starscream" 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-GrandCentralBoard/Pods-GrandCentralBoard.release.xcconfig b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.release.xcconfig index e32616d..156306e 100644 --- a/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.release.xcconfig +++ b/Pods/Target Support Files/Pods-GrandCentralBoard/Pods-GrandCentralBoard.release.xcconfig @@ -1,9 +1,9 @@ EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/PINCache" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "Decodable" -framework "GCBCore" -framework "GCBUtilities" -framework "MD5" -framework "Moya" -framework "Operations" -framework "Result" -framework "RxSwift" -framework "SlackKit" -framework "Starscream" +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit/CZWeatherKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PINCache/PINCache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CZWeatherKit" -framework "Decodable" -framework "GCBCore" -framework "GCBUtilities" -framework "MD5" -framework "Moya" -framework "Operations" -framework "PINCache" -framework "Result" -framework "RxSwift" -framework "SlackKit" -framework "Starscream" 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-GrandCentralBoardTests/Pods-GrandCentralBoardTests.debug.xcconfig b/Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.debug.xcconfig index b2bedb8..8a8d31e 100644 --- a/Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.debug.xcconfig @@ -1,8 +1,8 @@ EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase" "$PODS_CONFIGURATION_BUILD_DIR/Nimble" "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase" "$PODS_CONFIGURATION_BUILD_DIR/Nimble" "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/PINCache" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Nimble/Nimble.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs/OHHTTPStubs.framework/Headers" $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Nimble/Nimble.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs/OHHTTPStubs.framework/Headers" $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit/CZWeatherKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PINCache/PINCache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Nimble" -framework "OHHTTPStubs" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR diff --git a/Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.release.xcconfig b/Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.release.xcconfig index b2bedb8..8a8d31e 100644 --- a/Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-GrandCentralBoardTests/Pods-GrandCentralBoardTests.release.xcconfig @@ -1,8 +1,8 @@ EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase" "$PODS_CONFIGURATION_BUILD_DIR/Nimble" "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase" "$PODS_CONFIGURATION_BUILD_DIR/Nimble" "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs" "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit" "$PODS_CONFIGURATION_BUILD_DIR/Decodable" "$PODS_CONFIGURATION_BUILD_DIR/GCBCore" "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities" "$PODS_CONFIGURATION_BUILD_DIR/MD5" "$PODS_CONFIGURATION_BUILD_DIR/Moya" "$PODS_CONFIGURATION_BUILD_DIR/Operations" "$PODS_CONFIGURATION_BUILD_DIR/PINCache" "$PODS_CONFIGURATION_BUILD_DIR/Result" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" "$PODS_CONFIGURATION_BUILD_DIR/SlackKit" "$PODS_CONFIGURATION_BUILD_DIR/Starscream" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Nimble/Nimble.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs/OHHTTPStubs.framework/Headers" $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Nimble/Nimble.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/OHHTTPStubs/OHHTTPStubs.framework/Headers" $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/CZWeatherKit/CZWeatherKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Decodable/Decodable.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBCore/GCBCore.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCBUtilities/GCBUtilities.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MD5/MD5.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Operations/Operations.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PINCache/PINCache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SlackKit/SlackKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Starscream/Starscream.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Nimble" -framework "OHHTTPStubs" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR