diff --git a/LoopFollow.xcodeproj/project.pbxproj b/LoopFollow.xcodeproj/project.pbxproj index 9d1133389..8efab85aa 100644 --- a/LoopFollow.xcodeproj/project.pbxproj +++ b/LoopFollow.xcodeproj/project.pbxproj @@ -8,6 +8,14 @@ /* Begin PBXBuildFile section */ 3F1335F351590E573D8E6962 /* Pods_LoopFollow.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7D55B42A22051DAD69E89D0 /* Pods_LoopFollow.framework */; }; + DD152D3B24C01B2300361FA2 /* InfoDisplaySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD152D3A24C01B2300361FA2 /* InfoDisplaySettingsViewController.swift */; }; + DD98F54424BCEFEE0007425A /* ShareClientExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD98F54324BCEFEE0007425A /* ShareClientExtension.swift */; }; + DDCF979424C0D380002C9752 /* UIViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979324C0D380002C9752 /* UIViewExtension.swift */; }; + DDCF979624C1443C002C9752 /* GeneralSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979524C1443C002C9752 /* GeneralSettingsViewController.swift */; }; + DDCF979824C1489C002C9752 /* GraphSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */; }; + DDCF979A24C14DB4002C9752 /* WatchSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */; }; + DDCF979C24C14EFB002C9752 /* DebugSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */; }; + DDCF979E24C2382A002C9752 /* AppStateController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979D24C2382A002C9752 /* AppStateController.swift */; }; FC16A97A24996673003D6245 /* NightScout.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16A97924996673003D6245 /* NightScout.swift */; }; FC16A97B249966A3003D6245 /* AlarmSound.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC7CE589248ABEA3001F83B8 /* AlarmSound.swift */; }; FC16A97D24996747003D6245 /* Alarms.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16A97C24996747003D6245 /* Alarms.swift */; }; @@ -162,6 +170,14 @@ /* Begin PBXFileReference section */ 059B0FA59AABFE72FE13DDDA /* Pods-LoopFollow.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LoopFollow.release.xcconfig"; path = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.release.xcconfig"; sourceTree = ""; }; A7D55B42A22051DAD69E89D0 /* Pods_LoopFollow.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LoopFollow.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DD152D3A24C01B2300361FA2 /* InfoDisplaySettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoDisplaySettingsViewController.swift; sourceTree = ""; }; + DD98F54324BCEFEE0007425A /* ShareClientExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareClientExtension.swift; sourceTree = ""; }; + DDCF979324C0D380002C9752 /* UIViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewExtension.swift; sourceTree = ""; }; + DDCF979524C1443C002C9752 /* GeneralSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsViewController.swift; sourceTree = ""; }; + DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphSettingsViewController.swift; sourceTree = ""; }; + DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSettingsViewController.swift; sourceTree = ""; }; + DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugSettingsViewController.swift; sourceTree = ""; }; + DDCF979D24C2382A002C9752 /* AppStateController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateController.swift; sourceTree = ""; }; ECA3EFB4037410B4973BB632 /* Pods-LoopFollow.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LoopFollow.debug.xcconfig"; path = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig"; sourceTree = ""; }; FC16A97924996673003D6245 /* NightScout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightScout.swift; sourceTree = ""; }; FC16A97C24996747003D6245 /* Alarms.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alarms.swift; sourceTree = ""; }; @@ -350,6 +366,15 @@ path = Pods; sourceTree = ""; }; + DD98F54224BCEF190007425A /* Extensions */ = { + isa = PBXGroup; + children = ( + DD98F54324BCEFEE0007425A /* ShareClientExtension.swift */, + DDCF979324C0D380002C9752 /* UIViewExtension.swift */, + ); + path = Extensions; + sourceTree = ""; + }; FC16A97624995FEE003D6245 /* Application */ = { isa = PBXGroup; children = ( @@ -364,6 +389,7 @@ FC16A9782499657E003D6245 /* Controllers */ = { isa = PBXGroup; children = ( + DDCF979D24C2382A002C9752 /* AppStateController.swift */, FC7CE589248ABEA3001F83B8 /* AlarmSound.swift */, FC16A97924996673003D6245 /* NightScout.swift */, FC16A97C24996747003D6245 /* Alarms.swift */, @@ -513,6 +539,7 @@ FC8DEEE62485D1ED0075863F /* Info.plist */, FC7CE59A248D334B001F83B8 /* Resources */, FCC68871248A736700A0279D /* ViewControllers */, + DD98F54224BCEF190007425A /* Extensions */, FC16A9782499657E003D6245 /* Controllers */, FCC688542489367300A0279D /* helpers */, FCC68872248A748A00A0279D /* Models */, @@ -578,6 +605,11 @@ FCFEECA1248857A600402A7F /* SettingsViewController.swift */, FCC6884F248935D800A0279D /* AlarmViewController.swift */, FC7CE59E248D8D23001F83B8 /* SnoozeViewController.swift */, + DD152D3A24C01B2300361FA2 /* InfoDisplaySettingsViewController.swift */, + DDCF979524C1443C002C9752 /* GeneralSettingsViewController.swift */, + DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */, + DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */, + DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */, ); path = ViewControllers; sourceTree = ""; @@ -824,7 +856,9 @@ FCC68850248935D800A0279D /* AlarmViewController.swift in Sources */, FC7CE59F248D8D23001F83B8 /* SnoozeViewController.swift in Sources */, FCC6886724898F8000A0279D /* UserDefaultsValue.swift in Sources */, + DDCF979E24C2382A002C9752 /* AppStateController.swift in Sources */, FC97881E2485969B00A7906C /* NightScoutViewController.swift in Sources */, + DDCF979824C1489C002C9752 /* GraphSettingsViewController.swift in Sources */, FC3AE7B5249E8E0E00AAE1E0 /* LoopFollow.xcdatamodeld in Sources */, FCC6886F2489A53800A0279D /* AppConstants.swift in Sources */, FC16A97A24996673003D6245 /* NightScout.swift in Sources */, @@ -833,20 +867,26 @@ FC16A97B249966A3003D6245 /* AlarmSound.swift in Sources */, FCFEECA2248857A600402A7F /* SettingsViewController.swift in Sources */, FCFEECA02488157B00402A7F /* Chart.swift in Sources */, + DDCF979424C0D380002C9752 /* UIViewExtension.swift in Sources */, FCEF87AC24A141A700AE6FA0 /* bgUnits.swift in Sources */, FC1BDD3224A2585C001B652C /* DataStructs.swift in Sources */, FCC6886524898EEE00A0279D /* UserDefaults.swift in Sources */, FC16A97F249969E2003D6245 /* Graphs.swift in Sources */, + DD152D3B24C01B2300361FA2 /* InfoDisplaySettingsViewController.swift in Sources */, + DDCF979C24C14EFB002C9752 /* DebugSettingsViewController.swift in Sources */, FC97881C2485969B00A7906C /* MainViewController.swift in Sources */, + DDCF979624C1443C002C9752 /* GeneralSettingsViewController.swift in Sources */, FCC0FAC224922A22003E610E /* DictionaryKeyPath.swift in Sources */, FC9788182485969B00A7906C /* AppDelegate.swift in Sources */, FCC6886B24898FD800A0279D /* ObservationToken.swift in Sources */, + DD98F54424BCEFEE0007425A /* ShareClientExtension.swift in Sources */, FCC6886D2489909D00A0279D /* AnyConvertible.swift in Sources */, FC97881A2485969B00A7906C /* SceneDelegate.swift in Sources */, FCD49B6C24AA536E007879DC /* DebugViewController.swift in Sources */, FC1BDD2B24A22650001B652C /* Stats.swift in Sources */, FC1BDD2D24A23204001B652C /* StatsView.swift in Sources */, FCE537BC249A4D7D00F80BF8 /* carbBolusArrays.swift in Sources */, + DDCF979A24C14DB4002C9752 /* WatchSettingsViewController.swift in Sources */, FC16A98124996C07003D6245 /* DateTime.swift in Sources */, FC3CAB022493B6220068A152 /* BackgroundTaskAudio.swift in Sources */, ); diff --git a/LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist b/LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist index 8a869d109..cd47f354e 100644 --- a/LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ LoopFollow.xcscheme_^#shared#^_ orderHint - 3 + 4 diff --git a/LoopFollow/Application/AppDelegate.swift b/LoopFollow/Application/AppDelegate.swift index 97dece083..727ebfd20 100644 --- a/LoopFollow/Application/AppDelegate.swift +++ b/LoopFollow/Application/AppDelegate.swift @@ -16,7 +16,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let notificationCenter = UNUserNotificationCenter.current() - + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. @@ -30,12 +30,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } let store = EKEventStore() store.requestAccess(to: .event) {(granted, error) in - if !granted { return } - } - - return true - } - + if !granted { return } + } + + return true + } + + func applicationWillTerminate(_ application: UIApplication) { if UserDefaultsRepository.alertAppInactive.value { AlarmSound.setSoundFile(str: "Alarm_Buzzer") diff --git a/LoopFollow/Application/Base.lproj/Main.storyboard b/LoopFollow/Application/Base.lproj/Main.storyboard index 1cbee5750..2afa82198 100644 --- a/LoopFollow/Application/Base.lproj/Main.storyboard +++ b/LoopFollow/Application/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -16,20 +16,26 @@ - - + + - + + - + - + - - + @@ -105,159 +111,180 @@ - - - - - - + + - - + + + + + + + + + + + + + - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + - - - - - - - - - - - + + + + + + - + - - - - - + + - - - - - + + @@ -273,12 +300,15 @@ - - + + + + + @@ -449,50 +479,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -532,7 +518,6 @@ - @@ -544,7 +529,6 @@ - diff --git a/LoopFollow/Application/SceneDelegate.swift b/LoopFollow/Application/SceneDelegate.swift index 0bf9c95d0..5dbf730a1 100644 --- a/LoopFollow/Application/SceneDelegate.swift +++ b/LoopFollow/Application/SceneDelegate.swift @@ -12,12 +12,43 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? - + let appStateController = AppStateController() + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). guard let _ = (scene as? UIWindowScene) else { return } + + // get the tabBar + guard let tabBarController = window?.rootViewController as? UITabBarController, + let viewControllers = tabBarController.viewControllers + else { + return + } + + // set the main controllers' connection to the app sate + // other controllers that need to know app state are setup programatically + for i in 0.. UserDefaultsRepository.snoozedBGReadingTime.value as! TimeInterval { - - // trigger temporary alert first - if UserDefaultsRepository.alertTemporaryActive.value { - if UserDefaultsRepository.alertTemporaryBelow.value { - if Float(currentBG) < UserDefaultsRepository.alertTemporaryBG.value { - UserDefaultsRepository.alertTemporaryActive.value = false - AlarmSound.whichAlarm = "Temporary Alert" + func checkAlarms(bgs: [ShareGlucoseData]) { + if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Checking Alarms") } + // Don't check or fire alarms within 1 minute of prior alarm + if checkAlarmTimer.isValid { return } + + let date = Date() + let now = date.timeIntervalSince1970 + let currentBG = bgs[bgs.count - 1].sgv + let lastBG = bgs[bgs.count - 2].sgv + guard let deltas: [Int] = [ + bgs[bgs.count - 1].sgv - bgs[bgs.count - 2].sgv, + bgs[bgs.count - 2].sgv - bgs[bgs.count - 3].sgv, + bgs[bgs.count - 3].sgv - bgs[bgs.count - 4].sgv + ] else {} + let currentBGTime = bgs[bgs.count - 1].date + var alarmTriggered = false + var numLoops = 0 + checkQuietHours() + clearOldSnoozes() + + // Exit if all is snoozed + // still send persistent notification with all snoozed + if UserDefaultsRepository.alertSnoozeAllIsSnoozed.value { + persistentNotification(bgTime: currentBGTime) + return + } + + + // BG Based Alarms + // Check to make sure it is a current reading and has not already triggered alarm from this reading + if now - currentBGTime <= (5*60) && currentBGTime > UserDefaultsRepository.snoozedBGReadingTime.value as! TimeInterval { + + // trigger temporary alert first + if UserDefaultsRepository.alertTemporaryActive.value { + if UserDefaultsRepository.alertTemporaryBelow.value { + if Float(currentBG) < UserDefaultsRepository.alertTemporaryBG.value { + UserDefaultsRepository.alertTemporaryActive.value = false + AlarmSound.whichAlarm = "Temporary Alert" if UserDefaultsRepository.alertTemporaryBGRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertTemporaryBGDND.value, numLoops: numLoops) - return - } - } else{ - if Float(currentBG) > UserDefaultsRepository.alertTemporaryBG.value { - tabBarController?.selectedIndex = 2 - AlarmSound.whichAlarm = "Temporary Alert" + triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + } else{ + if Float(currentBG) > UserDefaultsRepository.alertTemporaryBG.value { + tabBarController?.selectedIndex = 2 + AlarmSound.whichAlarm = "Temporary Alert" if UserDefaultsRepository.alertTemporaryBGRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertTemporaryBGDND.value, numLoops: numLoops) - return - } - } - } - - // Check Urgent Low - if UserDefaultsRepository.alertUrgentLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value && - Float(currentBG) <= UserDefaultsRepository.alertUrgentLowBG.value { - // Separating this makes it so the low or drop alerts won't trigger if they already snoozed the urgent low - if !UserDefaultsRepository.alertUrgentLowIsSnoozed.value { - AlarmSound.whichAlarm = "Urgent Low Alert" + triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + } + } + + // Check Urgent Low + if UserDefaultsRepository.alertUrgentLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value && + Float(currentBG) <= UserDefaultsRepository.alertUrgentLowBG.value { + // Separating this makes it so the low or drop alerts won't trigger if they already snoozed the urgent low + if !UserDefaultsRepository.alertUrgentLowIsSnoozed.value { + AlarmSound.whichAlarm = "Urgent Low Alert" if UserDefaultsRepository.alertUrgentLowRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertUrgentLowDND.value, numLoops: numLoops) - return - } else { - return - } - } - - // Check Low - if UserDefaultsRepository.alertLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value && - Float(currentBG) <= UserDefaultsRepository.alertLowBG.value && !UserDefaultsRepository.alertLowIsSnoozed.value { - AlarmSound.whichAlarm = "Low Alert" + triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } else { + return + } + } + + // Check Low + if UserDefaultsRepository.alertLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value && + Float(currentBG) <= UserDefaultsRepository.alertLowBG.value && !UserDefaultsRepository.alertLowIsSnoozed.value { + AlarmSound.whichAlarm = "Low Alert" if UserDefaultsRepository.alertLowRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertLowDND.value, numLoops: numLoops) - return - } - - // Check Urgent High - if UserDefaultsRepository.alertUrgentHighActive.value && !UserDefaultsRepository.alertUrgentHighIsSnoozed.value && - Float(currentBG) >= UserDefaultsRepository.alertUrgentHighBG.value { - // Separating this makes it so the high or rise alerts won't trigger if they already snoozed the urgent high - if !UserDefaultsRepository.alertUrgentHighIsSnoozed.value { - AlarmSound.whichAlarm = "Urgent High Alert" + triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + + // Check Urgent High + if UserDefaultsRepository.alertUrgentHighActive.value && !UserDefaultsRepository.alertUrgentHighIsSnoozed.value && + Float(currentBG) >= UserDefaultsRepository.alertUrgentHighBG.value { + // Separating this makes it so the high or rise alerts won't trigger if they already snoozed the urgent high + if !UserDefaultsRepository.alertUrgentHighIsSnoozed.value { + AlarmSound.whichAlarm = "Urgent High Alert" if UserDefaultsRepository.alertUrgentHighRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertUrgentHighDND.value, numLoops: numLoops) - return - } else { - return - } - - } - - // Check High - let persistentReadings = Int(UserDefaultsRepository.alertHighPersistent.value / 5) - let persistentBG = bgData[bgData.count - 1 - persistentReadings].sgv - if UserDefaultsRepository.alertHighActive.value && - !UserDefaultsRepository.alertHighIsSnoozed.value && - Float(currentBG) >= UserDefaultsRepository.alertHighBG.value && - Float(persistentBG) >= UserDefaultsRepository.alertHighBG.value && - !UserDefaultsRepository.alertHighIsSnoozed.value { - AlarmSound.whichAlarm = "High Alert" + triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } else { + return + } + + } + + // Check High + let persistentReadings = Int(UserDefaultsRepository.alertHighPersistent.value / 5) + let persistentBG = bgData[bgData.count - 1 - persistentReadings].sgv + if UserDefaultsRepository.alertHighActive.value && + !UserDefaultsRepository.alertHighIsSnoozed.value && + Float(currentBG) >= UserDefaultsRepository.alertHighBG.value && + Float(persistentBG) >= UserDefaultsRepository.alertHighBG.value && + !UserDefaultsRepository.alertHighIsSnoozed.value { + AlarmSound.whichAlarm = "High Alert" if UserDefaultsRepository.alertHighRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertHighDND.value, numLoops: numLoops) - return - } - - - - // Check Fast Drop - if UserDefaultsRepository.alertFastDropActive.value && !UserDefaultsRepository.alertFastDropIsSnoozed.value { - // make sure limit is off or BG is below value - if (!UserDefaultsRepository.alertFastDropUseLimit.value) || (UserDefaultsRepository.alertFastDropUseLimit.value && Float(currentBG) < UserDefaultsRepository.alertFastDropBelowBG.value) { - let compare = 0 - UserDefaultsRepository.alertFastDropDelta.value - - //check last 2/3/4 readings - if (UserDefaultsRepository.alertFastDropReadings.value == 2 && Float(deltas[0]) <= compare) - || (UserDefaultsRepository.alertFastDropReadings.value == 3 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare) - || (UserDefaultsRepository.alertFastDropReadings.value == 4 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare && Float(deltas[2]) <= compare) { - AlarmSound.whichAlarm = "Fast Drop Alert" + triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + + + + // Check Fast Drop + if UserDefaultsRepository.alertFastDropActive.value && !UserDefaultsRepository.alertFastDropIsSnoozed.value { + // make sure limit is off or BG is below value + if (!UserDefaultsRepository.alertFastDropUseLimit.value) || (UserDefaultsRepository.alertFastDropUseLimit.value && Float(currentBG) < UserDefaultsRepository.alertFastDropBelowBG.value) { + let compare = 0 - UserDefaultsRepository.alertFastDropDelta.value + + //check last 2/3/4 readings + if (UserDefaultsRepository.alertFastDropReadings.value == 2 && Float(deltas[0]) <= compare) + || (UserDefaultsRepository.alertFastDropReadings.value == 3 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare) + || (UserDefaultsRepository.alertFastDropReadings.value == 4 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare && Float(deltas[2]) <= compare) { + AlarmSound.whichAlarm = "Fast Drop Alert" if UserDefaultsRepository.alertFastDropRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertFastDropDND.value, numLoops: numLoops) - return - } - } - } - - // Check Fast Rise - if UserDefaultsRepository.alertFastRiseActive.value && !UserDefaultsRepository.alertFastRiseIsSnoozed.value { - // make sure limit is off or BG is above value - if (!UserDefaultsRepository.alertFastRiseUseLimit.value) || (UserDefaultsRepository.alertFastRiseUseLimit.value && Float(currentBG) > UserDefaultsRepository.alertFastRiseAboveBG.value) { - let compare = UserDefaultsRepository.alertFastDropDelta.value - - //check last 2/3/4 readings - if (UserDefaultsRepository.alertFastRiseReadings.value == 2 && Float(deltas[0]) >= compare) - || (UserDefaultsRepository.alertFastRiseReadings.value == 3 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare) - || (UserDefaultsRepository.alertFastRiseReadings.value == 4 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare && Float(deltas[2]) >= compare) { - AlarmSound.whichAlarm = "Fast Rise Alert" + triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + } + } + + // Check Fast Rise + if UserDefaultsRepository.alertFastRiseActive.value && !UserDefaultsRepository.alertFastRiseIsSnoozed.value { + // make sure limit is off or BG is above value + if (!UserDefaultsRepository.alertFastRiseUseLimit.value) || (UserDefaultsRepository.alertFastRiseUseLimit.value && Float(currentBG) > UserDefaultsRepository.alertFastRiseAboveBG.value) { + let compare = UserDefaultsRepository.alertFastDropDelta.value + + //check last 2/3/4 readings + if (UserDefaultsRepository.alertFastRiseReadings.value == 2 && Float(deltas[0]) >= compare) + || (UserDefaultsRepository.alertFastRiseReadings.value == 3 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare) + || (UserDefaultsRepository.alertFastRiseReadings.value == 4 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare && Float(deltas[2]) >= compare) { + AlarmSound.whichAlarm = "Fast Rise Alert" if UserDefaultsRepository.alertFastRiseRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertFastRiseDND.value, numLoops: numLoops) - return - } - } - } - - - - } - - // These only get checked and fire if a BG reading doesn't fire - if UserDefaultsRepository.alertNotLoopingActive.value - && !UserDefaultsRepository.alertNotLoopingIsSnoozed.value - && (Double(dateTimeUtils.getNowTimeIntervalUTC() - UserDefaultsRepository.alertLastLoopTime.value) >= Double(UserDefaultsRepository.alertNotLooping.value * 60)) - && UserDefaultsRepository.alertLastLoopTime.value > 0 { - - var trigger = true - if (UserDefaultsRepository.alertNotLoopingUseLimits.value - && ( - (Float(currentBG) <= UserDefaultsRepository.alertNotLoopingUpperLimit.value - && Float(currentBG) >= UserDefaultsRepository.alertNotLoopingLowerLimit.value) || - // Ignore Limits if BG reading is older than non looping time - (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertNotLooping.value * 60)) - ) || - !UserDefaultsRepository.alertNotLoopingUseLimits.value) { - AlarmSound.whichAlarm = "Not Looping Alert" - if UserDefaultsRepository.alertNotLoopingRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertNotLoopingDND.value, numLoops: numLoops) - return - } - } - - // check for missed bolus - Only checks within 1 hour of carb entry - // Only continue if alert is active, not snooozed, we have carb data, and bg is over the ignore limit - if UserDefaultsRepository.alertMissedBolusActive.value - && !UserDefaultsRepository.alertMissedBolusIsSnoozed.value - && carbData.count > 0 - && Float(currentBG) > UserDefaultsRepository.alertMissedBolusLowGramsBG.value { + triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + } + } + - // Grab the latest carb entry - let lastCarb = carbData[carbData.count - 1].value - let lastCarbTime = carbData[carbData.count - 1].date - let now = dateTimeUtils.getNowTimeIntervalUTC() - //Make sure carb entry is newer than 1 hour, has reached the time length, and is over the ignore limit - if lastCarbTime > (now - (60 * 60)) - && lastCarbTime < (now - Double((UserDefaultsRepository.alertMissedBolus.value * 60))) - && lastCarb > Double(UserDefaultsRepository.alertMissedBolusLowGrams.value) { + } + + // These only get checked and fire if a BG reading doesn't fire + + //check for missed reading alert + if UserDefaultsRepository.alertMissedReadingActive.value && !UserDefaultsRepository.alertMissedReadingIsSnoozed.value && (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertMissedReading.value * 60)) { + AlarmSound.whichAlarm = "Missed Reading Alert" + if UserDefaultsRepository.alertMissedReadingRepeat.value { numLoops = -1 } + triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + + + if UserDefaultsRepository.url.value != "" { + + if UserDefaultsRepository.alertNotLoopingActive.value + && !UserDefaultsRepository.alertNotLoopingIsSnoozed.value + && (Double(dateTimeUtils.getNowTimeIntervalUTC() - UserDefaultsRepository.alertLastLoopTime.value) >= Double(UserDefaultsRepository.alertNotLooping.value * 60)) + && UserDefaultsRepository.alertLastLoopTime.value > 0 { - // There is a current carb but no boluses data at all - if bolusData.count < 1 { - AlarmSound.whichAlarm = "Missed Bolus Alert" - if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertMissedBolusDND.value, numLoops: numLoops) + var trigger = true + if (UserDefaultsRepository.alertNotLoopingUseLimits.value + && ( + (Float(currentBG) >= UserDefaultsRepository.alertNotLoopingUpperLimit.value + && Float(currentBG) <= UserDefaultsRepository.alertNotLoopingLowerLimit.value) || + // Ignore Limits if BG reading is older than non looping time + (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertNotLooping.value * 60)) + ) || + !UserDefaultsRepository.alertNotLoopingUseLimits.value) { + AlarmSound.whichAlarm = "Not Looping Alert" + if UserDefaultsRepository.alertNotLoopingRepeat.value { numLoops = -1 } + triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) return } + } + + // check for missed bolus - Only checks within 1 hour of carb entry + // Only continue if alert is active, not snooozed, we have carb data, and bg is over the ignore limit + if UserDefaultsRepository.alertMissedBolusActive.value + && !UserDefaultsRepository.alertMissedBolusIsSnoozed.value + && carbData.count > 0 + && Float(currentBG) > UserDefaultsRepository.alertMissedBolusLowGramsBG.value { + + // Grab the latest carb entry + let lastCarb = carbData[carbData.count - 1].value + let lastCarbTime = carbData[carbData.count - 1].date + let now = dateTimeUtils.getNowTimeIntervalUTC() - // Get the latest bolus over the small bolus exclusion - // Start with 0.0 bolus assuming there isn't one to cause a trigger and only add one if found - var lastBolus = 0.0 - var lastBolusTime = 0.0 - var i = 1 - // check the boluses in reverse order setting it only if the time is after the carb time minus prebolus time. - // This will make the loop stop at the most recent bolus that is over the minimum value or continue through all boluses - while lastBolus < UserDefaultsRepository.alertMissedBolusIgnoreBolus.value && i <= bolusData.count { - // Set the bolus if it's after the carb time minus prebolus time - if (bolusData[bolusData.count - i].date >= lastCarbTime - Double(UserDefaultsRepository.alertMissedBolusPrebolus.value * 60)) { - lastBolus = bolusData[bolusData.count - i].value - lastBolusTime = bolusData[bolusData.count - i].date + //Make sure carb entry is newer than 1 hour, has reached the time length, and is over the ignore limit + if lastCarbTime > (now - (60 * 60)) + && lastCarbTime < (now - Double((UserDefaultsRepository.alertMissedBolus.value * 60))) + && lastCarb > Double(UserDefaultsRepository.alertMissedBolusLowGrams.value) { + + // There is a current carb but no boluses data at all + if bolusData.count < 1 { + AlarmSound.whichAlarm = "Missed Bolus Alert" + if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 } + triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + + // Get the latest bolus over the small bolus exclusion + // Start with 0.0 bolus assuming there isn't one to cause a trigger and only add one if found + var lastBolus = 0.0 + var lastBolusTime = 0.0 + var i = 1 + // check the boluses in reverse order setting it only if the time is after the carb time minus prebolus time. + // This will make the loop stop at the most recent bolus that is over the minimum value or continue through all boluses + while lastBolus < UserDefaultsRepository.alertMissedBolusIgnoreBolus.value && i <= bolusData.count { + // Set the bolus if it's after the carb time minus prebolus time + if (bolusData[bolusData.count - i].date >= lastCarbTime - Double(UserDefaultsRepository.alertMissedBolusPrebolus.value * 60)) { + lastBolus = bolusData[bolusData.count - i].value + lastBolusTime = bolusData[bolusData.count - i].date + } + i += 1 + } + + // This will trigger is no boluses were set above + if (lastBolus == 0.0) { + AlarmSound.whichAlarm = "Missed Bolus Alert" + if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 } + triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return } - i += 1 + } - // This will trigger is no boluses were set above - if (lastBolus == 0.0) { - AlarmSound.whichAlarm = "Missed Bolus Alert" - if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertMissedBolusDND.value, numLoops: numLoops) + } + + // Check Sage + if UserDefaultsRepository.alertSAGEActive.value && !UserDefaultsRepository.alertSAGEIsSnoozed.value { + let insertTime = Double(UserDefaultsRepository.alertSageInsertTime.value) + let alertDistance = Double(UserDefaultsRepository.alertSAGE.value * 60 * 60) + let delta = now - insertTime + let tenDays = 10 * 24 * 60 * 60 + if Double(tenDays) - Double(delta) <= alertDistance { + AlarmSound.whichAlarm = "Sensor Change Alert" + if UserDefaultsRepository.alertSAGERepeat.value { numLoops = -1 } + triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) + return + } + } + + // Check Cage + if UserDefaultsRepository.alertCAGEActive.value && !UserDefaultsRepository.alertCAGEIsSnoozed.value { + let insertTime = Double(UserDefaultsRepository.alertCageInsertTime.value) + let alertDistance = Double(UserDefaultsRepository.alertCAGE.value * 60 * 60) + let delta = now - insertTime + let tenDays = 3 * 24 * 60 * 60 + if Double(tenDays) - Double(delta) <= alertDistance { + AlarmSound.whichAlarm = "Pump Change Alert" + if UserDefaultsRepository.alertCAGERepeat.value { numLoops = -1 } + triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) return } - } - } - - //check for missed reading alert - if UserDefaultsRepository.alertMissedReadingActive.value && !UserDefaultsRepository.alertMissedReadingIsSnoozed.value && (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertMissedReading.value * 60)) { - AlarmSound.whichAlarm = "Missed Reading Alert" - if UserDefaultsRepository.alertMissedReadingRepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertMissedReadingDND.value, numLoops: numLoops) - return - } - - // Check Sage - if UserDefaultsRepository.alertSAGEActive.value && !UserDefaultsRepository.alertSAGEIsSnoozed.value { - let insertTime = Double(UserDefaultsRepository.alertSageInsertTime.value) - let alertDistance = Double(UserDefaultsRepository.alertSAGE.value * 60 * 60) - let delta = now - insertTime - let tenDays = 10 * 24 * 60 * 60 - if Double(tenDays) - Double(delta) <= alertDistance { - AlarmSound.whichAlarm = "Sensor Change Alert" - if UserDefaultsRepository.alertSAGERepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertSAGEDND.value, numLoops: numLoops) - return - } - } - - // Check Cage - if UserDefaultsRepository.alertCAGEActive.value && !UserDefaultsRepository.alertCAGEIsSnoozed.value { - let insertTime = Double(UserDefaultsRepository.alertCageInsertTime.value) - let alertDistance = Double(UserDefaultsRepository.alertCAGE.value * 60 * 60) - let delta = now - insertTime - let tenDays = 3 * 24 * 60 * 60 - if Double(tenDays) - Double(delta) <= alertDistance { - AlarmSound.whichAlarm = "Pump Change Alert" - if UserDefaultsRepository.alertCAGERepeat.value { numLoops = -1 } - triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertCAGEDND.value, numLoops: numLoops) - return - } - } - - // still send persistent notification if no alarms trigger and persistent notification is on - persistentNotification(bgTime: currentBGTime) - - } + + + + + // still send persistent notification if no alarms trigger and persistent notification is on + persistentNotification(bgTime: currentBGTime) + + } func checkOverrideAlarms() { @@ -295,18 +304,18 @@ extension MainViewController { if latest.value == prior.value { return } var numLoops = 0 - if UserDefaultsRepository.alertOverrideStart.value { + if UserDefaultsRepository.alertOverrideStart.value && !UserDefaultsRepository.alertOverrideStartIsSnoozed.value { if latest.value != 1.0 && lastOverrideStartTime != latest.date { AlarmSound.whichAlarm = String(format: "%.0f%%", (latest.value * 100)) + " Override Started" if UserDefaultsRepository.alertOverrideStartRepeat.value { numLoops = -1 } - triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.alertOverrideStartDND.value, numLoops: numLoops) + triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) lastOverrideStartTime = latest.date } - } else if UserDefaultsRepository.alertOverrideEnd.value { + } else if UserDefaultsRepository.alertOverrideEnd.value && !UserDefaultsRepository.alertOverrideEndIsSnoozed.value { if latest.value == 1.0 && lastOverrideEndTime != latest.date { AlarmSound.whichAlarm = "Override Ended" if UserDefaultsRepository.alertOverrideEndRepeat.value { numLoops = -1 } - triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.alertOverrideEndDND.value, numLoops: numLoops) + triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops) lastOverrideEndTime = latest.date } } @@ -427,9 +436,64 @@ extension MainViewController { alarms.reloadIsSnoozed(key: "alertCAGEIsSnoozed", value: false) } + if date > UserDefaultsRepository.alertOverrideStartSnoozedTime.value ?? date { + UserDefaultsRepository.alertOverrideStartSnoozedTime.setNil(key: "alertOverrideStartSnoozedTime") + UserDefaultsRepository.alertOverrideStartIsSnoozed.value = false + alarms.reloadSnoozeTime(key: "alertOverrideStartSnoozedTime", setNil: true) + alarms.reloadIsSnoozed(key: "alertOverrideStartIsSnoozed", value: false) + } + if date > UserDefaultsRepository.alertOverrideEndSnoozedTime.value ?? date { + UserDefaultsRepository.alertOverrideEndSnoozedTime.setNil(key: "alertOverrideEndSnoozedTime") + UserDefaultsRepository.alertOverrideEndIsSnoozed.value = false + alarms.reloadSnoozeTime(key: "alertOverrideEndSnoozedTime", setNil: true) + alarms.reloadIsSnoozed(key: "alertOverrideEndIsSnoozed", value: false) + + } } + func checkQuietHours() { + if UserDefaultsRepository.quietHourStart.value == nil || UserDefaultsRepository.quietHourEnd.value == nil { return } + + var startDateComponents = DateComponents() + + let today = Date() + let todayCalendar = Calendar.current + let month = todayCalendar.component(.month, from: today) + let day = todayCalendar.component(.day, from: today) + let year = todayCalendar.component(.year, from: today) + let hour = todayCalendar.component(.hour, from: today) + let minute = todayCalendar.component(.minute, from: today) + let todayMinutes = (60 * hour) + minute + + let start = UserDefaultsRepository.quietHourStart.value + let startCalendar = Calendar.current + let startHour = startCalendar.component(.hour, from: start!) + let startMinute = startCalendar.component(.minute, from: start!) + let startMinutes = (60 * startHour) + startMinute + + if todayMinutes >= startMinutes { + let tomorrow = Date().addingTimeInterval(86400) + let tomorrowCalendar = Calendar.current + let end = UserDefaultsRepository.quietHourEnd.value + let endCalendar = Calendar.current + + var components = DateComponents() + components.month = tomorrowCalendar.component(.month, from: tomorrow) + components.day = tomorrowCalendar.component(.day, from: tomorrow) + components.year = tomorrowCalendar.component(.year, from: tomorrow) + components.hour = endCalendar.component(.hour, from: end!) + components.minute = endCalendar.component(.minute, from: end!) + components.second = endCalendar.component(.second, from: end!) + let snoozeCalendar = Calendar.current + let snoozeTime = snoozeCalendar.date(from: components) + + guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return } + snoozer.setQuietHours(snoozeTime: snoozeTime!) + } + + } + func speakBG(sgv: Int) { var speechSynthesizer = AVSpeechSynthesizer() var speechUtterance: AVSpeechUtterance = AVSpeechUtterance(string: "Current BG is " + bgUnits.toDisplayUnits(String(sgv))) diff --git a/LoopFollow/Controllers/AppStateController.swift b/LoopFollow/Controllers/AppStateController.swift new file mode 100644 index 000000000..d2a702ebc --- /dev/null +++ b/LoopFollow/Controllers/AppStateController.swift @@ -0,0 +1,63 @@ +// +// AppStateController.swift +// LoopFollow +// +// Created by Jose Paredes on 7/17/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation + +// App Sate used used to changes to the app view controllers (Settings, for example) +// Recommended way of utilizing is when viewVillAppear(..) is called, +// look in the app state to see if further action must be t + +// Setup App States to comminicate between views + +// Graph Setup Flags +enum ChartSettingsChangeEnum: Int { + case chartScaleXChanged = 1 + case showDotsChanged = 2 + case showLinesChanged = 4 + case offsetCarbsBolusChanged = 8 + case hoursToLoadChanged = 16 + case predictionToLoadChanged = 32 + case minBasalScaleChanged = 64 + case minBGScaleChanged = 128 + case minBGValueChanged = 256 + case overrideDisplayLocationChanged = 512 + case lowLineChanged = 1024 + case highLineChanged = 2048 +} + +// General Settings Flags +enum GeneralSettingsChangeEnum: Int { + case colorBGTextChange = 1 + case speakBGChange = 2 + case backgroundRefreshFrequencyChange = 4 + case backgroundRefreshChange = 8 + case appBadgeChange = 16 + case dimScreenWhenIdleChange = 32 + case forceDarkModeChang = 64 + case persistentNotificationChange = 128 + case persistentNotificationLastBGTimeChange = 256 + case screenlockSwitchStateChange = 512 + case showStatsChange = 1024 + case showSmallGraphChange = 2048 +} + +class AppStateController { + + // add app states & methods here + + // General Settings States + var generalSettingsChanged : Bool = false + var generalSettingsChanges : Int = 0 + + // Chart Settings State + var chartSettingsChanged : Bool = false // settings change has ocurred + var chartSettingsChanges: Int = 0 // what settings have changed + + // Info Data Settings State; no need for flags + var infoDataSettingsChanged: Bool = false +} diff --git a/LoopFollow/Controllers/Graphs.swift b/LoopFollow/Controllers/Graphs.swift index 51a9e0031..a3ccf97d7 100644 --- a/LoopFollow/Controllers/Graphs.swift +++ b/LoopFollow/Controllers/Graphs.swift @@ -10,10 +10,9 @@ import Foundation import Charts import UIKit - +let ScaleXMax:Float = 150.0 extension MainViewController { - func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) { if chartView == BGChartFull { BGChart.moveViewToX(entry.x) @@ -27,9 +26,22 @@ extension MainViewController { //BGChartFull.highlightValue(x: Double(currentMatrix.tx), y: Double(currentMatrix.ty), dataSetIndex: 0) } } + + func chartScaled(_ chartView: ChartViewBase, scaleX: CGFloat, scaleY: CGFloat) { + print("Chart Scaled: \(BGChart.scaleX), \(BGChart.scaleY)") + + // dont store huge values + var scale: Float = Float(BGChart.scaleX) + if(scale > ScaleXMax ) { + scale = ScaleXMax + } + UserDefaultsRepository.chartScaleX.value = Float(scale) + } + func createGraph(){ self.BGChart.clear() + // Create the BG Graph Data let entries = bgData var bgChartEntry = [ChartDataEntry]() @@ -211,11 +223,10 @@ extension MainViewController { BGChart.scaleYEnabled = false BGChart.drawGridBackgroundEnabled = false //BGChart.gridBackgroundColor = NSUIColor.secondarySystemBackground + BGChart.data = data BGChart.setExtraOffsets(left: 10, top: 10, right: 10, bottom: 10) - BGChart.setVisibleXRangeMinimum(10) - } @@ -255,7 +266,7 @@ extension MainViewController { ul.limit = Double(UserDefaultsRepository.highLine.value) ul.lineColor = NSUIColor.systemYellow.withAlphaComponent(0.5) BGChart.rightAxis.addLimitLine(ul) - + BGChart.data?.dataSets[dataIndex].notifyDataSetChanged() BGChart.data?.notifyDataChanged() BGChart.notifyDataSetChanged() @@ -293,7 +304,6 @@ extension MainViewController { } - // Set Colors let lineBG = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet @@ -314,8 +324,7 @@ extension MainViewController { } BGChart.rightAxis.axisMaximum = Double(maxBG) - - + BGChart.setVisibleXRangeMinimum(600) BGChart.data?.dataSets[dataIndex].notifyDataSetChanged() BGChart.data?.notifyDataChanged() BGChart.notifyDataSetChanged() @@ -324,7 +333,13 @@ extension MainViewController { BGChartFull.notifyDataSetChanged() if firstGraphLoad { - BGChart.zoom(scaleX: 18, scaleY: 1, x: 1, y: 1) + var scaleX = CGFloat(UserDefaultsRepository.chartScaleX.value) + print("Scale: \(scaleX)") + if( scaleX > CGFloat(ScaleXMax) ) { + scaleX = CGFloat(ScaleXMax) + UserDefaultsRepository.chartScaleX.value = ScaleXMax + } + BGChart.zoom(scaleX: scaleX, scaleY: 1, x: 1, y: 1) firstGraphLoad = false } if BGChart.chartXMax > dateTimeUtils.getNowTimeIntervalUTC() { @@ -359,6 +374,10 @@ extension MainViewController { smallChart.addEntry(value) } + smallChart.circleColors.removeAll() + smallChart.colors.removeAll() + mainChart.colors.removeAll() + mainChart.circleColors.removeAll() if colors.count > 0 { if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Graph: prediction colors") } for i in 0.. 0 { self.checkAlarms(bgs: bgData) } + // Used for Min Ago watch readings + writeCalendar() + + if UserDefaultsRepository.url.value != "" { + if latestLoopTime == 0 { + webLoadNSDeviceStatus() + + webLoadNSBGData(onlyPullLastRecord: onlyPullLastRecord) + + webLoadNSProfile() + if UserDefaultsRepository.downloadBasal.value { + WebLoadNSTempBasals() + } + if UserDefaultsRepository.downloadBolus.value { + webLoadNSBoluses() + } + if UserDefaultsRepository.downloadCarbs.value { + webLoadNSCarbs() + } + webLoadNSCage() + webLoadNSSage() + } + } + + } + } + + // Dex Share Web Call + func webLoadDexShare(onlyPullLastRecord: Bool = false) { + var count = 288 + if onlyPullLastRecord { count = 1 } + dexShare?.fetchData(count) { (err, result) -> () in + + // TODO: add error checking + if(err == nil) { + var data = result! + self.ProcessNSBGData(data: data, onlyPullLastRecord: onlyPullLastRecord) + } else { + // If we get an error, immediately try to pull NS BG Data + self.webLoadNSBGData(onlyPullLastRecord: onlyPullLastRecord) + } } } @@ -154,11 +185,11 @@ extension MainViewController { } let decoder = JSONDecoder() - let entriesResponse = try? decoder.decode([DataStructs.sgvData].self, from: data) + let entriesResponse = try? decoder.decode([ShareGlucoseData].self, from: data) if let entriesResponse = entriesResponse { DispatchQueue.main.async { // trigger the processor for the data after downloading. - self.ProcessNSBGData(data: entriesResponse, onlyPullLastRecord: onlyPullLastRecord) + self.ProcessNSBGData(data: entriesResponse, onlyPullLastRecord: onlyPullLastRecord, isNS: true) } } else { @@ -170,11 +201,26 @@ extension MainViewController { } // NS BG Data Response processor - func ProcessNSBGData(data: [DataStructs.sgvData], onlyPullLastRecord: Bool){ + func ProcessNSBGData(data: [ShareGlucoseData], onlyPullLastRecord: Bool, isNS: Bool = false){ if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: BG") } - var pullDate = data[data.count - 1].date / 1000 - pullDate.round(FloatingPointRoundingRule.toNearestOrEven) + var pullDate = data[data.count - 1].date + if isNS { + pullDate = data[data.count - 1].date / 1000 + pullDate.round(FloatingPointRoundingRule.toNearestOrEven) + } + + var latestDate = data[0].date + if isNS { + latestDate = data[0].date / 1000 + latestDate.round(FloatingPointRoundingRule.toNearestOrEven) + } + + let now = dateTimeUtils.getNowTimeIntervalUTC() + if !isNS && (latestDate + 330) < now { + webLoadNSBGData(onlyPullLastRecord: onlyPullLastRecord) + return + } // If we already have data, we're going to pop it to the end and remove the first. If we have old or no data, we'll destroy the whole array and start over. This is simpler than determining how far back we need to get new data from in case Dex back-filled readings if !onlyPullLastRecord { @@ -195,73 +241,86 @@ extension MainViewController { // loop through the data so we can reverse the order to oldest first for the graph and convert the NS timestamp to seconds instead of milliseconds. Makes date comparisons easier for everything else. for i in 0..= dateTimeUtils.getTimeInterval24HoursAgo() { - let reading = DataStructs.sgvData(sgv: data[data.count - 1 - i].sgv, date: dateString, direction: data[data.count - 1 - i].direction) + let reading = ShareGlucoseData(sgv: data[data.count - 1 - i].sgv, date: dateString, direction: data[data.count - 1 - i].direction) bgData.append(reading) } } - viewUpdateNSBG() + viewUpdateNSBG(isNS: isNS) } // NS BG Data Front end updater - func viewUpdateNSBG () { - if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Display: BG") } - guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return } - let entries = bgData - if entries.count > 0 { - let latestEntryi = entries.count - 1 - let latestBG = entries[latestEntryi].sgv - let priorBG = entries[latestEntryi - 1].sgv - let deltaBG = latestBG - priorBG as Int - let lastBGTime = entries[latestEntryi].date - let deltaTime = (TimeInterval(Date().timeIntervalSince1970)-lastBGTime) / 60 - var userUnit = " mg/dL" - if mmol { - userUnit = " mmol/L" - } - - BGText.text = bgUnits.toDisplayUnits(String(latestBG)) - snoozer.BGLabel.text = bgUnits.toDisplayUnits(String(latestBG)) - setBGTextColor() - - if let directionBG = entries[latestEntryi].direction { - DirectionText.text = bgDirectionGraphic(directionBG) - snoozer.DirectionLabel.text = bgDirectionGraphic(directionBG) - latestDirectionString = bgDirectionGraphic(directionBG) - } - else - { - DirectionText.text = "" - snoozer.DirectionLabel.text = "" - latestDirectionString = "" - } - - if deltaBG < 0 { - self.DeltaText.text = bgUnits.toDisplayUnits(String(deltaBG)) - snoozer.DeltaLabel.text = bgUnits.toDisplayUnits(String(deltaBG)) - latestDeltaString = String(deltaBG) + func viewUpdateNSBG (isNS: Bool) { + DispatchQueue.main.async { + if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Display: BG") } + guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return } + let entries = self.bgData + if entries.count > 0 { + let latestEntryi = entries.count - 1 + let latestBG = entries[latestEntryi].sgv + let priorBG = entries[latestEntryi - 1].sgv + let deltaBG = latestBG - priorBG as Int + let lastBGTime = entries[latestEntryi].date + let deltaTime = (TimeInterval(Date().timeIntervalSince1970)-lastBGTime) / 60 + var userUnit = " mg/dL" + if self.mmol { + userUnit = " mmol/L" + } + + // TODO: remove testing feature to color code arrow based on NS vs Dex + if isNS { + self.serverText.text = "Nightscout" + } else { + self.serverText.text = "Dexcom" + } + + self.BGText.text = bgUnits.toDisplayUnits(String(latestBG)) + snoozer.BGLabel.text = bgUnits.toDisplayUnits(String(latestBG)) + self.setBGTextColor() + + if let directionBG = entries[latestEntryi].direction { + self.DirectionText.text = self.bgDirectionGraphic(directionBG) + snoozer.DirectionLabel.text = self.bgDirectionGraphic(directionBG) + self.latestDirectionString = self.bgDirectionGraphic(directionBG) + } + else + { + self.DirectionText.text = "" + snoozer.DirectionLabel.text = "" + self.latestDirectionString = "" + } + + if deltaBG < 0 { + self.DeltaText.text = bgUnits.toDisplayUnits(String(deltaBG)) + snoozer.DeltaLabel.text = bgUnits.toDisplayUnits(String(deltaBG)) + self.latestDeltaString = String(deltaBG) + } + else + { + self.DeltaText.text = "+" + bgUnits.toDisplayUnits(String(deltaBG)) + snoozer.DeltaLabel.text = "+" + bgUnits.toDisplayUnits(String(deltaBG)) + self.latestDeltaString = "+" + String(deltaBG) + } + self.updateBadge(val: latestBG) + } else { - self.DeltaText.text = "+" + bgUnits.toDisplayUnits(String(deltaBG)) - snoozer.DeltaLabel.text = "+" + bgUnits.toDisplayUnits(String(deltaBG)) - latestDeltaString = "+" + String(deltaBG) + + return } - self.updateBadge(val: latestBG) - + self.updateBGGraph() + self.updateMinAgo() + self.updateStats() } - else - { - - return - } - updateBGGraph() - updateMinAgo() - updateStats() + } // NS Device Status Web Call @@ -308,6 +367,11 @@ extension MainViewController { // NS Device Status Response Processor func updateDeviceStatusDisplay(jsonDeviceStatus: [[String:AnyObject]]) { + self.clearLastInfoData(index: 0) + self.clearLastInfoData(index: 1) + self.clearLastInfoData(index: 3) + self.clearLastInfoData(index: 4) + self.clearLastInfoData(index: 5) if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: device status") } if jsonDeviceStatus.count == 0 { return @@ -339,6 +403,7 @@ extension MainViewController { // Loop if let lastLoopRecord = lastDeviceStatus?["loop"] as! [String : AnyObject]? { + print("Loop: \(lastLoopRecord)") if let lastLoopTime = formatter.date(from: (lastLoopRecord["timestamp"] as! String))?.timeIntervalSince1970 { UserDefaultsRepository.alertLastLoopTime.value = lastLoopTime if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "lastLoopTime: " + String(lastLoopTime)) } @@ -352,7 +417,7 @@ extension MainViewController { if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Loop: Was Enacted") } wasEnacted = true if let lastTempBasal = enacted["rate"] as? Double { - // tableData[2].value = String(format:"%.1f", lastTempBasal) + } } if let iobdata = lastLoopRecord["iob"] as? [String:AnyObject] { @@ -373,16 +438,25 @@ extension MainViewController { let toLoad = Int(UserDefaultsRepository.predictionToLoad.value * 12) var i = 1 while i <= toLoad { - let prediction = DataStructs.sgvData(sgv: prediction[i], date: predictionTime, direction: "flat") - predictionData.append(prediction) - predictionTime += 300 + if i < prediction.count { + let prediction = ShareGlucoseData(sgv: prediction[i], date: predictionTime, direction: "flat") + predictionData.append(prediction) + predictionTime += 300 + } i += 1 } } + let predMin = prediction.min() + let predMax = prediction.max() + tableData[9].value = bgUnits.toDisplayUnits(String(predMin!)) + "/" + bgUnits.toDisplayUnits(String(predMax!)) + if UserDefaultsRepository.graphPrediction.value { updatePredictionGraph() } } + if let recBolus = lastLoopRecord["recommendedBolus"] as? Double { + tableData[8].value = String(format:"%.2fU", recBolus) + } if let loopStatus = lastLoopRecord["recommendedTempBasal"] as? [String:AnyObject] { if let tempBasalTime = formatter.date(from: (loopStatus["timestamp"] as! String))?.timeIntervalSince1970 { var lastBGTime = lastLoopTime @@ -519,6 +593,7 @@ extension MainViewController { // NS Cage Response Processor func updateCage(data: [cageData]) { + self.clearLastInfoData(index: 7) if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: CAGE") } if data.count == 0 { return @@ -588,6 +663,7 @@ extension MainViewController { // NS Sage Response Processor func updateSage(data: [cageData]) { + self.clearLastInfoData(index: 6) if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process/Display: SAGE") } if data.count == 0 { return @@ -806,6 +882,7 @@ extension MainViewController { // NS Temp Basal Response Processor func updateBasals(entries: [[String:AnyObject]]) { + self.clearLastInfoData(index: 2) if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: Basal") } // due to temp basal durations, we're going to destroy the array and load everything each cycle for the time being. basalData.removeAll() @@ -950,9 +1027,11 @@ extension MainViewController { } tableData[2].value = latestBasal + infoTable.reloadData() if UserDefaultsRepository.graphBasal.value { updateBasalGraph() } + infoTable.reloadData() } // NS Bolus Web Call @@ -1013,7 +1092,9 @@ extension MainViewController { return } - let strippedZone = String(bolusDate.dropLast()) + // fix to remove millisecond (after period in timestamp) for FreeAPS users + var strippedZone = String(bolusDate.dropLast()) + strippedZone = strippedZone.components(separatedBy: ".")[0] let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" dateFormatter.locale = Locale(identifier: "en_US") @@ -1102,7 +1183,10 @@ extension MainViewController { } else { return } - let strippedZone = String(carbDate.dropLast()) + // Fix for FreeAPS milliseconds in timestamp + var strippedZone = String(carbDate.dropLast()) + strippedZone = strippedZone.components(separatedBy: ".")[0] + let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" dateFormatter.locale = Locale(identifier: "en_US") @@ -1110,19 +1194,19 @@ extension MainViewController { let dateString = dateFormatter.date(from: strippedZone) let dateTimeStamp = dateString!.timeIntervalSince1970 - do { - let carbs = try currentEntry?["carbs"] as! Double - let sgv = findNearestBGbyTime(needle: dateTimeStamp, haystack: bgData, startingIndex: lastFoundIndex) - lastFoundIndex = sgv.foundIndex - - if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) { - // Make the dot - let dot = bolusCarbGraphStruct(value: carbs, date: Double(dateTimeStamp), sgv: Int(sgv.sgv)) - carbData.append(dot) - } - } catch { - if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "ERROR: Null Carb entry") } + guard let carbs = currentEntry?["carbs"] as? Double else { + if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "ERROR: Null Carb entry")} + break } + let sgv = findNearestBGbyTime(needle: dateTimeStamp, haystack: bgData, startingIndex: lastFoundIndex) + lastFoundIndex = sgv.foundIndex + + if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) { + // Make the dot + let dot = bolusCarbGraphStruct(value: Double(carbs), date: Double(dateTimeStamp), sgv: Int(sgv.sgv)) + carbData.append(dot) + } + } diff --git a/LoopFollow/Controllers/Stats.swift b/LoopFollow/Controllers/Stats.swift index 47bfe48a0..fa75e7d53 100644 --- a/LoopFollow/Controllers/Stats.swift +++ b/LoopFollow/Controllers/Stats.swift @@ -20,9 +20,10 @@ class StatsData { var totalGlucose: Int var avgBG: Float var a1C: Float + var stdDev: Float var pie: [DataStructs.pieData] - init(bgData: [DataStructs.sgvData]) { + init(bgData: [ShareGlucoseData]) { self.countLow = 0 self.countRange = 0 @@ -54,8 +55,6 @@ class StatsData { DataStructs.pieData(name: "range", value: Double(percentRange)), DataStructs.pieData(name: "high", value: Double(percentHigh))] - - // Set Average avgBG = Float(totalGlucose / bgData.count) @@ -67,6 +66,13 @@ class StatsData { // https://github.com/nightscout/nightguard/pull/72 // a1C = (((46.7 + Float(avgBG)) / 28.7) - 2.152) / 0.09148 } + + // compute std dev (sigma) + var partialSum: Float = 0; + for i in 0.. 0 { - var stats = StatsData(bgData: bgData) + let stats = StatsData(bgData: bgData) statsLowPercent.text = String(format:"%.1f%", stats.percentLow) + "%" statsInRangePercent.text = String(format:"%.1f%", stats.percentRange) + "%" statsHighPercent.text = String(format:"%.1f%", stats.percentHigh) + "%" statsAvgBG.text = bgUnits.toDisplayUnits(String(format:"%.0f%", stats.avgBG)) statsEstA1C.text = String(format:"%.1f%", stats.a1C) + statsStdDev.text = String(format:"%.2f%", stats.stdDev) createStatsPie(pieData: stats.pie) } diff --git a/LoopFollow/Extensions/ShareClientExtension.swift b/LoopFollow/Extensions/ShareClientExtension.swift new file mode 100644 index 000000000..c39f7f731 --- /dev/null +++ b/LoopFollow/Extensions/ShareClientExtension.swift @@ -0,0 +1,60 @@ +// +// ShareClientExtension.swift +// LoopFollow +// +// Created by Jose Paredes on 7/13/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation +import ShareClient + +public struct ShareGlucoseData: Codable { + var sgv: Int + var date: TimeInterval + var direction: String? +} + +private var TrendTable: [String] = [ + "NONE", // 0 + "DoubleUp", // 1 + "SingleUp", // 2 + "FortyFiveUp", // 3 + "Flat", // 4 + "FortyFiveDown", // 5 + "SingleDown", // 6 + "DoubleDown", // 7 + "NOT COMPUTABLE", // 8 + "RATE OUT OF RANGE" // 9 +] + +// TODO: probably better to make this an inherited class rather than an extension +extension ShareClient { + + public func fetchData(_ entries: Int, callback: @escaping (ShareError?, [ShareGlucoseData]?) -> Void) { + + self.fetchLast(entries) { (error, result) -> () in + guard error == nil || result != nil else { + return callback(error, nil) + } + + // parse data to conanical form + var shareData = [ShareGlucoseData]() + for i in 0.. TrendTable.count-1) { + trend = 0 + } + + let newShareData = ShareGlucoseData( + sgv: Int(result![i].glucose), + date: result![i].timestamp.timeIntervalSince1970, + direction: TrendTable[trend] + ) + shareData.append(newShareData) + } + callback(nil,shareData) + } + } +} diff --git a/LoopFollow/Extensions/UIViewExtension.swift b/LoopFollow/Extensions/UIViewExtension.swift new file mode 100644 index 000000000..dc9472f7f --- /dev/null +++ b/LoopFollow/Extensions/UIViewExtension.swift @@ -0,0 +1,29 @@ +// +// UIViewExtension.swift +// LoopFollow +// +// Created by Jose Paredes on 7/16/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation +import UIKit + +extension UIView { + enum ViewSide { + case Left, Right, Top, Bottom + } + + func addBorder(toSide side: ViewSide, withColor color: CGColor, andThickness thickness: CGFloat) { + let border = CALayer() + border.backgroundColor = color + + switch side { + case .Left: border.frame = CGRect(x:0, y: 0, width: thickness, height: frame.height); break + case .Right: border.frame = CGRect(x: frame.width-thickness, y: 0, width: thickness, height: frame.height); break + case .Top: border.frame = CGRect(x: 0, y: 0, width: frame.width, height: thickness); break + case .Bottom: border.frame = CGRect(x: 0, y: frame.height-thickness, width: frame.width, height: thickness); break + } + layer.addSublayer(border) + } +} diff --git a/LoopFollow/ViewControllers/AlarmViewController.swift b/LoopFollow/ViewControllers/AlarmViewController.swift index 3613a9609..36e703652 100644 --- a/LoopFollow/ViewControllers/AlarmViewController.swift +++ b/LoopFollow/ViewControllers/AlarmViewController.swift @@ -11,6 +11,7 @@ import UIKit import Eureka class AlarmViewController: FormViewController { + var appStateController: AppStateController? var soundFiles: [String] = [ "Alarm_Buzzer", @@ -144,6 +145,8 @@ class AlarmViewController: FormViewController { } } + + // static let shared = AlarmViewController() @IBAction func unwindToAlarms(sender: UIStoryboardSegue) @@ -160,7 +163,7 @@ class AlarmViewController: FormViewController { form +++ Section("Select Alert") <<< SegmentedRow("bgAlerts"){ row in - row.title = "Main BG Alerts" + row.title = "" row.options = ["Urgent Low", "Low", "High", "Urgent High"] // row.value = "Urgent Low" }.onChange { [weak self] row in @@ -177,7 +180,7 @@ class AlarmViewController: FormViewController { row.value = value } <<< SegmentedRow("bgExtraAlerts"){ row in - row.title = "Extra BG Alerts" + row.title = "" row.options = ["No Readings", "Fast Drop", "Fast Rise", "Temporary"] //row.value = "Missed Readings" }.onChange { [weak self] row in @@ -194,8 +197,12 @@ class AlarmViewController: FormViewController { row.value = value } <<< SegmentedRow("otherAlerts"){ row in - row.title = "Other Alerts" + row.title = "" row.options = ["Not Looping", "Missed Bolus", "SAGE", "CAGE"] + if UserDefaultsRepository.url.value == "" { + row.hidden = true + } + //row.value = "Not Looping" }.onChange { [weak self] row in guard let value = row.value else { return } @@ -213,6 +220,9 @@ class AlarmViewController: FormViewController { <<< SegmentedRow("overrideAlerts"){ row in row.title = "" row.options = ["Override Start", "Override End"] + if UserDefaultsRepository.url.value == "" { + row.hidden = true + } //row.value = "Not Looping" }.onChange { [weak self] row in guard let value = row.value else { return } @@ -258,6 +268,42 @@ class AlarmViewController: FormViewController { buildAlarmSettings() } + + override func viewDidAppear(_ animated: Bool) { + showHideNSDetails() + } + + func showHideNSDetails() { + var isHidden = false + var isEnabled = true + if UserDefaultsRepository.url.value == "" { + isHidden = true + isEnabled = false + } + + if let row1 = form.rowBy(tag: "otherAlerts") as? SegmentedRow { + row1.hidden = .function(["hide"], {form in + return isHidden + }) + row1.evaluateHidden() + } + if let row2 = form.rowBy(tag: "overrideAlerts") as? SegmentedRow { + row2.hidden = .function(["hide"], {form in + return isHidden + }) + row2.evaluateHidden() + } + if let row3 = form.sectionBy(tag: "quietHourSection") as? Section { + row3.hidden = .function(["hide"], {form in + return isHidden + }) + row3.evaluateHidden() + } + + guard let nightscoutTab = self.tabBarController?.tabBar.items![3] else { return } + nightscoutTab.isEnabled = isEnabled + + } func buildSnoozeAll(){ form @@ -356,13 +402,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertTempoaryDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertTemporaryBGDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertTemporaryBGDND.value = value - } <<< SwitchRow("alertTemporaryRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertTemporaryBGRepeat.value @@ -427,13 +466,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertUrgentLowDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertUrgentLowDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertUrgentLowDND.value = value - } <<< SwitchRow("alertUrgentLowRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertUrgentLowRepeat.value @@ -540,13 +572,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertLowDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertLowDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertLowDND.value = value - } <<< SwitchRow("alertLowRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertLowRepeat.value @@ -667,13 +692,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertHighDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertHighDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertHighDND.value = value - } <<< SwitchRow("alertHighRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertHighRepeat.value @@ -778,13 +796,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertUrgentHighDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertUrgentHighDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertUrgentHighDND.value = value - } <<< SwitchRow("alertUrgentHighRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertUrgentHighRepeat.value @@ -926,13 +937,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertFastDropDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertFastDropDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertFastDropDND.value = value - } <<< SwitchRow("alertFastDropRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertFastDropRepeat.value @@ -1074,13 +1078,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertFastRiseDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertFastRiseDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertFastRiseDND.value = value - } <<< SwitchRow("alertFastRiseRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertFastRiseRepeat.value @@ -1187,13 +1184,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertMissedReadingDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertMissedReadingDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertMissedReadingDND.value = value - } <<< SwitchRow("alertMissedReadingRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertMissedReadingRepeat.value @@ -1336,13 +1326,6 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertNotLoopingDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertNotLoopingDND.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.alertNotLoopingDND.value = value - } <<< SwitchRow("alertNotLoopingRepeat"){ row in row.title = "Repeat Sound" row.value = UserDefaultsRepository.alertNotLoopingRepeat.value @@ -1504,12 +1487,12 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertMissedBolusDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertMissedBolusDND.value + <<< SwitchRow("alertMissedBolusQuiet"){ row in + row.title = "Use Quiet Hours" + row.value = UserDefaultsRepository.alertMissedBolusQuiet.value }.onChange { [weak self] row in guard let value = row.value else { return } - UserDefaultsRepository.alertMissedBolusDND.value = value + UserDefaultsRepository.alertMissedBolusQuiet.value = value } <<< SwitchRow("alertMissedBolusRepeat"){ row in row.title = "Repeat Sound" @@ -1630,12 +1613,12 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertSAGEDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertSAGEDND.value + <<< SwitchRow("alertSAGEQuiet"){ row in + row.title = "Use Quiet Hours" + row.value = UserDefaultsRepository.alertSAGEQuiet.value }.onChange { [weak self] row in guard let value = row.value else { return } - UserDefaultsRepository.alertSAGEDND.value = value + UserDefaultsRepository.alertSAGEQuiet.value = value } <<< SwitchRow("alertSAGERepeat"){ row in row.title = "Repeat Sound" @@ -1742,12 +1725,12 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertCAGEDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertCAGEDND.value + <<< SwitchRow("alertCAGEQuiet"){ row in + row.title = "Use Quiet Hours" + row.value = UserDefaultsRepository.alertCAGEQuiet.value }.onChange { [weak self] row in guard let value = row.value else { return } - UserDefaultsRepository.alertCAGEDND.value = value + UserDefaultsRepository.alertCAGEQuiet.value = value } <<< SwitchRow("alertCAGERepeat"){ row in row.title = "Repeat Sound" @@ -1826,12 +1809,12 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertOverrideStartDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertOverrideStartDND.value + <<< SwitchRow("alertOverrideStartQuiet"){ row in + row.title = "Use Quiet Hours" + row.value = UserDefaultsRepository.alertOverrideStartQuiet.value }.onChange { [weak self] row in guard let value = row.value else { return } - UserDefaultsRepository.alertOverrideStartDND.value = value + UserDefaultsRepository.alertOverrideStartQuiet.value = value } <<< SwitchRow("alertOverrideStartRepeat"){ row in row.title = "Repeat Sound" @@ -1840,6 +1823,46 @@ class AlarmViewController: FormViewController { guard let value = row.value else { return } UserDefaultsRepository.alertOverrideStartRepeat.value = value } + <<< DateTimeInlineRow("alertOverrideStartSnoozedTime") { row in + row.title = "Snoozed Until" + if (UserDefaultsRepository.alertOverrideStartSnoozedTime.value != nil) { + row.value = UserDefaultsRepository.alertOverrideStartSnoozedTime.value + } + row.minuteInterval = 5 + row.noValueDisplayText = "Not Snoozed" + } + .onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.alertOverrideStartSnoozedTime.value = value + UserDefaultsRepository.alertOverrideStartIsSnoozed.value = true + let otherRow = self?.form.rowBy(tag: "alertOverrideStartIsSnoozed") as! SwitchRow + otherRow.value = true + otherRow.reload() + } + .onExpandInlineRow { [weak self] cell, row, inlineRow in + inlineRow.cellUpdate() { cell, row in + cell.datePicker.datePickerMode = .dateAndTime + } + let color = cell.detailTextLabel?.textColor + row.onCollapseInlineRow { cell, _, _ in + cell.detailTextLabel?.textColor = color + } + cell.detailTextLabel?.textColor = cell.tintColor + } + <<< SwitchRow("alertOverrideStartIsSnoozed"){ row in + row.title = "Is Snoozed" + row.value = UserDefaultsRepository.alertOverrideStartIsSnoozed.value + row.hidden = "$alertOverrideStartSnoozedTime == nil" + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.alertOverrideStartIsSnoozed.value = value + if !value { + UserDefaultsRepository.alertOverrideStartSnoozedTime.setNil(key: "alertOverrideStartSnoozedTime") + let otherRow = self?.form.rowBy(tag: "alertOverrideStartSnoozedTime") as! DateTimeInlineRow + otherRow.value = nil + otherRow.reload() + } + } } @@ -1871,12 +1894,12 @@ class AlarmViewController: FormViewController { AlarmSound.stop() AlarmSound.playTest() } - <<< SwitchRow("alertOverrideEndDND"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.alertOverrideEndDND.value + <<< SwitchRow("alertOverrideEndQuiet"){ row in + row.title = "Use Quiet Hours" + row.value = UserDefaultsRepository.alertOverrideEndQuiet.value }.onChange { [weak self] row in guard let value = row.value else { return } - UserDefaultsRepository.alertOverrideEndDND.value = value + UserDefaultsRepository.alertOverrideEndQuiet.value = value } <<< SwitchRow("alertOverrideEndRepeat"){ row in row.title = "Repeat Sound" @@ -1885,19 +1908,67 @@ class AlarmViewController: FormViewController { guard let value = row.value else { return } UserDefaultsRepository.alertOverrideEndRepeat.value = value } + <<< DateTimeInlineRow("alertOverrideEndSnoozedTime") { row in + row.title = "Snoozed Until" + if (UserDefaultsRepository.alertOverrideEndSnoozedTime.value != nil) { + row.value = UserDefaultsRepository.alertOverrideEndSnoozedTime.value + } + row.minuteInterval = 5 + row.noValueDisplayText = "Not Snoozed" + } + .onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.alertOverrideEndSnoozedTime.value = value + UserDefaultsRepository.alertOverrideEndIsSnoozed.value = true + let otherRow = self?.form.rowBy(tag: "alertOverrideEndIsSnoozed") as! SwitchRow + otherRow.value = true + otherRow.reload() + } + .onExpandInlineRow { [weak self] cell, row, inlineRow in + inlineRow.cellUpdate() { cell, row in + cell.datePicker.datePickerMode = .dateAndTime + } + let color = cell.detailTextLabel?.textColor + row.onCollapseInlineRow { cell, _, _ in + cell.detailTextLabel?.textColor = color + } + cell.detailTextLabel?.textColor = cell.tintColor + } + <<< SwitchRow("alertOverrideEndIsSnoozed"){ row in + row.title = "Is Snoozed" + row.value = UserDefaultsRepository.alertOverrideEndIsSnoozed.value + row.hidden = "$alertOverrideEndSnoozedTime == nil" + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.alertOverrideEndIsSnoozed.value = value + if !value { + UserDefaultsRepository.alertOverrideEndSnoozedTime.setNil(key: "alertOverrideEndSnoozedTime") + let otherRow = self?.form.rowBy(tag: "alertOverrideEndSnoozedTime") as! DateTimeInlineRow + otherRow.value = nil + otherRow.reload() + } + } } func buildAlarmSettings() { form - +++ Section(header: "Alarm Sound Settings", footer: "Use this volume level for alarms that override system volume") + +++ Section(header: "Alarm Sound Settings", footer: "") + <<< SwitchRow("overrideSystemOutputVolume"){ row in + row.title = "Override System Volume" + row.value = UserDefaultsRepository.overrideSystemOutputVolume.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.overrideSystemOutputVolume.value = value + } <<< StepperRow("forcedOutputVolume") { row in row.title = "Volume Level" row.cell.stepper.stepValue = 0.05 row.cell.stepper.minimumValue = 0 row.cell.stepper.maximumValue = 1 row.value = Double(UserDefaultsRepository.forcedOutputVolume.value) + row.hidden = "$overrideSystemOutputVolume == false" row.displayValueFor = { value in guard let value = value else { return nil } return "\(Int(value*100))%" @@ -1906,20 +1977,26 @@ class AlarmViewController: FormViewController { guard let value = row.value else { return } UserDefaultsRepository.forcedOutputVolume.value = Float(value) } - /* <<< StepperRow("fadeInTimeInterval") { row in - row.title = "Fade-in Seconds" - row.cell.stepper.stepValue = 5 - row.cell.stepper.minimumValue = 0 - row.cell.stepper.maximumValue = 60 - row.value = Double(UserDefaultsRepository.fadeInTimeInterval.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return "\(Int(value))" - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.fadeInTimeInterval.value = TimeInterval(value) - }*/ + + +++ Section(header: "Quiet Hour Settings", footer: "Quiet hours can be used to automatically snooze non-critical alerts that you do not wish to be awakened for such as a sensor change pre-alert that may happen during the night.") { row in + row.tag = "quietHourSection" + } + <<< TimeInlineRow("quietHourStart") { row in + row.title = "Quiet Hours Start Today" + row.value = UserDefaultsRepository.quietHourStart.value + + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.quietHourStart.value = value + } + <<< TimeInlineRow("quietHourEnd") { row in + row.title = "Quiet Hours End Tomorrow" + row.value = UserDefaultsRepository.quietHourEnd.value + + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.quietHourEnd.value = value + } } } diff --git a/LoopFollow/ViewControllers/AppStateViewController.swift b/LoopFollow/ViewControllers/AppStateViewController.swift new file mode 100644 index 000000000..199bbdce5 --- /dev/null +++ b/LoopFollow/ViewControllers/AppStateViewController.swift @@ -0,0 +1,13 @@ +// +// AppStateViewController.swift +// LoopFollow +// +// Created by Jose Paredes on 7/17/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation + +class AppStateViewController { + var appStateController: AppStateController? +} diff --git a/LoopFollow/ViewControllers/DebugSettingsViewController.swift b/LoopFollow/ViewControllers/DebugSettingsViewController.swift new file mode 100644 index 000000000..5f296dde6 --- /dev/null +++ b/LoopFollow/ViewControllers/DebugSettingsViewController.swift @@ -0,0 +1,113 @@ +// +// DebugSettingsViewController.swift +// LoopFollow +// +// Created by Jose Paredes on 7/16/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation +import Eureka +import EventKit +import EventKitUI + +class DebugSettingsViewController: FormViewController { + + var appStateController: AppStateController? + + override func viewDidLoad() { + super.viewDidLoad() + if UserDefaultsRepository.forceDarkMode.value { + overrideUserInterfaceStyle = .dark + } + buildDebugSettings() + } + private func buildDebugSettings() { + form + +++ Section("Debug Settings") + + <<< SwitchRow("downloadBasal"){ row in + row.title = "Download Basal" + row.value = UserDefaultsRepository.downloadBasal.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.downloadBasal.value = value + } + <<< SwitchRow("graphBasal"){ row in + row.title = "Graph Basal" + row.value = UserDefaultsRepository.graphBasal.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.graphBasal.value = value + } + <<< SwitchRow("downloadBolus"){ row in + row.title = "Download Bolus" + row.value = UserDefaultsRepository.downloadBolus.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.downloadBolus.value = value + } + <<< SwitchRow("graphBolus"){ row in + row.title = "Graph Bolus" + row.value = UserDefaultsRepository.graphBolus.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.graphBolus.value = value + } + <<< SwitchRow("downloadCarbs"){ row in + row.title = "Download Carbs" + row.value = UserDefaultsRepository.downloadCarbs.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.downloadCarbs.value = value + } + <<< SwitchRow("graphCarbs"){ row in + row.title = "Graph Carbs" + row.value = UserDefaultsRepository.graphCarbs.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.graphCarbs.value = value + } + + <<< SwitchRow("downloadPrediction"){ row in + row.title = "Download Prediction" + row.value = UserDefaultsRepository.downloadPrediction.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.downloadPrediction.value = value + } + <<< SwitchRow("graphPrediction"){ row in + row.title = "Graph Prediction" + row.value = UserDefaultsRepository.graphPrediction.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.graphPrediction.value = value + } + <<< SwitchRow("debugLog"){ row in + row.title = "Show Debug Log" + row.value = UserDefaultsRepository.debugLog.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.debugLog.value = value + } + <<< StepperRow("viewRefreshDelay") { row in + row.title = "View Refresh Delay" + row.cell.stepper.stepValue = 1 + row.cell.stepper.minimumValue = 5 + row.cell.stepper.maximumValue = 30 + row.value = Double(UserDefaultsRepository.viewRefreshDelay.value) + row.displayValueFor = { value in + guard let value = value else { return nil } + return "\(Int(value))" + } + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.viewRefreshDelay.value = Double(value) + } + +++ ButtonRow() { + $0.title = "DONE" + }.onCellSelection { (row, arg) in + self.dismiss(animated:true, completion: nil) + } + } +} diff --git a/LoopFollow/ViewControllers/DebugViewController.swift b/LoopFollow/ViewControllers/DebugViewController.swift index 3298f985e..45e9593e9 100644 --- a/LoopFollow/ViewControllers/DebugViewController.swift +++ b/LoopFollow/ViewControllers/DebugViewController.swift @@ -10,20 +10,16 @@ import Foundation import UIKit class debugViewController: UIViewController { + - @IBOutlet weak var debugLogTextView: UITextView! - @IBOutlet weak var clearButton: UIButton! + var appStateController: AppStateController? override func viewDidLoad() { super.viewDidLoad() - debugLogTextView.isEditable = false } - @IBAction func clearButton(_ sender: Any) { - - self.debugLogTextView.text = "" - } + } diff --git a/LoopFollow/ViewControllers/GeneralSettingsViewController.swift b/LoopFollow/ViewControllers/GeneralSettingsViewController.swift new file mode 100644 index 000000000..27162c0d4 --- /dev/null +++ b/LoopFollow/ViewControllers/GeneralSettingsViewController.swift @@ -0,0 +1,157 @@ +// +// GeneralSetingsViewController.swift +// LoopFollow +// +// Created by Jose Paredes on 7/16/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation +import Eureka +import EventKit +import EventKitUI + +class GeneralSettingsViewController: FormViewController { + + var appStateController: AppStateController? + + override func viewDidLoad() { + super.viewDidLoad() + + if UserDefaultsRepository.forceDarkMode.value { + overrideUserInterfaceStyle = .dark + } + buildGeneralSettings() + } + + private func buildGeneralSettings() { + form + +++ Section("App Settings") + <<< SwitchRow("appBadge"){ row in + row.title = "Display App Badge" + row.tag = "appBadge" + row.value = UserDefaultsRepository.appBadge.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.appBadge.value = value + // Force main screen update + //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } + //mainScreen.nightscoutLoader(forceLoad: true) + + // set the appstate to indicate settings change and flags + if let appState = self!.appStateController { + appState.generalSettingsChanged = true + appState.generalSettingsChanges |= GeneralSettingsChangeEnum.appBadgeChange.rawValue + } + + } + <<< SwitchRow("backgroundRefresh"){ row in + row.title = "Background Refresh" + row.tag = "backgroundRefresh" + row.value = UserDefaultsRepository.backgroundRefresh.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.backgroundRefresh.value = value + } + <<< StepperRow("backgroundRefreshFrequency") { row in + row.title = "Refresh Minutes" + row.tag = "backgroundRefreshFrequency" + row.cell.stepper.stepValue = 0.25 + row.cell.stepper.minimumValue = 0.25 + row.cell.stepper.maximumValue = 10 + row.value = Double(UserDefaultsRepository.backgroundRefreshFrequency.value) + row.hidden = "$backgroundRefresh == false" + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.backgroundRefreshFrequency.value = value + } + <<< SwitchRow("persistentNotification") { row in + row.title = "Persistent Notification" + row.value = UserDefaultsRepository.persistentNotification.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.persistentNotification.value = value + } + + +++ Section("Display Settings") + <<< SwitchRow("forceDarkMode") { row in + row.title = "Force Dark Mode (Restart App)" + row.value = UserDefaultsRepository.forceDarkMode.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.forceDarkMode.value = value + + } + <<< SwitchRow("showStats") { row in + row.title = "Display Stats" + row.value = UserDefaultsRepository.showStats.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.showStats.value = value + + // set the appstate to indicate settings change and flags + if let appState = self!.appStateController { + appState.generalSettingsChanged = true + appState.generalSettingsChanges |= GeneralSettingsChangeEnum.showStatsChange.rawValue + } + } + <<< SwitchRow("showSmallGraph") { row in + row.title = "Display Small Graph" + row.value = UserDefaultsRepository.showSmallGraph.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.showSmallGraph.value = value + + // set the appstate to indicate settings change and flags + if let appState = self!.appStateController { + appState.generalSettingsChanged = true + appState.generalSettingsChanges |= GeneralSettingsChangeEnum.showSmallGraphChange.rawValue + } + } + <<< SwitchRow("colorBGText") { row in + row.title = "Color Main BG Text" + row.value = UserDefaultsRepository.colorBGText.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.colorBGText.value = value + // Force main screen update + //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } + //mainScreen.setBGTextColor() + + // set the appstate to indicate settings change and flags + if let appState = self!.appStateController { + appState.generalSettingsChanged = true + appState.generalSettingsChanges |= GeneralSettingsChangeEnum.colorBGTextChange.rawValue + } + } + + <<< SwitchRow("screenlockSwitchState") { row in + row.title = "Keep Screen Active" + row.value = UserDefaultsRepository.screenlockSwitchState.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + + if value { + UserDefaultsRepository.screenlockSwitchState.value = value + } + } + + + + + <<< SwitchRow("speakBG"){ row in + row.title = "Speak BG" + row.value = UserDefaultsRepository.speakBG.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.speakBG.value = value + } + + +++ ButtonRow() { + $0.title = "DONE" + }.onCellSelection { (row, arg) in + self.dismiss(animated:true, completion: nil) + } + } + +} diff --git a/LoopFollow/ViewControllers/GraphSettingsViewController.swift b/LoopFollow/ViewControllers/GraphSettingsViewController.swift new file mode 100644 index 000000000..734c77cd2 --- /dev/null +++ b/LoopFollow/ViewControllers/GraphSettingsViewController.swift @@ -0,0 +1,230 @@ +// +// GraphSettingsViewController.swift +// LoopFollow +// +// Created by Jose Paredes on 7/16/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation +import Eureka +import EventKit +import EventKitUI + +class GraphSettingsViewController: FormViewController { + + var appStateController: AppStateController? + + override func viewDidLoad() { + super.viewDidLoad() + if UserDefaultsRepository.forceDarkMode.value { + overrideUserInterfaceStyle = .dark + } + + buildGraphSettings() + + showHideNSDetails() + } + + func showHideNSDetails() { + var isHidden = false + var isEnabled = true + if UserDefaultsRepository.url.value == "" { + isHidden = true + isEnabled = false + } + + if let row1 = form.rowBy(tag: "predictionToLoad") as? StepperRow { + row1.hidden = .function(["hide"], {form in + return isHidden + }) + row1.evaluateHidden() + } + + if let row2 = form.rowBy(tag: "offsetCarbsBolus") as? SwitchRow { + row2.hidden = .function(["hide"], {form in + return isHidden + }) + row2.evaluateHidden() + } + + if let row3 = form.rowBy(tag: "overrideDisplayLocation") as? StepperRow { + row3.hidden = .function(["hide"], {form in + return isHidden + }) + row3.evaluateHidden() + } + + } + + private func buildGraphSettings() { + form + +++ Section("Graph Settings") + + <<< SwitchRow("switchRowDots"){ row in + row.title = "Display Dots" + row.value = UserDefaultsRepository.showDots.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.showDots.value = value + // Force main screen update + // guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } + // mainScreen.updateBGGraphSettings() + + // tell main screen that grap needs updating + if let appState = self!.appStateController { + appState.chartSettingsChanged = true + appState.chartSettingsChanges |= ChartSettingsChangeEnum.showDotsChanged.rawValue + } + } + <<< SwitchRow("switchRowLines"){ row in + row.title = "Display Lines" + row.value = UserDefaultsRepository.showLines.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.showLines.value = value + // Force main screen update + //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } + //mainScreen.updateBGGraphSettings() + + if let appState = self!.appStateController { + appState.chartSettingsChanged = true + appState.chartSettingsChanges |= ChartSettingsChangeEnum.showLinesChanged.rawValue + } + + } + <<< SwitchRow("offsetCarbsBolus"){ row in + row.title = "Offset Carb/Bolus Dots" + row.value = UserDefaultsRepository.offsetCarbsBolus.value + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.offsetCarbsBolus.value = value + + } + <<< StepperRow("predictionToLoad") { row in + row.title = "Hours of Prediction" + row.cell.stepper.stepValue = 0.25 + row.cell.stepper.minimumValue = 0.0 + row.cell.stepper.maximumValue = 6.0 + row.value = Double(UserDefaultsRepository.predictionToLoad.value) + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.predictionToLoad.value = value + } + <<< StepperRow("minBGScale") { row in + row.title = "Min BG Scale" + row.cell.stepper.stepValue = 1 + row.cell.stepper.minimumValue = Double(UserDefaultsRepository.highLine.value) + row.cell.stepper.maximumValue = 400 + row.value = Double(UserDefaultsRepository.minBGScale.value) + row.displayValueFor = { value in + guard let value = value else { return nil } + return bgUnits.toDisplayUnits(String(value)) + + } + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.minBGScale.value = Float(value) + + } + <<< StepperRow("minBGValue") { row in + row.title = "Min BG Display" + row.cell.stepper.stepValue = 1 + row.cell.stepper.minimumValue = -40 + row.cell.stepper.maximumValue = 40 + row.value = Double(UserDefaultsRepository.minBGValue.value) + row.displayValueFor = { value in + guard let value = value else { return nil } + return bgUnits.toDisplayUnits(String(value)) + } + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.minBGValue.value = Float(value) + // Force main screen update + //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } + //mainScreen.updateBGGraphSettings() + + if let appState = self!.appStateController { + appState.chartSettingsChanged = true + appState.chartSettingsChanges |= ChartSettingsChangeEnum.minBGValueChanged.rawValue + } + + } + <<< StepperRow("minBasalScale") { row in + row.title = "Min Basal Scale" + row.cell.stepper.stepValue = 0.5 + row.cell.stepper.minimumValue = 0.5 + row.cell.stepper.maximumValue = 20 + row.value = Double(UserDefaultsRepository.minBasalScale.value) + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.minBasalScale.value = value + } + <<< StepperRow("lowLine") { row in + row.title = "Low BG Display Value" + row.cell.stepper.stepValue = 1 + row.cell.stepper.minimumValue = 40 + row.cell.stepper.maximumValue = 120 + row.value = Double(UserDefaultsRepository.lowLine.value) + row.displayValueFor = { value in + guard let value = value else { return nil } + return bgUnits.toDisplayUnits(String(value)) + } + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.lowLine.value = Float(value) + // Force main screen update + //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } + //mainScreen.updateBGGraphSettings() + + // tell main screen to update + if let appState = self!.appStateController { + appState.chartSettingsChanged = true + appState.chartSettingsChanges |= ChartSettingsChangeEnum.lowLineChanged.rawValue + } + } + <<< StepperRow("highLine") { row in + row.title = "High BG Display Value" + row.cell.stepper.stepValue = 1 + row.cell.stepper.minimumValue = 120 + row.cell.stepper.maximumValue = 400 + row.value = Double(UserDefaultsRepository.highLine.value) + row.displayValueFor = { value in + guard let value = value else { return nil } + return bgUnits.toDisplayUnits(String(value)) + } + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.highLine.value = Float(value) + // Force main screen update + //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } + //mainScreen.updateBGGraphSettings() + + // let app state know of the change + if let appState = self!.appStateController { + appState.chartSettingsChanged = true + appState.chartSettingsChanges |= ChartSettingsChangeEnum.highLineChanged.rawValue + } + } + <<< StepperRow("overrideDisplayLocation") { row in + row.title = "Override BG Location" + row.cell.stepper.stepValue = 1 + row.cell.stepper.minimumValue = Double(UserDefaultsRepository.minBGValue.value) + row.cell.stepper.maximumValue = Double(UserDefaultsRepository.minBGScale.value) + row.value = Double(UserDefaultsRepository.overrideDisplayLocation.value) + row.displayValueFor = { value in + guard let value = value else { return nil } + return bgUnits.toDisplayUnits(String(value)) + } + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.overrideDisplayLocation.value = Float(value) + } + + +++ ButtonRow() { + $0.title = "DONE" + }.onCellSelection { (row, arg) in + self.dismiss(animated:true, completion: nil) + } + } +} diff --git a/LoopFollow/ViewControllers/InfoDisplaySettingsViewController.swift b/LoopFollow/ViewControllers/InfoDisplaySettingsViewController.swift new file mode 100644 index 000000000..6a6fb704e --- /dev/null +++ b/LoopFollow/ViewControllers/InfoDisplaySettingsViewController.swift @@ -0,0 +1,86 @@ +// +// InfoDisplaySettingsViewController.swift +// LoopFollow +// +// Created by Jose Paredes on 7/16/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import UIKit +import Eureka +import EventKit +import EventKitUI + +class InfoDisplaySettingsViewController: FormViewController { + var appStateController: AppStateController? + + + override func viewDidLoad() { + print("Display Load") + super.viewDidLoad() + if UserDefaultsRepository.forceDarkMode.value { + overrideUserInterfaceStyle = .dark + } + + createForm() + } + + private func createForm() { + form + +++ MultivaluedSection(multivaluedOptions: .Reorder, header: "Information Display Settings", footer: "Arrage/Enable Information Desired") { + + // TODO: add the other display values + $0.tag = "InfoDisplay" + + for i in 0.. Int { - return tableData.count + //return tableData.count + return derivedTableData.count + } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", for: indexPath) - let values = tableData[indexPath.row] + let values = derivedTableData[indexPath.row] cell.textLabel?.text = values.name cell.detailTextLabel?.text = values.value return cell @@ -284,6 +377,10 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele } + @objc override func viewDidAppear(_ animated: Bool) { + showHideNSDetails() + } + // Check for new data when timer ends @objc func timerDidEnd(_ timer:Timer) { // if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Main timer ended") } @@ -310,10 +407,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele } //Clear the info data before next pull. This ensures we aren't displaying old data if something fails. - func clearLastInfoData(){ - for i in 0.. String { @@ -323,7 +418,21 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele return String(format: "%02d:%02d", hours, minutes) } - + func showHideNSDetails() { + var isHidden = false + var isEnabled = true + if UserDefaultsRepository.url.value == "" { + isHidden = true + isEnabled = false + } + + LoopStatusLabel.isHidden = isHidden + PredictionLabel.isHidden = isHidden + infoTable.isHidden = isHidden + guard let nightscoutTab = self.tabBarController?.tabBar.items![3] else { return } + nightscoutTab.isEnabled = isEnabled + + } func updateBadge(val: Int) { if UserDefaultsRepository.appBadge.value { @@ -360,7 +469,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele func bgDirectionGraphic(_ value:String)->String { let //graphics:[String:String]=["Flat":"\u{2192}","DoubleUp":"\u{21C8}","SingleUp":"\u{2191}","FortyFiveUp":"\u{2197}\u{FE0E}","FortyFiveDown":"\u{2198}\u{FE0E}","SingleDown":"\u{2193}","DoubleDown":"\u{21CA}","None":"-","NOT COMPUTABLE":"-","RATE OUT OF RANGE":"-"] - graphics:[String:String]=["Flat":"→","DoubleUp":"↑↑","SingleUp":"↑","FortyFiveUp":"↗","FortyFiveDown":"↘︎","SingleDown":"↓","DoubleDown":"↓↓","None":"-","NOT COMPUTABLE":"-","RATE OUT OF RANGE":"-", "": "-"] + graphics:[String:String]=["Flat":"→","DoubleUp":"↑↑","SingleUp":"↑","FortyFiveUp":"↗","FortyFiveDown":"↘︎","SingleDown":"↓","DoubleDown":"↓↓","None":"-","NONE":"-","NOT COMPUTABLE":"-","RATE OUT OF RANGE":"-", "": "-"] return graphics[value]! } @@ -372,10 +481,12 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele if UserDefaultsRepository.calendarIdentifier.value == "" { return } - if self.lastCalDate == self.bgData[self.bgData.count - 1].date && self.calTimer.isValid { -// if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar - Not saving same entry") } - return } - + // This lets us fire the method to write Min Ago entries only once a minute starting after 6 minutes but allows new readings through + if self.lastCalDate == self.bgData[self.bgData.count - 1].date + && (self.calTimer.isValid || (dateTimeUtils.getNowTimeIntervalUTC() - self.lastCalDate) < 360) { + return + } + // Create Event info let deltaBG = self.bgData[self.bgData.count - 1].sgv - self.bgData[self.bgData.count - 2].sgv as Int let deltaTime = (TimeInterval(Date().timeIntervalSince1970) - self.bgData[self.bgData.count - 1].date) / 60 @@ -456,9 +567,10 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele event.calendar = self.store.calendar(withIdentifier: UserDefaultsRepository.calendarIdentifier.value) do { try self.store.save(event, span: .thisEvent, commit: true) - self.lastCalDate = self.bgData[self.bgData.count - 1].date self.calTimer.invalidate() - self.startCalTimer(time: (60 * 5)) + self.startCalTimer(time: (60 * 1)) + + self.lastCalDate = self.bgData[self.bgData.count - 1].date //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar Write: " + eventTitle) } //UserDefaultsRepository.savedEventID.value = event.eventIdentifier //save event id to access this particular event later } catch { @@ -479,13 +591,9 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele } func writeDebugLog(value: String) { - guard let debug = self.tabBarController!.viewControllers?[5] as? debugViewController else { return } var logText = "\n" + dateTimeUtils.printNow() + " - " + value print(logText) - if debug.debugLogTextView.text.lengthOfBytes(using: .utf8) > 1000 { - debug.debugLogTextView.text = "" - } - debug.debugLogTextView.text += logText + } diff --git a/LoopFollow/ViewControllers/NightScoutViewController.swift b/LoopFollow/ViewControllers/NightScoutViewController.swift index ed37e4a43..913932ea8 100644 --- a/LoopFollow/ViewControllers/NightScoutViewController.swift +++ b/LoopFollow/ViewControllers/NightScoutViewController.swift @@ -15,6 +15,7 @@ class NightscoutViewController: UIViewController { @IBOutlet weak var webView: WKWebView! + var appStateController: AppStateController? override func viewDidLoad() { super.viewDidLoad() diff --git a/LoopFollow/ViewControllers/SettingsViewController.swift b/LoopFollow/ViewControllers/SettingsViewController.swift index b01a0df45..1174cd8ba 100644 --- a/LoopFollow/ViewControllers/SettingsViewController.swift +++ b/LoopFollow/ViewControllers/SettingsViewController.swift @@ -13,20 +13,36 @@ import EventKitUI class SettingsViewController: FormViewController { - struct cal { - var title: String - var identifier: String - } - + var appStateController: AppStateController? - override func viewDidLoad() { + func showHideNSDetails() { + var isHidden = false + var isEnabled = true + if UserDefaultsRepository.url.value == "" { + isHidden = true + isEnabled = false + } + + if let row1 = form.rowBy(tag: "informationDisplaySettings") as? ButtonRow { + row1.hidden = .function(["hide"], {form in + return isHidden + }) + row1.evaluateHidden() + } + + guard let nightscoutTab = self.tabBarController?.tabBar.items![3] else { return } + nightscoutTab.isEnabled = isEnabled + + } + + override func viewDidLoad() { super.viewDidLoad() if UserDefaultsRepository.forceDarkMode.value { overrideUserInterfaceStyle = .dark } + - - + form +++ Section(header: "Nightscout Settings", footer: "Changing Nightscout settings requires an app restart.") <<< TextRow(){ row in @@ -36,7 +52,10 @@ class SettingsViewController: FormViewController { }.cellSetup { (cell, row) in cell.textField.autocorrectionType = .no }.onChange { row in - guard let value = row.value else { return } + guard let value = row.value else { + UserDefaultsRepository.url.value = "" + self.showHideNSDetails() + return } // check the format of the URL entered by the user and trim away any spaces or "/" at the end var urlNSInput = value.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression) if urlNSInput.last == "/" { @@ -45,7 +64,8 @@ class SettingsViewController: FormViewController { UserDefaultsRepository.url.value = urlNSInput.lowercased() // set the row value back to the correctly formatted URL so that the user immediately sees how it should have been written row.value = UserDefaultsRepository.url.value - } + self.showHideNSDetails() + } <<< TextRow(){ row in row.title = "NS Token" row.placeholder = "Leave blank if not using tokens" @@ -67,414 +87,103 @@ class SettingsViewController: FormViewController { guard let value = row.value else { return } UserDefaultsRepository.units.value = value } - - - buildGeneralSettings() - // buildAlarmSettings() - buildGraphSettings() - buildWatchSettings() - buildDebugSettings() - - - - - } - - func buildGeneralSettings() { - form - +++ Section("General Settings") - <<< SwitchRow("colorBGText") { row in - row.title = "Color Main BG Text" - row.value = UserDefaultsRepository.colorBGText.value - }.onChange { [weak self] row in + +++ Section("Dexcom Settings") + <<< TextRow(){ row in + row.title = "User Name" + row.value = UserDefaultsRepository.shareUserName.value + }.cellSetup { (cell, row) in + cell.textField.autocorrectionType = .no + }.onChange { row in + if row.value == nil { + UserDefaultsRepository.shareUserName.value = "" + } guard let value = row.value else { return } - UserDefaultsRepository.colorBGText.value = value - // Force main screen update - guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } - mainScreen.setBGTextColor() + UserDefaultsRepository.shareUserName.value = value } - <<< SwitchRow("forceDarkMode") { row in - row.title = "Force Dark Mode (Restart App)" - row.value = UserDefaultsRepository.forceDarkMode.value - }.onChange { [weak self] row in + <<< TextRow(){ row in + row.title = "Password" + row.value = UserDefaultsRepository.sharePassword.value + }.cellSetup { (cell, row) in + cell.textField.autocorrectionType = .no + cell.textField.isSecureTextEntry = true + }.onChange { row in + if row.value == nil { + UserDefaultsRepository.sharePassword.value = "" + } guard let value = row.value else { return } - UserDefaultsRepository.forceDarkMode.value = value + UserDefaultsRepository.sharePassword.value = value } - <<< SwitchRow("persistentNotification") { row in - row.title = "Persistent Notification" - row.value = UserDefaultsRepository.persistentNotification.value - }.onChange { [weak self] row in + <<< SegmentedRow("shareServer") { row in + row.title = "Server" + row.options = ["US", "NON-US"] + row.value = UserDefaultsRepository.shareServer.value + }.onChange { row in guard let value = row.value else { return } - UserDefaultsRepository.persistentNotification.value = value + UserDefaultsRepository.shareServer.value = value } - <<< SwitchRow("screenlockSwitchState") { row in - row.title = "Keep Screen Active" - row.value = UserDefaultsRepository.screenlockSwitchState.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - - if value { - UserDefaultsRepository.screenlockSwitchState.value = value - } - } - <<< SwitchRow("backgroundRefresh"){ row in - row.title = "Background Refresh" - row.tag = "backgroundRefresh" - row.value = UserDefaultsRepository.backgroundRefresh.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.backgroundRefresh.value = value - } - <<< StepperRow("backgroundRefreshFrequency") { row in - row.title = "Refresh Minutes" - row.tag = "backgroundRefreshFrequency" - row.cell.stepper.stepValue = 0.25 - row.cell.stepper.minimumValue = 0.25 - row.cell.stepper.maximumValue = 10 - row.value = Double(UserDefaultsRepository.backgroundRefreshFrequency.value) - row.hidden = "$backgroundRefresh == false" - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.backgroundRefreshFrequency.value = value - } - - <<< SwitchRow("appBadge"){ row in - row.title = "Display App Badge" - row.tag = "appBadge" - row.value = UserDefaultsRepository.appBadge.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.appBadge.value = value - // Force main screen update - guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } - mainScreen.nightscoutLoader(forceLoad: true) - } - <<< SwitchRow("speakBG"){ row in - row.title = "Speak BG" - row.value = UserDefaultsRepository.speakBG.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.speakBG.value = value - } - } - - func buildAlarmSettings() { - form - +++ Section("Alarm Settings") - <<< SwitchRow("overrideSystemOutputVolume"){ row in - row.title = "Override System Volume" - row.value = UserDefaultsRepository.overrideSystemOutputVolume.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.overrideSystemOutputVolume.value = value - } - <<< StepperRow("forcedOutputVolume") { row in - row.title = "Volume Level" - row.cell.stepper.stepValue = 0.05 - row.cell.stepper.minimumValue = 0 - row.cell.stepper.maximumValue = 1 - row.value = Double(UserDefaultsRepository.forcedOutputVolume.value) - row.hidden = "$overrideSystemOutputVolume == false" - row.displayValueFor = { value in - guard let value = value else { return nil } - return "\(Int(value*100))%" - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.forcedOutputVolume.value = Float(value) - } - /* <<< StepperRow("fadeInTimeInterval") { row in - row.title = "Fade-in Seconds" - row.cell.stepper.stepValue = 5 - row.cell.stepper.minimumValue = 0 - row.cell.stepper.maximumValue = 60 - row.value = Double(UserDefaultsRepository.fadeInTimeInterval.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return "\(Int(value))" - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.fadeInTimeInterval.value = TimeInterval(value) - }*/ - } - - func buildGraphSettings() { - form - +++ Section("Graph Settings") + +++ Section("App Settings") + <<< ButtonRow() { + $0.title = "General Settings" + $0.presentationMode = .show( + controllerProvider: .callback(builder: { + let controller = GeneralSettingsViewController() + controller.appStateController = self.appStateController + return controller + } + ), onDismiss: nil) + } + <<< ButtonRow("graphSettings") { + $0.title = "Graph Settings" + $0.presentationMode = .show( + controllerProvider: .callback(builder: { + let controller = GraphSettingsViewController() + controller.appStateController = self.appStateController + return controller + } + ), onDismiss: nil) + } + <<< ButtonRow("informationDisplaySettings") { + $0.title = "Information Display Settings" + $0.presentationMode = .show( + controllerProvider: .callback(builder: { + let controller = InfoDisplaySettingsViewController() + controller.appStateController = self.appStateController + return controller + } + ), onDismiss: nil) - <<< SwitchRow("switchRowDots"){ row in - row.title = "Display Dots" - row.value = UserDefaultsRepository.showDots.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.showDots.value = value - // Force main screen update - guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } - mainScreen.updateBGGraphSettings() - } - <<< SwitchRow("switchRowLines"){ row in - row.title = "Display Lines" - row.value = UserDefaultsRepository.showLines.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.showLines.value = value - // Force main screen update - guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } - mainScreen.updateBGGraphSettings() - } - <<< SwitchRow("offsetCarbsBolus"){ row in - row.title = "Offset Carb/Bolus Dots" - row.value = UserDefaultsRepository.offsetCarbsBolus.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.offsetCarbsBolus.value = value - - } - <<< StepperRow("predictionToLoad") { row in - row.title = "Hours of Prediction" - row.cell.stepper.stepValue = 0.25 - row.cell.stepper.minimumValue = 0.0 - row.cell.stepper.maximumValue = 6.0 - row.value = Double(UserDefaultsRepository.predictionToLoad.value) - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.predictionToLoad.value = value - } - <<< StepperRow("minBGScale") { row in - row.title = "Min BG Scale" - row.cell.stepper.stepValue = 1 - row.cell.stepper.minimumValue = Double(UserDefaultsRepository.highLine.value) - row.cell.stepper.maximumValue = 400 - row.value = Double(UserDefaultsRepository.minBGScale.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return bgUnits.toDisplayUnits(String(value)) - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.minBGScale.value = Float(value) - } - <<< StepperRow("minBGValue") { row in - row.title = "Min BG Display" - row.cell.stepper.stepValue = 1 - row.cell.stepper.minimumValue = -40 - row.cell.stepper.maximumValue = 40 - row.value = Double(UserDefaultsRepository.minBGValue.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return bgUnits.toDisplayUnits(String(value)) - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.minBGValue.value = Float(value) - // Force main screen update - guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } - mainScreen.updateBGGraphSettings() - } - <<< StepperRow("minBasalScale") { row in - row.title = "Min Basal Scale" - row.cell.stepper.stepValue = 0.5 - row.cell.stepper.minimumValue = 0.5 - row.cell.stepper.maximumValue = 20 - row.value = Double(UserDefaultsRepository.minBasalScale.value) - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.minBasalScale.value = value - } - <<< StepperRow("lowLine") { row in - row.title = "Low BG Display Value" - row.cell.stepper.stepValue = 1 - row.cell.stepper.minimumValue = 40 - row.cell.stepper.maximumValue = 120 - row.value = Double(UserDefaultsRepository.lowLine.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return bgUnits.toDisplayUnits(String(value)) - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.lowLine.value = Float(value) - // Force main screen update - guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } - mainScreen.updateBGGraphSettings() - } - <<< StepperRow("highLine") { row in - row.title = "High BG Display Value" - row.cell.stepper.stepValue = 1 - row.cell.stepper.minimumValue = 120 - row.cell.stepper.maximumValue = 400 - row.value = Double(UserDefaultsRepository.highLine.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return bgUnits.toDisplayUnits(String(value)) - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.highLine.value = Float(value) - // Force main screen update - guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return } - mainScreen.updateBGGraphSettings() - } - <<< StepperRow("overrideDisplayLocation") { row in - row.title = "Override BG Location" - row.cell.stepper.stepValue = 1 - row.cell.stepper.minimumValue = Double(UserDefaultsRepository.minBGValue.value) - row.cell.stepper.maximumValue = Double(UserDefaultsRepository.minBGScale.value) - row.value = Double(UserDefaultsRepository.overrideDisplayLocation.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return bgUnits.toDisplayUnits(String(value)) - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.overrideDisplayLocation.value = Float(value) - } - } - - func buildWatchSettings(){ - //array of calendars - let store = EKEventStore() - let ekCalendars = store.calendars(for: EKEntityType.event) - var calendars: [cal] = [] - for i in 0..("calendarIdentifier") { row in - row.title = "Calendar" - row.options = calendars.map { $0.identifier } - row.hidden = "$writeCalendarEvent == false" - row.value = UserDefaultsRepository.calendarIdentifier.value - row.displayValueFor = { value in - guard let value = value else { return nil } - let matching = calendars - .flatMap { $0 } - .filter { $0.identifier.range(of: value) != nil || $0.title.range(of: value) != nil } - if matching.count > 0 { - - return "\(String(matching[0].title))" - } else { - return " - " - } - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.calendarIdentifier.value = value - } - <<< TextRow("watchLine1"){ row in - row.title = "Line 1" - row.hidden = "$writeCalendarEvent == false" - row.value = UserDefaultsRepository.watchLine1.value - }.onChange { row in - guard let value = row.value else { return } - UserDefaultsRepository.watchLine1.value = value - } - <<< TextRow("watchLine2"){ row in - row.title = "Line 2" - row.hidden = "$writeCalendarEvent == false" - row.value = UserDefaultsRepository.watchLine2.value - }.onChange { row in - guard let value = row.value else { return } - UserDefaultsRepository.watchLine2.value = value - } - } - - func buildDebugSettings() { - form - +++ Section("Debug Settings") - - <<< SwitchRow("downloadBasal"){ row in - row.title = "Download Basal" - row.value = UserDefaultsRepository.downloadBasal.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.downloadBasal.value = value - } - <<< SwitchRow("graphBasal"){ row in - row.title = "Graph Basal" - row.value = UserDefaultsRepository.graphBasal.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.graphBasal.value = value - } - <<< SwitchRow("downloadBolus"){ row in - row.title = "Download Bolus" - row.value = UserDefaultsRepository.downloadBolus.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.downloadBolus.value = value - } - <<< SwitchRow("graphBolus"){ row in - row.title = "Graph Bolus" - row.value = UserDefaultsRepository.graphBolus.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.graphBolus.value = value + +++ Section("Debug Settings") + <<< ButtonRow() { + $0.title = "Configure Debug" + $0.presentationMode = .show( + controllerProvider: .callback(builder: { + let controller = DebugSettingsViewController() + controller.appStateController = self.appStateController + return controller } - <<< SwitchRow("downloadCarbs"){ row in - row.title = "Download Carbs" - row.value = UserDefaultsRepository.downloadCarbs.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.downloadCarbs.value = value - } - <<< SwitchRow("graphCarbs"){ row in - row.title = "Graph Carbs" - row.value = UserDefaultsRepository.graphCarbs.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.graphCarbs.value = value - } + ), onDismiss: nil) - <<< SwitchRow("downloadPrediction"){ row in - row.title = "Download Prediction" - row.value = UserDefaultsRepository.downloadPrediction.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.downloadPrediction.value = value - } - <<< SwitchRow("graphPrediction"){ row in - row.title = "Graph Prediction" - row.value = UserDefaultsRepository.graphPrediction.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.graphPrediction.value = value - } - <<< SwitchRow("debugLog"){ row in - row.title = "Show Debug Log" - row.value = UserDefaultsRepository.debugLog.value - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.debugLog.value = value - } - <<< StepperRow("viewRefreshDelay") { row in - row.title = "View Refresh Delay" - row.cell.stepper.stepValue = 1 - row.cell.stepper.minimumValue = 5 - row.cell.stepper.maximumValue = 30 - row.value = Double(UserDefaultsRepository.viewRefreshDelay.value) - row.displayValueFor = { value in - guard let value = value else { return nil } - return "\(Int(value))" - } - }.onChange { [weak self] row in - guard let value = row.value else { return } - UserDefaultsRepository.viewRefreshDelay.value = Double(value) } + + showHideNSDetails() + } - + + } diff --git a/LoopFollow/ViewControllers/SnoozeViewController.swift b/LoopFollow/ViewControllers/SnoozeViewController.swift index fbc931364..5ad288351 100644 --- a/LoopFollow/ViewControllers/SnoozeViewController.swift +++ b/LoopFollow/ViewControllers/SnoozeViewController.swift @@ -11,7 +11,7 @@ import UserNotifications class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate { - + var appStateController: AppStateController? var snoozeTabItem: UITabBarItem = UITabBarItem() var mainTabItem: UITabBarItem = UITabBarItem() @@ -64,6 +64,11 @@ class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate { content.subtitle += directionVal + " " content.subtitle += deltaVal content.categoryIdentifier = "category" + // This is needed to trigger vibrate on watch and phone + // TODO: + // See if we can use .Critcal + // See if we should use this method instead of direct sound player + content.sound = .default let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false) let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) @@ -156,6 +161,47 @@ class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate { } } + func setQuietHours(snoozeTime: Date) + { + + if UserDefaultsRepository.alertMissedBolusQuiet.value { + UserDefaultsRepository.alertMissedBolusIsSnoozed.value = true + UserDefaultsRepository.alertMissedBolusSnoozedTime.value = snoozeTime + guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return } + alarms.reloadIsSnoozed(key: "alertMissedBolusIsSnoozed", value: true) + alarms.reloadSnoozeTime(key: "alertMissedBolusSnoozedTime", setNil: false, value: snoozeTime) + } + if UserDefaultsRepository.alertOverrideStartQuiet.value { + UserDefaultsRepository.alertOverrideStartIsSnoozed.value = true + UserDefaultsRepository.alertOverrideStartSnoozedTime.value = snoozeTime + guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return } + alarms.reloadIsSnoozed(key: "alertOverrideStartIsSnoozed", value: true) + alarms.reloadSnoozeTime(key: "alertOverrideStartSnoozedTime", setNil: false, value: snoozeTime) + } + if UserDefaultsRepository.alertOverrideEndQuiet.value { + UserDefaultsRepository.alertOverrideEndIsSnoozed.value = true + UserDefaultsRepository.alertOverrideEndSnoozedTime.value = snoozeTime + guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return } + alarms.reloadIsSnoozed(key: "alertOverrideEndIsSnoozed", value: true) + alarms.reloadSnoozeTime(key: "alertOverrideEndSnoozedTime", setNil: false, value: snoozeTime) + } + if UserDefaultsRepository.alertCAGEQuiet.value { + UserDefaultsRepository.alertCAGEIsSnoozed.value = true + UserDefaultsRepository.alertCAGESnoozedTime.value = snoozeTime + guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return } + alarms.reloadIsSnoozed(key: "alertCAGEIsSnoozed", value: true) + alarms.reloadSnoozeTime(key: "alertCAGESnoozedTime", setNil: false, value: snoozeTime) + } + if UserDefaultsRepository.alertSAGEQuiet.value { + UserDefaultsRepository.alertSAGEIsSnoozed.value = true + UserDefaultsRepository.alertSAGESnoozedTime.value = snoozeTime + guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return } + alarms.reloadIsSnoozed(key: "alertSAGEIsSnoozed", value: true) + alarms.reloadSnoozeTime(key: "alertSAGESnoozedTime", setNil: false, value: snoozeTime) + } + + } + override func viewDidLoad() { super.viewDidLoad() if UserDefaultsRepository.forceDarkMode.value { diff --git a/LoopFollow/ViewControllers/WatchSettingsViewController.swift b/LoopFollow/ViewControllers/WatchSettingsViewController.swift new file mode 100644 index 000000000..6e1651408 --- /dev/null +++ b/LoopFollow/ViewControllers/WatchSettingsViewController.swift @@ -0,0 +1,145 @@ +// +// WatchSettingsViewController.swift +// LoopFollow +// +// Created by Jose Paredes on 7/16/20. +// Copyright © 2020 Jon Fawcett. All rights reserved. +// + +import Foundation +import Eureka +import EventKit +import EventKitUI + +class WatchSettingsViewController: FormViewController { + + var appStateController: AppStateController? + + override func viewDidLoad() { + super.viewDidLoad() + if UserDefaultsRepository.forceDarkMode.value { + overrideUserInterfaceStyle = .dark + } + buildWatchSettings() + showHideNSDetails() + } + + func showHideNSDetails() { + var isHidden = false + var isEnabled = true + if UserDefaultsRepository.url.value == "" { + isHidden = true + isEnabled = false + } + + let tmpArr = ["IOB", "COB", "BASAL", "LOOP", "OVERRIDE"] + for i in 0..("calendarIdentifier") { row in + row.title = "Calendar" + row.options = calendars.map { $0.identifier } + row.value = UserDefaultsRepository.calendarIdentifier.value + row.displayValueFor = { value in + guard let value = value else { return nil } + let matching = calendars + .flatMap { $0 } + .filter { $0.identifier.range(of: value) != nil || $0.title.range(of: value) != nil } + if matching.count > 0 { + + return "\(String(matching[0].title))" + } else { + return " - " + } + } + }.onChange { [weak self] row in + guard let value = row.value else { return } + UserDefaultsRepository.calendarIdentifier.value = value + } + <<< TextRow("watchLine1"){ row in + row.title = "Line 1" + row.value = UserDefaultsRepository.watchLine1.value + }.onChange { row in + guard let value = row.value else { return } + UserDefaultsRepository.watchLine1.value = value + } + <<< TextRow("watchLine2"){ row in + row.title = "Line 2" + row.value = UserDefaultsRepository.watchLine2.value + }.onChange { row in + guard let value = row.value else { return } + UserDefaultsRepository.watchLine2.value = value + } + + +++ Section(header: "Available Variables", footer: "") + <<< LabelRow("BG"){ row in + row.title = "%BG% : Blood Glucose Reading" + } + <<< LabelRow("DIRECTION"){ row in + row.title = "%DIRECTION% : Dexcom Trend Arrow" + } + <<< LabelRow("DELTA"){ row in + row.title = "%DELTA% : +/- From Last Reading" + } + <<< LabelRow("IOB"){ row in + row.title = "%IOB% : Insulin on Board" + } + <<< LabelRow("COB"){ row in + row.title = "%COB% : Carbs on Board" + } + <<< LabelRow("BASAL"){ row in + row.title = "%BASAL% : Current Basal u/hr" + } + <<< LabelRow("LOOP"){ row in + row.title = "%LOOP% : Loop Status Symbol" + } + <<< LabelRow("OVERRIDE"){ row in + row.title = "%OVERRIDE% : Active Override %" + } + <<< LabelRow("MINAGO"){ row in + row.title = "%MINAGO% : Only displays for old readings" + } + + + +++ ButtonRow() { + $0.title = "DONE" + }.onCellSelection { (row, arg) in + self.dismiss(animated:true, completion: nil) + } + } + +} diff --git a/LoopFollow/helpers/DataStructs.swift b/LoopFollow/helpers/DataStructs.swift index b69167da0..5e9080c52 100644 --- a/LoopFollow/helpers/DataStructs.swift +++ b/LoopFollow/helpers/DataStructs.swift @@ -10,13 +10,6 @@ import Foundation class DataStructs { - //NS BG Struct - struct sgvData: Codable { - var sgv: Int - var date: TimeInterval - var direction: String? - } - // Pie Chart Data struct pieData: Codable { var name: String diff --git a/LoopFollow/helpers/carbBolusArrays.swift b/LoopFollow/helpers/carbBolusArrays.swift index 2881a0800..4b690f690 100644 --- a/LoopFollow/helpers/carbBolusArrays.swift +++ b/LoopFollow/helpers/carbBolusArrays.swift @@ -11,7 +11,7 @@ import Foundation extension MainViewController { - func findNearestBGbyTime(needle: TimeInterval, haystack: [DataStructs.sgvData], startingIndex: Int) -> (sgv: Double, foundIndex: Int) { + func findNearestBGbyTime(needle: TimeInterval, haystack: [ShareGlucoseData], startingIndex: Int) -> (sgv: Double, foundIndex: Int) { // If we can't find a match or things fail, put it at 100 BG for i in startingIndex..(key: "infoDataTotal", default: 0) + static let infoNames = UserDefaultsValue<[String]>(key: "infoNames", default: [ + "IOB", + "COB", + "Basal", + "Override", + "Battery", + "Pump", + "SAGE", + "CAGE", + "Rec. Bolus", + "Pred."]) + static let infoSort = UserDefaultsValue<[Int]>(key: "infoSort", default: [0,1,2,3,4,5,6,7,8,9]) + static let infoVisible = UserDefaultsValue<[Bool]>(key: "infoVisible", default: [true,true,true,true,true,true,true,true,true,true]) + + // Nightscout Settings static let url = UserDefaultsValue(key: "url", default: "") static let token = UserDefaultsValue(key: "token", default: "") static let units = UserDefaultsValue(key: "units", default: "mg/dL") + // Dexcom Share Settings + static let shareUserName = UserDefaultsValue(key: "shareUserName", default: "") + static let sharePassword = UserDefaultsValue(key: "sharePassword", default: "") + static let shareServer = UserDefaultsValue(key: "shareServer", default: "US") + // Graph Settings + static let chartScaleX = UserDefaultsValue(key: "chartScaleX", default: 18.0) static let showDots = UserDefaultsValue(key: "showDots", default: true) static let showLines = UserDefaultsValue(key: "showLines", default: true) static let offsetCarbsBolus = UserDefaultsValue(key: "offsetCarbsBolus", default: true) @@ -31,6 +53,8 @@ class UserDefaultsRepository { // General Settings static let colorBGText = UserDefaultsValue(key: "colorBGText", default: true) + static let showStats = UserDefaultsValue(key: "showStats", default: true) + static let showSmallGraph = UserDefaultsValue(key: "showSmallGraph", default: true) static let speakBG = UserDefaultsValue(key: "speakBG", default: false) static let backgroundRefreshFrequency = UserDefaultsValue(key: "backgroundRefreshFrequency", default: 1) static let backgroundRefresh = UserDefaultsValue(key: "backgroundRefresh", default: true) @@ -51,7 +75,7 @@ class UserDefaultsRepository { static let downloadBolus = UserDefaultsValue(key: "downloadBolus", default: true) static let downloadCarbs = UserDefaultsValue(key: "downloadCarbs", default: true) static let downloadPrediction = UserDefaultsValue(key: "downloadPrediction", default: true) - static let graphBasal = UserDefaultsValue(key: "graphBasal", default: true) + static let graphBasal = UserDefaultsValue(key: "graphBasal", default: true) static let graphBolus = UserDefaultsValue(key: "graphBolus", default: true) static let graphCarbs = UserDefaultsValue(key: "graphCarbs", default: true) static let graphPrediction = UserDefaultsValue(key: "graphPrediction", default: true) @@ -78,12 +102,14 @@ class UserDefaultsRepository { // Alerts + static let quietHourStart = UserDefaultsValue(key: "quietHourStart", default: nil) + static let quietHourEnd = UserDefaultsValue(key: "quietHourEnd", default: nil) + static let snoozedBGReadingTime = UserDefaultsValue(key: "snoozedBGReadingTime", default: 0) static let alertCageInsertTime = UserDefaultsValue(key: "alertCageInsertTime", default: 0) static let alertSageInsertTime = UserDefaultsValue(key: "alertSageInsertTime", default: 0) - static let alertSnoozeAllTime = UserDefaultsValue(key: "alertSnoozeAllTime", default: nil) static let alertSnoozeAllIsSnoozed = UserDefaultsValue(key: "alertSnoozeAllIsSnoozed", default: false) @@ -92,7 +118,6 @@ class UserDefaultsRepository { static let alertUrgentLowSnooze = UserDefaultsValue(key: "alertUrgentLowSnooze", default: 5) static let alertUrgentLowSnoozedTime = UserDefaultsValue(key: "alertUrgentLowSnoozedTime", default: nil) static let alertUrgentLowIsSnoozed = UserDefaultsValue(key: "alertUrgentLowIsSnoozed", default: false) - static let alertUrgentLowDND = UserDefaultsValue(key: "alertUrgentLowDND", default: true) static let alertUrgentLowRepeat = UserDefaultsValue(key: "alertUrgentLowRepeat", default: true) static let alertUrgentLowSound = UserDefaultsValue(key: "alertUrgentLowSound", default: "Indeed") @@ -101,7 +126,6 @@ class UserDefaultsRepository { static let alertLowSnooze = UserDefaultsValue(key: "alertLowSnooze", default: 5) static let alertLowSnoozedTime = UserDefaultsValue(key: "alertLowSnoozedTime", default: nil) static let alertLowIsSnoozed = UserDefaultsValue(key: "alertLowIsSnoozed", default: false) - static let alertLowDND = UserDefaultsValue(key: "alertLowDND", default: true) static let alertLowRepeat = UserDefaultsValue(key: "alertLowRepeat", default: true) static let alertLowSound = UserDefaultsValue(key: "alertLowSound", default: "Indeed") @@ -111,7 +135,6 @@ class UserDefaultsRepository { static let alertHighSnooze = UserDefaultsValue(key: "alertHighSnooze", default: 60) static let alertHighSnoozedTime = UserDefaultsValue(key: "alertHighSnoozedTime", default: nil) static let alertHighIsSnoozed = UserDefaultsValue(key: "alertHighIsSnoozed", default: false) - static let alertHighDND = UserDefaultsValue(key: "alertHighDND", default: true) static let alertHighRepeat = UserDefaultsValue(key: "alertHighRepeat", default: true) static let alertHighSound = UserDefaultsValue(key: "alertHighSound", default: "Indeed") @@ -120,7 +143,6 @@ class UserDefaultsRepository { static let alertUrgentHighSnooze = UserDefaultsValue(key: "alertUrgentHighSnooze", default: 30) static let alertUrgentHighSnoozedTime = UserDefaultsValue(key: "alertUrgentHighSnoozedTime", default: nil) static let alertUrgentHighIsSnoozed = UserDefaultsValue(key: "alertUrgentHighIsSnoozed", default: false) - static let alertUrgentHighDND = UserDefaultsValue(key: "alertUrgentHighDND", default: true) static let alertUrgentHighRepeat = UserDefaultsValue(key: "alertUrgentHighRepeat", default: true) static let alertUrgentHighSound = UserDefaultsValue(key: "alertUrgentHighSound", default: "Indeed") @@ -133,7 +155,6 @@ class UserDefaultsRepository { static let alertFastDropBelowBG = UserDefaultsValue(key: "alertFastDropBelowBG", default: 120.0) static let alertFastDropSnoozedTime = UserDefaultsValue(key: "alertFastDropSnoozedTime", default: nil) static let alertFastDropIsSnoozed = UserDefaultsValue(key: "alertFastDropIsSnoozed", default: false) - static let alertFastDropDND = UserDefaultsValue(key: "alertFastDropDND", default: true) static let alertFastDropRepeat = UserDefaultsValue(key: "alertFastDropRepeat", default: true) static let alertFastDropSound = UserDefaultsValue(key: "alertFastDropSound", default: "Indeed") @@ -145,7 +166,6 @@ class UserDefaultsRepository { static let alertFastRiseAboveBG = UserDefaultsValue(key: "alertFastRiseAboveBG", default: 200.0) static let alertFastRiseSnoozedTime = UserDefaultsValue(key: "alertFastRiseSnoozedTime", default: nil) static let alertFastRiseIsSnoozed = UserDefaultsValue(key: "alertFastRiseIsSnoozed", default: false) - static let alertFastRiseDND = UserDefaultsValue(key: "alertFastRiseDND", default: true) static let alertFastRiseRepeat = UserDefaultsValue(key: "alertFastRiseRepeat", default: true) static let alertFastRiseSound = UserDefaultsValue(key: "alertFastRiseSound", default: "Indeed") @@ -155,7 +175,6 @@ class UserDefaultsRepository { static let alertMissedReadingSnooze = UserDefaultsValue(key: "alertMissedReadingSnooze", default: 30) static let alertMissedReadingSnoozedTime = UserDefaultsValue(key: "alertMissedReadingSnoozedTime", default: nil) static let alertMissedReadingIsSnoozed = UserDefaultsValue(key: "alertMissedReadingIsSnoozed", default: false) - static let alertMissedReadingDND = UserDefaultsValue(key: "alertMissedReadingDND", default: true) static let alertMissedReadingRepeat = UserDefaultsValue(key: "alertMissedReadingRepeat", default: true) static let alertMissedReadingSound = UserDefaultsValue(key: "alertMissedReadingSound", default: "Indeed") @@ -168,7 +187,6 @@ class UserDefaultsRepository { static let alertNotLoopingUpperLimit = UserDefaultsValue(key: "alertNotLoopingAboveBG", default: 160.0) static let alertNotLoopingSnoozedTime = UserDefaultsValue(key: "alertNotLoopingSnoozedTime", default: nil) static let alertNotLoopingIsSnoozed = UserDefaultsValue(key: "alertNotLoopingIsSnoozed", default: false) - static let alertNotLoopingDND = UserDefaultsValue(key: "alertNotLoopingDND", default: true) static let alertNotLoopingRepeat = UserDefaultsValue(key: "alertNotLoopingRepeat", default: true) static let alertNotLoopingSound = UserDefaultsValue(key: "alertNotLoopingSound", default: "Indeed") static let alertLastLoopTime = UserDefaultsValue(key: "alertLastLoopTime", default: 0) @@ -182,13 +200,13 @@ class UserDefaultsRepository { static let alertMissedBolusLowGramsBG = UserDefaultsValue(key: "alertMissedBolusLowGramsBG", default: 70.0) static let alertMissedBolusSnoozedTime = UserDefaultsValue(key: "alertMissedBolusSnoozedTime", default: nil) static let alertMissedBolusIsSnoozed = UserDefaultsValue(key: "alertMissedBolusIsSnoozed", default: false) - static let alertMissedBolusDND = UserDefaultsValue(key: "alertMissedBolusDND", default: false) + static let alertMissedBolusQuiet = UserDefaultsValue(key: "alertMissedBolusQuiet", default: false) static let alertMissedBolusRepeat = UserDefaultsValue(key: "alertMissedBolusRepeat", default: false) static let alertMissedBolusSound = UserDefaultsValue(key: "alertMissedBolusSound", default: "Indeed") static let alertSAGEActive = UserDefaultsValue(key: "alertSAGEActive", default: false) static let alertSAGE = UserDefaultsValue(key: "alertSAGE", default: 8) //Hours - static let alertSAGEDND = UserDefaultsValue(key: "alertSAGEDND", default: false) + static let alertSAGEQuiet = UserDefaultsValue(key: "alertSAGEQuiet", default: false) static let alertSAGERepeat = UserDefaultsValue(key: "alertSAGERepeat", default: false) static let alertSAGESnooze = UserDefaultsValue(key: "alertSAGESnooze", default: 2) //Hours static let alertSAGESnoozedTime = UserDefaultsValue(key: "alertSAGESnoozedTime", default: nil) @@ -197,7 +215,7 @@ class UserDefaultsRepository { static let alertCAGEActive = UserDefaultsValue(key: "alertCAGEActive", default: false) static let alertCAGE = UserDefaultsValue(key: "alertCAGE", default: 4) //Hours - static let alertCAGEDND = UserDefaultsValue(key: "alertCAGEDND", default: false) + static let alertCAGEQuiet = UserDefaultsValue(key: "alertCAGEQuiet", default: false) static let alertCAGERepeat = UserDefaultsValue(key: "alertCAGERepeat", default: false) static let alertCAGESnooze = UserDefaultsValue(key: "alertCAGESnooze", default: 2) //Hours static let alertCAGESnoozedTime = UserDefaultsValue(key: "alertCAGESnoozedTime", default: nil) @@ -209,18 +227,21 @@ class UserDefaultsRepository { static let alertTemporaryActive = UserDefaultsValue(key: "alertTemporaryActive", default: false) static let alertTemporaryBelow = UserDefaultsValue(key: "alertTemporaryBelow", default: true) static let alertTemporaryBG = UserDefaultsValue(key: "alertTemporaryBG", default: 90.0) - static let alertTemporaryBGDND = UserDefaultsValue(key: "alertTemporaryBGDND", default: true) static let alertTemporaryBGRepeat = UserDefaultsValue(key: "alertTemporaryBGRepeat", default: true) static let alertTemporarySound = UserDefaultsValue(key: "alertTemporarySound", default: "Indeed") static let alertOverrideStart = UserDefaultsValue(key: "alertOverrideStart", default: false) - static let alertOverrideStartDND = UserDefaultsValue(key: "alertOverrideStartDND", default: false) + static let alertOverrideStartQuiet = UserDefaultsValue(key: "alertOverrideStartQuiet", default: false) static let alertOverrideStartRepeat = UserDefaultsValue(key: "alertOverrideStartRepeat", default: false) static let alertOverrideStartSound = UserDefaultsValue(key: "alertOverrideStartSound", default: "Alert_Tone_Busy") + static let alertOverrideStartSnoozedTime = UserDefaultsValue(key: "alertOverrideStartSnoozedTime", default: nil) + static let alertOverrideStartIsSnoozed = UserDefaultsValue(key: "alertOverrideStartIsSnoozed", default: false) static let alertOverrideEnd = UserDefaultsValue(key: "alertOverrideEnd", default: false) - static let alertOverrideEndDND = UserDefaultsValue(key: "alertOverrideEndDND", default: false) + static let alertOverrideEndQuiet = UserDefaultsValue(key: "alertOverrideEndQuiet", default: false) static let alertOverrideEndRepeat = UserDefaultsValue(key: "alertOverrideEndRepeat", default: false) static let alertOverrideEndSound = UserDefaultsValue(key: "alertOverrideEndSound", default: "Ending_Reached") + static let alertOverrideEndSnoozedTime = UserDefaultsValue(key: "alertOverrideEndSnoozedTime", default: nil) + static let alertOverrideEndIsSnoozed = UserDefaultsValue(key: "alertOverrideEndIsSnoozed", default: false) } diff --git a/Podfile b/Podfile index 7d56523ec..ebcb5d378 100644 --- a/Podfile +++ b/Podfile @@ -3,5 +3,6 @@ target 'LoopFollow' do pod 'Charts' pod 'Eureka' - - end + pod 'ShareClient', :git => 'https://github.com/josep1972/dexcom-share-client-swift.git', :branch => 'dev' + +end diff --git a/Podfile.lock b/Podfile.lock index 691d4bf71..7629a4238 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -3,20 +3,33 @@ PODS: - Charts/Core (= 3.5.0) - Charts/Core (3.5.0) - Eureka (5.2.1) + - ShareClient (1.2) DEPENDENCIES: - Charts - Eureka + - ShareClient (from `https://github.com/josep1972/dexcom-share-client-swift.git`, branch `dev`) SPEC REPOS: trunk: - Charts - Eureka +EXTERNAL SOURCES: + ShareClient: + :branch: dev + :git: https://github.com/josep1972/dexcom-share-client-swift.git + +CHECKOUT OPTIONS: + ShareClient: + :commit: 815a1dbddd970a563e3b7fd22d88b23c164b026e + :git: https://github.com/josep1972/dexcom-share-client-swift.git + SPEC CHECKSUMS: Charts: 40a08591df1f8ad5c223ddedfb1a06da92f24f7c Eureka: c883105488e05bc65539f583246ecf9657cabbfe + ShareClient: 5937ff69b57c85c2004c915812f73cf7ae86549e -PODFILE CHECKSUM: 7665842405edac4f27ad84d4b66d6d57d5a4e5aa +PODFILE CHECKSUM: b5ee540f0ef2120e92d3b71909453c335d659552 COCOAPODS: 1.9.3 diff --git a/Pods/Local Podspecs/ShareClient.podspec.json b/Pods/Local Podspecs/ShareClient.podspec.json new file mode 100644 index 000000000..d763efe4c --- /dev/null +++ b/Pods/Local Podspecs/ShareClient.podspec.json @@ -0,0 +1,21 @@ +{ + "name": "ShareClient", + "version": "1.2", + "summary": "Dexcom Client Pod", + "swift_versions": "5.0", + "homepage": "https://github.com/josep1972/dexcom-share-client-swift", + "license": "MIT", + "authors": "josep1972", + "platforms": { + "ios": "13" + }, + "source": { + "git": "https://github.com/josep1972/dexcom-share-client-swift.git", + "tag": "v1.2" + }, + "source_files": [ + "ShareClient/ShareClient.h", + "ShareClient/ShareClient.swift" + ], + "swift_version": "5.0" +} diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 691d4bf71..7629a4238 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -3,20 +3,33 @@ PODS: - Charts/Core (= 3.5.0) - Charts/Core (3.5.0) - Eureka (5.2.1) + - ShareClient (1.2) DEPENDENCIES: - Charts - Eureka + - ShareClient (from `https://github.com/josep1972/dexcom-share-client-swift.git`, branch `dev`) SPEC REPOS: trunk: - Charts - Eureka +EXTERNAL SOURCES: + ShareClient: + :branch: dev + :git: https://github.com/josep1972/dexcom-share-client-swift.git + +CHECKOUT OPTIONS: + ShareClient: + :commit: 815a1dbddd970a563e3b7fd22d88b23c164b026e + :git: https://github.com/josep1972/dexcom-share-client-swift.git + SPEC CHECKSUMS: Charts: 40a08591df1f8ad5c223ddedfb1a06da92f24f7c Eureka: c883105488e05bc65539f583246ecf9657cabbfe + ShareClient: 5937ff69b57c85c2004c915812f73cf7ae86549e -PODFILE CHECKSUM: 7665842405edac4f27ad84d4b66d6d57d5a4e5aa +PODFILE CHECKSUM: b5ee540f0ef2120e92d3b71909453c335d659552 COCOAPODS: 1.9.3 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index b3b2e7207..0f4cf711e 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,233 +7,245 @@ objects = { /* Begin PBXBuildFile section */ - 00F52B5B3C90538FE25AEBD9DCC93249 /* ChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC49C98470D53DA3649F1E5A95641514 /* ChartDataProvider.swift */; }; - 01618174B06DD11428CA21BD4F996704 /* ComponentBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82516DCE2680E4E28B019A35C1AA85E7 /* ComponentBase.swift */; }; - 01E1380B9DAEF7517AD42713A8CB716E /* ButtonRowWithPresent.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA6C47970EE73E5F5C1C16EB032C7880 /* ButtonRowWithPresent.swift */; }; - 02DB3B5C782BC3DEF6B921B9D049201D /* BubbleChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 575A3D70A90822811C6533EF48873537 /* BubbleChartDataEntry.swift */; }; - 0388D8402985CBE0DB060BB0D7CCB2ED /* Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000D3C28CD7966485DFAD40B2C9874B4 /* Description.swift */; }; - 03D8F8D16FAF2B28113DB82186DBC66F /* BarLineChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9157BC0B4AEB06D64AE7443A8BD5947D /* BarLineChartViewBase.swift */; }; - 052CDA13B29437A2FDCD9D19230AD39F /* FieldsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FA682FA297006A934B23EEF8E8E3191 /* FieldsRow.swift */; }; - 05C88AAB95E98E3296996797706F19AF /* RuleRequired.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FD6950945FE0889962B8261E67750E /* RuleRequired.swift */; }; - 07572F1826C958646848D4EF5DBF377E /* RuleRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EDC871696C42F364FF9E4FBF320D207 /* RuleRange.swift */; }; - 0769C281810E13C0985B2A414F20ADDE /* XAxisRendererHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929451489095A14748EE4AC0ECE015B3 /* XAxisRendererHorizontalBarChart.swift */; }; - 09D2EA12CED518BAA4BCB6A707FA3125 /* TriangleShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89B6697D34583EEC038208D3A2CCC19 /* TriangleShapeRenderer.swift */; }; - 0A30CC2BF450A16F1F4C39C95CFA3A66 /* BarChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A67B7A482098A7B6617635A36A70C54 /* BarChartDataProvider.swift */; }; - 0D7339D0D404F9C394637DDFE383A7A8 /* DecimalFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE64A695A7435B21BE9B760056208374 /* DecimalFormatter.swift */; }; - 0E7DC6451BEFB26E3A47621C0B7F1C16 /* ViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB20702200078D6C342F044A7ACF647E /* ViewPortJob.swift */; }; - 1132976D856E1857C4CD9989B9A8EBCE /* PieChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CDFE98CDB50C3C14377F152923FF465 /* PieChartView.swift */; }; - 119C3D64BDFECAB92F4FFCEF9B4F135D /* CheckRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D88CE352A90F7E9AC65DFA6D8885891 /* CheckRow.swift */; }; - 12A718BC5CDEB44AA6B58C8EE7C13128 /* ChartColorTemplates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F934EBBD0C767A7DA6DEB455943843 /* ChartColorTemplates.swift */; }; - 13D3AB43B01F6D78090806390BD29B7E /* BarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012D858F75E53844C8DB0E8745A4245F /* BarChartDataSet.swift */; }; - 171D7FC46EC56CF9B16D97877A176C10 /* ChartUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2D900844C314E8262826754BCDB63E /* ChartUtils.swift */; }; - 1AF2A57E2B15E7DB326A38D8D8A4FBE2 /* ChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9640E3B61E9EB2E5999E6AF8A1E6D61A /* ChartViewBase.swift */; }; - 1BB933C505E10805A9E179E3DD2CA17E /* BaseRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BBDA9249CBAFE6EF9373177FF46337 /* BaseRow.swift */; }; - 1C2DB744A980164665CE687581222A12 /* Charts-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 88E17727D64A26D166EA94F8B96ACAB4 /* Charts-dummy.m */; }; - 1D2BEF7D292100F700E00314C6FA6FAF /* CandleStickChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF6F94A014222434C07CED041F1A6237 /* CandleStickChartView.swift */; }; - 1EA6964A5C78B205DFC45AFC08637DF8 /* LegendEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A0B1AFF34D1CE8A4698D476DAE19D1 /* LegendEntry.swift */; }; - 1F33F0B7F8701E9A20F90C6A32B2CA03 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A83BF9B84A2500DB376EB0440F3177 /* Platform.swift */; }; - 1F91BEF50B63CA55CA641D3367FCA3F3 /* CandleStickChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62109DDC014868EF85EAAC5DEA89E792 /* CandleStickChartRenderer.swift */; }; - 22681421488F1E799B4C8FFC0A77F29B /* ZoomViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA35BC7CB0631FB6172FCC3939301CE /* ZoomViewJob.swift */; }; - 25D675B271C3E073CF2C27B945FAADBB /* RadarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E24A04789464015C22D87D5E3A60671 /* RadarChartView.swift */; }; - 2652DBC582FD2BF6AA5B2A40B66020EC /* CircleShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB7F1FDCA25887A48D3D9A7FB615800 /* CircleShapeRenderer.swift */; }; - 26EFCEF521B95D2CCB19E5535408A1FA /* Fill.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254A6B4D102F8420A54512389166B1E8 /* Fill.swift */; }; - 27303BB4BDD2C456C1DEC36087E756B4 /* ICandleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68FDCFBE5C019D26281F7A56CAAFBD4A /* ICandleChartDataSet.swift */; }; - 27A3F7981DF0B5CFCB2E56AABBEAA319 /* FieldRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE28E66678F0411EB23844644DD532A /* FieldRow.swift */; }; - 2AFDC0B52F5347C726EAAD89365E3978 /* PieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CF245263BA6245C01808ECB50BA7C48 /* PieChartDataSet.swift */; }; - 2D144E1543B0B44E364EFEC4E6CFE8D5 /* RuleRegExp.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C982FD8EADF008ED080533ECC61350 /* RuleRegExp.swift */; }; - 2E5AD5FC9F45A7F38F5F5BC6FF7570E9 /* RuleClosure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79AAFAF1006DFD732C3559D661ABC07B /* RuleClosure.swift */; }; - 2E91A4CB83F9DC6BDDAE907A38FE4648 /* BubbleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE8CE52191DADD0E86EFFB723F5C1F43 /* BubbleChartDataProvider.swift */; }; - 2F819FF7F7721DA042E977EF91BA545D /* CombinedChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F1DEC08F246688F6E7531A3395E9B1 /* CombinedChartRenderer.swift */; }; - 31918F06050D6445E06FEDF8E2183AF6 /* XAxisRendererRadarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9FB34C64CEA9EB76D25668DF5B911D0 /* XAxisRendererRadarChart.swift */; }; - 32B122E4A8FECD28F192174EA3A4C704 /* MarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B352DD04711E5CD1288B6F43CA78EAD /* MarkerView.swift */; }; - 34BC5667BA39781B4F70C9AC0518E537 /* CombinedChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9DB5945996F90B2A9EE5243C6A1423F /* CombinedChartDataProvider.swift */; }; - 35C57ED01BE2D7FD6F4DACD96F5EDFE1 /* IFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20056B909D071B51B58A4EC7F9AF016 /* IFillFormatter.swift */; }; - 39E13C8ED0C32E9EC0B353CA45C70CF2 /* AnimatedMoveViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CB81995CD9E3411271534F01DAD4592 /* AnimatedMoveViewJob.swift */; }; - 3A5078F021BB004E2F4463F360D41391 /* HorizontalBarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C086384F94A6CED2FB0EC4DA22CF685 /* HorizontalBarChartView.swift */; }; + 00F52B5B3C90538FE25AEBD9DCC93249 /* ChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7DA86EA696B87A80FF54CABA26548A /* ChartDataProvider.swift */; }; + 01618174B06DD11428CA21BD4F996704 /* ComponentBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEC2735DCC80FD5BCE93B7D1D57A05FB /* ComponentBase.swift */; }; + 01E1380B9DAEF7517AD42713A8CB716E /* ButtonRowWithPresent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 937E34112E8DDE6B37ECE22A0BDC59E7 /* ButtonRowWithPresent.swift */; }; + 02DB3B5C782BC3DEF6B921B9D049201D /* BubbleChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCF71002CB08FA43477C09804AD8CF00 /* BubbleChartDataEntry.swift */; }; + 0388D8402985CBE0DB060BB0D7CCB2ED /* Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11D57BEB61E5B0C8070F999D1C04F128 /* Description.swift */; }; + 03D8F8D16FAF2B28113DB82186DBC66F /* BarLineChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02E9C61C3E7EBE33601F29273FD0610F /* BarLineChartViewBase.swift */; }; + 052CDA13B29437A2FDCD9D19230AD39F /* FieldsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E304C127B722E54D8A82C9CAD421A740 /* FieldsRow.swift */; }; + 05C88AAB95E98E3296996797706F19AF /* RuleRequired.swift in Sources */ = {isa = PBXBuildFile; fileRef = 358D210738B60758170EEAB4EBFD35F7 /* RuleRequired.swift */; }; + 07572F1826C958646848D4EF5DBF377E /* RuleRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F6A8E2C6ECCAF59C045894E1F3DF8C5 /* RuleRange.swift */; }; + 0769C281810E13C0985B2A414F20ADDE /* XAxisRendererHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F34C60E8ABE81F99BFB0915A1517A0 /* XAxisRendererHorizontalBarChart.swift */; }; + 09D2EA12CED518BAA4BCB6A707FA3125 /* TriangleShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 733827F65F5022C471A1447F04440570 /* TriangleShapeRenderer.swift */; }; + 0A30CC2BF450A16F1F4C39C95CFA3A66 /* BarChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B155A2FCCFFC4A5633BA14B82C657F3 /* BarChartDataProvider.swift */; }; + 0D7339D0D404F9C394637DDFE383A7A8 /* DecimalFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B417B1F0CF4DCEC4917E71B8477B9E1 /* DecimalFormatter.swift */; }; + 0E7DC6451BEFB26E3A47621C0B7F1C16 /* ViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D28AE94DD8B0CC673A577C731C03431 /* ViewPortJob.swift */; }; + 1132976D856E1857C4CD9989B9A8EBCE /* PieChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5284FBF634CFF42E384E18E1D82F111C /* PieChartView.swift */; }; + 119C3D64BDFECAB92F4FFCEF9B4F135D /* CheckRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB158EC4C258A5082D64122F7AF89500 /* CheckRow.swift */; }; + 12A718BC5CDEB44AA6B58C8EE7C13128 /* ChartColorTemplates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F49CC163BE65B796CE8B4C654F0B221 /* ChartColorTemplates.swift */; }; + 13D3AB43B01F6D78090806390BD29B7E /* BarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45D5F14D7DBABC785E6B47E0AA271EE3 /* BarChartDataSet.swift */; }; + 171D7FC46EC56CF9B16D97877A176C10 /* ChartUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB3F85B18411852AC6F1EEBBB6D9DCA /* ChartUtils.swift */; }; + 1AF2A57E2B15E7DB326A38D8D8A4FBE2 /* ChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D9E3F84B8F3CDDF959B5457AC2CF6D9 /* ChartViewBase.swift */; }; + 1BB933C505E10805A9E179E3DD2CA17E /* BaseRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4010AF1B513BF04041A5432AF20E42B /* BaseRow.swift */; }; + 1C2DB744A980164665CE687581222A12 /* Charts-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CA6A2727DA19123030277D8B0B6EAD4E /* Charts-dummy.m */; }; + 1D2BEF7D292100F700E00314C6FA6FAF /* CandleStickChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3C05AC94561A5051FEF33F481EC70E6 /* CandleStickChartView.swift */; }; + 1EA6964A5C78B205DFC45AFC08637DF8 /* LegendEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03233AB6D94FE12321C740972ECDCC7C /* LegendEntry.swift */; }; + 1F33F0B7F8701E9A20F90C6A32B2CA03 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B403CCDCB84443B5F5C2ACB7F05262F8 /* Platform.swift */; }; + 1F91BEF50B63CA55CA641D3367FCA3F3 /* CandleStickChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A3C6AB4C2213910B58D3A525336E5E /* CandleStickChartRenderer.swift */; }; + 22681421488F1E799B4C8FFC0A77F29B /* ZoomViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653297DA1AAAEEFC0BF5642F6604CDDC /* ZoomViewJob.swift */; }; + 25D675B271C3E073CF2C27B945FAADBB /* RadarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EBF436B7501608AB33DA5DEF29C213A /* RadarChartView.swift */; }; + 2652DBC582FD2BF6AA5B2A40B66020EC /* CircleShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91590B3C1B301C3DE53A488D68A81701 /* CircleShapeRenderer.swift */; }; + 26EFCEF521B95D2CCB19E5535408A1FA /* Fill.swift in Sources */ = {isa = PBXBuildFile; fileRef = D545BAE8C86C5021FAEB27D4C25D6F10 /* Fill.swift */; }; + 27303BB4BDD2C456C1DEC36087E756B4 /* ICandleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3243DA31298D1FE6BEA4A606C0E0944 /* ICandleChartDataSet.swift */; }; + 27A3F7981DF0B5CFCB2E56AABBEAA319 /* FieldRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4F8A767A733062C597BA28637807CF6 /* FieldRow.swift */; }; + 2AFDC0B52F5347C726EAAD89365E3978 /* PieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44178678937D7A1451FAB15F69C1D8E /* PieChartDataSet.swift */; }; + 2D144E1543B0B44E364EFEC4E6CFE8D5 /* RuleRegExp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99445AF2EFD84919074857FAE2171830 /* RuleRegExp.swift */; }; + 2E5AD5FC9F45A7F38F5F5BC6FF7570E9 /* RuleClosure.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8BC5CA866C668A73EDFD53784DB4A4C /* RuleClosure.swift */; }; + 2E91A4CB83F9DC6BDDAE907A38FE4648 /* BubbleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC48B177FD06557DCB9C5C3583D5B87 /* BubbleChartDataProvider.swift */; }; + 2F819FF7F7721DA042E977EF91BA545D /* CombinedChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F12CC35F78CEC5436F967BCF50C5EF0 /* CombinedChartRenderer.swift */; }; + 3116B2E3FECFF3942AEA6BF17796CA37 /* ShareClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C1F35E26A6B017DFE6EA7B2EEF34E01 /* ShareClient.swift */; }; + 31918F06050D6445E06FEDF8E2183AF6 /* XAxisRendererRadarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFC29535908C42BB065B4E30585417A4 /* XAxisRendererRadarChart.swift */; }; + 32B122E4A8FECD28F192174EA3A4C704 /* MarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CEC4ADA231B20F225A0C0800CF05406 /* MarkerView.swift */; }; + 34BC5667BA39781B4F70C9AC0518E537 /* CombinedChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60B3D090DD53CC3BA96A41B6A0776C /* CombinedChartDataProvider.swift */; }; + 35C57ED01BE2D7FD6F4DACD96F5EDFE1 /* IFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 805B8ACDB7AF64D4B1EFF9695D06D6E7 /* IFillFormatter.swift */; }; + 39E13C8ED0C32E9EC0B353CA45C70CF2 /* AnimatedMoveViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9F3AC74EA385AD1FB48BB312B9A8D01 /* AnimatedMoveViewJob.swift */; }; + 3A5078F021BB004E2F4463F360D41391 /* HorizontalBarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB8BBD29DF85A11464A5ADA946CB94D /* HorizontalBarChartView.swift */; }; + 3A81072EB144BB6F03C7F5360EEEE03D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; 3B86A25C5362FD2905831A10C4806500 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; - 3BF29BEA4C1FF7360E93882C9D6C2A7C /* AlertRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 481AA3E635F1093F5AB7FD74ADA9BDD9 /* AlertRow.swift */; }; - 3D57709B53538839313AA6A6DC6E322C /* ILineRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD2422A99038FA392E12DC40300CD5CC /* ILineRadarChartDataSet.swift */; }; - 3EAC9B9D96C569653EF71750289EB0D0 /* CandleChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 666AEAC030E22BD0BDE90830AF057310 /* CandleChartDataEntry.swift */; }; - 45D64D81FC93E350F19E7A28A8A8FDAC /* NavigationAccessoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEBF3FF6A0AA50E17997BE01E91A7B0E /* NavigationAccessoryView.swift */; }; - 474E946BEBC8E12EA9C8D766BDFCEEF5 /* Platform+Graphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = B495707192AD3EB05D28B3FC41D3DE79 /* Platform+Graphics.swift */; }; - 4975CACC893A427910F64270C28E7275 /* RadarChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70230EF21C40FA0D1ED0CF3F82D0CCA5 /* RadarChartData.swift */; }; - 4994E7B2E69CF616E8E7ECD19014CAE0 /* CandleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EF8E5F90E48A1146DE536864603C6B1 /* CandleChartDataSet.swift */; }; - 4BA52D959C6AC78D2B641936C986D5BD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; - 4BBFCE1FBB68AAFB91FF682CD80B9F69 /* ChevronDownShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9ACCB5D9F822C2F7D0C1E84D401124D /* ChevronDownShapeRenderer.swift */; }; - 4D5CAEA66E12CA438CD7B4FA78BB6186 /* ListCheckRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C86B0118C269219B26CEB29BFEB2BE7 /* ListCheckRow.swift */; }; - 4D9563B240B9127EDF6FBA5A21180FD8 /* PieChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378C21F8B8F022E50AA5A54C32444EEA /* PieChartData.swift */; }; - 4DB24C948D1C4F4FB43DAA833D049885 /* LegendRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A414CED5CB27F40037F440A7B99A8181 /* LegendRenderer.swift */; }; - 5128310DB4D59B51642B2A13972C3434 /* IAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C992A46C86EB9DE636AF70545363749 /* IAxisValueFormatter.swift */; }; - 53772EF4F22DD42A63551C4CD687E9A6 /* LineRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16819173DF628B0FC53570AE9383A1E9 /* LineRadarChartDataSet.swift */; }; - 553F2C40EE9B6C0A1CC57FC2894455CD /* SelectableRowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25585170D6AB5308AE2A678B8A2AFD9 /* SelectableRowType.swift */; }; - 56EB318A58A511C6BE4098E8EAD6A7C0 /* MultipleSelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 742D75E835BBB864914066437E0F9AAF /* MultipleSelectorRow.swift */; }; - 57DA9857A10221E5D429C48B85BB0010 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF9EC3B5687C1269D9ACA71960B2722F /* Cell.swift */; }; - 58398B0E03224E5EBE7FCFAD62F8FB69 /* ILineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053BA00FFC9D0CCCA874716694EF87DA /* ILineChartDataSet.swift */; }; - 5847AEA5F6021F082A9238BDD5801079 /* Platform+Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF1521DEA9B23E85D6E3B390594B8386 /* Platform+Accessibility.swift */; }; - 5A02CFF7195D1A7592F777170D8FC6D9 /* Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D3208F76CADE6D8572D57C206C965D /* Protocols.swift */; }; - 5A1A55188705CB82F540F58D2910AB93 /* Section.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AD9C87BF211B61583EFC0CDAAFD1FE /* Section.swift */; }; - 5A8396B9DDE887F7C397B7EEBC4163AA /* PickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDADC32BFF4DE543DCC8A0C9F33610B8 /* PickerRow.swift */; }; - 5B96DE0FB615C832ACB06B9E16B49740 /* IValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4079FC6B8F8238BE5842EC9593970ED4 /* IValueFormatter.swift */; }; - 5C790091CB1B0D41E23A4AE5FA727983 /* IBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABEA1E706788F7FB4AEF5ABDA5884A2 /* IBubbleChartDataSet.swift */; }; - 5D79FD33591AEAEB1B9BF86EC4EA3EA6 /* BubbleChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7F12C82F13C5D254AFDD932BB189E2 /* BubbleChartRenderer.swift */; }; - 5DA6F4FC8413B90BD793D0AE181C2AA9 /* SquareShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF2AAADC8530B44EFDAFDF76424ACB9 /* SquareShapeRenderer.swift */; }; - 5E27C6B54F72D3C34AB6605772DF7E70 /* LineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8096CF97803FE35D19082B189F139D53 /* LineScatterCandleRadarChartDataSet.swift */; }; - 5F5515249E1A20C230755D2E8001F3FC /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = A76A34E9C02A6AE7AF665A056FC21385 /* Operators.swift */; }; - 5FA0AFCA94E1291506DC54D03765FA22 /* Row.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372778BB7FE2428A1F850F71B3BB5F37 /* Row.swift */; }; - 61B753A042411BCF77F768D958106A5C /* RadarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D25B6FD011B35288185B6EF33CDACC8 /* RadarHighlighter.swift */; }; - 61D928089445221BAB80A8DB76A68904 /* PopoverSelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877048B6F67A34C1FD3885CD20CF3AC6 /* PopoverSelectorRow.swift */; }; + 3BF29BEA4C1FF7360E93882C9D6C2A7C /* AlertRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F50F1D5643D6EBCA09E428806984608 /* AlertRow.swift */; }; + 3D57709B53538839313AA6A6DC6E322C /* ILineRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF8B918AB264444686976350703223A /* ILineRadarChartDataSet.swift */; }; + 3EAC9B9D96C569653EF71750289EB0D0 /* CandleChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDBBC91348519BCFAF54CEB0F3A336E3 /* CandleChartDataEntry.swift */; }; + 45D64D81FC93E350F19E7A28A8A8FDAC /* NavigationAccessoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D0D30B8F618735D32A0FCFC52EB805D /* NavigationAccessoryView.swift */; }; + 474E946BEBC8E12EA9C8D766BDFCEEF5 /* Platform+Graphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDDD26C0BFFFEF7E05816A85ED3048C1 /* Platform+Graphics.swift */; }; + 4975CACC893A427910F64270C28E7275 /* RadarChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B360F02EE859A284562621B5BC8061F /* RadarChartData.swift */; }; + 4994E7B2E69CF616E8E7ECD19014CAE0 /* CandleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70FFA615C5AB19A462747668F6DFAE52 /* CandleChartDataSet.swift */; }; + 4BBFCE1FBB68AAFB91FF682CD80B9F69 /* ChevronDownShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9057EE1840994798463E40010C5B2BC5 /* ChevronDownShapeRenderer.swift */; }; + 4D5CAEA66E12CA438CD7B4FA78BB6186 /* ListCheckRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C7ED3BDF9A49970B6D7F0C0BF8E2B3 /* ListCheckRow.swift */; }; + 4D9563B240B9127EDF6FBA5A21180FD8 /* PieChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5027B3B59A4B57AD77A4D08FD35B4F5 /* PieChartData.swift */; }; + 4DB24C948D1C4F4FB43DAA833D049885 /* LegendRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13243CBC570EC1C4F0410EAB1D89DF92 /* LegendRenderer.swift */; }; + 5128310DB4D59B51642B2A13972C3434 /* IAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00184B71D9C00EA8FDF24D6CE7E8617B /* IAxisValueFormatter.swift */; }; + 5160948170D313DCA6586CFADF3B2A6A /* ShareClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 88506EF0DE39A04D24F910A93C337EFD /* ShareClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53772EF4F22DD42A63551C4CD687E9A6 /* LineRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49992CCA5AEFDD6B4059FA55B46719E2 /* LineRadarChartDataSet.swift */; }; + 553F2C40EE9B6C0A1CC57FC2894455CD /* SelectableRowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94046F1B95DF94D6E175F891C3C315AD /* SelectableRowType.swift */; }; + 56EB318A58A511C6BE4098E8EAD6A7C0 /* MultipleSelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5C4B57627CE6A33CA5AFF28D7B4470 /* MultipleSelectorRow.swift */; }; + 57DA9857A10221E5D429C48B85BB0010 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 568C835AC8B764A0183271E99058B163 /* Cell.swift */; }; + 58398B0E03224E5EBE7FCFAD62F8FB69 /* ILineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5C1C37151607BD73B8CBF52A04A3C2A /* ILineChartDataSet.swift */; }; + 5847AEA5F6021F082A9238BDD5801079 /* Platform+Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBCB97DFE79BCFD22A9806F8AAE04749 /* Platform+Accessibility.swift */; }; + 5A02CFF7195D1A7592F777170D8FC6D9 /* Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C9CD0FB1963D56F3399E0EF8469A0FA /* Protocols.swift */; }; + 5A1A55188705CB82F540F58D2910AB93 /* Section.swift in Sources */ = {isa = PBXBuildFile; fileRef = 989650FD7F5122CA9AC857FF507D818E /* Section.swift */; }; + 5A8396B9DDE887F7C397B7EEBC4163AA /* PickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EEB10C82369CAF70178A725C299F81E /* PickerRow.swift */; }; + 5B96DE0FB615C832ACB06B9E16B49740 /* IValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52777F38E94D175B30FD6CCE0503BE91 /* IValueFormatter.swift */; }; + 5C790091CB1B0D41E23A4AE5FA727983 /* IBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C500690781B6631CE1C0946BDBDDAB /* IBubbleChartDataSet.swift */; }; + 5D79FD33591AEAEB1B9BF86EC4EA3EA6 /* BubbleChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B31F4F15FC21AB2A91319F457B686A31 /* BubbleChartRenderer.swift */; }; + 5DA6F4FC8413B90BD793D0AE181C2AA9 /* SquareShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F9B961D3E7671D04E9474A1C7A2194F /* SquareShapeRenderer.swift */; }; + 5E27C6B54F72D3C34AB6605772DF7E70 /* LineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F38C6C77C1EDABA11F488AF0CB7113BC /* LineScatterCandleRadarChartDataSet.swift */; }; + 5F5515249E1A20C230755D2E8001F3FC /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55F11A5FF44761B6757A841E9A4FE3BD /* Operators.swift */; }; + 5F840ED834EBE06F641AA87BD7B7B178 /* ShareClient-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A047E01EAD49DCD01C6AE241C055B64E /* ShareClient-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5FA0AFCA94E1291506DC54D03765FA22 /* Row.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EACBD53E243A3F9DF8735D46C2460E /* Row.swift */; }; + 61B753A042411BCF77F768D958106A5C /* RadarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FF0C890A9774E7FC5E8434FB5FDA41 /* RadarHighlighter.swift */; }; + 61D928089445221BAB80A8DB76A68904 /* PopoverSelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A909150E97DC082367FC2960FCB633BA /* PopoverSelectorRow.swift */; }; 624CD096DCC639825FDB7372D5E5FF43 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; - 62BEAD080E107195393F8ABBA8C81572 /* BarChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AD23361C3941A28A568A73F5E2A0C96 /* BarChartData.swift */; }; - 62C2F7F87CA413E2407F1F8DECA88949 /* IChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7A9E25022D8E2DE5F4B5ABCFF8073B /* IChartDataSet.swift */; }; - 62E99A538A3363A9013DCCBF519B876F /* CellType.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD7FCF54BAD47CD0733E99A9318D846 /* CellType.swift */; }; - 640C152125D86F7A3C9BDD7D18563CBA /* Platform+Gestures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5FDCBCF25DC40CBD3324686E14C95A /* Platform+Gestures.swift */; }; - 644CBE15115BFEDB16BF372F81CFF076 /* PieRadarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1BB70383AD3D2088BD979874E38FB12 /* PieRadarHighlighter.swift */; }; - 64A0821B4F9954E56639DAF9BD7E575C /* Transformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2F3155FB4D74FAF71DACB796F6C37CF /* Transformer.swift */; }; - 66B829842549EECCE91E61D34FFABCBA /* ScatterChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BE1D35B7B996A40A09DBA627975CAD /* ScatterChartData.swift */; }; - 66FC952C43367208D641932AEB59DA8A /* LineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAB210E66749830C126E32238CE2082D /* LineChartDataSet.swift */; }; - 6706FE594A5FC58BE59F7AA454982D93 /* SliderRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 604618765E9FC4A4C41502066047493A /* SliderRow.swift */; }; - 675D24D585A2506762D77E6052517E00 /* IPieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D988C4498CD948B3BA26A653BC5F2BE1 /* IPieChartDataSet.swift */; }; - 6801E6D885988880F502EFA919360446 /* DefaultAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F84715AE8809D6316FF9BCEAD20DCA /* DefaultAxisValueFormatter.swift */; }; - 683F5BAD171DD257F3EC9472323B4BC7 /* RadarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 071D24D80B9E2809386D89EE81F176E2 /* RadarChartRenderer.swift */; }; - 6A532F6858B2D5219D76BEFE1E74A5A6 /* HorizontalBarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11A72698F5A39FE67A8908256260F03 /* HorizontalBarChartRenderer.swift */; }; - 6D13C3C40D5F2B21B4491B81002F2894 /* RuleEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2275ABB30ED7FCACFB71FDEF947219F2 /* RuleEmail.swift */; }; - 6FDD5EA5214B8CDC0E747916F07D74C2 /* YAxisRendererRadarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE339BC445333F4277FCCF4B6E05248B /* YAxisRendererRadarChart.swift */; }; - 7005C904B5F05004C2BC6703E8B14F39 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92D10EDF63A87D7BD2367F7E8DB62A50 /* Validation.swift */; }; - 709152D66394DCE1D7D3802C65090118 /* IBarLineScatterCandleBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB31C7D459AACCCDAD58C4427C65B1F /* IBarLineScatterCandleBubbleChartDataSet.swift */; }; - 7320CBA29BE1D473CA5BE26B1D226D04 /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E147C593487F41985DF252E8462F8E5 /* Animator.swift */; }; - 74D4DC9B702FBC147C03965E9F271128 /* CrossShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B547D32213ED4ACD5121E873E08B63 /* CrossShapeRenderer.swift */; }; - 74EC68DA659219AB56A917312A73EA7D /* SelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 480C03B7DF1E21E39BD90A9F76955F98 /* SelectorViewController.swift */; }; - 75B22CB8C580F73B117214B061436099 /* IMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 155737109C81D674801FCC3A99A51918 /* IMarker.swift */; }; - 7605565F28B5C078923EE0A3F5D7C86E /* ChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15AE42BF26F6B49F108794BABAF01BE8 /* ChartData.swift */; }; - 7731319719C1878AE7AF9D78705712AF /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C2A801B59BAFE6387217B3B12162AFB /* Range.swift */; }; - 7ACE9E9A28CB14F6DB0D7218C8B50917 /* BubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168949456FDA5D72FC492981BF2AB55E /* BubbleChartDataSet.swift */; }; - 7C944D24CCF29DC5C1B8232C1DBE0340 /* Pods-LoopFollow-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E41188828C3ADE7A96C4DA6ED1CCDA2 /* Pods-LoopFollow-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7CDE8FB3A24BA483F4D2AFB70D990F70 /* Eureka-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FE802B440E6EA22B84F90B2192E9C89C /* Eureka-dummy.m */; }; - 7D605E2EF1E737244832E3329AE89746 /* BarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44AB25DFE6C3A06D58D49ED0CF5DB3EC /* BarChartRenderer.swift */; }; - 7EA6B81624538BCC292467DC0E7832D0 /* BubbleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F85FACC2016BEC51568E2DA039871BA /* BubbleChartData.swift */; }; + 62BEAD080E107195393F8ABBA8C81572 /* BarChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D27C9E57D9FF2AF21780555D5ABAD72 /* BarChartData.swift */; }; + 62C2F7F87CA413E2407F1F8DECA88949 /* IChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14CC39F6C23F4D5D781A2C4B60DF765D /* IChartDataSet.swift */; }; + 62E99A538A3363A9013DCCBF519B876F /* CellType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33379FD8AB582363EBE9071C28E58575 /* CellType.swift */; }; + 640C152125D86F7A3C9BDD7D18563CBA /* Platform+Gestures.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1225F47304F13FF1AC7386400F4ED87 /* Platform+Gestures.swift */; }; + 644CBE15115BFEDB16BF372F81CFF076 /* PieRadarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ACC330581B8B5D9791487A217968559 /* PieRadarHighlighter.swift */; }; + 64A0821B4F9954E56639DAF9BD7E575C /* Transformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E240AEA05F9F44EE97E2D31F32D155F8 /* Transformer.swift */; }; + 66B829842549EECCE91E61D34FFABCBA /* ScatterChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80D29F462EBAF9532A128EC200F45E9 /* ScatterChartData.swift */; }; + 66FC952C43367208D641932AEB59DA8A /* LineChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11084C60F774B99DECB61B35E3EC7DD3 /* LineChartDataSet.swift */; }; + 6706FE594A5FC58BE59F7AA454982D93 /* SliderRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 263007DB32EB3A923F7839CBF8E121BA /* SliderRow.swift */; }; + 675D24D585A2506762D77E6052517E00 /* IPieChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C32A2598D7B44B2489E4DB9D0CEEA55 /* IPieChartDataSet.swift */; }; + 6801E6D885988880F502EFA919360446 /* DefaultAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EFBA8CE68D4633D9089932B8A4E3871 /* DefaultAxisValueFormatter.swift */; }; + 683F5BAD171DD257F3EC9472323B4BC7 /* RadarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B08418091F0B05BA6BDCC363F96B8C43 /* RadarChartRenderer.swift */; }; + 6A532F6858B2D5219D76BEFE1E74A5A6 /* HorizontalBarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A139CB129780B5CE6CC6A7ABE85922E /* HorizontalBarChartRenderer.swift */; }; + 6D13C3C40D5F2B21B4491B81002F2894 /* RuleEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A4B20180EE2205670B1B03813AD23E /* RuleEmail.swift */; }; + 6FDD5EA5214B8CDC0E747916F07D74C2 /* YAxisRendererRadarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9423746E4BC0AD1992F5D13E2E1F9E70 /* YAxisRendererRadarChart.swift */; }; + 7005C904B5F05004C2BC6703E8B14F39 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99AC4BCC8856578AC43D03573FADE196 /* Validation.swift */; }; + 709152D66394DCE1D7D3802C65090118 /* IBarLineScatterCandleBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69BD15D5856F4E84E769AFD9438BF861 /* IBarLineScatterCandleBubbleChartDataSet.swift */; }; + 7320CBA29BE1D473CA5BE26B1D226D04 /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF80E9E9FD2ABA19F783C1FE8CEDE21 /* Animator.swift */; }; + 74D4DC9B702FBC147C03965E9F271128 /* CrossShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2507ADB972377DD593EFFA943EA075D0 /* CrossShapeRenderer.swift */; }; + 74EC68DA659219AB56A917312A73EA7D /* SelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01022F6F2F1BF3E5C5F500A0650CC1BF /* SelectorViewController.swift */; }; + 75B22CB8C580F73B117214B061436099 /* IMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E940C1BB7A0182B5BD9433DF9D6E040F /* IMarker.swift */; }; + 7605565F28B5C078923EE0A3F5D7C86E /* ChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD106D95076EE34EC2C06B62908D944 /* ChartData.swift */; }; + 7731319719C1878AE7AF9D78705712AF /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28E3D7678445542747F9C16A8ADD7CC0 /* Range.swift */; }; + 7ACE9E9A28CB14F6DB0D7218C8B50917 /* BubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC6B766C4F4809D41B6E083F9A3F0AC /* BubbleChartDataSet.swift */; }; + 7CDE8FB3A24BA483F4D2AFB70D990F70 /* Eureka-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A9A56A406C5958A1B025AF2BEADEAB5E /* Eureka-dummy.m */; }; + 7D605E2EF1E737244832E3329AE89746 /* BarChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFF6A340445BB493577104B53D9A7588 /* BarChartRenderer.swift */; }; + 7EA6B81624538BCC292467DC0E7832D0 /* BubbleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = A76791113E26FF4E2E0456B3AFBEB78B /* BubbleChartData.swift */; }; 7EEDCE629FA937973E081443AAEEF514 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */; }; - 8104AC0D8B60EEC6FB5C73EAFA1934AA /* PieRadarChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4C9132328F362E9C3125EA0BB30F7F /* PieRadarChartViewBase.swift */; }; - 81FCFDD76834B83BF46D3741C79FF29A /* MarkerImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53A8210C66064E3B8F1EC9B6453B323 /* MarkerImage.swift */; }; - 821C23BCC87386E7EDAAF97B3C4F1D5D /* RowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 774E64F62D19C0B99410BBF3B8FE0555 /* RowType.swift */; }; - 83907D8546A31C4C4B1E31DA90A0CD77 /* ChartLimitLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E6ADC76EF0EE1AE0F7877BAE8AC3430 /* ChartLimitLine.swift */; }; - 83BBD232FE2EA04587B21C81B73AFC09 /* ChartDataEntryBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F342C0D599983866B101EAD57EE965BC /* ChartDataEntryBase.swift */; }; - 8606577BE49942FFBE9764F6BAC993A8 /* BarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 714555686E18EFF7F47B8D5E49DBEA3F /* BarHighlighter.swift */; }; - 8A92D825C03E19810B5393EFDFE4502E /* MultipleSelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3FB5D0BD363FB7F09E40CBD6821E463 /* MultipleSelectorViewController.swift */; }; - 8AFA10B7F0591080EA6BCBCC9CB34BE1 /* GenericMultipleSelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9B73786C8C3F0A227107004B92E8D5 /* GenericMultipleSelectorRow.swift */; }; - 8CBA559D0C2045A8E6F7F9922C553F0F /* CandleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C079A2B4457B189E14F7ACCDF6210CB2 /* CandleChartDataProvider.swift */; }; - 8CDD660210D5A535F6725F30259E629A /* PresenterRowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B21D20DD89ABCD133C907484489A4E9 /* PresenterRowType.swift */; }; - 8D62FB3504F2C9B9E0910E493637F7BE /* BarChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55ED648BE5F5D63433355F4029BE846A /* BarChartDataEntry.swift */; }; - 8E01F38A1667D8B2C57E20400D6BB425 /* LineRadarRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6CAE7AC4CEE072EBCA52375CFE7EAC8 /* LineRadarRenderer.swift */; }; - 8EE80878B32207C5EC1712D83F04983A /* ChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BA5667ABB00F921823EE8C11E0C596 /* ChartDataSet.swift */; }; - 91704461340ABFBEB88425DCC9867890 /* HorizontalBarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A52112890B03A2230EA87DE2074EBF66 /* HorizontalBarHighlighter.swift */; }; - 91FA70B412F137846836139ED890FF6C /* ChartBaseDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4DC8D9C55731586FBF6CA8B50AE3C8 /* ChartBaseDataSet.swift */; }; - 930F4FD273BB41A8D1BB1F07608B3028 /* RadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71C85204757B1DFD665A234DDC2CB843 /* RadarChartDataSet.swift */; }; - 93966518847AB0F104DFCC9DC5B63197 /* ChartHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86F8AE08B613E8389A122C6ED38A14A2 /* ChartHighlighter.swift */; }; - 9400854C32DFF16FD068D280CD43176F /* AxisBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FCDBD5310D634048A381DF6344DCB8 /* AxisBase.swift */; }; - 94921CD3D3FBA3D6572678B1F59AA957 /* TransformerHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AD46C920FCFDF92D97C5CE6DA55653C /* TransformerHorizontalBarChart.swift */; }; - 970B9C4530EA8ACC31B005CE4523C91B /* AnimatedZoomViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BDA597AD98E041BDF72BECA4E7CC21C /* AnimatedZoomViewJob.swift */; }; - 991A4EA362C241D77DF184594E226E93 /* ScatterChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFCB038F9DFF63DB1A66A0BA0DE2FF3 /* ScatterChartView.swift */; }; - 9C081B18BB1A54D953EB89605319AA77 /* Legend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F7D2159259306783652FFC35C5F4BB5 /* Legend.swift */; }; - 9F668D7B0F3CEA3608D305A013A7BE48 /* Highlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 679725EAA7D6C233678CE91C58906413 /* Highlight.swift */; }; - A02F150A74062D9E29592D3EBD13B777 /* StepperRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE837191BE21D305F27EADE4736036C7 /* StepperRow.swift */; }; - A4C99CE4C6D89F2107F6A280A0A85688 /* HeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF31146E46DDECAC6A65C804FDFB9567 /* HeaderFooterView.swift */; }; - A688509392FC14A799979CEA50908A2D /* DataApproximator+N.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FE0C9E36C7E4EA71A9C0915DCDE460 /* DataApproximator+N.swift */; }; - A710DCACFF8FFEA66D7ACC5D1BD95C1D /* XAxisRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5CF5AF933F10270B89A5C7DA4913A6D /* XAxisRenderer.swift */; }; - A77DA0652E7847FE296224EEB12F7EBD /* RuleLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D2D7BC97BBDFE8D04CF6B579F20125 /* RuleLength.swift */; }; - A86CEF7063CDF44017CBFC67DEA1168E /* ChevronUpShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3589AD577F14D9EF3C1B486E3AE9AD1 /* ChevronUpShapeRenderer.swift */; }; - A91D4F561E5C16644A5D3A389609ACD6 /* DoublePickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C23603F603481C63472733E4703D0D /* DoublePickerRow.swift */; }; - A95748A4D50EEB26B6290061C34DAA6D /* AnimatedViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377C3CF3DE13B0EC7726913B2DA966C9 /* AnimatedViewPortJob.swift */; }; - AA39F0560285BF5448411D429ED9408D /* IScatterChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE6E347B4EC0B71AFAC54530B584158B /* IScatterChartDataSet.swift */; }; - AAA33D7843F1F33E3F9D6F261AB5C2B3 /* PickerInlineRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE7167E3A24661ED73D8E4CF4833587 /* PickerInlineRow.swift */; }; - AADC2477F0EC2A446D3342DCA1E220C8 /* TriplePickerInputRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64CA3F06341E9548CF06B61574FDE552 /* TriplePickerInputRow.swift */; }; - ABC6878E21B62261BBB4E1631E5EDAF1 /* ChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECEF07022B6C554B4E9802C221B95B9 /* ChartDataEntry.swift */; }; - AC795F2AEFA1C804BABDB1D4931FAAEB /* RowProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C7772421B5C0539F7DC061340FF69FC /* RowProtocols.swift */; }; - AD1E6E99CE3807BF3DEE1BEBE6E3CAF2 /* BarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C3392B488D1C70CE763BEC834C6E40 /* BarChartView.swift */; }; - AEAB95AFD2529CDAF3A10D90A165CF16 /* BarLineScatterCandleBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83942BEC8B7DB3645C30D60937AF2652 /* BarLineScatterCandleBubbleChartDataSet.swift */; }; - AF34EC6CDB336F35ACD18C2CA8428251 /* PieChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0888FBF51D984A19315B2B45406842AE /* PieChartDataEntry.swift */; }; - AFCEB645D509F679CE8FBCFFEDBB65BC /* SwitchRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7AE0E1C416BB967B5624D0ECADD53F8 /* SwitchRow.swift */; }; - B00A1568A89DD820BC9063DC6961540D /* XAxis.swift in Sources */ = {isa = PBXBuildFile; fileRef = B86222F70DF9BA5C9FD5BC0C57B44516 /* XAxis.swift */; }; - B14341E138DC6D05193C2866864E9DEC /* AxisRendererBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DCD9F34ED2EFAB655BF84EB19BF0B03 /* AxisRendererBase.swift */; }; - B45CE2B91939EC0EA7898C1C6BA16367 /* ILineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249597AD33DF9857FD7F304A78EBA7DF /* ILineScatterCandleRadarChartDataSet.swift */; }; - B466D5B2650B7521FBE653FC9B7A793D /* DateInlineRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF603CBA0282655DE10AB2E64E38A78 /* DateInlineRow.swift */; }; - B490953386257F2C8E03C1D632AC361E /* OptionsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E613BE0BFFB09D55A3AD7BC1EEFD4823 /* OptionsRow.swift */; }; - B65DAD4280582DBED3A5A2C62185B389 /* YAxisRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD461674D07DC3CCE2C5289E94480677 /* YAxisRenderer.swift */; }; - B6DF9275361EA04A959E38F4133C33B7 /* SwipeActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB8EF9C425A89B975BEF843FFF552985 /* SwipeActions.swift */; }; - B7F7A44644C42AB4F5FD569F6B1EAD58 /* Pods-LoopFollow-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 28609CC9D3828C150821F3AA18752A77 /* Pods-LoopFollow-dummy.m */; }; - B87DABFAA95CDA5DFDDD2F409FDD5DF3 /* YAxisRendererHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950BD31462B45700CCB1D7EC3B5EFDCB /* YAxisRendererHorizontalBarChart.swift */; }; - BB75859BDCF578D67C08E6E6741701EB /* PieChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA54E592B656A55A540BF36DF17957A /* PieChartRenderer.swift */; }; - BCD42880A54D247B7A68AC06335D0AF5 /* YAxis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72076E17F40C394C421E55A1B2A5B5AB /* YAxis.swift */; }; - BDD367ED4BB5510C86658115EE6BE71E /* CombinedHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B024F185ECED75F48C085E205179B60 /* CombinedHighlighter.swift */; }; - BE93E023215A8B4A05A2AEC8B7FAE170 /* InlineRowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F7E3D2928552D57E8FFCA76AE2898BA /* InlineRowType.swift */; }; - C031EFD3013B5803C3B7A6D07E4721C0 /* CombinedChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CADE2DFAF271071EECD3C92248F2192 /* CombinedChartData.swift */; }; - C08713DF3DF904E55D8A3E3775A6F3EB /* TriplePickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4C0C98D51FEC617960BEE2F5E7EC507 /* TriplePickerRow.swift */; }; - C0F073D21CF9CB5F87F3F21044E98BF0 /* DateRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A5BD0C4DDD7D499A7B4F756946AA449 /* DateRow.swift */; }; - C2012E1E9FD44B75ECF4B4B3D3782293 /* IndexAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B946915CF4D343517B51D33FD3A04BCF /* IndexAxisValueFormatter.swift */; }; - C299DDF2CE31D8489EFFD0B9D086F9FE /* SelectableSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = E81B1BBAF0B43F0A7937AAA509040657 /* SelectableSection.swift */; }; - C2F5EF0076B32E28969F73229409F94E /* DatePickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87994AC80B253089EC8951B0916B1C1D /* DatePickerRow.swift */; }; - C45A1A018758BC37A59C89114F9A4F75 /* Platform+Touch Handling.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA9B460BCA0242A40EEA3451ECEA392E /* Platform+Touch Handling.swift */; }; - C4EB1DE2CCEE60A99EB5AA718DD67105 /* Eureka-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BB6D1BC5E7576A4EE182F66FDB70135E /* Eureka-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C5562E6984BB0FDC8358F2737187DC90 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7105F1BABE60EE081EBDC3478EBDF544 /* Helpers.swift */; }; - C5880AE977F94A1AE25E756A805B7B0B /* LineChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3154F080DAF844406EBAD792DD1F1AC /* LineChartDataProvider.swift */; }; - C5A3430178D9993D8A5A13864AE40A45 /* ScatterChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E075D6FF5CADB79137C6C0F8BD9AD8 /* ScatterChartDataProvider.swift */; }; - C63B306D3FAA845771A0B1CEB3F0DC16 /* TextAreaRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631A847995A0DF85FFC969F478E97199 /* TextAreaRow.swift */; }; - C6F4045EAF5410768B595ED98863A250 /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B8D6F073E0C9F1D0DC0A4EF5F00D80 /* Renderer.swift */; }; - C72D7A57303FE4E7E25AB747DD3A85AC /* RadarChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239824BA5FBE5BA1E6FB1E33773E251B /* RadarChartDataEntry.swift */; }; - C742D0AA9431960E21B6203AF6D2F62B /* PieHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E5488781769EC1BC666BD556553C613 /* PieHighlighter.swift */; }; - C74F50DD266F0933B137D16ACD76FB1A /* RuleURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A865F9D1855A690E30467224D40412 /* RuleURL.swift */; }; - C798D8F553DB176CD793E27B4C309DC6 /* ChartDataRendererBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 729A12A9B7F0A0EE6EEE33B5176F30BB /* ChartDataRendererBase.swift */; }; - C7F30DCF3631591639429F38CDA24EBC /* BarLineScatterCandleBubbleRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E76DAA9695B062B079865671555A198 /* BarLineScatterCandleBubbleRenderer.swift */; }; - C8092EC19C870273D18B562A7EE9CD0F /* BarLineScatterCandleBubbleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 745E6248CAB2E4A068E95D95FA0F1440 /* BarLineScatterCandleBubbleChartDataProvider.swift */; }; - C831261CF70AECC8AC9DDFDBFC3F7172 /* LabelRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFDCD79EE4C6A3EB03E710810887DE9 /* LabelRow.swift */; }; - C97BE76AAB5C7242509D8482EBA86AE9 /* Form.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3B623F7078308F6C63E600530AD2EC /* Form.swift */; }; - CAE986D939019B7726C896B88AC34B82 /* ScatterChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8D402409FDE04B9AA68921C87A582A /* ScatterChartDataSet.swift */; }; - CB6E235EB0A5B896F9D1815877757EF9 /* CandleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E0F07C3184BEE9EE73A064412FB3969 /* CandleChartData.swift */; }; - CDABB0AA47F0EEE957FCE629F8D2DB6B /* BubbleChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288F47791ECB7EED768B2B26F8DCB68A /* BubbleChartView.swift */; }; - CEC814CFD549BCDDAB65F5918969182E /* IHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5376E6450A6747741DC5879E846A8D4 /* IHighlighter.swift */; }; - CEF27164EA8A8C1BCB66B7A75E287216 /* ActionSheetRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964ECD689E6D753A7D3EBE859C86AB18 /* ActionSheetRow.swift */; }; - D68F93293888B6776369185028CB60B0 /* IBarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47ECE07091D1F3FAD8674F1494B51FD /* IBarChartDataSet.swift */; }; - D6E011A7BA193945CEA69517E40CBD48 /* XShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9F8D990EA4AB722F7E4DDB271FBDF07 /* XShapeRenderer.swift */; }; - D75CBD8D2B4526B7DE24212AB7B24D20 /* RowControllerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F94BB85650EA9A8A660C2DF565554364 /* RowControllerType.swift */; }; - D7663970356A7FBA65579C1EB951220C /* SelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E15189F1DAD306A270886D315DA65038 /* SelectorRow.swift */; }; - D7B623CFD7231E00FB60419AA17A3E82 /* MoveViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECE56B02AC87347DA9DB74C57E343848 /* MoveViewJob.swift */; }; - D885D137C7BBBBA479BDB92A72B7D04E /* Platform+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45034360BF273A6E100C7D34B21A68B7 /* Platform+Color.swift */; }; - D9687FA7E8A77056DC5C8444EEA904E5 /* BarLineScatterCandleBubbleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C381C388D31FC8085089D38D9F55A7AE /* BarLineScatterCandleBubbleChartData.swift */; }; - D9FAA26AD41D565773823B074F93D909 /* DateFieldRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D1CD2B50CF172C70D4C70E118CF2D6 /* DateFieldRow.swift */; }; - DC28EC495C8806D9B9C0CB0C2F8E8673 /* LineScatterCandleRadarRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD37D5B6C9777C0410BD7981DFEECAA0 /* LineScatterCandleRadarRenderer.swift */; }; - DD3CC52D093C0DF2CF8109C55CFFCD85 /* DefaultValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5333884384F3F0617A1755CB9C04EA9 /* DefaultValueFormatter.swift */; }; - DDCAF53B6EE94F6ADF428036C2A85244 /* DataApproximator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02064BFFCDD93F0B2E28045C270091A4 /* DataApproximator.swift */; }; - DFD06D79C71CCAEFA59D7DFBD706C493 /* DoublePickerInputRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68EEFBE89237E60B56F262C7E544E55D /* DoublePickerInputRow.swift */; }; - E0F369B772C5C8F0AF3A1C8BA5674628 /* ButtonRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3FB45C36C40B6053CC640379ABFF09 /* ButtonRow.swift */; }; - E2FF6F533C0CFB1461BA3D7B76B48A9C /* DefaultFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CA67E3BD944650F1EED5FA0B16BF2A9 /* DefaultFillFormatter.swift */; }; - E3E2A605AF119D1F90CE77963E6CFD26 /* SelectorAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCCDA1A52389202D21A2C0CE07AE0975 /* SelectorAlertController.swift */; }; - E3EDB632F407232103226EB2AF8C239D /* Charts-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB5771835E6170F384829884E2B9985 /* Charts-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E4131026AAE1E3333FB46E14CED55F2A /* ViewPortHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D365EA8C2BD866565B9032143F883585 /* ViewPortHandler.swift */; }; - E73D9F2950182C774E50E891F75C1BB4 /* LineChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A96D0B3D1148D579EBBBE4099B43D /* LineChartView.swift */; }; - E7DA4EBBBFFF3EB6992CA11B921DD211 /* SegmentedRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DD5D404866482790244CEA58FC02516 /* SegmentedRow.swift */; }; - E987F386AA63D0DCD22642A475A8EFD7 /* PickerInputRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC07EA79DDA9EF6E69EC9529D4BFE371 /* PickerInputRow.swift */; }; - E999737BF0D21446B7FFE4DA783EACB2 /* ScatterChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61129B8933ABD9C897F5F3D21BFB0DEB /* ScatterChartRenderer.swift */; }; - E9AB923FC704B44222C8A5DB4145113A /* Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80318751D82A1232D25FE42BE09D9FFA /* Core.swift */; }; - EB9E8E94E8877C33E88295D89CF5D9CC /* RuleEqualsToRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 805041F849AC6045DBA321E0CBE414ED /* RuleEqualsToRow.swift */; }; - ECC149B136D4D63AF251912E051A142F /* IShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF8BB64B5949D2CAA9B7D84B20B679E7 /* IShapeRenderer.swift */; }; - ED58A23EB5289726B5D74EFEEA590BDD /* LineChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BCBA4882939D2562643379A8CCDF2E6 /* LineChartData.swift */; }; - F1B3693550BD159B7E910C182326A44B /* ChartAnimationEasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5018E78EF154B922DA8A314E96C8EFE /* ChartAnimationEasing.swift */; }; - F2279E1339CC1B6326AD6FF389D24F96 /* DateInlineFieldRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 606EA49EC0D70404AA0567511C66F093 /* DateInlineFieldRow.swift */; }; - F2C1EF0010084FA2B769B019EBD6D909 /* CombinedChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD429C5F2105C02645A5B0C4404E6276 /* CombinedChartView.swift */; }; - F47D1993C006C374C634B04421484A4D /* AlertOptionsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0704DED0FDFDBECD5D672C8122D09D3 /* AlertOptionsRow.swift */; }; - FC378CAAA9FD5B4B156B982EBDB12BA3 /* IRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AD25BE0988BE256D99C8BD37264BF92 /* IRadarChartDataSet.swift */; }; - FECC68B085B27878A5C1F2FECC9F088F /* PushRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C98A13EC67B78112EB25C6A7E85200A /* PushRow.swift */; }; - FEFD4F20D5515E1D596FCFA083EB05D7 /* LineChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE0989B752944E4E267D4EC37EC8BEF /* LineChartRenderer.swift */; }; + 8104AC0D8B60EEC6FB5C73EAFA1934AA /* PieRadarChartViewBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2DE04D0335A389EA6CFE06E46448744 /* PieRadarChartViewBase.swift */; }; + 81FCFDD76834B83BF46D3741C79FF29A /* MarkerImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20212CB9D6FB4BFF75889AFB3C5646FC /* MarkerImage.swift */; }; + 821C23BCC87386E7EDAAF97B3C4F1D5D /* RowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2271519AA755EB5C69A7284CAA6F23 /* RowType.swift */; }; + 83907D8546A31C4C4B1E31DA90A0CD77 /* ChartLimitLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A4C0D12FF704C57F2F34EADF00CE47 /* ChartLimitLine.swift */; }; + 83BBD232FE2EA04587B21C81B73AFC09 /* ChartDataEntryBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 205BB79BE6C1FCA776CE1D4293B9CDE3 /* ChartDataEntryBase.swift */; }; + 8606577BE49942FFBE9764F6BAC993A8 /* BarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51133B95E04FCEF52CECCBA0FA2FB64C /* BarHighlighter.swift */; }; + 8A92D825C03E19810B5393EFDFE4502E /* MultipleSelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A92BA872BE33DE132E60FA393324DB1 /* MultipleSelectorViewController.swift */; }; + 8AFA10B7F0591080EA6BCBCC9CB34BE1 /* GenericMultipleSelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548BE84DABD9800530A1C66FE902B9C7 /* GenericMultipleSelectorRow.swift */; }; + 8CBA559D0C2045A8E6F7F9922C553F0F /* CandleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AFCBD39119B8A39E3A0CA0B9CE6C4FB /* CandleChartDataProvider.swift */; }; + 8CDD660210D5A535F6725F30259E629A /* PresenterRowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA401AF5B307DD562DF29F2CC80553 /* PresenterRowType.swift */; }; + 8D62FB3504F2C9B9E0910E493637F7BE /* BarChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = B31407514FCEAE451A67BFB01F99FD57 /* BarChartDataEntry.swift */; }; + 8E01F38A1667D8B2C57E20400D6BB425 /* LineRadarRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA7E136F2C50A7AAEFD8EE9EA59AA762 /* LineRadarRenderer.swift */; }; + 8EE80878B32207C5EC1712D83F04983A /* ChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D118C0F313FDC57A29E6BBB205A3799 /* ChartDataSet.swift */; }; + 91704461340ABFBEB88425DCC9867890 /* HorizontalBarHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D61C45B0A3EA48AEABB9B6979D820216 /* HorizontalBarHighlighter.swift */; }; + 91FA70B412F137846836139ED890FF6C /* ChartBaseDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71786812E4BA34CFE31958629790D981 /* ChartBaseDataSet.swift */; }; + 930F4FD273BB41A8D1BB1F07608B3028 /* RadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FCC0B2AAFCFDCD7682F7C52CA90AEBC /* RadarChartDataSet.swift */; }; + 93966518847AB0F104DFCC9DC5B63197 /* ChartHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C2E8914194091C19C13CB44C9C7EA80 /* ChartHighlighter.swift */; }; + 9400854C32DFF16FD068D280CD43176F /* AxisBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57AAE9789B991F46EFCE58CE338AED41 /* AxisBase.swift */; }; + 94921CD3D3FBA3D6572678B1F59AA957 /* TransformerHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B605529F8016666F6C3794D9768CA5 /* TransformerHorizontalBarChart.swift */; }; + 970B9C4530EA8ACC31B005CE4523C91B /* AnimatedZoomViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540C2AE657DFD33D82A5800A9A30E715 /* AnimatedZoomViewJob.swift */; }; + 991A4EA362C241D77DF184594E226E93 /* ScatterChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93BB1EE57468D56B0F2972A1F23E8E4 /* ScatterChartView.swift */; }; + 9C081B18BB1A54D953EB89605319AA77 /* Legend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCBC3E7CA177D591BC893AB3839AF87 /* Legend.swift */; }; + 9F668D7B0F3CEA3608D305A013A7BE48 /* Highlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55D5F888EBF0F894D53C98C99A93C2DB /* Highlight.swift */; }; + A02F150A74062D9E29592D3EBD13B777 /* StepperRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF639FF42B23B13286D9199B2D7C556 /* StepperRow.swift */; }; + A4C99CE4C6D89F2107F6A280A0A85688 /* HeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F124EF1DD30BEFB748316D6CE0709B2E /* HeaderFooterView.swift */; }; + A688509392FC14A799979CEA50908A2D /* DataApproximator+N.swift in Sources */ = {isa = PBXBuildFile; fileRef = 990AA38654ECD509645583469ADAFB2E /* DataApproximator+N.swift */; }; + A710DCACFF8FFEA66D7ACC5D1BD95C1D /* XAxisRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE582A1AABA555CA7E4333D8A82A6D9 /* XAxisRenderer.swift */; }; + A77DA0652E7847FE296224EEB12F7EBD /* RuleLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = B73122FF47D657B6EE798456F35C01B8 /* RuleLength.swift */; }; + A86CEF7063CDF44017CBFC67DEA1168E /* ChevronUpShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21406035541105CB111B7A60D6C8FE35 /* ChevronUpShapeRenderer.swift */; }; + A91D4F561E5C16644A5D3A389609ACD6 /* DoublePickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067C4CFC921FC0C56F6C5B3B4240008 /* DoublePickerRow.swift */; }; + A95748A4D50EEB26B6290061C34DAA6D /* AnimatedViewPortJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59CE156C94B888A75504D963FB95A5A7 /* AnimatedViewPortJob.swift */; }; + AA39F0560285BF5448411D429ED9408D /* IScatterChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A869216FA3AC6BF4E9E522958EEC835A /* IScatterChartDataSet.swift */; }; + AAA33D7843F1F33E3F9D6F261AB5C2B3 /* PickerInlineRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 484636B2979047FB29E457F1E1725FD9 /* PickerInlineRow.swift */; }; + AADC2477F0EC2A446D3342DCA1E220C8 /* TriplePickerInputRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ED88FD8F5C5DE12E98FA1F15BA06F85 /* TriplePickerInputRow.swift */; }; + AB53E15E90B6A71CAF72834B072D88D3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; + ABC6878E21B62261BBB4E1631E5EDAF1 /* ChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8520A7F8F8673F94B6DDE4B08E471B6 /* ChartDataEntry.swift */; }; + AC795F2AEFA1C804BABDB1D4931FAAEB /* RowProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0682A5A7DECA0B6B492499FF9E0BCE22 /* RowProtocols.swift */; }; + AD1E6E99CE3807BF3DEE1BEBE6E3CAF2 /* BarChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A88AC66D4BA5F2606CBD23F8BC468D4 /* BarChartView.swift */; }; + AEAB95AFD2529CDAF3A10D90A165CF16 /* BarLineScatterCandleBubbleChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC8A8EC434DD8733B56039AB331048F1 /* BarLineScatterCandleBubbleChartDataSet.swift */; }; + AF34EC6CDB336F35ACD18C2CA8428251 /* PieChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB789687F3D81D3F4CB82C2550645219 /* PieChartDataEntry.swift */; }; + AFCEB645D509F679CE8FBCFFEDBB65BC /* SwitchRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1396F9374A230FAADC599E8FA2CA92 /* SwitchRow.swift */; }; + B00A1568A89DD820BC9063DC6961540D /* XAxis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35BFB3FED5774078472BE1B4BFB69E66 /* XAxis.swift */; }; + B14341E138DC6D05193C2866864E9DEC /* AxisRendererBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECE9378CE08AC95D1C70F245CCC10937 /* AxisRendererBase.swift */; }; + B45CE2B91939EC0EA7898C1C6BA16367 /* ILineScatterCandleRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 914FD2A2403BAC9475234D3B9A7B13D4 /* ILineScatterCandleRadarChartDataSet.swift */; }; + B466D5B2650B7521FBE653FC9B7A793D /* DateInlineRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082D9D903940DEE55728285DC66D61EB /* DateInlineRow.swift */; }; + B490953386257F2C8E03C1D632AC361E /* OptionsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8F18420183616B27CA1A9863B96A94 /* OptionsRow.swift */; }; + B65DAD4280582DBED3A5A2C62185B389 /* YAxisRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44A1B6FFE86F41186B23437AC8B0AD94 /* YAxisRenderer.swift */; }; + B66CAEA692B43131362E25A49DDF71EF /* Pods-LoopFollow-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E41188828C3ADE7A96C4DA6ED1CCDA2 /* Pods-LoopFollow-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B6DF9275361EA04A959E38F4133C33B7 /* SwipeActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8A26F11880F80D57A284B6094FF410 /* SwipeActions.swift */; }; + B87DABFAA95CDA5DFDDD2F409FDD5DF3 /* YAxisRendererHorizontalBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = F52B736816C4134465DD07E7A3C6EE82 /* YAxisRendererHorizontalBarChart.swift */; }; + BB75859BDCF578D67C08E6E6741701EB /* PieChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E89110FD8C719CD0408D733C769EECC7 /* PieChartRenderer.swift */; }; + BCD42880A54D247B7A68AC06335D0AF5 /* YAxis.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9C9FC3F24D3132834031FBA0497B6 /* YAxis.swift */; }; + BDD367ED4BB5510C86658115EE6BE71E /* CombinedHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE34CABB424024A41851C39678BA5EF3 /* CombinedHighlighter.swift */; }; + BE93E023215A8B4A05A2AEC8B7FAE170 /* InlineRowType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7967D1617EF3687E7EA393DDFEBC8B31 /* InlineRowType.swift */; }; + C031EFD3013B5803C3B7A6D07E4721C0 /* CombinedChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 919647803888A5B15DB3222FCDA56E0A /* CombinedChartData.swift */; }; + C08713DF3DF904E55D8A3E3775A6F3EB /* TriplePickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D8EB04398FDB94F46498AD99A989CA8 /* TriplePickerRow.swift */; }; + C0F073D21CF9CB5F87F3F21044E98BF0 /* DateRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68406FC37BCF5DE56607C70BA1C3EBC5 /* DateRow.swift */; }; + C2012E1E9FD44B75ECF4B4B3D3782293 /* IndexAxisValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B780059D2B1759DB0B490F39320EF494 /* IndexAxisValueFormatter.swift */; }; + C299DDF2CE31D8489EFFD0B9D086F9FE /* SelectableSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C0DC7BD82B4AEB6E245BAF4F6B3746 /* SelectableSection.swift */; }; + C2F5EF0076B32E28969F73229409F94E /* DatePickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DAC497D7FAFA91FCC10B7463162949B /* DatePickerRow.swift */; }; + C45A1A018758BC37A59C89114F9A4F75 /* Platform+Touch Handling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527868253626F5726DA92BB29CCA64F5 /* Platform+Touch Handling.swift */; }; + C4EB1DE2CCEE60A99EB5AA718DD67105 /* Eureka-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 425EDA696831087CE695C0052A266AF7 /* Eureka-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C5562E6984BB0FDC8358F2737187DC90 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00456494744A907EC58DC4BA16D53DD9 /* Helpers.swift */; }; + C5880AE977F94A1AE25E756A805B7B0B /* LineChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87C515318E4A075DCC3455EA33F32672 /* LineChartDataProvider.swift */; }; + C5A3430178D9993D8A5A13864AE40A45 /* ScatterChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 947C167AF75DD780C25483F12F12822B /* ScatterChartDataProvider.swift */; }; + C63B306D3FAA845771A0B1CEB3F0DC16 /* TextAreaRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428FF5D0423FE20B4F82273AE39B347F /* TextAreaRow.swift */; }; + C6F4045EAF5410768B595ED98863A250 /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F31DFAC4317F012937CBC2CDADF0B452 /* Renderer.swift */; }; + C72D7A57303FE4E7E25AB747DD3A85AC /* RadarChartDataEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71A6113B0BF33B6BE24E733E54B29F11 /* RadarChartDataEntry.swift */; }; + C742D0AA9431960E21B6203AF6D2F62B /* PieHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2D931E90044D88802D3FD030161D3C8 /* PieHighlighter.swift */; }; + C74F50DD266F0933B137D16ACD76FB1A /* RuleURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E407FE7A788430D697A04C2DDC4BE6 /* RuleURL.swift */; }; + C798D8F553DB176CD793E27B4C309DC6 /* ChartDataRendererBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D5BDBD9C81A644553CCFCA2CEFF4633 /* ChartDataRendererBase.swift */; }; + C7F30DCF3631591639429F38CDA24EBC /* BarLineScatterCandleBubbleRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346C3FCE7CD5ADF791B7B4734B94FC6A /* BarLineScatterCandleBubbleRenderer.swift */; }; + C8092EC19C870273D18B562A7EE9CD0F /* BarLineScatterCandleBubbleChartDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38DFB2F0E62325600A27627339CCDDDD /* BarLineScatterCandleBubbleChartDataProvider.swift */; }; + C831261CF70AECC8AC9DDFDBFC3F7172 /* LabelRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2982FD762FA7E78B9C8674FDBF7C488 /* LabelRow.swift */; }; + C97BE76AAB5C7242509D8482EBA86AE9 /* Form.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5471DA369762341AFA788636BF5238B0 /* Form.swift */; }; + CAE986D939019B7726C896B88AC34B82 /* ScatterChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C61637BA5B312D410FE6D08195ECCE1 /* ScatterChartDataSet.swift */; }; + CB6E235EB0A5B896F9D1815877757EF9 /* CandleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = FABD11111F00FECAB5D76CA8D511540A /* CandleChartData.swift */; }; + CDABB0AA47F0EEE957FCE629F8D2DB6B /* BubbleChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92E073284CCFB590C93D4DC4AF39731B /* BubbleChartView.swift */; }; + CEC814CFD549BCDDAB65F5918969182E /* IHighlighter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A13F8D0A0BEAE5837834E66A8B1AAB8B /* IHighlighter.swift */; }; + CEF27164EA8A8C1BCB66B7A75E287216 /* ActionSheetRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4579AB6A714D0B0145487000C5B95DD8 /* ActionSheetRow.swift */; }; + D68F93293888B6776369185028CB60B0 /* IBarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46FC3BFFBF3E488A77264AF9F2A376D3 /* IBarChartDataSet.swift */; }; + D6E011A7BA193945CEA69517E40CBD48 /* XShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F61CC9BC348F45A50AD5AB2ED815BAB /* XShapeRenderer.swift */; }; + D75CBD8D2B4526B7DE24212AB7B24D20 /* RowControllerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B59B19AC178737F69F4E653E3D3C3C /* RowControllerType.swift */; }; + D7663970356A7FBA65579C1EB951220C /* SelectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACC18BFAFFF03439AE7FC5425BC06568 /* SelectorRow.swift */; }; + D7B623CFD7231E00FB60419AA17A3E82 /* MoveViewJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF8539432E41C7FAB4F3E455D0FC889F /* MoveViewJob.swift */; }; + D7D17805603B1DD6F02D8108C31090E5 /* ShareClient-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F458F913F6215D5244FD4EFCE470807B /* ShareClient-dummy.m */; }; + D885D137C7BBBBA479BDB92A72B7D04E /* Platform+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C854F81EB4FC44FABBDCDA04740B70 /* Platform+Color.swift */; }; + D9687FA7E8A77056DC5C8444EEA904E5 /* BarLineScatterCandleBubbleChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = E329C10FB955618FAB19FE474DB7071E /* BarLineScatterCandleBubbleChartData.swift */; }; + D9FAA26AD41D565773823B074F93D909 /* DateFieldRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9F53293DA948FB69D6A7E95F323FB4 /* DateFieldRow.swift */; }; + DC28EC495C8806D9B9C0CB0C2F8E8673 /* LineScatterCandleRadarRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97FE7FFB6C5E1BCD95EB806FAF00E4FC /* LineScatterCandleRadarRenderer.swift */; }; + DD3CC52D093C0DF2CF8109C55CFFCD85 /* DefaultValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16C72CDF15178DB4843E0353D0DAD8AF /* DefaultValueFormatter.swift */; }; + DDCAF53B6EE94F6ADF428036C2A85244 /* DataApproximator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E27A5743F40167D8B6E7F58FB53D7607 /* DataApproximator.swift */; }; + DFD06D79C71CCAEFA59D7DFBD706C493 /* DoublePickerInputRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E815F54AB4445B900090ACEE3A2FFF04 /* DoublePickerInputRow.swift */; }; + E0F369B772C5C8F0AF3A1C8BA5674628 /* ButtonRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2EE47C8EFAFB7A567F4AFF90304521 /* ButtonRow.swift */; }; + E2FF6F533C0CFB1461BA3D7B76B48A9C /* DefaultFillFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16F7E6A55623407EB9928C72D9EE3B5F /* DefaultFillFormatter.swift */; }; + E3E2A605AF119D1F90CE77963E6CFD26 /* SelectorAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F2849FC47AE118D4F91DF4314FFF6BB /* SelectorAlertController.swift */; }; + E3EDB632F407232103226EB2AF8C239D /* Charts-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D753B6F3540FE6A7C56D2547C3EEF851 /* Charts-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4131026AAE1E3333FB46E14CED55F2A /* ViewPortHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49B9AD34B61808B09D75C28FEB6901A0 /* ViewPortHandler.swift */; }; + E73D9F2950182C774E50E891F75C1BB4 /* LineChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B632A9A6846FCE64A0A99A4D151E615 /* LineChartView.swift */; }; + E7DA4EBBBFFF3EB6992CA11B921DD211 /* SegmentedRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B137D762352C7744393FACFC24CC97 /* SegmentedRow.swift */; }; + E987F386AA63D0DCD22642A475A8EFD7 /* PickerInputRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF358AA0AFC2C0AF0152E704E7512517 /* PickerInputRow.swift */; }; + E999737BF0D21446B7FFE4DA783EACB2 /* ScatterChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD22F889858CF5ECBE1B37789BB2E68 /* ScatterChartRenderer.swift */; }; + E9AB923FC704B44222C8A5DB4145113A /* Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8183772B19A56CF748806153BF97D089 /* Core.swift */; }; + EB9E8E94E8877C33E88295D89CF5D9CC /* RuleEqualsToRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93DBEA6C1381CFA8F6B6DFD85A9A5A02 /* RuleEqualsToRow.swift */; }; + ECC149B136D4D63AF251912E051A142F /* IShapeRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DB219299A8A67D5EC1C43C6BF5A8EE4 /* IShapeRenderer.swift */; }; + ED58A23EB5289726B5D74EFEEA590BDD /* LineChartData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D365274AEF519C7E50E8567DEBC9CEF3 /* LineChartData.swift */; }; + F1B3693550BD159B7E910C182326A44B /* ChartAnimationEasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254111998274AAAA1452EBD98043BD22 /* ChartAnimationEasing.swift */; }; + F1B37767979921C4758B54144610815D /* Pods-LoopFollow-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 28609CC9D3828C150821F3AA18752A77 /* Pods-LoopFollow-dummy.m */; }; + F2279E1339CC1B6326AD6FF389D24F96 /* DateInlineFieldRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDFAF86922EDD701C440B78809BA7858 /* DateInlineFieldRow.swift */; }; + F2C1EF0010084FA2B769B019EBD6D909 /* CombinedChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B27115EBCC224F7D67778C26B1275B8 /* CombinedChartView.swift */; }; + F47D1993C006C374C634B04421484A4D /* AlertOptionsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6153DD0B9FA40F02377E5F8A060E378 /* AlertOptionsRow.swift */; }; + FC378CAAA9FD5B4B156B982EBDB12BA3 /* IRadarChartDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D4AC313CBD7A5E08DA0B52709B04CA /* IRadarChartDataSet.swift */; }; + FECC68B085B27878A5C1F2FECC9F088F /* PushRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 589103C5CFBCC41339AECEF41A55A87A /* PushRow.swift */; }; + FEFD4F20D5515E1D596FCFA083EB05D7 /* LineChartRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB9DAFB27FC7A51349BE9255F640DCF /* LineChartRenderer.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 67241C8E1C4F3763EEFBE1158914CC77 /* PBXContainerItemProxy */ = { + 7272ABD8A5C4DE0FAA10777D4FE249DD /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = BF03B0B2B8B052092CB5F90CC5FB3757; remoteInfo = Charts; }; - 6CD95FF1D5DAF8313F0757EB40F5C9A3 /* PBXContainerItemProxy */ = { + 768CF338A2BC484E9597CD398DFA4136 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 32507FDB9BAD6EF17DCB14A888ECA5D9; + remoteInfo = ShareClient; + }; + 87D6DD57B95016F1515B8CA873C52B51 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; @@ -243,249 +255,259 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 000D3C28CD7966485DFAD40B2C9874B4 /* Description.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Description.swift; path = Source/Charts/Components/Description.swift; sourceTree = ""; }; - 012D858F75E53844C8DB0E8745A4245F /* BarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift; sourceTree = ""; }; - 015C2D96C13D444803A9754ABE5B9F39 /* Charts-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Charts-prefix.pch"; sourceTree = ""; }; - 02064BFFCDD93F0B2E28045C270091A4 /* DataApproximator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataApproximator.swift; path = Source/Charts/Filters/DataApproximator.swift; sourceTree = ""; }; - 03A865F9D1855A690E30467224D40412 /* RuleURL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleURL.swift; path = Source/Validations/RuleURL.swift; sourceTree = ""; }; - 053BA00FFC9D0CCCA874716694EF87DA /* ILineChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineChartDataSet.swift; sourceTree = ""; }; - 071D24D80B9E2809386D89EE81F176E2 /* RadarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartRenderer.swift; path = Source/Charts/Renderers/RadarChartRenderer.swift; sourceTree = ""; }; + 00184B71D9C00EA8FDF24D6CE7E8617B /* IAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IAxisValueFormatter.swift; path = Source/Charts/Formatters/IAxisValueFormatter.swift; sourceTree = ""; }; + 00456494744A907EC58DC4BA16D53DD9 /* Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helpers.swift; path = Source/Core/Helpers.swift; sourceTree = ""; }; + 01022F6F2F1BF3E5C5F500A0650CC1BF /* SelectorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectorViewController.swift; path = Source/Rows/Controllers/SelectorViewController.swift; sourceTree = ""; }; + 017205CE9DD9404E68FC3A813A5BC6A4 /* Charts.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Charts.debug.xcconfig; sourceTree = ""; }; + 01B137D762352C7744393FACFC24CC97 /* SegmentedRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SegmentedRow.swift; path = Source/Rows/SegmentedRow.swift; sourceTree = ""; }; + 02E9C61C3E7EBE33601F29273FD0610F /* BarLineChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineChartViewBase.swift; path = Source/Charts/Charts/BarLineChartViewBase.swift; sourceTree = ""; }; + 03233AB6D94FE12321C740972ECDCC7C /* LegendEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegendEntry.swift; path = Source/Charts/Components/LegendEntry.swift; sourceTree = ""; }; + 059FA0BC581C628A7E67661ABCE587BD /* ShareClient.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ShareClient.modulemap; sourceTree = ""; }; + 0682A5A7DECA0B6B492499FF9E0BCE22 /* RowProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RowProtocols.swift; path = Source/Core/RowProtocols.swift; sourceTree = ""; }; 082977F3777A7D434AB35C357B487F83 /* Eureka.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Eureka.framework; path = Eureka.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0888FBF51D984A19315B2B45406842AE /* PieChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/PieChartDataEntry.swift; sourceTree = ""; }; - 0ABEA1E706788F7FB4AEF5ABDA5884A2 /* IBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBubbleChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBubbleChartDataSet.swift; sourceTree = ""; }; - 0AD25BE0988BE256D99C8BD37264BF92 /* IRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/IRadarChartDataSet.swift; sourceTree = ""; }; - 0B024F185ECED75F48C085E205179B60 /* CombinedHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedHighlighter.swift; path = Source/Charts/Highlight/CombinedHighlighter.swift; sourceTree = ""; }; - 0B352DD04711E5CD1288B6F43CA78EAD /* MarkerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarkerView.swift; path = Source/Charts/Components/MarkerView.swift; sourceTree = ""; }; - 0C86B0118C269219B26CEB29BFEB2BE7 /* ListCheckRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ListCheckRow.swift; path = Source/Rows/SelectableRows/ListCheckRow.swift; sourceTree = ""; }; - 0E4A96D0B3D1148D579EBBBE4099B43D /* LineChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartView.swift; path = Source/Charts/Charts/LineChartView.swift; sourceTree = ""; }; - 0F7E3D2928552D57E8FFCA76AE2898BA /* InlineRowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InlineRowType.swift; path = Source/Core/InlineRowType.swift; sourceTree = ""; }; - 155737109C81D674801FCC3A99A51918 /* IMarker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IMarker.swift; path = Source/Charts/Components/IMarker.swift; sourceTree = ""; }; + 082D9D903940DEE55728285DC66D61EB /* DateInlineRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateInlineRow.swift; path = Source/Rows/DateInlineRow.swift; sourceTree = ""; }; + 0A7DA86EA696B87A80FF54CABA26548A /* ChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataProvider.swift; path = Source/Charts/Interfaces/ChartDataProvider.swift; sourceTree = ""; }; + 0AB3F85B18411852AC6F1EEBBB6D9DCA /* ChartUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartUtils.swift; path = Source/Charts/Utils/ChartUtils.swift; sourceTree = ""; }; + 0AB9DAFB27FC7A51349BE9255F640DCF /* LineChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartRenderer.swift; path = Source/Charts/Renderers/LineChartRenderer.swift; sourceTree = ""; }; + 0C1F35E26A6B017DFE6EA7B2EEF34E01 /* ShareClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareClient.swift; path = ShareClient/ShareClient.swift; sourceTree = ""; }; + 0C2E8914194091C19C13CB44C9C7EA80 /* ChartHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartHighlighter.swift; path = Source/Charts/Highlight/ChartHighlighter.swift; sourceTree = ""; }; + 0C32A2598D7B44B2489E4DB9D0CEEA55 /* IPieChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IPieChartDataSet.swift; path = Source/Charts/Data/Interfaces/IPieChartDataSet.swift; sourceTree = ""; }; + 0C61637BA5B312D410FE6D08195ECCE1 /* ScatterChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift; sourceTree = ""; }; + 0D9E3F84B8F3CDDF959B5457AC2CF6D9 /* ChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartViewBase.swift; path = Source/Charts/Charts/ChartViewBase.swift; sourceTree = ""; }; + 0DAC497D7FAFA91FCC10B7463162949B /* DatePickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DatePickerRow.swift; path = Source/Rows/DatePickerRow.swift; sourceTree = ""; }; + 0DB219299A8A67D5EC1C43C6BF5A8EE4 /* IShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/IShapeRenderer.swift; sourceTree = ""; }; + 0FD22F889858CF5ECBE1B37789BB2E68 /* ScatterChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartRenderer.swift; path = Source/Charts/Renderers/ScatterChartRenderer.swift; sourceTree = ""; }; + 11084C60F774B99DECB61B35E3EC7DD3 /* LineChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift; sourceTree = ""; }; + 11C0DC7BD82B4AEB6E245BAF4F6B3746 /* SelectableSection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectableSection.swift; path = Source/Core/SelectableSection.swift; sourceTree = ""; }; + 11D57BEB61E5B0C8070F999D1C04F128 /* Description.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Description.swift; path = Source/Charts/Components/Description.swift; sourceTree = ""; }; + 13243CBC570EC1C4F0410EAB1D89DF92 /* LegendRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegendRenderer.swift; path = Source/Charts/Renderers/LegendRenderer.swift; sourceTree = ""; }; + 14CC39F6C23F4D5D781A2C4B60DF765D /* IChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IChartDataSet.swift; path = Source/Charts/Data/Interfaces/IChartDataSet.swift; sourceTree = ""; }; 1572E89B2070E8BDB7D3E2CBF51DE672 /* Pods-LoopFollow-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-LoopFollow-acknowledgements.plist"; sourceTree = ""; }; - 15AE42BF26F6B49F108794BABAF01BE8 /* ChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartData.swift; path = Source/Charts/Data/Implementations/Standard/ChartData.swift; sourceTree = ""; }; - 16819173DF628B0FC53570AE9383A1E9 /* LineRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineRadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift; sourceTree = ""; }; - 168949456FDA5D72FC492981BF2AB55E /* BubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift; sourceTree = ""; }; + 16C72CDF15178DB4843E0353D0DAD8AF /* DefaultValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultValueFormatter.swift; path = Source/Charts/Formatters/DefaultValueFormatter.swift; sourceTree = ""; }; + 16D4AC313CBD7A5E08DA0B52709B04CA /* IRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/IRadarChartDataSet.swift; sourceTree = ""; }; 16D6C652182636AC8246D4751AEC2B19 /* Pods-LoopFollow-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-LoopFollow-Info.plist"; sourceTree = ""; }; + 16F7E6A55623407EB9928C72D9EE3B5F /* DefaultFillFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultFillFormatter.swift; path = Source/Charts/Formatters/DefaultFillFormatter.swift; sourceTree = ""; }; 1955DA138EA7F33CEC4481481CBCD451 /* Pods-LoopFollow.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-LoopFollow.modulemap"; sourceTree = ""; }; - 1A67B7A482098A7B6617635A36A70C54 /* BarChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataProvider.swift; path = Source/Charts/Interfaces/BarChartDataProvider.swift; sourceTree = ""; }; - 1B51FA0A7F212B5A0C265121FBB47A8F /* Charts.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Charts.release.xcconfig; sourceTree = ""; }; - 1C7A9E25022D8E2DE5F4B5ABCFF8073B /* IChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IChartDataSet.swift; path = Source/Charts/Data/Interfaces/IChartDataSet.swift; sourceTree = ""; }; - 1C992A46C86EB9DE636AF70545363749 /* IAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IAxisValueFormatter.swift; path = Source/Charts/Formatters/IAxisValueFormatter.swift; sourceTree = ""; }; - 212BC3B1A39FD603CF008C6589F8D495 /* Eureka.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Eureka.modulemap; sourceTree = ""; }; - 21F934EBBD0C767A7DA6DEB455943843 /* ChartColorTemplates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartColorTemplates.swift; path = Source/Charts/Utils/ChartColorTemplates.swift; sourceTree = ""; }; - 2275ABB30ED7FCACFB71FDEF947219F2 /* RuleEmail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleEmail.swift; path = Source/Validations/RuleEmail.swift; sourceTree = ""; }; - 239824BA5FBE5BA1E6FB1E33773E251B /* RadarChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartDataEntry.swift; sourceTree = ""; }; - 249597AD33DF9857FD7F304A78EBA7DF /* ILineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift; sourceTree = ""; }; - 254A6B4D102F8420A54512389166B1E8 /* Fill.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Fill.swift; path = Source/Charts/Utils/Fill.swift; sourceTree = ""; }; + 1B155A2FCCFFC4A5633BA14B82C657F3 /* BarChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataProvider.swift; path = Source/Charts/Interfaces/BarChartDataProvider.swift; sourceTree = ""; }; + 1B2271519AA755EB5C69A7284CAA6F23 /* RowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RowType.swift; path = Source/Core/RowType.swift; sourceTree = ""; }; + 1B360F02EE859A284562621B5BC8061F /* RadarChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartData.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartData.swift; sourceTree = ""; }; + 1CD849B795C7F3EE32C6353297C6F4CF /* Charts.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Charts.release.xcconfig; sourceTree = ""; }; + 1EBF436B7501608AB33DA5DEF29C213A /* RadarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartView.swift; path = Source/Charts/Charts/RadarChartView.swift; sourceTree = ""; }; + 1F1396F9374A230FAADC599E8FA2CA92 /* SwitchRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchRow.swift; path = Source/Rows/SwitchRow.swift; sourceTree = ""; }; + 20212CB9D6FB4BFF75889AFB3C5646FC /* MarkerImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarkerImage.swift; path = Source/Charts/Components/MarkerImage.swift; sourceTree = ""; }; + 205BB79BE6C1FCA776CE1D4293B9CDE3 /* ChartDataEntryBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataEntryBase.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataEntryBase.swift; sourceTree = ""; }; + 20EACBD53E243A3F9DF8735D46C2460E /* Row.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Row.swift; path = Source/Core/Row.swift; sourceTree = ""; }; + 21406035541105CB111B7A60D6C8FE35 /* ChevronUpShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChevronUpShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift; sourceTree = ""; }; + 21FF0C890A9774E7FC5E8434FB5FDA41 /* RadarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarHighlighter.swift; path = Source/Charts/Highlight/RadarHighlighter.swift; sourceTree = ""; }; + 2507ADB972377DD593EFFA943EA075D0 /* CrossShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CrossShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift; sourceTree = ""; }; + 254111998274AAAA1452EBD98043BD22 /* ChartAnimationEasing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartAnimationEasing.swift; path = Source/Charts/Animation/ChartAnimationEasing.swift; sourceTree = ""; }; + 263007DB32EB3A923F7839CBF8E121BA /* SliderRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SliderRow.swift; path = Source/Rows/SliderRow.swift; sourceTree = ""; }; + 26A4C0D12FF704C57F2F34EADF00CE47 /* ChartLimitLine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartLimitLine.swift; path = Source/Charts/Components/ChartLimitLine.swift; sourceTree = ""; }; + 27E029128823B9D672A01E4BB4DAD95B /* ShareClient.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShareClient.debug.xcconfig; sourceTree = ""; }; 28609CC9D3828C150821F3AA18752A77 /* Pods-LoopFollow-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-LoopFollow-dummy.m"; sourceTree = ""; }; - 288F47791ECB7EED768B2B26F8DCB68A /* BubbleChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartView.swift; path = Source/Charts/Charts/BubbleChartView.swift; sourceTree = ""; }; - 2AD23361C3941A28A568A73F5E2A0C96 /* BarChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartData.swift; path = Source/Charts/Data/Implementations/Standard/BarChartData.swift; sourceTree = ""; }; - 2AD46C920FCFDF92D97C5CE6DA55653C /* TransformerHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformerHorizontalBarChart.swift; path = Source/Charts/Utils/TransformerHorizontalBarChart.swift; sourceTree = ""; }; - 2C2A801B59BAFE6387217B3B12162AFB /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = Source/Charts/Highlight/Range.swift; sourceTree = ""; }; - 2C7772421B5C0539F7DC061340FF69FC /* RowProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RowProtocols.swift; path = Source/Core/RowProtocols.swift; sourceTree = ""; }; - 2D7F12C82F13C5D254AFDD932BB189E2 /* BubbleChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartRenderer.swift; path = Source/Charts/Renderers/BubbleChartRenderer.swift; sourceTree = ""; }; - 2FB31C7D459AACCCDAD58C4427C65B1F /* IBarLineScatterCandleBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBarLineScatterCandleBubbleChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift; sourceTree = ""; }; + 28E3D7678445542747F9C16A8ADD7CC0 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = Source/Charts/Highlight/Range.swift; sourceTree = ""; }; + 29A3C6AB4C2213910B58D3A525336E5E /* CandleStickChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleStickChartRenderer.swift; path = Source/Charts/Renderers/CandleStickChartRenderer.swift; sourceTree = ""; }; + 2C9CD0FB1963D56F3399E0EF8469A0FA /* Protocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protocols.swift; path = Source/Rows/Common/Protocols.swift; sourceTree = ""; }; + 2CE0760BAB5896395C25F90C2A921230 /* Charts.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Charts.modulemap; sourceTree = ""; }; + 2CEC4ADA231B20F225A0C0800CF05406 /* MarkerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarkerView.swift; path = Source/Charts/Components/MarkerView.swift; sourceTree = ""; }; + 2D27C9E57D9FF2AF21780555D5ABAD72 /* BarChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartData.swift; path = Source/Charts/Data/Implementations/Standard/BarChartData.swift; sourceTree = ""; }; + 2D5C4B57627CE6A33CA5AFF28D7B4470 /* MultipleSelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipleSelectorRow.swift; path = Source/Rows/MultipleSelectorRow.swift; sourceTree = ""; }; + 2E8F18420183616B27CA1A9863B96A94 /* OptionsRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OptionsRow.swift; path = Source/Rows/Common/OptionsRow.swift; sourceTree = ""; }; + 2ED88FD8F5C5DE12E98FA1F15BA06F85 /* TriplePickerInputRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TriplePickerInputRow.swift; path = Source/Rows/TriplePickerInputRow.swift; sourceTree = ""; }; + 2EEB10C82369CAF70178A725C299F81E /* PickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PickerRow.swift; path = Source/Rows/PickerRow.swift; sourceTree = ""; }; + 2EFBA8CE68D4633D9089932B8A4E3871 /* DefaultAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultAxisValueFormatter.swift; path = Source/Charts/Formatters/DefaultAxisValueFormatter.swift; sourceTree = ""; }; + 2F2849FC47AE118D4F91DF4314FFF6BB /* SelectorAlertController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectorAlertController.swift; path = Source/Rows/Controllers/SelectorAlertController.swift; sourceTree = ""; }; + 2F8A26F11880F80D57A284B6094FF410 /* SwipeActions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwipeActions.swift; path = Source/Core/SwipeActions.swift; sourceTree = ""; }; 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 31BA5667ABB00F921823EE8C11E0C596 /* ChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataSet.swift; sourceTree = ""; }; - 34F84715AE8809D6316FF9BCEAD20DCA /* DefaultAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultAxisValueFormatter.swift; path = Source/Charts/Formatters/DefaultAxisValueFormatter.swift; sourceTree = ""; }; - 372778BB7FE2428A1F850F71B3BB5F37 /* Row.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Row.swift; path = Source/Core/Row.swift; sourceTree = ""; }; - 377C3CF3DE13B0EC7726913B2DA966C9 /* AnimatedViewPortJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedViewPortJob.swift; path = Source/Charts/Jobs/AnimatedViewPortJob.swift; sourceTree = ""; }; - 378C21F8B8F022E50AA5A54C32444EEA /* PieChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartData.swift; path = Source/Charts/Data/Implementations/Standard/PieChartData.swift; sourceTree = ""; }; - 37BE1D35B7B996A40A09DBA627975CAD /* ScatterChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartData.swift; path = Source/Charts/Data/Implementations/Standard/ScatterChartData.swift; sourceTree = ""; }; - 3B21D20DD89ABCD133C907484489A4E9 /* PresenterRowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PresenterRowType.swift; path = Source/Core/PresenterRowType.swift; sourceTree = ""; }; - 3CF2AAADC8530B44EFDAFDF76424ACB9 /* SquareShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SquareShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift; sourceTree = ""; }; - 3CFDCD79EE4C6A3EB03E710810887DE9 /* LabelRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LabelRow.swift; path = Source/Rows/LabelRow.swift; sourceTree = ""; }; - 3D88CE352A90F7E9AC65DFA6D8885891 /* CheckRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CheckRow.swift; path = Source/Rows/CheckRow.swift; sourceTree = ""; }; - 3E24A04789464015C22D87D5E3A60671 /* RadarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartView.swift; path = Source/Charts/Charts/RadarChartView.swift; sourceTree = ""; }; - 4079FC6B8F8238BE5842EC9593970ED4 /* IValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IValueFormatter.swift; path = Source/Charts/Formatters/IValueFormatter.swift; sourceTree = ""; }; + 32A4B20180EE2205670B1B03813AD23E /* RuleEmail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleEmail.swift; path = Source/Validations/RuleEmail.swift; sourceTree = ""; }; + 32C854F81EB4FC44FABBDCDA04740B70 /* Platform+Color.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Color.swift"; path = "Source/Charts/Utils/Platform+Color.swift"; sourceTree = ""; }; + 3310EBD9F2A5EB47D39A359FDA666961 /* ShareClient-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShareClient-prefix.pch"; sourceTree = ""; }; + 33379FD8AB582363EBE9071C28E58575 /* CellType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CellType.swift; path = Source/Core/CellType.swift; sourceTree = ""; }; + 346C3FCE7CD5ADF791B7B4734B94FC6A /* BarLineScatterCandleBubbleRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleRenderer.swift; path = Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift; sourceTree = ""; }; + 358D210738B60758170EEAB4EBFD35F7 /* RuleRequired.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleRequired.swift; path = Source/Validations/RuleRequired.swift; sourceTree = ""; }; + 35BFB3FED5774078472BE1B4BFB69E66 /* XAxis.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxis.swift; path = Source/Charts/Components/XAxis.swift; sourceTree = ""; }; + 38DFB2F0E62325600A27627339CCDDDD /* BarLineScatterCandleBubbleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartDataProvider.swift; path = Source/Charts/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift; sourceTree = ""; }; + 3AF80E9E9FD2ABA19F783C1FE8CEDE21 /* Animator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Animator.swift; path = Source/Charts/Animation/Animator.swift; sourceTree = ""; }; + 3B417B1F0CF4DCEC4917E71B8477B9E1 /* DecimalFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DecimalFormatter.swift; path = Source/Rows/Common/DecimalFormatter.swift; sourceTree = ""; }; + 3D5BDBD9C81A644553CCFCA2CEFF4633 /* ChartDataRendererBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataRendererBase.swift; path = Source/Charts/Renderers/ChartDataRendererBase.swift; sourceTree = ""; }; + 3DF639FF42B23B13286D9199B2D7C556 /* StepperRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StepperRow.swift; path = Source/Rows/StepperRow.swift; sourceTree = ""; }; + 3F9B961D3E7671D04E9474A1C7A2194F /* SquareShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SquareShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/SquareShapeRenderer.swift; sourceTree = ""; }; + 425EDA696831087CE695C0052A266AF7 /* Eureka-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Eureka-umbrella.h"; sourceTree = ""; }; + 428FF5D0423FE20B4F82273AE39B347F /* TextAreaRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextAreaRow.swift; path = Source/Rows/TextAreaRow.swift; sourceTree = ""; }; 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 44AB25DFE6C3A06D58D49ED0CF5DB3EC /* BarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartRenderer.swift; path = Source/Charts/Renderers/BarChartRenderer.swift; sourceTree = ""; }; - 45034360BF273A6E100C7D34B21A68B7 /* Platform+Color.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Color.swift"; path = "Source/Charts/Utils/Platform+Color.swift"; sourceTree = ""; }; - 45FD6950945FE0889962B8261E67750E /* RuleRequired.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleRequired.swift; path = Source/Validations/RuleRequired.swift; sourceTree = ""; }; - 480C03B7DF1E21E39BD90A9F76955F98 /* SelectorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectorViewController.swift; path = Source/Rows/Controllers/SelectorViewController.swift; sourceTree = ""; }; - 481AA3E635F1093F5AB7FD74ADA9BDD9 /* AlertRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlertRow.swift; path = Source/Rows/AlertRow.swift; sourceTree = ""; }; - 4A5BD0C4DDD7D499A7B4F756946AA449 /* DateRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateRow.swift; path = Source/Rows/DateRow.swift; sourceTree = ""; }; + 44A1B6FFE86F41186B23437AC8B0AD94 /* YAxisRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRenderer.swift; path = Source/Charts/Renderers/YAxisRenderer.swift; sourceTree = ""; }; + 4579AB6A714D0B0145487000C5B95DD8 /* ActionSheetRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActionSheetRow.swift; path = Source/Rows/ActionSheetRow.swift; sourceTree = ""; }; + 4582F709E55ADE01009D1DF37A0D1A2C /* Eureka-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Eureka-Info.plist"; sourceTree = ""; }; + 45D5F14D7DBABC785E6B47E0AA271EE3 /* BarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift; sourceTree = ""; }; + 46FC3BFFBF3E488A77264AF9F2A376D3 /* IBarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBarChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBarChartDataSet.swift; sourceTree = ""; }; + 484636B2979047FB29E457F1E1725FD9 /* PickerInlineRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PickerInlineRow.swift; path = Source/Rows/PickerInlineRow.swift; sourceTree = ""; }; + 49992CCA5AEFDD6B4059FA55B46719E2 /* LineRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineRadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineRadarChartDataSet.swift; sourceTree = ""; }; + 49B9AD34B61808B09D75C28FEB6901A0 /* ViewPortHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewPortHandler.swift; path = Source/Charts/Utils/ViewPortHandler.swift; sourceTree = ""; }; + 4B632A9A6846FCE64A0A99A4D151E615 /* LineChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartView.swift; path = Source/Charts/Charts/LineChartView.swift; sourceTree = ""; }; 4BACF8B4E5759037E1CC8A6423FF7B67 /* Pods_LoopFollow.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_LoopFollow.framework; path = "Pods-LoopFollow.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BE549356A9D91D4E5A4967405F362C5 /* Charts.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Charts.modulemap; sourceTree = ""; }; - 4EA35BC7CB0631FB6172FCC3939301CE /* ZoomViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomViewJob.swift; path = Source/Charts/Jobs/ZoomViewJob.swift; sourceTree = ""; }; - 4FA682FA297006A934B23EEF8E8E3191 /* FieldsRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FieldsRow.swift; path = Source/Rows/FieldsRow.swift; sourceTree = ""; }; - 55ED648BE5F5D63433355F4029BE846A /* BarChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/BarChartDataEntry.swift; sourceTree = ""; }; - 575A3D70A90822811C6533EF48873537 /* BubbleChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartDataEntry.swift; sourceTree = ""; }; - 57B547D32213ED4ACD5121E873E08B63 /* CrossShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CrossShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift; sourceTree = ""; }; - 5F7D2159259306783652FFC35C5F4BB5 /* Legend.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Legend.swift; path = Source/Charts/Components/Legend.swift; sourceTree = ""; }; - 604618765E9FC4A4C41502066047493A /* SliderRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SliderRow.swift; path = Source/Rows/SliderRow.swift; sourceTree = ""; }; - 606EA49EC0D70404AA0567511C66F093 /* DateInlineFieldRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateInlineFieldRow.swift; path = Source/Rows/Common/DateInlineFieldRow.swift; sourceTree = ""; }; - 60A0B1AFF34D1CE8A4698D476DAE19D1 /* LegendEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegendEntry.swift; path = Source/Charts/Components/LegendEntry.swift; sourceTree = ""; }; - 60D3208F76CADE6D8572D57C206C965D /* Protocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protocols.swift; path = Source/Rows/Common/Protocols.swift; sourceTree = ""; }; - 61129B8933ABD9C897F5F3D21BFB0DEB /* ScatterChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartRenderer.swift; path = Source/Charts/Renderers/ScatterChartRenderer.swift; sourceTree = ""; }; - 62109DDC014868EF85EAAC5DEA89E792 /* CandleStickChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleStickChartRenderer.swift; path = Source/Charts/Renderers/CandleStickChartRenderer.swift; sourceTree = ""; }; - 631A847995A0DF85FFC969F478E97199 /* TextAreaRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextAreaRow.swift; path = Source/Rows/TextAreaRow.swift; sourceTree = ""; }; - 64CA3F06341E9548CF06B61574FDE552 /* TriplePickerInputRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TriplePickerInputRow.swift; path = Source/Rows/TriplePickerInputRow.swift; sourceTree = ""; }; - 65AD3DF61E7279E34430EAA394531696 /* Charts.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Charts.debug.xcconfig; sourceTree = ""; }; - 666AEAC030E22BD0BDE90830AF057310 /* CandleChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartDataEntry.swift; sourceTree = ""; }; - 679725EAA7D6C233678CE91C58906413 /* Highlight.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Highlight.swift; path = Source/Charts/Highlight/Highlight.swift; sourceTree = ""; }; - 68D2D7BC97BBDFE8D04CF6B579F20125 /* RuleLength.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleLength.swift; path = Source/Validations/RuleLength.swift; sourceTree = ""; }; - 68EEFBE89237E60B56F262C7E544E55D /* DoublePickerInputRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DoublePickerInputRow.swift; path = Source/Rows/DoublePickerInputRow.swift; sourceTree = ""; }; - 68FDCFBE5C019D26281F7A56CAAFBD4A /* ICandleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ICandleChartDataSet.swift; path = Source/Charts/Data/Interfaces/ICandleChartDataSet.swift; sourceTree = ""; }; - 6BCBA4882939D2562643379A8CCDF2E6 /* LineChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartData.swift; path = Source/Charts/Data/Implementations/Standard/LineChartData.swift; sourceTree = ""; }; - 6C5FDCBCF25DC40CBD3324686E14C95A /* Platform+Gestures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Gestures.swift"; path = "Source/Charts/Utils/Platform+Gestures.swift"; sourceTree = ""; }; - 6E6ADC76EF0EE1AE0F7877BAE8AC3430 /* ChartLimitLine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartLimitLine.swift; path = Source/Charts/Components/ChartLimitLine.swift; sourceTree = ""; }; - 6F8D402409FDE04B9AA68921C87A582A /* ScatterChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/ScatterChartDataSet.swift; sourceTree = ""; }; - 70230EF21C40FA0D1ED0CF3F82D0CCA5 /* RadarChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartData.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartData.swift; sourceTree = ""; }; - 7105F1BABE60EE081EBDC3478EBDF544 /* Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helpers.swift; path = Source/Core/Helpers.swift; sourceTree = ""; }; - 714555686E18EFF7F47B8D5E49DBEA3F /* BarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarHighlighter.swift; path = Source/Charts/Highlight/BarHighlighter.swift; sourceTree = ""; }; - 71C85204757B1DFD665A234DDC2CB843 /* RadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift; sourceTree = ""; }; - 72076E17F40C394C421E55A1B2A5B5AB /* YAxis.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxis.swift; path = Source/Charts/Components/YAxis.swift; sourceTree = ""; }; - 729A12A9B7F0A0EE6EEE33B5176F30BB /* ChartDataRendererBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataRendererBase.swift; path = Source/Charts/Renderers/ChartDataRendererBase.swift; sourceTree = ""; }; - 742D75E835BBB864914066437E0F9AAF /* MultipleSelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipleSelectorRow.swift; path = Source/Rows/MultipleSelectorRow.swift; sourceTree = ""; }; - 745E6248CAB2E4A068E95D95FA0F1440 /* BarLineScatterCandleBubbleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartDataProvider.swift; path = Source/Charts/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift; sourceTree = ""; }; - 774E64F62D19C0B99410BBF3B8FE0555 /* RowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RowType.swift; path = Source/Core/RowType.swift; sourceTree = ""; }; - 79AAFAF1006DFD732C3559D661ABC07B /* RuleClosure.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleClosure.swift; path = Source/Validations/RuleClosure.swift; sourceTree = ""; }; - 7BDA597AD98E041BDF72BECA4E7CC21C /* AnimatedZoomViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedZoomViewJob.swift; path = Source/Charts/Jobs/AnimatedZoomViewJob.swift; sourceTree = ""; }; - 7CADE2DFAF271071EECD3C92248F2192 /* CombinedChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartData.swift; path = Source/Charts/Data/Implementations/Standard/CombinedChartData.swift; sourceTree = ""; }; - 7CB81995CD9E3411271534F01DAD4592 /* AnimatedMoveViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedMoveViewJob.swift; path = Source/Charts/Jobs/AnimatedMoveViewJob.swift; sourceTree = ""; }; - 7CF245263BA6245C01808ECB50BA7C48 /* PieChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift; sourceTree = ""; }; - 7D25B6FD011B35288185B6EF33CDACC8 /* RadarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarHighlighter.swift; path = Source/Charts/Highlight/RadarHighlighter.swift; sourceTree = ""; }; - 7E0F07C3184BEE9EE73A064412FB3969 /* CandleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartData.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartData.swift; sourceTree = ""; }; + 4D28AE94DD8B0CC673A577C731C03431 /* ViewPortJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewPortJob.swift; path = Source/Charts/Jobs/ViewPortJob.swift; sourceTree = ""; }; + 4EFCC91F90BD17AD567D57CE537F2268 /* ShareClient-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ShareClient-Info.plist"; sourceTree = ""; }; + 4FFBD63A349249CCAC76EAE17C6E540A /* Charts-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Charts-Info.plist"; sourceTree = ""; }; + 5067C4CFC921FC0C56F6C5B3B4240008 /* DoublePickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DoublePickerRow.swift; path = Source/Rows/DoublePickerRow.swift; sourceTree = ""; }; + 51133B95E04FCEF52CECCBA0FA2FB64C /* BarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarHighlighter.swift; path = Source/Charts/Highlight/BarHighlighter.swift; sourceTree = ""; }; + 52777F38E94D175B30FD6CCE0503BE91 /* IValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IValueFormatter.swift; path = Source/Charts/Formatters/IValueFormatter.swift; sourceTree = ""; }; + 527868253626F5726DA92BB29CCA64F5 /* Platform+Touch Handling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Touch Handling.swift"; path = "Source/Charts/Utils/Platform+Touch Handling.swift"; sourceTree = ""; }; + 5284FBF634CFF42E384E18E1D82F111C /* PieChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartView.swift; path = Source/Charts/Charts/PieChartView.swift; sourceTree = ""; }; + 540C2AE657DFD33D82A5800A9A30E715 /* AnimatedZoomViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedZoomViewJob.swift; path = Source/Charts/Jobs/AnimatedZoomViewJob.swift; sourceTree = ""; }; + 5471DA369762341AFA788636BF5238B0 /* Form.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Form.swift; path = Source/Core/Form.swift; sourceTree = ""; }; + 548BE84DABD9800530A1C66FE902B9C7 /* GenericMultipleSelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericMultipleSelectorRow.swift; path = Source/Rows/Common/GenericMultipleSelectorRow.swift; sourceTree = ""; }; + 55D5F888EBF0F894D53C98C99A93C2DB /* Highlight.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Highlight.swift; path = Source/Charts/Highlight/Highlight.swift; sourceTree = ""; }; + 55F11A5FF44761B6757A841E9A4FE3BD /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Source/Core/Operators.swift; sourceTree = ""; }; + 568C835AC8B764A0183271E99058B163 /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cell.swift; path = Source/Core/Cell.swift; sourceTree = ""; }; + 57AAE9789B991F46EFCE58CE338AED41 /* AxisBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisBase.swift; path = Source/Charts/Components/AxisBase.swift; sourceTree = ""; }; + 589103C5CFBCC41339AECEF41A55A87A /* PushRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushRow.swift; path = Source/Rows/PushRow.swift; sourceTree = ""; }; + 59CE156C94B888A75504D963FB95A5A7 /* AnimatedViewPortJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedViewPortJob.swift; path = Source/Charts/Jobs/AnimatedViewPortJob.swift; sourceTree = ""; }; + 5A92BA872BE33DE132E60FA393324DB1 /* MultipleSelectorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipleSelectorViewController.swift; path = Source/Rows/Controllers/MultipleSelectorViewController.swift; sourceTree = ""; }; + 5ACC330581B8B5D9791487A217968559 /* PieRadarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieRadarHighlighter.swift; path = Source/Charts/Highlight/PieRadarHighlighter.swift; sourceTree = ""; }; + 5B27115EBCC224F7D67778C26B1275B8 /* CombinedChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartView.swift; path = Source/Charts/Charts/CombinedChartView.swift; sourceTree = ""; }; + 5D0D30B8F618735D32A0FCFC52EB805D /* NavigationAccessoryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NavigationAccessoryView.swift; path = Source/Core/NavigationAccessoryView.swift; sourceTree = ""; }; + 5F50F1D5643D6EBCA09E428806984608 /* AlertRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlertRow.swift; path = Source/Rows/AlertRow.swift; sourceTree = ""; }; + 5F60B3D090DD53CC3BA96A41B6A0776C /* CombinedChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartDataProvider.swift; path = Source/Charts/Interfaces/CombinedChartDataProvider.swift; sourceTree = ""; }; + 63B59B19AC178737F69F4E653E3D3C3C /* RowControllerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RowControllerType.swift; path = Source/Core/RowControllerType.swift; sourceTree = ""; }; + 653297DA1AAAEEFC0BF5642F6604CDDC /* ZoomViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomViewJob.swift; path = Source/Charts/Jobs/ZoomViewJob.swift; sourceTree = ""; }; + 68406FC37BCF5DE56607C70BA1C3EBC5 /* DateRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateRow.swift; path = Source/Rows/DateRow.swift; sourceTree = ""; }; + 69BD15D5856F4E84E769AFD9438BF861 /* IBarLineScatterCandleBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBarLineScatterCandleBubbleChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift; sourceTree = ""; }; + 6FCBC3E7CA177D591BC893AB3839AF87 /* Legend.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Legend.swift; path = Source/Charts/Components/Legend.swift; sourceTree = ""; }; + 70FFA615C5AB19A462747668F6DFAE52 /* CandleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift; sourceTree = ""; }; + 71786812E4BA34CFE31958629790D981 /* ChartBaseDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartBaseDataSet.swift; path = Source/Charts/Data/Implementations/ChartBaseDataSet.swift; sourceTree = ""; }; + 71A6113B0BF33B6BE24E733E54B29F11 /* RadarChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartDataEntry.swift; sourceTree = ""; }; + 720BAE67C4F9E996548ED7C3C156633E /* Eureka-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Eureka-prefix.pch"; sourceTree = ""; }; + 733827F65F5022C471A1447F04440570 /* TriangleShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TriangleShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift; sourceTree = ""; }; + 7967D1617EF3687E7EA393DDFEBC8B31 /* InlineRowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InlineRowType.swift; path = Source/Core/InlineRowType.swift; sourceTree = ""; }; + 7AC48B177FD06557DCB9C5C3583D5B87 /* BubbleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataProvider.swift; path = Source/Charts/Interfaces/BubbleChartDataProvider.swift; sourceTree = ""; }; + 7D118C0F313FDC57A29E6BBB205A3799 /* ChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataSet.swift; sourceTree = ""; }; + 7D8EB04398FDB94F46498AD99A989CA8 /* TriplePickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TriplePickerRow.swift; path = Source/Rows/TriplePickerRow.swift; sourceTree = ""; }; 7E41188828C3ADE7A96C4DA6ED1CCDA2 /* Pods-LoopFollow-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-LoopFollow-umbrella.h"; sourceTree = ""; }; - 7E5488781769EC1BC666BD556553C613 /* PieHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieHighlighter.swift; path = Source/Charts/Highlight/PieHighlighter.swift; sourceTree = ""; }; - 7E76DAA9695B062B079865671555A198 /* BarLineScatterCandleBubbleRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleRenderer.swift; path = Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift; sourceTree = ""; }; - 7ECEF07022B6C554B4E9802C221B95B9 /* ChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataEntry.swift; sourceTree = ""; }; - 7EDC871696C42F364FF9E4FBF320D207 /* RuleRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleRange.swift; path = Source/Validations/RuleRange.swift; sourceTree = ""; }; - 7F85FACC2016BEC51568E2DA039871BA /* BubbleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartData.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartData.swift; sourceTree = ""; }; - 80318751D82A1232D25FE42BE09D9FFA /* Core.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Core.swift; path = Source/Core/Core.swift; sourceTree = ""; }; - 805041F849AC6045DBA321E0CBE414ED /* RuleEqualsToRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleEqualsToRow.swift; path = Source/Validations/RuleEqualsToRow.swift; sourceTree = ""; }; - 8096CF97803FE35D19082B189F139D53 /* LineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift; sourceTree = ""; }; - 82516DCE2680E4E28B019A35C1AA85E7 /* ComponentBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComponentBase.swift; path = Source/Charts/Components/ComponentBase.swift; sourceTree = ""; }; - 82F1DEC08F246688F6E7531A3395E9B1 /* CombinedChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartRenderer.swift; path = Source/Charts/Renderers/CombinedChartRenderer.swift; sourceTree = ""; }; - 83942BEC8B7DB3645C30D60937AF2652 /* BarLineScatterCandleBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift; sourceTree = ""; }; - 86F8AE08B613E8389A122C6ED38A14A2 /* ChartHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartHighlighter.swift; path = Source/Charts/Highlight/ChartHighlighter.swift; sourceTree = ""; }; - 877048B6F67A34C1FD3885CD20CF3AC6 /* PopoverSelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopoverSelectorRow.swift; path = Source/Rows/PopoverSelectorRow.swift; sourceTree = ""; }; - 87994AC80B253089EC8951B0916B1C1D /* DatePickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DatePickerRow.swift; path = Source/Rows/DatePickerRow.swift; sourceTree = ""; }; - 88E17727D64A26D166EA94F8B96ACAB4 /* Charts-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Charts-dummy.m"; sourceTree = ""; }; - 8CA67E3BD944650F1EED5FA0B16BF2A9 /* DefaultFillFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultFillFormatter.swift; path = Source/Charts/Formatters/DefaultFillFormatter.swift; sourceTree = ""; }; - 8CDFE98CDB50C3C14377F152923FF465 /* PieChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartView.swift; path = Source/Charts/Charts/PieChartView.swift; sourceTree = ""; }; - 8DB307AF5190BC0642C752B5DE6AEC4E /* Charts-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Charts-Info.plist"; sourceTree = ""; }; - 8E147C593487F41985DF252E8462F8E5 /* Animator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Animator.swift; path = Source/Charts/Animation/Animator.swift; sourceTree = ""; }; - 8EF8E5F90E48A1146DE536864603C6B1 /* CandleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartDataSet.swift; sourceTree = ""; }; - 9157BC0B4AEB06D64AE7443A8BD5947D /* BarLineChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineChartViewBase.swift; path = Source/Charts/Charts/BarLineChartViewBase.swift; sourceTree = ""; }; - 929451489095A14748EE4AC0ECE015B3 /* XAxisRendererHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRendererHorizontalBarChart.swift; path = Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift; sourceTree = ""; }; - 92D10EDF63A87D7BD2367F7E8DB62A50 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Core/Validation.swift; sourceTree = ""; }; - 950BD31462B45700CCB1D7EC3B5EFDCB /* YAxisRendererHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRendererHorizontalBarChart.swift; path = Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift; sourceTree = ""; }; - 9640E3B61E9EB2E5999E6AF8A1E6D61A /* ChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartViewBase.swift; path = Source/Charts/Charts/ChartViewBase.swift; sourceTree = ""; }; - 964ECD689E6D753A7D3EBE859C86AB18 /* ActionSheetRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActionSheetRow.swift; path = Source/Rows/ActionSheetRow.swift; sourceTree = ""; }; - 972988CAA5B213B4B7E79E686D947066 /* Eureka.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Eureka.debug.xcconfig; sourceTree = ""; }; - 98C23603F603481C63472733E4703D0D /* DoublePickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DoublePickerRow.swift; path = Source/Rows/DoublePickerRow.swift; sourceTree = ""; }; - 9BE7167E3A24661ED73D8E4CF4833587 /* PickerInlineRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PickerInlineRow.swift; path = Source/Rows/PickerInlineRow.swift; sourceTree = ""; }; - 9C086384F94A6CED2FB0EC4DA22CF685 /* HorizontalBarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarChartView.swift; path = Source/Charts/Charts/HorizontalBarChartView.swift; sourceTree = ""; }; - 9C98A13EC67B78112EB25C6A7E85200A /* PushRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushRow.swift; path = Source/Rows/PushRow.swift; sourceTree = ""; }; + 7FCC0B2AAFCFDCD7682F7C52CA90AEBC /* RadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/RadarChartDataSet.swift; sourceTree = ""; }; + 805B8ACDB7AF64D4B1EFF9695D06D6E7 /* IFillFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IFillFormatter.swift; path = Source/Charts/Formatters/IFillFormatter.swift; sourceTree = ""; }; + 8183772B19A56CF748806153BF97D089 /* Core.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Core.swift; path = Source/Core/Core.swift; sourceTree = ""; }; + 87C515318E4A075DCC3455EA33F32672 /* LineChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartDataProvider.swift; path = Source/Charts/Interfaces/LineChartDataProvider.swift; sourceTree = ""; }; + 88506EF0DE39A04D24F910A93C337EFD /* ShareClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ShareClient.h; path = ShareClient/ShareClient.h; sourceTree = ""; }; + 8A88AC66D4BA5F2606CBD23F8BC468D4 /* BarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartView.swift; path = Source/Charts/Charts/BarChartView.swift; sourceTree = ""; }; + 8AFCBD39119B8A39E3A0CA0B9CE6C4FB /* CandleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataProvider.swift; path = Source/Charts/Interfaces/CandleChartDataProvider.swift; sourceTree = ""; }; + 8F12CC35F78CEC5436F967BCF50C5EF0 /* CombinedChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartRenderer.swift; path = Source/Charts/Renderers/CombinedChartRenderer.swift; sourceTree = ""; }; + 8F49CC163BE65B796CE8B4C654F0B221 /* ChartColorTemplates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartColorTemplates.swift; path = Source/Charts/Utils/ChartColorTemplates.swift; sourceTree = ""; }; + 9057EE1840994798463E40010C5B2BC5 /* ChevronDownShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChevronDownShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift; sourceTree = ""; }; + 914FD2A2403BAC9475234D3B9A7B13D4 /* ILineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift; sourceTree = ""; }; + 91590B3C1B301C3DE53A488D68A81701 /* CircleShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CircleShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift; sourceTree = ""; }; + 919647803888A5B15DB3222FCDA56E0A /* CombinedChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartData.swift; path = Source/Charts/Data/Implementations/Standard/CombinedChartData.swift; sourceTree = ""; }; + 92E073284CCFB590C93D4DC4AF39731B /* BubbleChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartView.swift; path = Source/Charts/Charts/BubbleChartView.swift; sourceTree = ""; }; + 937E34112E8DDE6B37ECE22A0BDC59E7 /* ButtonRowWithPresent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ButtonRowWithPresent.swift; path = Source/Rows/ButtonRowWithPresent.swift; sourceTree = ""; }; + 93DBEA6C1381CFA8F6B6DFD85A9A5A02 /* RuleEqualsToRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleEqualsToRow.swift; path = Source/Validations/RuleEqualsToRow.swift; sourceTree = ""; }; + 94046F1B95DF94D6E175F891C3C315AD /* SelectableRowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectableRowType.swift; path = Source/Core/SelectableRowType.swift; sourceTree = ""; }; + 9423746E4BC0AD1992F5D13E2E1F9E70 /* YAxisRendererRadarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRendererRadarChart.swift; path = Source/Charts/Renderers/YAxisRendererRadarChart.swift; sourceTree = ""; }; + 947C167AF75DD780C25483F12F12822B /* ScatterChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartDataProvider.swift; path = Source/Charts/Interfaces/ScatterChartDataProvider.swift; sourceTree = ""; }; + 94F34C60E8ABE81F99BFB0915A1517A0 /* XAxisRendererHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRendererHorizontalBarChart.swift; path = Source/Charts/Renderers/XAxisRendererHorizontalBarChart.swift; sourceTree = ""; }; + 97FE7FFB6C5E1BCD95EB806FAF00E4FC /* LineScatterCandleRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarRenderer.swift; path = Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift; sourceTree = ""; }; + 989650FD7F5122CA9AC857FF507D818E /* Section.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Section.swift; path = Source/Core/Section.swift; sourceTree = ""; }; + 990AA38654ECD509645583469ADAFB2E /* DataApproximator+N.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DataApproximator+N.swift"; path = "Source/Charts/Filters/DataApproximator+N.swift"; sourceTree = ""; }; + 99445AF2EFD84919074857FAE2171830 /* RuleRegExp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleRegExp.swift; path = Source/Validations/RuleRegExp.swift; sourceTree = ""; }; + 99A385B62C3482DFD4D1A6D9D36A48E8 /* Charts-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Charts-prefix.pch"; sourceTree = ""; }; + 99AC4BCC8856578AC43D03573FADE196 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Core/Validation.swift; sourceTree = ""; }; + 99E407FE7A788430D697A04C2DDC4BE6 /* RuleURL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleURL.swift; path = Source/Validations/RuleURL.swift; sourceTree = ""; }; + 9A139CB129780B5CE6CC6A7ABE85922E /* HorizontalBarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarChartRenderer.swift; path = Source/Charts/Renderers/HorizontalBarChartRenderer.swift; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9DCD9F34ED2EFAB655BF84EB19BF0B03 /* AxisRendererBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisRendererBase.swift; path = Source/Charts/Renderers/AxisRendererBase.swift; sourceTree = ""; }; - 9DD5D404866482790244CEA58FC02516 /* SegmentedRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SegmentedRow.swift; path = Source/Rows/SegmentedRow.swift; sourceTree = ""; }; - 9F2D900844C314E8262826754BCDB63E /* ChartUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartUtils.swift; path = Source/Charts/Utils/ChartUtils.swift; sourceTree = ""; }; + 9F61CC9BC348F45A50AD5AB2ED815BAB /* XShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/XShapeRenderer.swift; sourceTree = ""; }; + 9F6A8E2C6ECCAF59C045894E1F3DF8C5 /* RuleRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleRange.swift; path = Source/Validations/RuleRange.swift; sourceTree = ""; }; + 9FBA401AF5B307DD562DF29F2CC80553 /* PresenterRowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PresenterRowType.swift; path = Source/Core/PresenterRowType.swift; sourceTree = ""; }; + A047E01EAD49DCD01C6AE241C055B64E /* ShareClient-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShareClient-umbrella.h"; sourceTree = ""; }; A0878FA8411033349498923D4630B956 /* Pods-LoopFollow-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-LoopFollow-frameworks.sh"; sourceTree = ""; }; + A13F8D0A0BEAE5837834E66A8B1AAB8B /* IHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IHighlighter.swift; path = Source/Charts/Highlight/IHighlighter.swift; sourceTree = ""; }; A1C1B977ED8804E8AEEC884E7359EE58 /* Charts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Charts.framework; path = Charts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A3154F080DAF844406EBAD792DD1F1AC /* LineChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartDataProvider.swift; path = Source/Charts/Interfaces/LineChartDataProvider.swift; sourceTree = ""; }; - A414CED5CB27F40037F440A7B99A8181 /* LegendRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegendRenderer.swift; path = Source/Charts/Renderers/LegendRenderer.swift; sourceTree = ""; }; - A4C0C98D51FEC617960BEE2F5E7EC507 /* TriplePickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TriplePickerRow.swift; path = Source/Rows/TriplePickerRow.swift; sourceTree = ""; }; - A52112890B03A2230EA87DE2074EBF66 /* HorizontalBarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarHighlighter.swift; path = Source/Charts/Highlight/HorizontalBarHighlighter.swift; sourceTree = ""; }; - A76A34E9C02A6AE7AF665A056FC21385 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Source/Core/Operators.swift; sourceTree = ""; }; - A7B8D6F073E0C9F1D0DC0A4EF5F00D80 /* Renderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Renderer.swift; path = Source/Charts/Renderers/Renderer.swift; sourceTree = ""; }; - A9DB5945996F90B2A9EE5243C6A1423F /* CombinedChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartDataProvider.swift; path = Source/Charts/Interfaces/CombinedChartDataProvider.swift; sourceTree = ""; }; - AA9B460BCA0242A40EEA3451ECEA392E /* Platform+Touch Handling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Touch Handling.swift"; path = "Source/Charts/Utils/Platform+Touch Handling.swift"; sourceTree = ""; }; - AAB5771835E6170F384829884E2B9985 /* Charts-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Charts-umbrella.h"; sourceTree = ""; }; - AB8EF9C425A89B975BEF843FFF552985 /* SwipeActions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwipeActions.swift; path = Source/Core/SwipeActions.swift; sourceTree = ""; }; - AC07EA79DDA9EF6E69EC9529D4BFE371 /* PickerInputRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PickerInputRow.swift; path = Source/Rows/PickerInputRow.swift; sourceTree = ""; }; - ADE0989B752944E4E267D4EC37EC8BEF /* LineChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartRenderer.swift; path = Source/Charts/Renderers/LineChartRenderer.swift; sourceTree = ""; }; - AE64A695A7435B21BE9B760056208374 /* DecimalFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DecimalFormatter.swift; path = Source/Rows/Common/DecimalFormatter.swift; sourceTree = ""; }; - AE6E347B4EC0B71AFAC54530B584158B /* IScatterChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IScatterChartDataSet.swift; path = Source/Charts/Data/Interfaces/IScatterChartDataSet.swift; sourceTree = ""; }; - AEBF3FF6A0AA50E17997BE01E91A7B0E /* NavigationAccessoryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NavigationAccessoryView.swift; path = Source/Core/NavigationAccessoryView.swift; sourceTree = ""; }; - AF6F94A014222434C07CED041F1A6237 /* CandleStickChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleStickChartView.swift; path = Source/Charts/Charts/CandleStickChartView.swift; sourceTree = ""; }; + A4010AF1B513BF04041A5432AF20E42B /* BaseRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseRow.swift; path = Source/Core/BaseRow.swift; sourceTree = ""; }; + A76791113E26FF4E2E0456B3AFBEB78B /* BubbleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartData.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartData.swift; sourceTree = ""; }; + A869216FA3AC6BF4E9E522958EEC835A /* IScatterChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IScatterChartDataSet.swift; path = Source/Charts/Data/Interfaces/IScatterChartDataSet.swift; sourceTree = ""; }; + A909150E97DC082367FC2960FCB633BA /* PopoverSelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopoverSelectorRow.swift; path = Source/Rows/PopoverSelectorRow.swift; sourceTree = ""; }; + A9A56A406C5958A1B025AF2BEADEAB5E /* Eureka-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Eureka-dummy.m"; sourceTree = ""; }; + A9C7ED3BDF9A49970B6D7F0C0BF8E2B3 /* ListCheckRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ListCheckRow.swift; path = Source/Rows/SelectableRows/ListCheckRow.swift; sourceTree = ""; }; + AC8A8EC434DD8733B56039AB331048F1 /* BarLineScatterCandleBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift; sourceTree = ""; }; + ACC18BFAFFF03439AE7FC5425BC06568 /* SelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectorRow.swift; path = Source/Rows/Common/SelectorRow.swift; sourceTree = ""; }; + AEC6B766C4F4809D41B6E083F9A3F0AC /* BubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartDataSet.swift; sourceTree = ""; }; + AF8539432E41C7FAB4F3E455D0FC889F /* MoveViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MoveViewJob.swift; path = Source/Charts/Jobs/MoveViewJob.swift; sourceTree = ""; }; + B08418091F0B05BA6BDCC363F96B8C43 /* RadarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RadarChartRenderer.swift; path = Source/Charts/Renderers/RadarChartRenderer.swift; sourceTree = ""; }; B1DF43F4B1524F385F6090756FA3016A /* Pods-LoopFollow.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-LoopFollow.debug.xcconfig"; sourceTree = ""; }; - B2F3155FB4D74FAF71DACB796F6C37CF /* Transformer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformer.swift; path = Source/Charts/Utils/Transformer.swift; sourceTree = ""; }; - B3589AD577F14D9EF3C1B486E3AE9AD1 /* ChevronUpShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChevronUpShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift; sourceTree = ""; }; - B495707192AD3EB05D28B3FC41D3DE79 /* Platform+Graphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Graphics.swift"; path = "Source/Charts/Utils/Platform+Graphics.swift"; sourceTree = ""; }; - B5CAA0775EDBAE161B5D0E7EA11FD6BC /* Eureka-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Eureka-prefix.pch"; sourceTree = ""; }; - B86222F70DF9BA5C9FD5BC0C57B44516 /* XAxis.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxis.swift; path = Source/Charts/Components/XAxis.swift; sourceTree = ""; }; - B946915CF4D343517B51D33FD3A04BCF /* IndexAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IndexAxisValueFormatter.swift; path = Source/Charts/Formatters/IndexAxisValueFormatter.swift; sourceTree = ""; }; - B9ACCB5D9F822C2F7D0C1E84D401124D /* ChevronDownShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChevronDownShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift; sourceTree = ""; }; - BA3B623F7078308F6C63E600530AD2EC /* Form.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Form.swift; path = Source/Core/Form.swift; sourceTree = ""; }; - BB6D1BC5E7576A4EE182F66FDB70135E /* Eureka-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Eureka-umbrella.h"; sourceTree = ""; }; - BBE28E66678F0411EB23844644DD532A /* FieldRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FieldRow.swift; path = Source/Rows/Common/FieldRow.swift; sourceTree = ""; }; - BBF603CBA0282655DE10AB2E64E38A78 /* DateInlineRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateInlineRow.swift; path = Source/Rows/DateInlineRow.swift; sourceTree = ""; }; - BD461674D07DC3CCE2C5289E94480677 /* YAxisRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRenderer.swift; path = Source/Charts/Renderers/YAxisRenderer.swift; sourceTree = ""; }; - BDADC32BFF4DE543DCC8A0C9F33610B8 /* PickerRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PickerRow.swift; path = Source/Rows/PickerRow.swift; sourceTree = ""; }; - BDFCB038F9DFF63DB1A66A0BA0DE2FF3 /* ScatterChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartView.swift; path = Source/Charts/Charts/ScatterChartView.swift; sourceTree = ""; }; - C079A2B4457B189E14F7ACCDF6210CB2 /* CandleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataProvider.swift; path = Source/Charts/Interfaces/CandleChartDataProvider.swift; sourceTree = ""; }; - C11A72698F5A39FE67A8908256260F03 /* HorizontalBarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarChartRenderer.swift; path = Source/Charts/Renderers/HorizontalBarChartRenderer.swift; sourceTree = ""; }; - C1BB70383AD3D2088BD979874E38FB12 /* PieRadarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieRadarHighlighter.swift; path = Source/Charts/Highlight/PieRadarHighlighter.swift; sourceTree = ""; }; - C381C388D31FC8085089D38D9F55A7AE /* BarLineScatterCandleBubbleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartData.swift; path = Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift; sourceTree = ""; }; - C53A8210C66064E3B8F1EC9B6453B323 /* MarkerImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarkerImage.swift; path = Source/Charts/Components/MarkerImage.swift; sourceTree = ""; }; - C7AE0E1C416BB967B5624D0ECADD53F8 /* SwitchRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchRow.swift; path = Source/Rows/SwitchRow.swift; sourceTree = ""; }; - C9BBDA9249CBAFE6EF9373177FF46337 /* BaseRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseRow.swift; path = Source/Core/BaseRow.swift; sourceTree = ""; }; - CA4DC8D9C55731586FBF6CA8B50AE3C8 /* ChartBaseDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartBaseDataSet.swift; path = Source/Charts/Data/Implementations/ChartBaseDataSet.swift; sourceTree = ""; }; - CA9B73786C8C3F0A227107004B92E8D5 /* GenericMultipleSelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericMultipleSelectorRow.swift; path = Source/Rows/Common/GenericMultipleSelectorRow.swift; sourceTree = ""; }; - CAB210E66749830C126E32238CE2082D /* LineChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineChartDataSet.swift; sourceTree = ""; }; - CB20702200078D6C342F044A7ACF647E /* ViewPortJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewPortJob.swift; path = Source/Charts/Jobs/ViewPortJob.swift; sourceTree = ""; }; - CD37D5B6C9777C0410BD7981DFEECAA0 /* LineScatterCandleRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarRenderer.swift; path = Source/Charts/Renderers/LineScatterCandleRadarRenderer.swift; sourceTree = ""; }; - CD429C5F2105C02645A5B0C4404E6276 /* CombinedChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedChartView.swift; path = Source/Charts/Charts/CombinedChartView.swift; sourceTree = ""; }; - CF1521DEA9B23E85D6E3B390594B8386 /* Platform+Accessibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Accessibility.swift"; path = "Source/Charts/Utils/Platform+Accessibility.swift"; sourceTree = ""; }; - CF31146E46DDECAC6A65C804FDFB9567 /* HeaderFooterView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeaderFooterView.swift; path = Source/Core/HeaderFooterView.swift; sourceTree = ""; }; - CF9EC3B5687C1269D9ACA71960B2722F /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cell.swift; path = Source/Core/Cell.swift; sourceTree = ""; }; - D0704DED0FDFDBECD5D672C8122D09D3 /* AlertOptionsRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlertOptionsRow.swift; path = Source/Rows/Common/AlertOptionsRow.swift; sourceTree = ""; }; - D0C3392B488D1C70CE763BEC834C6E40 /* BarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartView.swift; path = Source/Charts/Charts/BarChartView.swift; sourceTree = ""; }; - D0FE0C9E36C7E4EA71A9C0915DCDE460 /* DataApproximator+N.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DataApproximator+N.swift"; path = "Source/Charts/Filters/DataApproximator+N.swift"; sourceTree = ""; }; - D20056B909D071B51B58A4EC7F9AF016 /* IFillFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IFillFormatter.swift; path = Source/Charts/Formatters/IFillFormatter.swift; sourceTree = ""; }; - D25585170D6AB5308AE2A678B8A2AFD9 /* SelectableRowType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectableRowType.swift; path = Source/Core/SelectableRowType.swift; sourceTree = ""; }; - D2A83BF9B84A2500DB376EB0440F3177 /* Platform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.swift; path = Source/Charts/Utils/Platform.swift; sourceTree = ""; }; - D2E075D6FF5CADB79137C6C0F8BD9AD8 /* ScatterChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartDataProvider.swift; path = Source/Charts/Interfaces/ScatterChartDataProvider.swift; sourceTree = ""; }; - D365EA8C2BD866565B9032143F883585 /* ViewPortHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewPortHandler.swift; path = Source/Charts/Utils/ViewPortHandler.swift; sourceTree = ""; }; - D4D1CD2B50CF172C70D4C70E118CF2D6 /* DateFieldRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFieldRow.swift; path = Source/Rows/Common/DateFieldRow.swift; sourceTree = ""; }; - D5333884384F3F0617A1755CB9C04EA9 /* DefaultValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultValueFormatter.swift; path = Source/Charts/Formatters/DefaultValueFormatter.swift; sourceTree = ""; }; - D89B6697D34583EEC038208D3A2CCC19 /* TriangleShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TriangleShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/TriangleShapeRenderer.swift; sourceTree = ""; }; - D988C4498CD948B3BA26A653BC5F2BE1 /* IPieChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IPieChartDataSet.swift; path = Source/Charts/Data/Interfaces/IPieChartDataSet.swift; sourceTree = ""; }; - D9F8D990EA4AB722F7E4DDB271FBDF07 /* XShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/XShapeRenderer.swift; sourceTree = ""; }; - D9FB34C64CEA9EB76D25668DF5B911D0 /* XAxisRendererRadarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRendererRadarChart.swift; path = Source/Charts/Renderers/XAxisRendererRadarChart.swift; sourceTree = ""; }; - DA3FB45C36C40B6053CC640379ABFF09 /* ButtonRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ButtonRow.swift; path = Source/Rows/ButtonRow.swift; sourceTree = ""; }; - DC49C98470D53DA3649F1E5A95641514 /* ChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataProvider.swift; path = Source/Charts/Interfaces/ChartDataProvider.swift; sourceTree = ""; }; - DCA54E592B656A55A540BF36DF17957A /* PieChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartRenderer.swift; path = Source/Charts/Renderers/PieChartRenderer.swift; sourceTree = ""; }; - DF8BB64B5949D2CAA9B7D84B20B679E7 /* IShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/IShapeRenderer.swift; sourceTree = ""; }; - DFB7F1FDCA25887A48D3D9A7FB615800 /* CircleShapeRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CircleShapeRenderer.swift; path = Source/Charts/Renderers/Scatter/CircleShapeRenderer.swift; sourceTree = ""; }; - E15189F1DAD306A270886D315DA65038 /* SelectorRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectorRow.swift; path = Source/Rows/Common/SelectorRow.swift; sourceTree = ""; }; - E1AD9C87BF211B61583EFC0CDAAFD1FE /* Section.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Section.swift; path = Source/Core/Section.swift; sourceTree = ""; }; - E3FB5D0BD363FB7F09E40CBD6821E463 /* MultipleSelectorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipleSelectorViewController.swift; path = Source/Rows/Controllers/MultipleSelectorViewController.swift; sourceTree = ""; }; - E5376E6450A6747741DC5879E846A8D4 /* IHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IHighlighter.swift; path = Source/Charts/Highlight/IHighlighter.swift; sourceTree = ""; }; - E5C982FD8EADF008ED080533ECC61350 /* RuleRegExp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleRegExp.swift; path = Source/Validations/RuleRegExp.swift; sourceTree = ""; }; - E5CF5AF933F10270B89A5C7DA4913A6D /* XAxisRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRenderer.swift; path = Source/Charts/Renderers/XAxisRenderer.swift; sourceTree = ""; }; - E613BE0BFFB09D55A3AD7BC1EEFD4823 /* OptionsRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OptionsRow.swift; path = Source/Rows/Common/OptionsRow.swift; sourceTree = ""; }; - E6CAE7AC4CEE072EBCA52375CFE7EAC8 /* LineRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineRadarRenderer.swift; path = Source/Charts/Renderers/LineRadarRenderer.swift; sourceTree = ""; }; - E81B1BBAF0B43F0A7937AAA509040657 /* SelectableSection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectableSection.swift; path = Source/Core/SelectableSection.swift; sourceTree = ""; }; - EAE950ECC462BCF193C89D86EEB21977 /* Eureka.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Eureka.release.xcconfig; sourceTree = ""; }; - EBD7FCF54BAD47CD0733E99A9318D846 /* CellType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CellType.swift; path = Source/Core/CellType.swift; sourceTree = ""; }; + B28A2F7F1E6F57132EDC348E349719CA /* Eureka.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Eureka.debug.xcconfig; sourceTree = ""; }; + B2D931E90044D88802D3FD030161D3C8 /* PieHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieHighlighter.swift; path = Source/Charts/Highlight/PieHighlighter.swift; sourceTree = ""; }; + B3127CF0F6CFE1BEDAD6752A448E7D67 /* Eureka.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Eureka.release.xcconfig; sourceTree = ""; }; + B31407514FCEAE451A67BFB01F99FD57 /* BarChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/BarChartDataEntry.swift; sourceTree = ""; }; + B31F4F15FC21AB2A91319F457B686A31 /* BubbleChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartRenderer.swift; path = Source/Charts/Renderers/BubbleChartRenderer.swift; sourceTree = ""; }; + B3C500690781B6631CE1C0946BDBDDAB /* IBubbleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBubbleChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBubbleChartDataSet.swift; sourceTree = ""; }; + B403CCDCB84443B5F5C2ACB7F05262F8 /* Platform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.swift; path = Source/Charts/Utils/Platform.swift; sourceTree = ""; }; + B5027B3B59A4B57AD77A4D08FD35B4F5 /* PieChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartData.swift; path = Source/Charts/Data/Implementations/Standard/PieChartData.swift; sourceTree = ""; }; + B73122FF47D657B6EE798456F35C01B8 /* RuleLength.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleLength.swift; path = Source/Validations/RuleLength.swift; sourceTree = ""; }; + B780059D2B1759DB0B490F39320EF494 /* IndexAxisValueFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IndexAxisValueFormatter.swift; path = Source/Charts/Formatters/IndexAxisValueFormatter.swift; sourceTree = ""; }; + B9F3AC74EA385AD1FB48BB312B9A8D01 /* AnimatedMoveViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedMoveViewJob.swift; path = Source/Charts/Jobs/AnimatedMoveViewJob.swift; sourceTree = ""; }; + BB2EE47C8EFAFB7A567F4AFF90304521 /* ButtonRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ButtonRow.swift; path = Source/Rows/ButtonRow.swift; sourceTree = ""; }; + BCD106D95076EE34EC2C06B62908D944 /* ChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartData.swift; path = Source/Charts/Data/Implementations/Standard/ChartData.swift; sourceTree = ""; }; + BE34CABB424024A41851C39678BA5EF3 /* CombinedHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombinedHighlighter.swift; path = Source/Charts/Highlight/CombinedHighlighter.swift; sourceTree = ""; }; + BED228AF72ED5D323F30BAC261C5CD14 /* Eureka.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Eureka.modulemap; sourceTree = ""; }; + BF358AA0AFC2C0AF0152E704E7512517 /* PickerInputRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PickerInputRow.swift; path = Source/Rows/PickerInputRow.swift; sourceTree = ""; }; + C0B605529F8016666F6C3794D9768CA5 /* TransformerHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformerHorizontalBarChart.swift; path = Source/Charts/Utils/TransformerHorizontalBarChart.swift; sourceTree = ""; }; + C2465E4C7B40A2D725278AEE6113E535 /* ShareClient.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ShareClient.framework; path = ShareClient.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C2982FD762FA7E78B9C8674FDBF7C488 /* LabelRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LabelRow.swift; path = Source/Rows/LabelRow.swift; sourceTree = ""; }; + C4D9C9FC3F24D3132834031FBA0497B6 /* YAxis.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxis.swift; path = Source/Charts/Components/YAxis.swift; sourceTree = ""; }; + C4F8A767A733062C597BA28637807CF6 /* FieldRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FieldRow.swift; path = Source/Rows/Common/FieldRow.swift; sourceTree = ""; }; + C5C1C37151607BD73B8CBF52A04A3C2A /* ILineChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineChartDataSet.swift; sourceTree = ""; }; + C80D29F462EBAF9532A128EC200F45E9 /* ScatterChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartData.swift; path = Source/Charts/Data/Implementations/Standard/ScatterChartData.swift; sourceTree = ""; }; + CA6A2727DA19123030277D8B0B6EAD4E /* Charts-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Charts-dummy.m"; sourceTree = ""; }; + CBB8BBD29DF85A11464A5ADA946CB94D /* HorizontalBarChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarChartView.swift; path = Source/Charts/Charts/HorizontalBarChartView.swift; sourceTree = ""; }; + CCF71002CB08FA43477C09804AD8CF00 /* BubbleChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/BubbleChartDataEntry.swift; sourceTree = ""; }; + CFF6A340445BB493577104B53D9A7588 /* BarChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarChartRenderer.swift; path = Source/Charts/Renderers/BarChartRenderer.swift; sourceTree = ""; }; + D3243DA31298D1FE6BEA4A606C0E0944 /* ICandleChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ICandleChartDataSet.swift; path = Source/Charts/Data/Interfaces/ICandleChartDataSet.swift; sourceTree = ""; }; + D365274AEF519C7E50E8567DEBC9CEF3 /* LineChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineChartData.swift; path = Source/Charts/Data/Implementations/Standard/LineChartData.swift; sourceTree = ""; }; + D44178678937D7A1451FAB15F69C1D8E /* PieChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/PieChartDataSet.swift; sourceTree = ""; }; + D545BAE8C86C5021FAEB27D4C25D6F10 /* Fill.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Fill.swift; path = Source/Charts/Utils/Fill.swift; sourceTree = ""; }; + D61C45B0A3EA48AEABB9B6979D820216 /* HorizontalBarHighlighter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalBarHighlighter.swift; path = Source/Charts/Highlight/HorizontalBarHighlighter.swift; sourceTree = ""; }; + D753B6F3540FE6A7C56D2547C3EEF851 /* Charts-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Charts-umbrella.h"; sourceTree = ""; }; + DB158EC4C258A5082D64122F7AF89500 /* CheckRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CheckRow.swift; path = Source/Rows/CheckRow.swift; sourceTree = ""; }; + E085DDC030F8EC270DBA2B97E1CBF58D /* ShareClient.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShareClient.release.xcconfig; sourceTree = ""; }; + E1225F47304F13FF1AC7386400F4ED87 /* Platform+Gestures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Gestures.swift"; path = "Source/Charts/Utils/Platform+Gestures.swift"; sourceTree = ""; }; + E240AEA05F9F44EE97E2D31F32D155F8 /* Transformer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformer.swift; path = Source/Charts/Utils/Transformer.swift; sourceTree = ""; }; + E27A5743F40167D8B6E7F58FB53D7607 /* DataApproximator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataApproximator.swift; path = Source/Charts/Filters/DataApproximator.swift; sourceTree = ""; }; + E304C127B722E54D8A82C9CAD421A740 /* FieldsRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FieldsRow.swift; path = Source/Rows/FieldsRow.swift; sourceTree = ""; }; + E329C10FB955618FAB19FE474DB7071E /* BarLineScatterCandleBubbleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BarLineScatterCandleBubbleChartData.swift; path = Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift; sourceTree = ""; }; + E6153DD0B9FA40F02377E5F8A060E378 /* AlertOptionsRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlertOptionsRow.swift; path = Source/Rows/Common/AlertOptionsRow.swift; sourceTree = ""; }; + E815F54AB4445B900090ACEE3A2FFF04 /* DoublePickerInputRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DoublePickerInputRow.swift; path = Source/Rows/DoublePickerInputRow.swift; sourceTree = ""; }; + E8520A7F8F8673F94B6DDE4B08E471B6 /* ChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataEntry.swift; sourceTree = ""; }; + E89110FD8C719CD0408D733C769EECC7 /* PieChartRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartRenderer.swift; path = Source/Charts/Renderers/PieChartRenderer.swift; sourceTree = ""; }; + E8BC5CA866C668A73EDFD53784DB4A4C /* RuleClosure.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RuleClosure.swift; path = Source/Validations/RuleClosure.swift; sourceTree = ""; }; + E940C1BB7A0182B5BD9433DF9D6E040F /* IMarker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IMarker.swift; path = Source/Charts/Components/IMarker.swift; sourceTree = ""; }; + EA7E136F2C50A7AAEFD8EE9EA59AA762 /* LineRadarRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineRadarRenderer.swift; path = Source/Charts/Renderers/LineRadarRenderer.swift; sourceTree = ""; }; + EAE582A1AABA555CA7E4333D8A82A6D9 /* XAxisRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRenderer.swift; path = Source/Charts/Renderers/XAxisRenderer.swift; sourceTree = ""; }; + EBCB97DFE79BCFD22A9806F8AAE04749 /* Platform+Accessibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Accessibility.swift"; path = "Source/Charts/Utils/Platform+Accessibility.swift"; sourceTree = ""; }; EBE2A8C176CC9C76279BE195BDA90B7F /* Pods-LoopFollow.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-LoopFollow.release.xcconfig"; sourceTree = ""; }; - ECE56B02AC87347DA9DB74C57E343848 /* MoveViewJob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MoveViewJob.swift; path = Source/Charts/Jobs/MoveViewJob.swift; sourceTree = ""; }; + EBF8B918AB264444686976350703223A /* ILineRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineRadarChartDataSet.swift; sourceTree = ""; }; + ECE9378CE08AC95D1C70F245CCC10937 /* AxisRendererBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisRendererBase.swift; path = Source/Charts/Renderers/AxisRendererBase.swift; sourceTree = ""; }; + EDBBC91348519BCFAF54CEB0F3A336E3 /* CandleChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartDataEntry.swift; sourceTree = ""; }; + EDDD26C0BFFFEF7E05816A85ED3048C1 /* Platform+Graphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Platform+Graphics.swift"; path = "Source/Charts/Utils/Platform+Graphics.swift"; sourceTree = ""; }; + EE9F53293DA948FB69D6A7E95F323FB4 /* DateFieldRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFieldRow.swift; path = Source/Rows/Common/DateFieldRow.swift; sourceTree = ""; }; F0EFA056547237258760018B2FE0CAD6 /* Pods-LoopFollow-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-LoopFollow-acknowledgements.markdown"; sourceTree = ""; }; - F342C0D599983866B101EAD57EE965BC /* ChartDataEntryBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartDataEntryBase.swift; path = Source/Charts/Data/Implementations/Standard/ChartDataEntryBase.swift; sourceTree = ""; }; - F47ECE07091D1F3FAD8674F1494B51FD /* IBarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IBarChartDataSet.swift; path = Source/Charts/Data/Interfaces/IBarChartDataSet.swift; sourceTree = ""; }; - F5018E78EF154B922DA8A314E96C8EFE /* ChartAnimationEasing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChartAnimationEasing.swift; path = Source/Charts/Animation/ChartAnimationEasing.swift; sourceTree = ""; }; - F7FCDBD5310D634048A381DF6344DCB8 /* AxisBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AxisBase.swift; path = Source/Charts/Components/AxisBase.swift; sourceTree = ""; }; - F94BB85650EA9A8A660C2DF565554364 /* RowControllerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RowControllerType.swift; path = Source/Core/RowControllerType.swift; sourceTree = ""; }; - FA6C47970EE73E5F5C1C16EB032C7880 /* ButtonRowWithPresent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ButtonRowWithPresent.swift; path = Source/Rows/ButtonRowWithPresent.swift; sourceTree = ""; }; - FBE65F23175ABAF0E3E490016F32A9F9 /* Eureka-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Eureka-Info.plist"; sourceTree = ""; }; - FC4C9132328F362E9C3125EA0BB30F7F /* PieRadarChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieRadarChartViewBase.swift; path = Source/Charts/Charts/PieRadarChartViewBase.swift; sourceTree = ""; }; - FCCDA1A52389202D21A2C0CE07AE0975 /* SelectorAlertController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectorAlertController.swift; path = Source/Rows/Controllers/SelectorAlertController.swift; sourceTree = ""; }; - FD2422A99038FA392E12DC40300CD5CC /* ILineRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ILineRadarChartDataSet.swift; path = Source/Charts/Data/Interfaces/ILineRadarChartDataSet.swift; sourceTree = ""; }; - FE339BC445333F4277FCCF4B6E05248B /* YAxisRendererRadarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRendererRadarChart.swift; path = Source/Charts/Renderers/YAxisRendererRadarChart.swift; sourceTree = ""; }; - FE802B440E6EA22B84F90B2192E9C89C /* Eureka-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Eureka-dummy.m"; sourceTree = ""; }; - FE837191BE21D305F27EADE4736036C7 /* StepperRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StepperRow.swift; path = Source/Rows/StepperRow.swift; sourceTree = ""; }; - FE8CE52191DADD0E86EFFB723F5C1F43 /* BubbleChartDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleChartDataProvider.swift; path = Source/Charts/Interfaces/BubbleChartDataProvider.swift; sourceTree = ""; }; + F124EF1DD30BEFB748316D6CE0709B2E /* HeaderFooterView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HeaderFooterView.swift; path = Source/Core/HeaderFooterView.swift; sourceTree = ""; }; + F2DE04D0335A389EA6CFE06E46448744 /* PieRadarChartViewBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieRadarChartViewBase.swift; path = Source/Charts/Charts/PieRadarChartViewBase.swift; sourceTree = ""; }; + F31DFAC4317F012937CBC2CDADF0B452 /* Renderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Renderer.swift; path = Source/Charts/Renderers/Renderer.swift; sourceTree = ""; }; + F38C6C77C1EDABA11F488AF0CB7113BC /* LineScatterCandleRadarChartDataSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LineScatterCandleRadarChartDataSet.swift; path = Source/Charts/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift; sourceTree = ""; }; + F3C05AC94561A5051FEF33F481EC70E6 /* CandleStickChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleStickChartView.swift; path = Source/Charts/Charts/CandleStickChartView.swift; sourceTree = ""; }; + F458F913F6215D5244FD4EFCE470807B /* ShareClient-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ShareClient-dummy.m"; sourceTree = ""; }; + F52B736816C4134465DD07E7A3C6EE82 /* YAxisRendererHorizontalBarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = YAxisRendererHorizontalBarChart.swift; path = Source/Charts/Renderers/YAxisRendererHorizontalBarChart.swift; sourceTree = ""; }; + F93BB1EE57468D56B0F2972A1F23E8E4 /* ScatterChartView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScatterChartView.swift; path = Source/Charts/Charts/ScatterChartView.swift; sourceTree = ""; }; + FABD11111F00FECAB5D76CA8D511540A /* CandleChartData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CandleChartData.swift; path = Source/Charts/Data/Implementations/Standard/CandleChartData.swift; sourceTree = ""; }; + FB789687F3D81D3F4CB82C2550645219 /* PieChartDataEntry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PieChartDataEntry.swift; path = Source/Charts/Data/Implementations/Standard/PieChartDataEntry.swift; sourceTree = ""; }; + FDFAF86922EDD701C440B78809BA7858 /* DateInlineFieldRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateInlineFieldRow.swift; path = Source/Rows/Common/DateInlineFieldRow.swift; sourceTree = ""; }; + FEC2735DCC80FD5BCE93B7D1D57A05FB /* ComponentBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComponentBase.swift; path = Source/Charts/Components/ComponentBase.swift; sourceTree = ""; }; + FFC29535908C42BB065B4E30585417A4 /* XAxisRendererRadarChart.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XAxisRendererRadarChart.swift; path = Source/Charts/Renderers/XAxisRendererRadarChart.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 1745F82B3CC4880D8373C92843BD73A0 /* Frameworks */ = { + 1DC97817961139E7E35F2AE2C60B6E3C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4BA52D959C6AC78D2B641936C986D5BD /* Foundation.framework in Frameworks */, + 3A81072EB144BB6F03C7F5360EEEE03D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -506,30 +528,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EABB43369342DBA322AEFCFCA32DCDF2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AB53E15E90B6A71CAF72834B072D88D3 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 08C34954AB9394F4BD1E0AE6B4BA1AD3 /* Support Files */ = { - isa = PBXGroup; - children = ( - 212BC3B1A39FD603CF008C6589F8D495 /* Eureka.modulemap */, - FE802B440E6EA22B84F90B2192E9C89C /* Eureka-dummy.m */, - FBE65F23175ABAF0E3E490016F32A9F9 /* Eureka-Info.plist */, - B5CAA0775EDBAE161B5D0E7EA11FD6BC /* Eureka-prefix.pch */, - BB6D1BC5E7576A4EE182F66FDB70135E /* Eureka-umbrella.h */, - 972988CAA5B213B4B7E79E686D947066 /* Eureka.debug.xcconfig */, - EAE950ECC462BCF193C89D86EEB21977 /* Eureka.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/Eureka"; - sourceTree = ""; - }; - 10EF57FA96C8A6EB332E6830C11ACAC4 /* Products */ = { + 0B47EBF6CDD6919FDEC1F73BC48C0D48 /* Products */ = { isa = PBXGroup; children = ( A1C1B977ED8804E8AEEC884E7359EE58 /* Charts.framework */, 082977F3777A7D434AB35C357B487F83 /* Eureka.framework */, 4BACF8B4E5759037E1CC8A6423FF7B67 /* Pods_LoopFollow.framework */, + C2465E4C7B40A2D725278AEE6113E535 /* ShareClient.framework */, ); name = Products; sourceTree = ""; @@ -542,161 +558,29 @@ name = Frameworks; sourceTree = ""; }; - 22F2370240DE477187E6567CC446EF23 /* Core */ = { + 3142C223F4EB54E9A2E170B9D8ACA4BE /* Charts */ = { isa = PBXGroup; children = ( - 7CB81995CD9E3411271534F01DAD4592 /* AnimatedMoveViewJob.swift */, - 377C3CF3DE13B0EC7726913B2DA966C9 /* AnimatedViewPortJob.swift */, - 7BDA597AD98E041BDF72BECA4E7CC21C /* AnimatedZoomViewJob.swift */, - 8E147C593487F41985DF252E8462F8E5 /* Animator.swift */, - F7FCDBD5310D634048A381DF6344DCB8 /* AxisBase.swift */, - 9DCD9F34ED2EFAB655BF84EB19BF0B03 /* AxisRendererBase.swift */, - 2AD23361C3941A28A568A73F5E2A0C96 /* BarChartData.swift */, - 55ED648BE5F5D63433355F4029BE846A /* BarChartDataEntry.swift */, - 1A67B7A482098A7B6617635A36A70C54 /* BarChartDataProvider.swift */, - 012D858F75E53844C8DB0E8745A4245F /* BarChartDataSet.swift */, - 44AB25DFE6C3A06D58D49ED0CF5DB3EC /* BarChartRenderer.swift */, - D0C3392B488D1C70CE763BEC834C6E40 /* BarChartView.swift */, - 714555686E18EFF7F47B8D5E49DBEA3F /* BarHighlighter.swift */, - 9157BC0B4AEB06D64AE7443A8BD5947D /* BarLineChartViewBase.swift */, - C381C388D31FC8085089D38D9F55A7AE /* BarLineScatterCandleBubbleChartData.swift */, - 745E6248CAB2E4A068E95D95FA0F1440 /* BarLineScatterCandleBubbleChartDataProvider.swift */, - 83942BEC8B7DB3645C30D60937AF2652 /* BarLineScatterCandleBubbleChartDataSet.swift */, - 7E76DAA9695B062B079865671555A198 /* BarLineScatterCandleBubbleRenderer.swift */, - 7F85FACC2016BEC51568E2DA039871BA /* BubbleChartData.swift */, - 575A3D70A90822811C6533EF48873537 /* BubbleChartDataEntry.swift */, - FE8CE52191DADD0E86EFFB723F5C1F43 /* BubbleChartDataProvider.swift */, - 168949456FDA5D72FC492981BF2AB55E /* BubbleChartDataSet.swift */, - 2D7F12C82F13C5D254AFDD932BB189E2 /* BubbleChartRenderer.swift */, - 288F47791ECB7EED768B2B26F8DCB68A /* BubbleChartView.swift */, - 7E0F07C3184BEE9EE73A064412FB3969 /* CandleChartData.swift */, - 666AEAC030E22BD0BDE90830AF057310 /* CandleChartDataEntry.swift */, - C079A2B4457B189E14F7ACCDF6210CB2 /* CandleChartDataProvider.swift */, - 8EF8E5F90E48A1146DE536864603C6B1 /* CandleChartDataSet.swift */, - 62109DDC014868EF85EAAC5DEA89E792 /* CandleStickChartRenderer.swift */, - AF6F94A014222434C07CED041F1A6237 /* CandleStickChartView.swift */, - F5018E78EF154B922DA8A314E96C8EFE /* ChartAnimationEasing.swift */, - CA4DC8D9C55731586FBF6CA8B50AE3C8 /* ChartBaseDataSet.swift */, - 21F934EBBD0C767A7DA6DEB455943843 /* ChartColorTemplates.swift */, - 15AE42BF26F6B49F108794BABAF01BE8 /* ChartData.swift */, - 7ECEF07022B6C554B4E9802C221B95B9 /* ChartDataEntry.swift */, - F342C0D599983866B101EAD57EE965BC /* ChartDataEntryBase.swift */, - DC49C98470D53DA3649F1E5A95641514 /* ChartDataProvider.swift */, - 729A12A9B7F0A0EE6EEE33B5176F30BB /* ChartDataRendererBase.swift */, - 31BA5667ABB00F921823EE8C11E0C596 /* ChartDataSet.swift */, - 86F8AE08B613E8389A122C6ED38A14A2 /* ChartHighlighter.swift */, - 6E6ADC76EF0EE1AE0F7877BAE8AC3430 /* ChartLimitLine.swift */, - 9F2D900844C314E8262826754BCDB63E /* ChartUtils.swift */, - 9640E3B61E9EB2E5999E6AF8A1E6D61A /* ChartViewBase.swift */, - B9ACCB5D9F822C2F7D0C1E84D401124D /* ChevronDownShapeRenderer.swift */, - B3589AD577F14D9EF3C1B486E3AE9AD1 /* ChevronUpShapeRenderer.swift */, - DFB7F1FDCA25887A48D3D9A7FB615800 /* CircleShapeRenderer.swift */, - 7CADE2DFAF271071EECD3C92248F2192 /* CombinedChartData.swift */, - A9DB5945996F90B2A9EE5243C6A1423F /* CombinedChartDataProvider.swift */, - 82F1DEC08F246688F6E7531A3395E9B1 /* CombinedChartRenderer.swift */, - CD429C5F2105C02645A5B0C4404E6276 /* CombinedChartView.swift */, - 0B024F185ECED75F48C085E205179B60 /* CombinedHighlighter.swift */, - 82516DCE2680E4E28B019A35C1AA85E7 /* ComponentBase.swift */, - 57B547D32213ED4ACD5121E873E08B63 /* CrossShapeRenderer.swift */, - 02064BFFCDD93F0B2E28045C270091A4 /* DataApproximator.swift */, - D0FE0C9E36C7E4EA71A9C0915DCDE460 /* DataApproximator+N.swift */, - 34F84715AE8809D6316FF9BCEAD20DCA /* DefaultAxisValueFormatter.swift */, - 8CA67E3BD944650F1EED5FA0B16BF2A9 /* DefaultFillFormatter.swift */, - D5333884384F3F0617A1755CB9C04EA9 /* DefaultValueFormatter.swift */, - 000D3C28CD7966485DFAD40B2C9874B4 /* Description.swift */, - 254A6B4D102F8420A54512389166B1E8 /* Fill.swift */, - 679725EAA7D6C233678CE91C58906413 /* Highlight.swift */, - C11A72698F5A39FE67A8908256260F03 /* HorizontalBarChartRenderer.swift */, - 9C086384F94A6CED2FB0EC4DA22CF685 /* HorizontalBarChartView.swift */, - A52112890B03A2230EA87DE2074EBF66 /* HorizontalBarHighlighter.swift */, - 1C992A46C86EB9DE636AF70545363749 /* IAxisValueFormatter.swift */, - F47ECE07091D1F3FAD8674F1494B51FD /* IBarChartDataSet.swift */, - 2FB31C7D459AACCCDAD58C4427C65B1F /* IBarLineScatterCandleBubbleChartDataSet.swift */, - 0ABEA1E706788F7FB4AEF5ABDA5884A2 /* IBubbleChartDataSet.swift */, - 68FDCFBE5C019D26281F7A56CAAFBD4A /* ICandleChartDataSet.swift */, - 1C7A9E25022D8E2DE5F4B5ABCFF8073B /* IChartDataSet.swift */, - D20056B909D071B51B58A4EC7F9AF016 /* IFillFormatter.swift */, - E5376E6450A6747741DC5879E846A8D4 /* IHighlighter.swift */, - 053BA00FFC9D0CCCA874716694EF87DA /* ILineChartDataSet.swift */, - FD2422A99038FA392E12DC40300CD5CC /* ILineRadarChartDataSet.swift */, - 249597AD33DF9857FD7F304A78EBA7DF /* ILineScatterCandleRadarChartDataSet.swift */, - 155737109C81D674801FCC3A99A51918 /* IMarker.swift */, - B946915CF4D343517B51D33FD3A04BCF /* IndexAxisValueFormatter.swift */, - D988C4498CD948B3BA26A653BC5F2BE1 /* IPieChartDataSet.swift */, - 0AD25BE0988BE256D99C8BD37264BF92 /* IRadarChartDataSet.swift */, - AE6E347B4EC0B71AFAC54530B584158B /* IScatterChartDataSet.swift */, - DF8BB64B5949D2CAA9B7D84B20B679E7 /* IShapeRenderer.swift */, - 4079FC6B8F8238BE5842EC9593970ED4 /* IValueFormatter.swift */, - 5F7D2159259306783652FFC35C5F4BB5 /* Legend.swift */, - 60A0B1AFF34D1CE8A4698D476DAE19D1 /* LegendEntry.swift */, - A414CED5CB27F40037F440A7B99A8181 /* LegendRenderer.swift */, - 6BCBA4882939D2562643379A8CCDF2E6 /* LineChartData.swift */, - A3154F080DAF844406EBAD792DD1F1AC /* LineChartDataProvider.swift */, - CAB210E66749830C126E32238CE2082D /* LineChartDataSet.swift */, - ADE0989B752944E4E267D4EC37EC8BEF /* LineChartRenderer.swift */, - 0E4A96D0B3D1148D579EBBBE4099B43D /* LineChartView.swift */, - 16819173DF628B0FC53570AE9383A1E9 /* LineRadarChartDataSet.swift */, - E6CAE7AC4CEE072EBCA52375CFE7EAC8 /* LineRadarRenderer.swift */, - 8096CF97803FE35D19082B189F139D53 /* LineScatterCandleRadarChartDataSet.swift */, - CD37D5B6C9777C0410BD7981DFEECAA0 /* LineScatterCandleRadarRenderer.swift */, - C53A8210C66064E3B8F1EC9B6453B323 /* MarkerImage.swift */, - 0B352DD04711E5CD1288B6F43CA78EAD /* MarkerView.swift */, - ECE56B02AC87347DA9DB74C57E343848 /* MoveViewJob.swift */, - 378C21F8B8F022E50AA5A54C32444EEA /* PieChartData.swift */, - 0888FBF51D984A19315B2B45406842AE /* PieChartDataEntry.swift */, - 7CF245263BA6245C01808ECB50BA7C48 /* PieChartDataSet.swift */, - DCA54E592B656A55A540BF36DF17957A /* PieChartRenderer.swift */, - 8CDFE98CDB50C3C14377F152923FF465 /* PieChartView.swift */, - 7E5488781769EC1BC666BD556553C613 /* PieHighlighter.swift */, - FC4C9132328F362E9C3125EA0BB30F7F /* PieRadarChartViewBase.swift */, - C1BB70383AD3D2088BD979874E38FB12 /* PieRadarHighlighter.swift */, - D2A83BF9B84A2500DB376EB0440F3177 /* Platform.swift */, - CF1521DEA9B23E85D6E3B390594B8386 /* Platform+Accessibility.swift */, - 45034360BF273A6E100C7D34B21A68B7 /* Platform+Color.swift */, - 6C5FDCBCF25DC40CBD3324686E14C95A /* Platform+Gestures.swift */, - B495707192AD3EB05D28B3FC41D3DE79 /* Platform+Graphics.swift */, - AA9B460BCA0242A40EEA3451ECEA392E /* Platform+Touch Handling.swift */, - 70230EF21C40FA0D1ED0CF3F82D0CCA5 /* RadarChartData.swift */, - 239824BA5FBE5BA1E6FB1E33773E251B /* RadarChartDataEntry.swift */, - 71C85204757B1DFD665A234DDC2CB843 /* RadarChartDataSet.swift */, - 071D24D80B9E2809386D89EE81F176E2 /* RadarChartRenderer.swift */, - 3E24A04789464015C22D87D5E3A60671 /* RadarChartView.swift */, - 7D25B6FD011B35288185B6EF33CDACC8 /* RadarHighlighter.swift */, - 2C2A801B59BAFE6387217B3B12162AFB /* Range.swift */, - A7B8D6F073E0C9F1D0DC0A4EF5F00D80 /* Renderer.swift */, - 37BE1D35B7B996A40A09DBA627975CAD /* ScatterChartData.swift */, - D2E075D6FF5CADB79137C6C0F8BD9AD8 /* ScatterChartDataProvider.swift */, - 6F8D402409FDE04B9AA68921C87A582A /* ScatterChartDataSet.swift */, - 61129B8933ABD9C897F5F3D21BFB0DEB /* ScatterChartRenderer.swift */, - BDFCB038F9DFF63DB1A66A0BA0DE2FF3 /* ScatterChartView.swift */, - 3CF2AAADC8530B44EFDAFDF76424ACB9 /* SquareShapeRenderer.swift */, - B2F3155FB4D74FAF71DACB796F6C37CF /* Transformer.swift */, - 2AD46C920FCFDF92D97C5CE6DA55653C /* TransformerHorizontalBarChart.swift */, - D89B6697D34583EEC038208D3A2CCC19 /* TriangleShapeRenderer.swift */, - D365EA8C2BD866565B9032143F883585 /* ViewPortHandler.swift */, - CB20702200078D6C342F044A7ACF647E /* ViewPortJob.swift */, - B86222F70DF9BA5C9FD5BC0C57B44516 /* XAxis.swift */, - E5CF5AF933F10270B89A5C7DA4913A6D /* XAxisRenderer.swift */, - 929451489095A14748EE4AC0ECE015B3 /* XAxisRendererHorizontalBarChart.swift */, - D9FB34C64CEA9EB76D25668DF5B911D0 /* XAxisRendererRadarChart.swift */, - D9F8D990EA4AB722F7E4DDB271FBDF07 /* XShapeRenderer.swift */, - 72076E17F40C394C421E55A1B2A5B5AB /* YAxis.swift */, - BD461674D07DC3CCE2C5289E94480677 /* YAxisRenderer.swift */, - 950BD31462B45700CCB1D7EC3B5EFDCB /* YAxisRendererHorizontalBarChart.swift */, - FE339BC445333F4277FCCF4B6E05248B /* YAxisRendererRadarChart.swift */, - 4EA35BC7CB0631FB6172FCC3939301CE /* ZoomViewJob.swift */, + 9DBB6B5BA8A75BBF0E0EE3EDA0897BE9 /* Core */, + 98591E8B414C24014E0BBBC0232C3D41 /* Support Files */, ); - name = Core; + name = Charts; + path = Charts; sourceTree = ""; }; - 2A992A1E3B03450792DC85229803B825 /* Charts */ = { + 4BCC92DFEC2AF1A2792C20AA309B54F7 /* Support Files */ = { isa = PBXGroup; children = ( - 22F2370240DE477187E6567CC446EF23 /* Core */, - 65558019872A59570C54EEC30127F75E /* Support Files */, + BED228AF72ED5D323F30BAC261C5CD14 /* Eureka.modulemap */, + A9A56A406C5958A1B025AF2BEADEAB5E /* Eureka-dummy.m */, + 4582F709E55ADE01009D1DF37A0D1A2C /* Eureka-Info.plist */, + 720BAE67C4F9E996548ED7C3C156633E /* Eureka-prefix.pch */, + 425EDA696831087CE695C0052A266AF7 /* Eureka-umbrella.h */, + B28A2F7F1E6F57132EDC348E349719CA /* Eureka.debug.xcconfig */, + B3127CF0F6CFE1BEDAD6752A448E7D67 /* Eureka.release.xcconfig */, ); - name = Charts; - path = Charts; + name = "Support Files"; + path = "../Target Support Files/Eureka"; sourceTree = ""; }; 4F2B32159E3EA4B0DF32393843F9E975 /* Targets Support Files */ = { @@ -707,114 +591,288 @@ name = "Targets Support Files"; sourceTree = ""; }; - 5E9E1E43890A876C6EDEDBD1FD22FEFC /* Eureka */ = { + 4FE512F3B2184A5A5916DF9D4ADA2260 /* ShareClient */ = { + isa = PBXGroup; + children = ( + 88506EF0DE39A04D24F910A93C337EFD /* ShareClient.h */, + 0C1F35E26A6B017DFE6EA7B2EEF34E01 /* ShareClient.swift */, + 9EAE10647C1132BEA8591805CCE4B205 /* Support Files */, + ); + name = ShareClient; + path = ShareClient; + sourceTree = ""; + }; + 58A8F852B8FCFC7E73EA234EC77810F3 /* Pods */ = { isa = PBXGroup; children = ( - 964ECD689E6D753A7D3EBE859C86AB18 /* ActionSheetRow.swift */, - D0704DED0FDFDBECD5D672C8122D09D3 /* AlertOptionsRow.swift */, - 481AA3E635F1093F5AB7FD74ADA9BDD9 /* AlertRow.swift */, - C9BBDA9249CBAFE6EF9373177FF46337 /* BaseRow.swift */, - DA3FB45C36C40B6053CC640379ABFF09 /* ButtonRow.swift */, - FA6C47970EE73E5F5C1C16EB032C7880 /* ButtonRowWithPresent.swift */, - CF9EC3B5687C1269D9ACA71960B2722F /* Cell.swift */, - EBD7FCF54BAD47CD0733E99A9318D846 /* CellType.swift */, - 3D88CE352A90F7E9AC65DFA6D8885891 /* CheckRow.swift */, - 80318751D82A1232D25FE42BE09D9FFA /* Core.swift */, - D4D1CD2B50CF172C70D4C70E118CF2D6 /* DateFieldRow.swift */, - 606EA49EC0D70404AA0567511C66F093 /* DateInlineFieldRow.swift */, - BBF603CBA0282655DE10AB2E64E38A78 /* DateInlineRow.swift */, - 87994AC80B253089EC8951B0916B1C1D /* DatePickerRow.swift */, - 4A5BD0C4DDD7D499A7B4F756946AA449 /* DateRow.swift */, - AE64A695A7435B21BE9B760056208374 /* DecimalFormatter.swift */, - 68EEFBE89237E60B56F262C7E544E55D /* DoublePickerInputRow.swift */, - 98C23603F603481C63472733E4703D0D /* DoublePickerRow.swift */, - BBE28E66678F0411EB23844644DD532A /* FieldRow.swift */, - 4FA682FA297006A934B23EEF8E8E3191 /* FieldsRow.swift */, - BA3B623F7078308F6C63E600530AD2EC /* Form.swift */, - CA9B73786C8C3F0A227107004B92E8D5 /* GenericMultipleSelectorRow.swift */, - CF31146E46DDECAC6A65C804FDFB9567 /* HeaderFooterView.swift */, - 7105F1BABE60EE081EBDC3478EBDF544 /* Helpers.swift */, - 0F7E3D2928552D57E8FFCA76AE2898BA /* InlineRowType.swift */, - 3CFDCD79EE4C6A3EB03E710810887DE9 /* LabelRow.swift */, - 0C86B0118C269219B26CEB29BFEB2BE7 /* ListCheckRow.swift */, - 742D75E835BBB864914066437E0F9AAF /* MultipleSelectorRow.swift */, - E3FB5D0BD363FB7F09E40CBD6821E463 /* MultipleSelectorViewController.swift */, - AEBF3FF6A0AA50E17997BE01E91A7B0E /* NavigationAccessoryView.swift */, - A76A34E9C02A6AE7AF665A056FC21385 /* Operators.swift */, - E613BE0BFFB09D55A3AD7BC1EEFD4823 /* OptionsRow.swift */, - 9BE7167E3A24661ED73D8E4CF4833587 /* PickerInlineRow.swift */, - AC07EA79DDA9EF6E69EC9529D4BFE371 /* PickerInputRow.swift */, - BDADC32BFF4DE543DCC8A0C9F33610B8 /* PickerRow.swift */, - 877048B6F67A34C1FD3885CD20CF3AC6 /* PopoverSelectorRow.swift */, - 3B21D20DD89ABCD133C907484489A4E9 /* PresenterRowType.swift */, - 60D3208F76CADE6D8572D57C206C965D /* Protocols.swift */, - 9C98A13EC67B78112EB25C6A7E85200A /* PushRow.swift */, - 372778BB7FE2428A1F850F71B3BB5F37 /* Row.swift */, - F94BB85650EA9A8A660C2DF565554364 /* RowControllerType.swift */, - 2C7772421B5C0539F7DC061340FF69FC /* RowProtocols.swift */, - 774E64F62D19C0B99410BBF3B8FE0555 /* RowType.swift */, - 79AAFAF1006DFD732C3559D661ABC07B /* RuleClosure.swift */, - 2275ABB30ED7FCACFB71FDEF947219F2 /* RuleEmail.swift */, - 805041F849AC6045DBA321E0CBE414ED /* RuleEqualsToRow.swift */, - 68D2D7BC97BBDFE8D04CF6B579F20125 /* RuleLength.swift */, - 7EDC871696C42F364FF9E4FBF320D207 /* RuleRange.swift */, - E5C982FD8EADF008ED080533ECC61350 /* RuleRegExp.swift */, - 45FD6950945FE0889962B8261E67750E /* RuleRequired.swift */, - 03A865F9D1855A690E30467224D40412 /* RuleURL.swift */, - E1AD9C87BF211B61583EFC0CDAAFD1FE /* Section.swift */, - 9DD5D404866482790244CEA58FC02516 /* SegmentedRow.swift */, - D25585170D6AB5308AE2A678B8A2AFD9 /* SelectableRowType.swift */, - E81B1BBAF0B43F0A7937AAA509040657 /* SelectableSection.swift */, - FCCDA1A52389202D21A2C0CE07AE0975 /* SelectorAlertController.swift */, - E15189F1DAD306A270886D315DA65038 /* SelectorRow.swift */, - 480C03B7DF1E21E39BD90A9F76955F98 /* SelectorViewController.swift */, - 604618765E9FC4A4C41502066047493A /* SliderRow.swift */, - FE837191BE21D305F27EADE4736036C7 /* StepperRow.swift */, - AB8EF9C425A89B975BEF843FFF552985 /* SwipeActions.swift */, - C7AE0E1C416BB967B5624D0ECADD53F8 /* SwitchRow.swift */, - 631A847995A0DF85FFC969F478E97199 /* TextAreaRow.swift */, - 64CA3F06341E9548CF06B61574FDE552 /* TriplePickerInputRow.swift */, - A4C0C98D51FEC617960BEE2F5E7EC507 /* TriplePickerRow.swift */, - 92D10EDF63A87D7BD2367F7E8DB62A50 /* Validation.swift */, - 08C34954AB9394F4BD1E0AE6B4BA1AD3 /* Support Files */, + 3142C223F4EB54E9A2E170B9D8ACA4BE /* Charts */, + 5ADA1BEE684F64550F523D76A4349CD3 /* Eureka */, + 4FE512F3B2184A5A5916DF9D4ADA2260 /* ShareClient */, + ); + name = Pods; + sourceTree = ""; + }; + 5ADA1BEE684F64550F523D76A4349CD3 /* Eureka */ = { + isa = PBXGroup; + children = ( + 4579AB6A714D0B0145487000C5B95DD8 /* ActionSheetRow.swift */, + E6153DD0B9FA40F02377E5F8A060E378 /* AlertOptionsRow.swift */, + 5F50F1D5643D6EBCA09E428806984608 /* AlertRow.swift */, + A4010AF1B513BF04041A5432AF20E42B /* BaseRow.swift */, + BB2EE47C8EFAFB7A567F4AFF90304521 /* ButtonRow.swift */, + 937E34112E8DDE6B37ECE22A0BDC59E7 /* ButtonRowWithPresent.swift */, + 568C835AC8B764A0183271E99058B163 /* Cell.swift */, + 33379FD8AB582363EBE9071C28E58575 /* CellType.swift */, + DB158EC4C258A5082D64122F7AF89500 /* CheckRow.swift */, + 8183772B19A56CF748806153BF97D089 /* Core.swift */, + EE9F53293DA948FB69D6A7E95F323FB4 /* DateFieldRow.swift */, + FDFAF86922EDD701C440B78809BA7858 /* DateInlineFieldRow.swift */, + 082D9D903940DEE55728285DC66D61EB /* DateInlineRow.swift */, + 0DAC497D7FAFA91FCC10B7463162949B /* DatePickerRow.swift */, + 68406FC37BCF5DE56607C70BA1C3EBC5 /* DateRow.swift */, + 3B417B1F0CF4DCEC4917E71B8477B9E1 /* DecimalFormatter.swift */, + E815F54AB4445B900090ACEE3A2FFF04 /* DoublePickerInputRow.swift */, + 5067C4CFC921FC0C56F6C5B3B4240008 /* DoublePickerRow.swift */, + C4F8A767A733062C597BA28637807CF6 /* FieldRow.swift */, + E304C127B722E54D8A82C9CAD421A740 /* FieldsRow.swift */, + 5471DA369762341AFA788636BF5238B0 /* Form.swift */, + 548BE84DABD9800530A1C66FE902B9C7 /* GenericMultipleSelectorRow.swift */, + F124EF1DD30BEFB748316D6CE0709B2E /* HeaderFooterView.swift */, + 00456494744A907EC58DC4BA16D53DD9 /* Helpers.swift */, + 7967D1617EF3687E7EA393DDFEBC8B31 /* InlineRowType.swift */, + C2982FD762FA7E78B9C8674FDBF7C488 /* LabelRow.swift */, + A9C7ED3BDF9A49970B6D7F0C0BF8E2B3 /* ListCheckRow.swift */, + 2D5C4B57627CE6A33CA5AFF28D7B4470 /* MultipleSelectorRow.swift */, + 5A92BA872BE33DE132E60FA393324DB1 /* MultipleSelectorViewController.swift */, + 5D0D30B8F618735D32A0FCFC52EB805D /* NavigationAccessoryView.swift */, + 55F11A5FF44761B6757A841E9A4FE3BD /* Operators.swift */, + 2E8F18420183616B27CA1A9863B96A94 /* OptionsRow.swift */, + 484636B2979047FB29E457F1E1725FD9 /* PickerInlineRow.swift */, + BF358AA0AFC2C0AF0152E704E7512517 /* PickerInputRow.swift */, + 2EEB10C82369CAF70178A725C299F81E /* PickerRow.swift */, + A909150E97DC082367FC2960FCB633BA /* PopoverSelectorRow.swift */, + 9FBA401AF5B307DD562DF29F2CC80553 /* PresenterRowType.swift */, + 2C9CD0FB1963D56F3399E0EF8469A0FA /* Protocols.swift */, + 589103C5CFBCC41339AECEF41A55A87A /* PushRow.swift */, + 20EACBD53E243A3F9DF8735D46C2460E /* Row.swift */, + 63B59B19AC178737F69F4E653E3D3C3C /* RowControllerType.swift */, + 0682A5A7DECA0B6B492499FF9E0BCE22 /* RowProtocols.swift */, + 1B2271519AA755EB5C69A7284CAA6F23 /* RowType.swift */, + E8BC5CA866C668A73EDFD53784DB4A4C /* RuleClosure.swift */, + 32A4B20180EE2205670B1B03813AD23E /* RuleEmail.swift */, + 93DBEA6C1381CFA8F6B6DFD85A9A5A02 /* RuleEqualsToRow.swift */, + B73122FF47D657B6EE798456F35C01B8 /* RuleLength.swift */, + 9F6A8E2C6ECCAF59C045894E1F3DF8C5 /* RuleRange.swift */, + 99445AF2EFD84919074857FAE2171830 /* RuleRegExp.swift */, + 358D210738B60758170EEAB4EBFD35F7 /* RuleRequired.swift */, + 99E407FE7A788430D697A04C2DDC4BE6 /* RuleURL.swift */, + 989650FD7F5122CA9AC857FF507D818E /* Section.swift */, + 01B137D762352C7744393FACFC24CC97 /* SegmentedRow.swift */, + 94046F1B95DF94D6E175F891C3C315AD /* SelectableRowType.swift */, + 11C0DC7BD82B4AEB6E245BAF4F6B3746 /* SelectableSection.swift */, + 2F2849FC47AE118D4F91DF4314FFF6BB /* SelectorAlertController.swift */, + ACC18BFAFFF03439AE7FC5425BC06568 /* SelectorRow.swift */, + 01022F6F2F1BF3E5C5F500A0650CC1BF /* SelectorViewController.swift */, + 263007DB32EB3A923F7839CBF8E121BA /* SliderRow.swift */, + 3DF639FF42B23B13286D9199B2D7C556 /* StepperRow.swift */, + 2F8A26F11880F80D57A284B6094FF410 /* SwipeActions.swift */, + 1F1396F9374A230FAADC599E8FA2CA92 /* SwitchRow.swift */, + 428FF5D0423FE20B4F82273AE39B347F /* TextAreaRow.swift */, + 2ED88FD8F5C5DE12E98FA1F15BA06F85 /* TriplePickerInputRow.swift */, + 7D8EB04398FDB94F46498AD99A989CA8 /* TriplePickerRow.swift */, + 99AC4BCC8856578AC43D03573FADE196 /* Validation.swift */, + 4BCC92DFEC2AF1A2792C20AA309B54F7 /* Support Files */, ); name = Eureka; path = Eureka; sourceTree = ""; }; - 65558019872A59570C54EEC30127F75E /* Support Files */ = { + 98591E8B414C24014E0BBBC0232C3D41 /* Support Files */ = { isa = PBXGroup; children = ( - 4BE549356A9D91D4E5A4967405F362C5 /* Charts.modulemap */, - 88E17727D64A26D166EA94F8B96ACAB4 /* Charts-dummy.m */, - 8DB307AF5190BC0642C752B5DE6AEC4E /* Charts-Info.plist */, - 015C2D96C13D444803A9754ABE5B9F39 /* Charts-prefix.pch */, - AAB5771835E6170F384829884E2B9985 /* Charts-umbrella.h */, - 65AD3DF61E7279E34430EAA394531696 /* Charts.debug.xcconfig */, - 1B51FA0A7F212B5A0C265121FBB47A8F /* Charts.release.xcconfig */, + 2CE0760BAB5896395C25F90C2A921230 /* Charts.modulemap */, + CA6A2727DA19123030277D8B0B6EAD4E /* Charts-dummy.m */, + 4FFBD63A349249CCAC76EAE17C6E540A /* Charts-Info.plist */, + 99A385B62C3482DFD4D1A6D9D36A48E8 /* Charts-prefix.pch */, + D753B6F3540FE6A7C56D2547C3EEF851 /* Charts-umbrella.h */, + 017205CE9DD9404E68FC3A813A5BC6A4 /* Charts.debug.xcconfig */, + 1CD849B795C7F3EE32C6353297C6F4CF /* Charts.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/Charts"; sourceTree = ""; }; - CF1408CF629C7361332E53B88F7BD30C = { + 9DBB6B5BA8A75BBF0E0EE3EDA0897BE9 /* Core */ = { isa = PBXGroup; children = ( - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, - CFC778CFC3B05B1588C425DC4BFFBFE5 /* Pods */, - 10EF57FA96C8A6EB332E6830C11ACAC4 /* Products */, - 4F2B32159E3EA4B0DF32393843F9E975 /* Targets Support Files */, + B9F3AC74EA385AD1FB48BB312B9A8D01 /* AnimatedMoveViewJob.swift */, + 59CE156C94B888A75504D963FB95A5A7 /* AnimatedViewPortJob.swift */, + 540C2AE657DFD33D82A5800A9A30E715 /* AnimatedZoomViewJob.swift */, + 3AF80E9E9FD2ABA19F783C1FE8CEDE21 /* Animator.swift */, + 57AAE9789B991F46EFCE58CE338AED41 /* AxisBase.swift */, + ECE9378CE08AC95D1C70F245CCC10937 /* AxisRendererBase.swift */, + 2D27C9E57D9FF2AF21780555D5ABAD72 /* BarChartData.swift */, + B31407514FCEAE451A67BFB01F99FD57 /* BarChartDataEntry.swift */, + 1B155A2FCCFFC4A5633BA14B82C657F3 /* BarChartDataProvider.swift */, + 45D5F14D7DBABC785E6B47E0AA271EE3 /* BarChartDataSet.swift */, + CFF6A340445BB493577104B53D9A7588 /* BarChartRenderer.swift */, + 8A88AC66D4BA5F2606CBD23F8BC468D4 /* BarChartView.swift */, + 51133B95E04FCEF52CECCBA0FA2FB64C /* BarHighlighter.swift */, + 02E9C61C3E7EBE33601F29273FD0610F /* BarLineChartViewBase.swift */, + E329C10FB955618FAB19FE474DB7071E /* BarLineScatterCandleBubbleChartData.swift */, + 38DFB2F0E62325600A27627339CCDDDD /* BarLineScatterCandleBubbleChartDataProvider.swift */, + AC8A8EC434DD8733B56039AB331048F1 /* BarLineScatterCandleBubbleChartDataSet.swift */, + 346C3FCE7CD5ADF791B7B4734B94FC6A /* BarLineScatterCandleBubbleRenderer.swift */, + A76791113E26FF4E2E0456B3AFBEB78B /* BubbleChartData.swift */, + CCF71002CB08FA43477C09804AD8CF00 /* BubbleChartDataEntry.swift */, + 7AC48B177FD06557DCB9C5C3583D5B87 /* BubbleChartDataProvider.swift */, + AEC6B766C4F4809D41B6E083F9A3F0AC /* BubbleChartDataSet.swift */, + B31F4F15FC21AB2A91319F457B686A31 /* BubbleChartRenderer.swift */, + 92E073284CCFB590C93D4DC4AF39731B /* BubbleChartView.swift */, + FABD11111F00FECAB5D76CA8D511540A /* CandleChartData.swift */, + EDBBC91348519BCFAF54CEB0F3A336E3 /* CandleChartDataEntry.swift */, + 8AFCBD39119B8A39E3A0CA0B9CE6C4FB /* CandleChartDataProvider.swift */, + 70FFA615C5AB19A462747668F6DFAE52 /* CandleChartDataSet.swift */, + 29A3C6AB4C2213910B58D3A525336E5E /* CandleStickChartRenderer.swift */, + F3C05AC94561A5051FEF33F481EC70E6 /* CandleStickChartView.swift */, + 254111998274AAAA1452EBD98043BD22 /* ChartAnimationEasing.swift */, + 71786812E4BA34CFE31958629790D981 /* ChartBaseDataSet.swift */, + 8F49CC163BE65B796CE8B4C654F0B221 /* ChartColorTemplates.swift */, + BCD106D95076EE34EC2C06B62908D944 /* ChartData.swift */, + E8520A7F8F8673F94B6DDE4B08E471B6 /* ChartDataEntry.swift */, + 205BB79BE6C1FCA776CE1D4293B9CDE3 /* ChartDataEntryBase.swift */, + 0A7DA86EA696B87A80FF54CABA26548A /* ChartDataProvider.swift */, + 3D5BDBD9C81A644553CCFCA2CEFF4633 /* ChartDataRendererBase.swift */, + 7D118C0F313FDC57A29E6BBB205A3799 /* ChartDataSet.swift */, + 0C2E8914194091C19C13CB44C9C7EA80 /* ChartHighlighter.swift */, + 26A4C0D12FF704C57F2F34EADF00CE47 /* ChartLimitLine.swift */, + 0AB3F85B18411852AC6F1EEBBB6D9DCA /* ChartUtils.swift */, + 0D9E3F84B8F3CDDF959B5457AC2CF6D9 /* ChartViewBase.swift */, + 9057EE1840994798463E40010C5B2BC5 /* ChevronDownShapeRenderer.swift */, + 21406035541105CB111B7A60D6C8FE35 /* ChevronUpShapeRenderer.swift */, + 91590B3C1B301C3DE53A488D68A81701 /* CircleShapeRenderer.swift */, + 919647803888A5B15DB3222FCDA56E0A /* CombinedChartData.swift */, + 5F60B3D090DD53CC3BA96A41B6A0776C /* CombinedChartDataProvider.swift */, + 8F12CC35F78CEC5436F967BCF50C5EF0 /* CombinedChartRenderer.swift */, + 5B27115EBCC224F7D67778C26B1275B8 /* CombinedChartView.swift */, + BE34CABB424024A41851C39678BA5EF3 /* CombinedHighlighter.swift */, + FEC2735DCC80FD5BCE93B7D1D57A05FB /* ComponentBase.swift */, + 2507ADB972377DD593EFFA943EA075D0 /* CrossShapeRenderer.swift */, + E27A5743F40167D8B6E7F58FB53D7607 /* DataApproximator.swift */, + 990AA38654ECD509645583469ADAFB2E /* DataApproximator+N.swift */, + 2EFBA8CE68D4633D9089932B8A4E3871 /* DefaultAxisValueFormatter.swift */, + 16F7E6A55623407EB9928C72D9EE3B5F /* DefaultFillFormatter.swift */, + 16C72CDF15178DB4843E0353D0DAD8AF /* DefaultValueFormatter.swift */, + 11D57BEB61E5B0C8070F999D1C04F128 /* Description.swift */, + D545BAE8C86C5021FAEB27D4C25D6F10 /* Fill.swift */, + 55D5F888EBF0F894D53C98C99A93C2DB /* Highlight.swift */, + 9A139CB129780B5CE6CC6A7ABE85922E /* HorizontalBarChartRenderer.swift */, + CBB8BBD29DF85A11464A5ADA946CB94D /* HorizontalBarChartView.swift */, + D61C45B0A3EA48AEABB9B6979D820216 /* HorizontalBarHighlighter.swift */, + 00184B71D9C00EA8FDF24D6CE7E8617B /* IAxisValueFormatter.swift */, + 46FC3BFFBF3E488A77264AF9F2A376D3 /* IBarChartDataSet.swift */, + 69BD15D5856F4E84E769AFD9438BF861 /* IBarLineScatterCandleBubbleChartDataSet.swift */, + B3C500690781B6631CE1C0946BDBDDAB /* IBubbleChartDataSet.swift */, + D3243DA31298D1FE6BEA4A606C0E0944 /* ICandleChartDataSet.swift */, + 14CC39F6C23F4D5D781A2C4B60DF765D /* IChartDataSet.swift */, + 805B8ACDB7AF64D4B1EFF9695D06D6E7 /* IFillFormatter.swift */, + A13F8D0A0BEAE5837834E66A8B1AAB8B /* IHighlighter.swift */, + C5C1C37151607BD73B8CBF52A04A3C2A /* ILineChartDataSet.swift */, + EBF8B918AB264444686976350703223A /* ILineRadarChartDataSet.swift */, + 914FD2A2403BAC9475234D3B9A7B13D4 /* ILineScatterCandleRadarChartDataSet.swift */, + E940C1BB7A0182B5BD9433DF9D6E040F /* IMarker.swift */, + B780059D2B1759DB0B490F39320EF494 /* IndexAxisValueFormatter.swift */, + 0C32A2598D7B44B2489E4DB9D0CEEA55 /* IPieChartDataSet.swift */, + 16D4AC313CBD7A5E08DA0B52709B04CA /* IRadarChartDataSet.swift */, + A869216FA3AC6BF4E9E522958EEC835A /* IScatterChartDataSet.swift */, + 0DB219299A8A67D5EC1C43C6BF5A8EE4 /* IShapeRenderer.swift */, + 52777F38E94D175B30FD6CCE0503BE91 /* IValueFormatter.swift */, + 6FCBC3E7CA177D591BC893AB3839AF87 /* Legend.swift */, + 03233AB6D94FE12321C740972ECDCC7C /* LegendEntry.swift */, + 13243CBC570EC1C4F0410EAB1D89DF92 /* LegendRenderer.swift */, + D365274AEF519C7E50E8567DEBC9CEF3 /* LineChartData.swift */, + 87C515318E4A075DCC3455EA33F32672 /* LineChartDataProvider.swift */, + 11084C60F774B99DECB61B35E3EC7DD3 /* LineChartDataSet.swift */, + 0AB9DAFB27FC7A51349BE9255F640DCF /* LineChartRenderer.swift */, + 4B632A9A6846FCE64A0A99A4D151E615 /* LineChartView.swift */, + 49992CCA5AEFDD6B4059FA55B46719E2 /* LineRadarChartDataSet.swift */, + EA7E136F2C50A7AAEFD8EE9EA59AA762 /* LineRadarRenderer.swift */, + F38C6C77C1EDABA11F488AF0CB7113BC /* LineScatterCandleRadarChartDataSet.swift */, + 97FE7FFB6C5E1BCD95EB806FAF00E4FC /* LineScatterCandleRadarRenderer.swift */, + 20212CB9D6FB4BFF75889AFB3C5646FC /* MarkerImage.swift */, + 2CEC4ADA231B20F225A0C0800CF05406 /* MarkerView.swift */, + AF8539432E41C7FAB4F3E455D0FC889F /* MoveViewJob.swift */, + B5027B3B59A4B57AD77A4D08FD35B4F5 /* PieChartData.swift */, + FB789687F3D81D3F4CB82C2550645219 /* PieChartDataEntry.swift */, + D44178678937D7A1451FAB15F69C1D8E /* PieChartDataSet.swift */, + E89110FD8C719CD0408D733C769EECC7 /* PieChartRenderer.swift */, + 5284FBF634CFF42E384E18E1D82F111C /* PieChartView.swift */, + B2D931E90044D88802D3FD030161D3C8 /* PieHighlighter.swift */, + F2DE04D0335A389EA6CFE06E46448744 /* PieRadarChartViewBase.swift */, + 5ACC330581B8B5D9791487A217968559 /* PieRadarHighlighter.swift */, + B403CCDCB84443B5F5C2ACB7F05262F8 /* Platform.swift */, + EBCB97DFE79BCFD22A9806F8AAE04749 /* Platform+Accessibility.swift */, + 32C854F81EB4FC44FABBDCDA04740B70 /* Platform+Color.swift */, + E1225F47304F13FF1AC7386400F4ED87 /* Platform+Gestures.swift */, + EDDD26C0BFFFEF7E05816A85ED3048C1 /* Platform+Graphics.swift */, + 527868253626F5726DA92BB29CCA64F5 /* Platform+Touch Handling.swift */, + 1B360F02EE859A284562621B5BC8061F /* RadarChartData.swift */, + 71A6113B0BF33B6BE24E733E54B29F11 /* RadarChartDataEntry.swift */, + 7FCC0B2AAFCFDCD7682F7C52CA90AEBC /* RadarChartDataSet.swift */, + B08418091F0B05BA6BDCC363F96B8C43 /* RadarChartRenderer.swift */, + 1EBF436B7501608AB33DA5DEF29C213A /* RadarChartView.swift */, + 21FF0C890A9774E7FC5E8434FB5FDA41 /* RadarHighlighter.swift */, + 28E3D7678445542747F9C16A8ADD7CC0 /* Range.swift */, + F31DFAC4317F012937CBC2CDADF0B452 /* Renderer.swift */, + C80D29F462EBAF9532A128EC200F45E9 /* ScatterChartData.swift */, + 947C167AF75DD780C25483F12F12822B /* ScatterChartDataProvider.swift */, + 0C61637BA5B312D410FE6D08195ECCE1 /* ScatterChartDataSet.swift */, + 0FD22F889858CF5ECBE1B37789BB2E68 /* ScatterChartRenderer.swift */, + F93BB1EE57468D56B0F2972A1F23E8E4 /* ScatterChartView.swift */, + 3F9B961D3E7671D04E9474A1C7A2194F /* SquareShapeRenderer.swift */, + E240AEA05F9F44EE97E2D31F32D155F8 /* Transformer.swift */, + C0B605529F8016666F6C3794D9768CA5 /* TransformerHorizontalBarChart.swift */, + 733827F65F5022C471A1447F04440570 /* TriangleShapeRenderer.swift */, + 49B9AD34B61808B09D75C28FEB6901A0 /* ViewPortHandler.swift */, + 4D28AE94DD8B0CC673A577C731C03431 /* ViewPortJob.swift */, + 35BFB3FED5774078472BE1B4BFB69E66 /* XAxis.swift */, + EAE582A1AABA555CA7E4333D8A82A6D9 /* XAxisRenderer.swift */, + 94F34C60E8ABE81F99BFB0915A1517A0 /* XAxisRendererHorizontalBarChart.swift */, + FFC29535908C42BB065B4E30585417A4 /* XAxisRendererRadarChart.swift */, + 9F61CC9BC348F45A50AD5AB2ED815BAB /* XShapeRenderer.swift */, + C4D9C9FC3F24D3132834031FBA0497B6 /* YAxis.swift */, + 44A1B6FFE86F41186B23437AC8B0AD94 /* YAxisRenderer.swift */, + F52B736816C4134465DD07E7A3C6EE82 /* YAxisRendererHorizontalBarChart.swift */, + 9423746E4BC0AD1992F5D13E2E1F9E70 /* YAxisRendererRadarChart.swift */, + 653297DA1AAAEEFC0BF5642F6604CDDC /* ZoomViewJob.swift */, ); + name = Core; sourceTree = ""; }; - CFC778CFC3B05B1588C425DC4BFFBFE5 /* Pods */ = { + 9EAE10647C1132BEA8591805CCE4B205 /* Support Files */ = { isa = PBXGroup; children = ( - 2A992A1E3B03450792DC85229803B825 /* Charts */, - 5E9E1E43890A876C6EDEDBD1FD22FEFC /* Eureka */, + 059FA0BC581C628A7E67661ABCE587BD /* ShareClient.modulemap */, + F458F913F6215D5244FD4EFCE470807B /* ShareClient-dummy.m */, + 4EFCC91F90BD17AD567D57CE537F2268 /* ShareClient-Info.plist */, + 3310EBD9F2A5EB47D39A359FDA666961 /* ShareClient-prefix.pch */, + A047E01EAD49DCD01C6AE241C055B64E /* ShareClient-umbrella.h */, + 27E029128823B9D672A01E4BB4DAD95B /* ShareClient.debug.xcconfig */, + E085DDC030F8EC270DBA2B97E1CBF58D /* ShareClient.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/ShareClient"; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, + 58A8F852B8FCFC7E73EA234EC77810F3 /* Pods */, + 0B47EBF6CDD6919FDEC1F73BC48C0D48 /* Products */, + 4F2B32159E3EA4B0DF32393843F9E975 /* Targets Support Files */, ); - name = Pods; sourceTree = ""; }; DB261ABD9474868F278295D2D489B4C2 /* Pods-LoopFollow */ = { @@ -846,33 +904,60 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 2B1298CA8BA121230C125C3AA5DC112C /* Headers */ = { + 3C21E3A60B8D2063E4CC2A0220E45AFD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7C944D24CCF29DC5C1B8232C1DBE0340 /* Pods-LoopFollow-umbrella.h in Headers */, + E3EDB632F407232103226EB2AF8C239D /* Charts-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3C21E3A60B8D2063E4CC2A0220E45AFD /* Headers */ = { + 7DD3157FBDD386B4916158C875050C47 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E3EDB632F407232103226EB2AF8C239D /* Charts-umbrella.h in Headers */, + C4EB1DE2CCEE60A99EB5AA718DD67105 /* Eureka-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7DD3157FBDD386B4916158C875050C47 /* Headers */ = { + 9B9F97AA1CF9FB0787D2291A888A6C93 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - C4EB1DE2CCEE60A99EB5AA718DD67105 /* Eureka-umbrella.h in Headers */, + B66CAEA692B43131362E25A49DDF71EF /* Pods-LoopFollow-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D276E430C7565D9317DDE8279F92EFEE /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 5F840ED834EBE06F641AA87BD7B7B178 /* ShareClient-umbrella.h in Headers */, + 5160948170D313DCA6586CFADF3B2A6A /* ShareClient.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 32507FDB9BAD6EF17DCB14A888ECA5D9 /* ShareClient */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7531FF23B45C520CA26A36BB717E6A4A /* Build configuration list for PBXNativeTarget "ShareClient" */; + buildPhases = ( + D276E430C7565D9317DDE8279F92EFEE /* Headers */, + 6DE4FB6CA9BD0140F71EFF0ABFBD9611 /* Sources */, + EABB43369342DBA322AEFCFCA32DCDF2 /* Frameworks */, + 3E36C65E5AE7F55E311769F98062FD33 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ShareClient; + productName = ShareClient; + productReference = C2465E4C7B40A2D725278AEE6113E535 /* ShareClient.framework */; + productType = "com.apple.product-type.framework"; + }; 88BE8BE7A2FE6CED4193CCD8FF3CBEF7 /* Eureka */ = { isa = PBXNativeTarget; buildConfigurationList = 36778B42AB96755AAFA8AF892C40E50E /* Build configuration list for PBXNativeTarget "Eureka" */; @@ -911,18 +996,19 @@ }; E187D4B9C2B76F773546AF1E39D2ECCD /* Pods-LoopFollow */ = { isa = PBXNativeTarget; - buildConfigurationList = 830FE489D447214A7D4DCC2CAABC8049 /* Build configuration list for PBXNativeTarget "Pods-LoopFollow" */; + buildConfigurationList = C296AD097A8FA560D79E90D3C22C96E9 /* Build configuration list for PBXNativeTarget "Pods-LoopFollow" */; buildPhases = ( - 2B1298CA8BA121230C125C3AA5DC112C /* Headers */, - 9F20CE21DDE5321968CCD575C6B5DA93 /* Sources */, - 1745F82B3CC4880D8373C92843BD73A0 /* Frameworks */, - 9162B137BEE54A89999E3A43FDAA8416 /* Resources */, + 9B9F97AA1CF9FB0787D2291A888A6C93 /* Headers */, + 5BEF58C702FDC74DAA08B265E0143D5B /* Sources */, + 1DC97817961139E7E35F2AE2C60B6E3C /* Frameworks */, + A35DC61B22F4A23E51FB4B97627ABCE9 /* Resources */, ); buildRules = ( ); dependencies = ( - 6D8B5D1B9AD70D9E733DB930598E647F /* PBXTargetDependency */, - F840E2A0A183442D217AE53080A7D3C3 /* PBXTargetDependency */, + AA3C18940D595C8ABAA899EE95469C91 /* PBXTargetDependency */, + 8B0A5134AC4ECFA08B720B20790FFA19 /* PBXTargetDependency */, + 94AF0CD3D1D2B1992DFCD0273D0F2387 /* PBXTargetDependency */, ); name = "Pods-LoopFollow"; productName = "Pods-LoopFollow"; @@ -947,19 +1033,27 @@ Base, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 10EF57FA96C8A6EB332E6830C11ACAC4 /* Products */; + productRefGroup = 0B47EBF6CDD6919FDEC1F73BC48C0D48 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( BF03B0B2B8B052092CB5F90CC5FB3757 /* Charts */, 88BE8BE7A2FE6CED4193CCD8FF3CBEF7 /* Eureka */, E187D4B9C2B76F773546AF1E39D2ECCD /* Pods-LoopFollow */, + 32507FDB9BAD6EF17DCB14A888ECA5D9 /* ShareClient */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 9162B137BEE54A89999E3A43FDAA8416 /* Resources */ = { + 3E36C65E5AE7F55E311769F98062FD33 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A35DC61B22F4A23E51FB4B97627ABCE9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -1057,6 +1151,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 5BEF58C702FDC74DAA08B265E0143D5B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F1B37767979921C4758B54144610815D /* Pods-LoopFollow-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6D366EFBB5EBF23E78291B1F4BFCECFA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1205,35 +1307,42 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9F20CE21DDE5321968CCD575C6B5DA93 /* Sources */ = { + 6DE4FB6CA9BD0140F71EFF0ABFBD9611 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B7F7A44644C42AB4F5FD569F6B1EAD58 /* Pods-LoopFollow-dummy.m in Sources */, + D7D17805603B1DD6F02D8108C31090E5 /* ShareClient-dummy.m in Sources */, + 3116B2E3FECFF3942AEA6BF17796CA37 /* ShareClient.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 6D8B5D1B9AD70D9E733DB930598E647F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Charts; - target = BF03B0B2B8B052092CB5F90CC5FB3757 /* Charts */; - targetProxy = 67241C8E1C4F3763EEFBE1158914CC77 /* PBXContainerItemProxy */; - }; - F840E2A0A183442D217AE53080A7D3C3 /* PBXTargetDependency */ = { + 8B0A5134AC4ECFA08B720B20790FFA19 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Eureka; target = 88BE8BE7A2FE6CED4193CCD8FF3CBEF7 /* Eureka */; - targetProxy = 6CD95FF1D5DAF8313F0757EB40F5C9A3 /* PBXContainerItemProxy */; + targetProxy = 87D6DD57B95016F1515B8CA873C52B51 /* PBXContainerItemProxy */; + }; + 94AF0CD3D1D2B1992DFCD0273D0F2387 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ShareClient; + target = 32507FDB9BAD6EF17DCB14A888ECA5D9 /* ShareClient */; + targetProxy = 768CF338A2BC484E9597CD398DFA4136 /* PBXContainerItemProxy */; + }; + AA3C18940D595C8ABAA899EE95469C91 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Charts; + target = BF03B0B2B8B052092CB5F90CC5FB3757 /* Charts */; + targetProxy = 7272ABD8A5C4DE0FAA10777D4FE249DD /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 006A8D074426E7178BCD5048F6EBC566 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EAE950ECC462BCF193C89D86EEB21977 /* Eureka.release.xcconfig */; + baseConfigurationReference = B3127CF0F6CFE1BEDAD6752A448E7D67 /* Eureka.release.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1269,7 +1378,7 @@ }; 13DF91FECD4EB2AAAF95405099441E29 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 65AD3DF61E7279E34430EAA394531696 /* Charts.debug.xcconfig */; + baseConfigurationReference = 017205CE9DD9404E68FC3A813A5BC6A4 /* Charts.debug.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1302,83 +1411,6 @@ }; name = Debug; }; - 1D3649A307AC9B0A097467A55247CCF8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = EBE2A8C176CC9C76279BE195BDA90B7F /* Pods-LoopFollow.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 4F00B863FE0F61394DBDF2771B1F28C8 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B1DF43F4B1524F385F6090756FA3016A /* Pods-LoopFollow.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; 6C61D818ACD3C2C116FED6A9C67E91B4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1443,6 +1475,43 @@ }; name = Debug; }; + 7445CE2DA3D731E7CC7B9F0E82576D87 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E085DDC030F8EC270DBA2B97E1CBF58D /* ShareClient.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ShareClient/ShareClient-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ShareClient/ShareClient-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/ShareClient/ShareClient.modulemap"; + PRODUCT_MODULE_NAME = ShareClient; + PRODUCT_NAME = ShareClient; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 7DC5F11AFBEAE473E8D3C24A2D11338D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1503,9 +1572,45 @@ }; name = Release; }; + 872B91677D6C5E98109D15A182CD805F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 27E029128823B9D672A01E4BB4DAD95B /* ShareClient.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ShareClient/ShareClient-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ShareClient/ShareClient-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/ShareClient/ShareClient.modulemap"; + PRODUCT_MODULE_NAME = ShareClient; + PRODUCT_NAME = ShareClient; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 8843ACEAF275101A2F5739BFC13D4E90 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B51FA0A7F212B5A0C265121FBB47A8F /* Charts.release.xcconfig */; + baseConfigurationReference = 1CD849B795C7F3EE32C6353297C6F4CF /* Charts.release.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1539,9 +1644,48 @@ }; name = Release; }; + A57D7F46620CEA8E6010E60F37AA1C40 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EBE2A8C176CC9C76279BE195BDA90B7F /* Pods-LoopFollow.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; D27C976E5A2F75B799103220B6FECE18 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 972988CAA5B213B4B7E79E686D947066 /* Eureka.debug.xcconfig */; + baseConfigurationReference = B28A2F7F1E6F57132EDC348E349719CA /* Eureka.debug.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1574,6 +1718,44 @@ }; name = Debug; }; + E56FA54D604FEC313768CAB1F44761B8 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B1DF43F4B1524F385F6090756FA3016A /* Pods-LoopFollow.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1595,11 +1777,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 830FE489D447214A7D4DCC2CAABC8049 /* Build configuration list for PBXNativeTarget "Pods-LoopFollow" */ = { + 7531FF23B45C520CA26A36BB717E6A4A /* Build configuration list for PBXNativeTarget "ShareClient" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 872B91677D6C5E98109D15A182CD805F /* Debug */, + 7445CE2DA3D731E7CC7B9F0E82576D87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C296AD097A8FA560D79E90D3C22C96E9 /* Build configuration list for PBXNativeTarget "Pods-LoopFollow" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4F00B863FE0F61394DBDF2771B1F28C8 /* Debug */, - 1D3649A307AC9B0A097467A55247CCF8 /* Release */, + E56FA54D604FEC313768CAB1F44761B8 /* Debug */, + A57D7F46620CEA8E6010E60F37AA1C40 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/ShareClient.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/ShareClient.xcscheme new file mode 100644 index 000000000..669728282 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/ShareClient.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist index 56c9680c4..f3c5e873d 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist @@ -25,6 +25,13 @@ orderHint 2 + ShareClient.xcscheme + + isShown + + orderHint + 3 + SuppressBuildableAutocreation diff --git a/Pods/ShareClient/LICENSE b/Pods/ShareClient/LICENSE new file mode 100644 index 000000000..0d98a1db8 --- /dev/null +++ b/Pods/ShareClient/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Mark Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pods/ShareClient/ShareClient/ShareClient.h b/Pods/ShareClient/ShareClient/ShareClient.h new file mode 100644 index 000000000..2d67034b0 --- /dev/null +++ b/Pods/ShareClient/ShareClient/ShareClient.h @@ -0,0 +1,19 @@ +// +// ShareClient.h +// ShareClient +// +// Created by Nathan Racklyeft on 5/8/16. +// Copyright © 2016 Mark Wilson. All rights reserved. +// + +#import + +//! Project version number for ShareClient. +FOUNDATION_EXPORT double ShareClientVersionNumber; + +//! Project version string for ShareClient. +FOUNDATION_EXPORT const unsigned char ShareClientVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Pods/ShareClient/ShareClient/ShareClient.swift b/Pods/ShareClient/ShareClient/ShareClient.swift new file mode 100644 index 000000000..70d869c98 --- /dev/null +++ b/Pods/ShareClient/ShareClient/ShareClient.swift @@ -0,0 +1,222 @@ +// +// ShareClient.h +// ShareClient +// +// Created by Mark Wilson on 5/7/16. +// Copyright © 2016 Mark Wilson. All rights reserved. +// + +import Foundation + +public struct ShareGlucose { + public let glucose: UInt16 + public let trend: UInt8 + public let timestamp: Date +} + +public enum ShareError: Error { + case httpError(Error) + // some possible values of errorCode: + // SSO_AuthenticateAccountNotFound + // SSO_AuthenticatePasswordInvalid + // SSO_AuthenticateMaxAttemptsExceeed + case loginError(errorCode: String) + case fetchError + case dataError(reason: String) + case dateError +} + + +public enum KnownShareServers: String { + case US="https://share1.dexcom.com" + case NON_US="https://shareous1.dexcom.com" + +} + +// From the Dexcom Share iOS app, via @bewest and @shanselman: +// https://github.com/bewest/share2nightscout-bridge +private let dexcomUserAgent = "Dexcom Share/3.0.2.11 CFNetwork/711.2.23 Darwin/14.0.0" +private let dexcomApplicationId = "d89443d2-327c-4a6f-89e5-496bbb0317db" +private let dexcomLoginPath = "/ShareWebServices/Services/General/LoginPublisherAccountByName" +private let dexcomLatestGlucosePath = "/ShareWebServices/Services/Publisher/ReadPublisherLatestGlucoseValues" +private let maxReauthAttempts = 2 + +// TODO use an HTTP library which supports JSON and futures instead of callbacks. +// using cocoapods in a playground appears complicated +// ¯\_(ツ)_/¯ +private func dexcomPOST(_ url: URL, JSONData: [String: AnyObject]? = nil, callback: @escaping (Error?, String?) -> Void) { + var data: Data? + + if let JSONData = JSONData { + guard let encoded = try? JSONSerialization.data(withJSONObject: JSONData, options:[]) else { + return callback(ShareError.dataError(reason: "Failed to encode JSON for POST to " + url.absoluteString), nil) + } + + data = encoded + } + + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + request.addValue("application/json", forHTTPHeaderField: "Accept") + request.addValue(dexcomUserAgent, forHTTPHeaderField: "User-Agent") + request.httpBody = data + + URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in + if error != nil { + callback(error, nil) + } else { + callback(nil, String(data: data!, encoding: .utf8)) + } + }).resume() +} + +public class ShareClient { + public let username: String + public let password: String + + private let shareServer:String + private var token: String? + + public init(username: String, password: String, shareServer:String=KnownShareServers.US.rawValue) { + self.username = username + self.password = password + self.shareServer = shareServer + } + public convenience init(username: String, password: String, shareServer:KnownShareServers=KnownShareServers.US) { + + self.init(username: username, password: password, shareServer:shareServer.rawValue) + + } + + public func fetchLast(_ n: Int, callback: @escaping (ShareError?, [ShareGlucose]?) -> Void) { + fetchLastWithRetries(n, remaining: maxReauthAttempts, callback: callback) + } + + private func ensureToken(_ callback: @escaping (ShareError?) -> Void) { + if token != nil { + callback(nil) + } else { + fetchToken() { (error, token) in + if error != nil { + callback(error) + } else { + self.token = token + callback(nil) + } + } + } + } + + private func fetchToken(_ callback: @escaping (ShareError?, String?) -> Void) { + let data = [ + "accountName": username, + "password": password, + "applicationId": dexcomApplicationId + ] + + guard let url = URL(string: shareServer + dexcomLoginPath) else { + return callback(ShareError.fetchError, nil) + } + + dexcomPOST(url, JSONData: data as [String : AnyObject]?) { (error, response) in + if let error = error { + return callback(.httpError(error), nil) + } + + guard let response = response, + let data = response.data(using: .utf8), + let decoded = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) + else { + return callback(.loginError(errorCode: "unknown"), nil) + } + + if let token = decoded as? String { + // success is a JSON-encoded string containing the token + callback(nil, token) + } else { + // failure is a JSON object containing the error reason + let errorCode = (decoded as? [String: String])?["Code"] ?? "unknown" + callback(.loginError(errorCode: errorCode), nil) + } + } + } + + private func fetchLastWithRetries(_ n: Int, remaining: Int, callback: @escaping (ShareError?, [ShareGlucose]?) -> Void) { + ensureToken() { (error) in + guard error == nil else { + return callback(error, nil) + } + + guard var components = URLComponents(string: self.shareServer + dexcomLatestGlucosePath) else { + return callback(.fetchError, nil) + } + + components.queryItems = [ + URLQueryItem(name: "sessionId", value: self.token), + URLQueryItem(name: "minutes", value: String(1440)), + URLQueryItem(name: "maxCount", value: String(n)) + ] + + guard let url = components.url else { + return callback(.fetchError, nil) + } + + dexcomPOST(url) { (error, response) in + if let error = error { + return callback(.httpError(error), nil) + } + + do { + guard let response = response else { + throw ShareError.fetchError + } + + let decoded = try? JSONSerialization.jsonObject(with: response.data(using: .utf8)!, options: []) + guard let sgvs = decoded as? Array else { + if remaining > 0 { + self.token = nil + return self.fetchLastWithRetries(n, remaining: remaining - 1, callback: callback) + } else { + throw ShareError.dataError(reason: "Failed to decode SGVs as array after trying to reauth: " + response) + } + } + + var transformed: Array = [] + for sgv in sgvs { + if let glucose = sgv["Value"] as? Int, let trend = sgv["Trend"] as? Int, let wt = sgv["WT"] as? String { + transformed.append(ShareGlucose( + glucose: UInt16(glucose), + trend: UInt8(trend), + timestamp: try self.parseDate(wt) + )) + } else { + throw ShareError.dataError(reason: "Failed to decode an SGV record: " + response) + } + } + callback(nil, transformed) + } catch let error as ShareError { + callback(error, nil) + } catch { + callback(.fetchError, nil) + } + } + } + } + + private func parseDate(_ wt: String) throws -> Date { + // wt looks like "/Date(1462404576000)/" + let re = try NSRegularExpression(pattern: "\\((.*)\\)") + if let match = re.firstMatch(in: wt, range: NSMakeRange(0, wt.count)) { + #if swift(>=4) + let matchRange = match.range(at: 1) + #else + let matchRange = match.rangeAt(1) + #endif + let epoch = Double((wt as NSString).substring(with: matchRange))! / 1000 + return Date(timeIntervalSince1970: epoch) + } else { + throw ShareError.dateError + } + } +} diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.markdown b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.markdown index 3b12de8b5..e60386534 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.markdown @@ -231,4 +231,29 @@ 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. + +## ShareClient + +The MIT License (MIT) + +Copyright (c) 2016 Mark Wilson + +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. + Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.plist b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.plist index 3a8a4aee8..c3ef6992c 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-acknowledgements.plist @@ -255,6 +255,37 @@ SOFTWARE. Type PSGroupSpecifier + + FooterText + The MIT License (MIT) + +Copyright (c) 2016 Mark Wilson + +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. + + License + MIT + Title + ShareClient + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist index 84c35777c..4dce4e416 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist @@ -1,3 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh ${BUILT_PRODUCTS_DIR}/Charts/Charts.framework -${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework +${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist index 2f4c5a945..f37a0ae29 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist @@ -1,2 +1,3 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Charts.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ShareClient.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-input-files.xcfilelist index 84c35777c..4dce4e416 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-input-files.xcfilelist @@ -1,3 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh ${BUILT_PRODUCTS_DIR}/Charts/Charts.framework -${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework +${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-output-files.xcfilelist index 2f4c5a945..f37a0ae29 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-output-files.xcfilelist @@ -1,2 +1,3 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Charts.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ShareClient.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh index baa3c343b..92a2f2b23 100755 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh @@ -199,10 +199,12 @@ fi if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Charts/Charts.framework" install_framework "${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework" + install_framework "${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Charts/Charts.framework" install_framework "${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework" + install_framework "${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig index 982c690ec..3f1a812d8 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient/ShareClient.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "UIKit" +OTHER_LDFLAGS = $(inherited) -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "ShareClient" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.release.xcconfig b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.release.xcconfig index 982c690ec..3f1a812d8 100644 --- a/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.release.xcconfig +++ b/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.release.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient/ShareClient.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "UIKit" +OTHER_LDFLAGS = $(inherited) -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "ShareClient" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/ShareClient/ShareClient-Info.plist b/Pods/Target Support Files/ShareClient/ShareClient-Info.plist new file mode 100644 index 000000000..2a9158a0b --- /dev/null +++ b/Pods/Target Support Files/ShareClient/ShareClient-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.2.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/ShareClient/ShareClient-dummy.m b/Pods/Target Support Files/ShareClient/ShareClient-dummy.m new file mode 100644 index 000000000..d45c52caf --- /dev/null +++ b/Pods/Target Support Files/ShareClient/ShareClient-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_ShareClient : NSObject +@end +@implementation PodsDummy_ShareClient +@end diff --git a/Pods/Target Support Files/ShareClient/ShareClient-prefix.pch b/Pods/Target Support Files/ShareClient/ShareClient-prefix.pch new file mode 100644 index 000000000..beb2a2441 --- /dev/null +++ b/Pods/Target Support Files/ShareClient/ShareClient-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/ShareClient/ShareClient-umbrella.h b/Pods/Target Support Files/ShareClient/ShareClient-umbrella.h new file mode 100644 index 000000000..578fbf572 --- /dev/null +++ b/Pods/Target Support Files/ShareClient/ShareClient-umbrella.h @@ -0,0 +1,17 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "ShareClient.h" + +FOUNDATION_EXPORT double ShareClientVersionNumber; +FOUNDATION_EXPORT const unsigned char ShareClientVersionString[]; + diff --git a/Pods/Target Support Files/ShareClient/ShareClient.debug.xcconfig b/Pods/Target Support Files/ShareClient/ShareClient.debug.xcconfig new file mode 100644 index 000000000..5cc916227 --- /dev/null +++ b/Pods/Target Support Files/ShareClient/ShareClient.debug.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShareClient +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShareClient +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/ShareClient/ShareClient.modulemap b/Pods/Target Support Files/ShareClient/ShareClient.modulemap new file mode 100644 index 000000000..81b51f238 --- /dev/null +++ b/Pods/Target Support Files/ShareClient/ShareClient.modulemap @@ -0,0 +1,6 @@ +framework module ShareClient { + umbrella header "ShareClient-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/ShareClient/ShareClient.release.xcconfig b/Pods/Target Support Files/ShareClient/ShareClient.release.xcconfig new file mode 100644 index 000000000..5cc916227 --- /dev/null +++ b/Pods/Target Support Files/ShareClient/ShareClient.release.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShareClient +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShareClient +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES